diff --git a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/ExceptionTranslationFilterBeanDefinitionParser.java b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/ExceptionTranslationFilterBeanDefinitionParser.java index ec48ee99e2..1214b87eba 100644 --- a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/ExceptionTranslationFilterBeanDefinitionParser.java +++ b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/ExceptionTranslationFilterBeanDefinitionParser.java @@ -15,13 +15,40 @@ import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; /** - * Basically accessDeniedUrl is optional, we if unspecified impl will - * auto-detect any AccessDeniedHandler in ctx and use it; alternately if there - * are > 1 such handlers, we can nominate the one to use via - * accessDeniedBeanRef; + *

+ * This class parses the tag and creates the + * bean defintion for ExceptionTranslationFilter.
The + * '<security:access-denied .. />' tag is optional and if not specified + * ExceptionTranslationFilter
will autodetect the instance + * of AccessDeniedHandler; alternately if there are > 1 such + * handlers,
we can nominate the one to use via 'accessDeniedBeanRef'. + *

* - * @author vpuri + *

+ * The 'entryPointBeanRef' and 'accessDeniedBeanRef' can be specified as + * attributes or inner bean definitions.
See following sample showing both + * ways. + *

+ * + *

+ * Sample: + *

<security:exception-translation id="exceptionTranslationFilter"> + *
+ *
<security:entry-point + * entryPointBeanRef="authenticationProcessingFilterEntryPoint" />
+ *
<security:access-denied accessDeniedBeanRef="theBeanToUse" /> + *
+ *
</security:exception-translation>
+ * or + *
<security:exception-translation id="exceptionTranslationFilter" + * entryPointBeanRef="ref" accessDeniedBeanRef="ref" />
+ *
+ *

+ * + * @author Vishal Puri * @since + * @see {@link org.acegisecurity.ui.ExceptionTranslationFilter} + * @see {@link org.acegisecurity.ui.AccessDeniedHandler} */ public class ExceptionTranslationFilterBeanDefinitionParser extends AbstractBeanDefinitionParser { @@ -30,10 +57,10 @@ public class ExceptionTranslationFilterBeanDefinitionParser extends AbstractBean private static final String ACCESS_DENIED_REF = "accessDeniedBeanRef"; private static final String ACCESS_DENIED_URL = "accessDeniedUrl"; - + private static final String ENTRY_POINT = "entry-point"; - - private static final String ENTRY_POINT_REF ="entryPointBeanRef"; + + private static final String ENTRY_POINT_REF = "entryPointBeanRef"; protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { @@ -42,10 +69,10 @@ public class ExceptionTranslationFilterBeanDefinitionParser extends AbstractBean // add handler Element accessDeniedElement = DomUtils.getChildElementByTagName(element, ACCESS_DENIED); setAccessDeniedHandlerProperty(parserContext, exceptionFilterDef, accessDeniedElement); - + Element entryPointElement = DomUtils.getChildElementByTagName(element, ENTRY_POINT); setEntryPointProperty(exceptionFilterDef, entryPointElement); - + return exceptionFilterDef; } @@ -57,10 +84,11 @@ public class ExceptionTranslationFilterBeanDefinitionParser extends AbstractBean } /** - * + * Resolves are reference to 'accessDeniedHandler' property. * @param parserContext - * @param repositoryBeanDef - * @param element + * @param exceptionFilterDef The ExceptionFilter BeanDefinition + * @param accessDeniedElement The inner tag for accessDeniedHandler + * property. */ private void setAccessDeniedHandlerProperty(ParserContext parserContext, RootBeanDefinition exceptionFilterDef, Element accessDeniedElement) { @@ -68,29 +96,21 @@ public class ExceptionTranslationFilterBeanDefinitionParser extends AbstractBean setBeanReferenceOrInnerBeanDefinitions(exceptionFilterDef, accessDeniedElement, "accessDeniedHandler", accessDeniedElement.getAttribute(ACCESS_DENIED_REF)); } - else { - // register BFPP to check if handler exist in application context, - // if > 1 throw error saying ref should be specified as there are - // more than one - RootBeanDefinition accessDeniedHandlerLocatorBeanDef = new RootBeanDefinition( - AccessDeniedHandlerBeanDefinitionLocator.class); - parserContext.getReaderContext().registerWithGeneratedName(accessDeniedHandlerLocatorBeanDef); - } } /** + * Add property if it's specified as an attribute or inner tag. * - * @param repositoryBeanDef - * @param element - * @param property - * @param reference + * @param exceptionFilterDef The ExceptionFilter BeanDefinition + * @param element The inner bean element + * @param property The property to add + * @param beanRef The bean reference to resolve. */ - private void setBeanReferenceOrInnerBeanDefinitions(RootBeanDefinition exceptionFilterDef, - Element element, String property, String beanRef) { + private void setBeanReferenceOrInnerBeanDefinitions(RootBeanDefinition exceptionFilterDef, Element element, + String property, String beanRef) { // check for encoderBeanRef attribute if (StringUtils.hasLength(beanRef)) { - exceptionFilterDef.getPropertyValues().addPropertyValue(property, - new RuntimeBeanReference(beanRef)); + exceptionFilterDef.getPropertyValues().addPropertyValue(property, new RuntimeBeanReference(beanRef)); } else { doSetInnerBeanDefinitions(exceptionFilterDef, element, property); @@ -98,10 +118,10 @@ public class ExceptionTranslationFilterBeanDefinitionParser extends AbstractBean } /** - * - * @param repositoryBeanDef - * @param element - * @param property + * Add property specified as an inner bean definition. + * @param exceptionFilterDef The ExceptionFilter BeanDefinition + * @param element The inner bean element + * @param property The property to add */ private void doSetInnerBeanDefinitions(RootBeanDefinition exceptionFilterDef, Element accessDeniedElement, String property) { @@ -111,6 +131,12 @@ public class ExceptionTranslationFilterBeanDefinitionParser extends AbstractBean } + /** + * @param element + * @param attribute + * @param property + * @param definition + */ private void setPropertyIfAvailable(Element element, String attribute, String property, RootBeanDefinition definition) { String propertyValue = element.getAttribute(attribute);