1
2
3
4
5
6
7
8
9
10
11 package org.mule.config.spring.parsers.specific;
12
13 import org.mule.config.spring.parsers.assembly.BeanAssembler;
14 import org.mule.config.spring.parsers.assembly.BeanAssemblerFactory;
15 import org.mule.config.spring.parsers.assembly.DefaultBeanAssembler;
16 import org.mule.config.spring.parsers.assembly.DefaultBeanAssemblerFactory;
17 import org.mule.config.spring.parsers.assembly.configuration.PropertyConfiguration;
18 import org.mule.config.spring.parsers.generic.ParentDefinitionParser;
19 import org.mule.routing.MessageFilter;
20
21 import java.util.List;
22
23 import org.springframework.beans.MutablePropertyValues;
24 import org.springframework.beans.PropertyValue;
25 import org.springframework.beans.factory.config.BeanDefinition;
26 import org.springframework.beans.factory.config.RuntimeBeanReference;
27 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
28 import org.springframework.beans.factory.support.ManagedList;
29 import org.w3c.dom.Element;
30
31
32
33
34
35 public class FilterRefDefinitionParser extends ParentDefinitionParser
36 {
37 public static final String FILTER = "filter";
38
39 @Override
40 protected void preProcess(Element element)
41 {
42 super.preProcess(element);
43 if (isWrapWithMessageFilter(element))
44 {
45 setBeanAssemblerFactory(new MessageProcessorWrappingBeanAssemblerFactory());
46 addAlias(ATTRIBUTE_REF, "messageProcessor");
47 }
48 else
49 {
50 setBeanAssemblerFactory(new DefaultBeanAssemblerFactory());
51 addAlias(ATTRIBUTE_REF, FILTER);
52 }
53 }
54
55 private boolean isWrapWithMessageFilter(Element e)
56 {
57 String parentName = e.getParentNode().getLocalName().toLowerCase();
58 String grandParentName = e.getParentNode().getParentNode().getLocalName().toLowerCase();
59
60 return !("message-filter".equals(parentName) || "and-filter".equals(parentName)
61 || "or-filter".equals(parentName) || "not-filter".equals(parentName)
62 || "outbound".equals(grandParentName) || "selective-consumer-router".equals(parentName)
63 || "error-filter".equals(parentName) || "when".equals(parentName));
64 }
65
66 private static class MessageProcessorWrappingBeanAssemblerFactory implements BeanAssemblerFactory
67 {
68 @Override
69 public BeanAssembler newBeanAssembler(PropertyConfiguration beanConfig,
70 BeanDefinitionBuilder bean,
71 PropertyConfiguration targetConfig,
72 BeanDefinition target)
73 {
74 return new MessageProcessorWrappingBeanAssembler(beanConfig, bean, targetConfig, target);
75 }
76 }
77
78 private static class MessageProcessorWrappingBeanAssembler extends DefaultBeanAssembler
79 {
80 public MessageProcessorWrappingBeanAssembler(PropertyConfiguration beanConfig,
81 BeanDefinitionBuilder bean,
82 PropertyConfiguration targetConfig,
83 BeanDefinition target)
84 {
85 super(beanConfig, bean, targetConfig, target);
86 }
87
88 @Override
89 public void copyBeanToTarget()
90 {
91 String oldName = "messageProcessor";
92 assertTargetPresent();
93 String newName = bestGuessName(targetConfig, oldName, target.getBeanClassName());
94 MutablePropertyValues targetProperties = target.getPropertyValues();
95 MutablePropertyValues beanProperties = bean.getBeanDefinition().getPropertyValues();
96 Object value = beanProperties.getPropertyValue(newName).getValue();
97 RuntimeBeanReference ref = (RuntimeBeanReference) ((ManagedList<?>) value).get(0);
98
99 BeanDefinitionBuilder messageFilter = BeanDefinitionBuilder.genericBeanDefinition(MessageFilter.class);
100 messageFilter.addPropertyValue(FILTER, ref);
101
102 PropertyValue pv = targetProperties.getPropertyValue(newName);
103 Object oldValue = null == pv ? null : pv.getValue();
104
105 if (oldValue == null)
106 {
107 oldValue = new ManagedList<Object>();
108 pv = new PropertyValue(newName, oldValue);
109 targetProperties.addPropertyValue(pv);
110 }
111 if (targetConfig.isCollection(oldName))
112 {
113 List list = retrieveList(oldValue);
114 list.add(messageFilter.getBeanDefinition());
115 }
116 else
117 {
118 targetProperties.addPropertyValue(newName, messageFilter.getBeanDefinition());
119 }
120 }
121 }
122
123 }