1
2
3
4
5
6
7
8
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
39
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
65
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 }