PageRenderTime 49ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/jarb-constraint-violations/src/main/java/org/jarbframework/violation/configuration/xml/ConfigurableConstraintExceptionFactoryBeanDefinitionParser.java

http://github.com/42BV/jarb
Java | 92 lines | 71 code | 16 blank | 5 comment | 3 complexity | 00cc63521e43069fdec745ed0a2d49cf MD5 | raw file
  1. package org.jarbframework.violation.configuration.xml;
  2. import static org.jarbframework.utils.spring.xml.BeanParsingHelper.parsePropertyFromAttributeOrChild;
  3. import static org.springframework.beans.factory.support.BeanDefinitionBuilder.genericBeanDefinition;
  4. import static org.springframework.util.xml.DomUtils.getChildElementsByTagName;
  5. import java.util.Collection;
  6. import java.util.List;
  7. import org.jarbframework.utils.spring.SingletonFactoryBean;
  8. import org.jarbframework.violation.factory.DatabaseConstraintExceptionFactory;
  9. import org.jarbframework.violation.factory.custom.ConfigurableConstraintExceptionFactory;
  10. import org.jarbframework.violation.factory.custom.ExceptionFactoryMapping;
  11. import org.springframework.beans.factory.annotation.Required;
  12. import org.springframework.beans.factory.config.BeanDefinition;
  13. import org.springframework.beans.factory.support.AbstractBeanDefinition;
  14. import org.springframework.beans.factory.support.BeanDefinitionBuilder;
  15. import org.springframework.beans.factory.support.ManagedList;
  16. import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
  17. import org.springframework.beans.factory.xml.ParserContext;
  18. import org.w3c.dom.Element;
  19. /**
  20. * Parses a {@link ConfigurableConstraintExceptionFactory} from XML.
  21. * @author Jeroen van Schagen
  22. * @since 22-09-2011
  23. */
  24. public class ConfigurableConstraintExceptionFactoryBeanDefinitionParser extends AbstractBeanDefinitionParser {
  25. @Override
  26. protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
  27. BeanDefinitionBuilder factoryBuilder = genericBeanDefinition(ConfigurableConstraintExceptionFactoryParserFactoryBean.class);
  28. BeanDefinition factoryDefinition = factoryBuilder.getRawBeanDefinition();
  29. factoryBuilder.addPropertyValue("defaultFactory", parseDefaultExceptionFactory(element, parserContext, factoryDefinition));
  30. factoryBuilder.addPropertyValue("exceptionMappings", parseExceptionMappings(element, parserContext, factoryDefinition));
  31. return factoryBuilder.getBeanDefinition();
  32. }
  33. private Object parseDefaultExceptionFactory(Element element, ParserContext parserContext, BeanDefinition parent) {
  34. return parsePropertyFromAttributeOrChild(element, "default-factory", parserContext, parent);
  35. }
  36. private ManagedList<Object> parseExceptionMappings(Element element, ParserContext parserContext, BeanDefinition parentDefinition) {
  37. List<Element> mappingElements = getChildElementsByTagName(element, "exception-mapping");
  38. ManagedList<Object> mappingDefinitions = new ManagedList<Object>(mappingElements.size());
  39. mappingDefinitions.setElementTypeName(ExceptionFactoryMapping.class.getName());
  40. mappingDefinitions.setSource(parentDefinition);
  41. ExceptionFactoryMappingBeanDefinitionParser mappingParser = new ExceptionFactoryMappingBeanDefinitionParser(parentDefinition);
  42. for (Element mappingElement : mappingElements) {
  43. mappingDefinitions.add(mappingParser.parse(mappingElement, parserContext));
  44. }
  45. return mappingDefinitions;
  46. }
  47. static final class ConfigurableConstraintExceptionFactoryParserFactoryBean extends SingletonFactoryBean<ConfigurableConstraintExceptionFactory> {
  48. private DatabaseConstraintExceptionFactory defaultFactory;
  49. private Collection<ExceptionFactoryMapping> exceptionMappings;
  50. public void setDefaultFactory(DatabaseConstraintExceptionFactory defaultFactory) {
  51. this.defaultFactory = defaultFactory;
  52. }
  53. @Required
  54. public void setExceptionMappings(Collection<ExceptionFactoryMapping> exceptionMappings) {
  55. this.exceptionMappings = exceptionMappings;
  56. }
  57. @Override
  58. protected ConfigurableConstraintExceptionFactory createObject() throws Exception {
  59. ConfigurableConstraintExceptionFactory factory = instantateFactory();
  60. return registerMappings(factory);
  61. }
  62. private ConfigurableConstraintExceptionFactory instantateFactory() {
  63. return defaultFactory != null ? new ConfigurableConstraintExceptionFactory(defaultFactory) : new ConfigurableConstraintExceptionFactory();
  64. }
  65. private ConfigurableConstraintExceptionFactory registerMappings(ConfigurableConstraintExceptionFactory factory) {
  66. for (ExceptionFactoryMapping exceptionMapping : exceptionMappings) {
  67. factory.registerMapping(exceptionMapping);
  68. }
  69. return factory;
  70. }
  71. }
  72. @Override
  73. protected boolean shouldGenerateIdAsFallback() {
  74. return true;
  75. }
  76. }