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