1
2
3
4
5
6
7
8
9
10
11 package org.mule.config.spring.parsers.specific;
12
13 import org.mule.api.lifecycle.Disposable;
14 import org.mule.api.lifecycle.Initialisable;
15 import org.mule.component.DefaultJavaComponent;
16 import org.mule.object.AbstractObjectFactory;
17 import org.mule.object.SingletonObjectFactory;
18
19 import java.util.HashMap;
20 import java.util.Map;
21
22 import org.springframework.beans.factory.support.AbstractBeanDefinition;
23 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
24 import org.springframework.beans.factory.support.GenericBeanDefinition;
25 import org.springframework.beans.factory.xml.ParserContext;
26 import org.w3c.dom.Element;
27 import org.w3c.dom.NamedNodeMap;
28 import org.w3c.dom.Node;
29
30
31
32
33
34
35
36
37
38
39
40
41 public class SimpleComponentDefinitionParser extends ComponentDefinitionParser
42 {
43 private static Class OBJECT_FACTORY_TYPE = SingletonObjectFactory.class;
44 private Class componentInstanceClass;
45 private Map properties = new HashMap();
46
47 public SimpleComponentDefinitionParser(Class component, Class componentInstanceClass)
48 {
49 super(DefaultJavaComponent.class);
50 this.componentInstanceClass = componentInstanceClass;
51 }
52
53 @Override
54 protected void preProcess(Element element)
55 {
56 super.preProcess(element);
57
58 NamedNodeMap attrs = element.getAttributes();
59
60 int numAttrs = attrs.getLength();
61 Node attr;
62 for (int i = numAttrs-1; i >= 0; --i)
63 {
64 attr = attrs.item(i);
65 if (attr.getNamespaceURI() == null)
66 {
67 properties.put(attr.getNodeName(), attr.getNodeValue());
68 attrs.removeNamedItem(attr.getNodeName());
69 }
70 }
71 }
72
73 protected void parseChild(Element element, ParserContext parserContext, BeanDefinitionBuilder builder)
74 {
75
76
77 builder.addPropertyValue("objectFactory", getObjectFactoryDefinition(element));
78
79 super.parseChild(element, parserContext, builder);
80 }
81
82 protected AbstractBeanDefinition getObjectFactoryDefinition(Element element)
83 {
84 AbstractBeanDefinition objectFactoryBeanDefinition = new GenericBeanDefinition();
85 objectFactoryBeanDefinition.setBeanClass(OBJECT_FACTORY_TYPE);
86 objectFactoryBeanDefinition.getPropertyValues()
87 .addPropertyValue(AbstractObjectFactory.ATTRIBUTE_OBJECT_CLASS, componentInstanceClass);
88 objectFactoryBeanDefinition.getPropertyValues().addPropertyValue("properties", properties);
89
90
91 objectFactoryBeanDefinition.setInitMethodName(Initialisable.PHASE_NAME);
92 objectFactoryBeanDefinition.setDestroyMethodName(Disposable.PHASE_NAME);
93 return objectFactoryBeanDefinition;
94 }
95 }