View Javadoc

1   /*
2    * $Id: FilterRefDefinitionParser.java 23006 2011-09-22 05:51:15Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.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  
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   * This allows a filter to be defined globally, or embedded within an endpoint. IF required the filter is
33   * wrapped in MessageFilter instance before being injected into the parent.
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 }