View Javadoc

1   /*
2    * $Id: TestComponentDefinitionParser.java 12017 2008-06-12 09:04:04Z rossmason $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  package org.mule.tck.config;
11  
12  import org.mule.api.lifecycle.Disposable;
13  import org.mule.api.lifecycle.Initialisable;
14  import org.mule.component.DefaultJavaComponent;
15  import org.mule.config.spring.parsers.specific.ComponentDefinitionParser;
16  import org.mule.object.AbstractObjectFactory;
17  import org.mule.object.SingletonObjectFactory;
18  import org.mule.tck.functional.EventCallback;
19  import org.mule.tck.functional.FunctionalTestComponent;
20  import org.mule.util.ClassUtils;
21  import org.mule.util.IOUtils;
22  import org.mule.util.StringUtils;
23  
24  import java.io.IOException;
25  import java.util.HashMap;
26  import java.util.Map;
27  
28  import org.springframework.beans.factory.BeanCreationException;
29  import org.springframework.beans.factory.support.AbstractBeanDefinition;
30  import org.springframework.beans.factory.support.BeanDefinitionBuilder;
31  import org.springframework.beans.factory.support.GenericBeanDefinition;
32  import org.springframework.beans.factory.xml.ParserContext;
33  import org.w3c.dom.Element;
34  import org.w3c.dom.Node;
35  import org.w3c.dom.NodeList;
36  
37  /**
38   * Configures a FunctionalTestComponent wrapped as a JavaComponent.  Theis parser provides a short form way of
39   * configuring a test component in Mule.
40   */
41  public class TestComponentDefinitionParser extends ComponentDefinitionParser
42  {
43      private static Class OBJECT_FACTORY_TYPE = SingletonObjectFactory.class;
44      private Class componentInstanceClass = FunctionalTestComponent.class;
45  
46      public TestComponentDefinitionParser()
47      {
48          super(DefaultJavaComponent.class);
49          addIgnored("appendString");
50          addIgnored("enableMessageHistory");
51          addIgnored("enableNotifications");
52          addIgnored("throwException");
53          addIgnored("exceptionToThrow");
54          addIgnored("waitTime");
55          addIgnored("doInboundTransform");
56      }
57  
58      protected void parseChild(Element element, ParserContext parserContext, BeanDefinitionBuilder builder)
59      {
60          Element parent = (Element) element.getParentNode();
61          String serviceName = parent.getAttribute(ATTRIBUTE_NAME);
62          builder.addPropertyReference("service", serviceName);
63  
64          // Create a BeanDefinition for the nested object factory and set it a
65          // property value for the component
66          AbstractBeanDefinition objectFactoryBeanDefinition = new GenericBeanDefinition();
67          objectFactoryBeanDefinition.setBeanClass(OBJECT_FACTORY_TYPE);
68          objectFactoryBeanDefinition.getPropertyValues().addPropertyValue(AbstractObjectFactory.ATTRIBUTE_OBJECT_CLASS,
69                  componentInstanceClass);
70          objectFactoryBeanDefinition.setInitMethodName(Initialisable.PHASE_NAME);
71          objectFactoryBeanDefinition.setDestroyMethodName(Disposable.PHASE_NAME);
72          Map props = new HashMap();
73          for (int i = 0; i < element.getAttributes().getLength(); i++)
74          {
75              Node n = element.getAttributes().item(i);
76                  props.put(n.getLocalName(), n.getNodeValue());
77          }
78          String returnData = null;
79  
80          NodeList list = element.getChildNodes();
81          for (int i = 0; i < list.getLength(); i++)
82          {
83              if ("return-data".equals(list.item(i).getLocalName()))
84              {
85                  Element rData = (Element) list.item(i);
86                  if (StringUtils.isNotEmpty(rData.getAttribute("file")))
87                  {
88                      String file = rData.getAttribute("file");
89                      try
90                      {
91                          returnData = IOUtils.getResourceAsString(file, getClass());
92                      }
93                      catch (IOException e)
94                      {
95                          throw new BeanCreationException("Failed to load test-data resource: " + file, e);
96                      }
97                  }
98                  else
99                  {
100                     returnData = rData.getTextContent();
101                 }
102             }
103             else if ("callback".equals(list.item(i).getLocalName()))
104             {
105                 Element ele = (Element) list.item(i);
106                 String c = ele.getAttribute("class");
107                 try
108                 {
109                     EventCallback cb = (EventCallback)ClassUtils.instanciateClass(c, ClassUtils.NO_ARGS);
110                     props.put("eventCallback", cb);
111 
112                 }
113                 catch (Exception e)
114                 {
115                     throw new BeanCreationException("Failed to load event-callback: " + c, e);
116                 }
117             }
118 
119         }
120 
121         if (returnData != null)
122         {
123             props.put("returnData", returnData);
124         }
125         objectFactoryBeanDefinition.getPropertyValues().addPropertyValue("properties", props);
126 
127         builder.addPropertyValue("objectFactory", objectFactoryBeanDefinition);
128 
129         super.parseChild(element, parserContext, builder);
130     }
131 
132 }