Coverage Report - org.doxla.spring.automock.xml.namespace.BasicAutoMockBeanDefinitionParser
 
Classes in this File Line Coverage Branch Coverage Complexity
BasicAutoMockBeanDefinitionParser
100% 
100% 
0
 
 1  
 package org.doxla.spring.automock.xml.namespace;
 2  
 
 3  
 import org.doxla.spring.automock.AutoMockExposingPostProcessor;
 4  
 import org.doxla.spring.automock.resolver.MockClassResolver;
 5  
 import org.springframework.beans.factory.config.BeanDefinition;
 6  
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 7  
 import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
 8  
 import org.springframework.beans.factory.xml.ParserContext;
 9  
 import org.springframework.context.ApplicationContext;
 10  
 import org.w3c.dom.Element;
 11  
 
 12  
 /**
 13  
  * Does all the work involved in registering a {@link AutoMockExposingPostProcessor} and the {@link MockClassResolver} into 
 14  
  * the Spring {@link ApplicationContext} it is defined in.
 15  
  * 
 16  
  * @see AutoMockExposingPostProcessor
 17  
  * @see MockClassResolver
 18  
  * @see NamespaceElement
 19  
 
 20  
  * @author danoxlade
 21  
  */
 22  
 public class BasicAutoMockBeanDefinitionParser
 23  
         extends AbstractBeanDefinitionParser{
 24  
         
 25  
         /**
 26  
          * The Spring bean name of the {@link AutoMockExposingPostProcessor} exposed when using the "automock" namespace.
 27  
          */
 28  
         public static final String AUTOMOCK_POST_PROCESSOR_BEAN_NAME = "org.doxla.spring.automock.AutoMockPostProcessorBean";
 29  
         
 30  
         private static final String MOCK_CLASS_RESOLVER = "mockClassResolver";
 31  
         private final NamespaceElement autoMockSchemaElement;
 32  
 
 33  
         /**
 34  
          * @param element The {@link NamespaceElement} which defines which {@link MockClassResolver} the exposed 
 35  
          * {@link AutoMockExposingPostProcessor} bean should use as a strategy.
 36  
          * 
 37  
          * @see AutoMockExposingPostProcessor
 38  
          * @see NamespaceElement
 39  
          */
 40  5
         public BasicAutoMockBeanDefinitionParser(NamespaceElement element) {
 41  5
                 this.autoMockSchemaElement = element;
 42  5
         }
 43  
 
 44  
         /**
 45  
          * Handle the 'automock:elementNameHere' XML Element
 46  
          */
 47  
         @Override
 48  
         protected BeanDefinition parseInternal(Element element, ParserContext parserContext) {
 49  1
                 element.setAttribute(ID_ATTRIBUTE,AUTOMOCK_POST_PROCESSOR_BEAN_NAME);
 50  
                 
 51  1
                 registerMockClassResolverBean(element,parserContext);
 52  
                 
 53  1
                 BeanDefinitionBuilder postProcessorDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(getPostProcessorBeanClass());
 54  1
                 postProcessorDefinitionBuilder.addPropertyReference(MOCK_CLASS_RESOLVER, MOCK_CLASS_RESOLVER);
 55  
                 
 56  1
                 return postProcessorDefinitionBuilder.getBeanDefinition();
 57  
         }
 58  
 
 59  
         /**
 60  
          * Work out which {@link MockClassResolver} instance to use and register it with Spring
 61  
          * 
 62  
          * @param element
 63  
          * @param parserContext
 64  
          */
 65  
         private void registerMockClassResolverBean(Element element, ParserContext parserContext) {
 66  1
                 BeanDefinitionBuilder strategyDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(getStrategyBeanClass());
 67  
                 
 68  2
                 for(String[] propertyName : this.autoMockSchemaElement.propertyToAttributeMappings()){
 69  1
                         strategyDefinitionBuilder.addPropertyValue(propertyName[0], element.getAttribute( propertyName[1] ));
 70  
                 }
 71  1
                 parserContext.getRegistry().registerBeanDefinition(MOCK_CLASS_RESOLVER,strategyDefinitionBuilder.getBeanDefinition());
 72  1
         }
 73  
 
 74  
         private Class getPostProcessorBeanClass() {
 75  1
                 return AutoMockExposingPostProcessor.class;
 76  
         }
 77  
         
 78  
         private Class<? extends MockClassResolver> getStrategyBeanClass() {
 79  1
                 return this.autoMockSchemaElement.getStrategyClass();
 80  
         }
 81  
 
 82  
 }