View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.enricher;
8   
9   import org.mule.RequestContext;
10  import org.mule.api.MuleEvent;
11  import org.mule.api.MuleException;
12  import org.mule.api.MuleMessage;
13  import org.mule.api.expression.ExpressionManager;
14  import org.mule.api.processor.MessageProcessor;
15  import org.mule.processor.AbstractMessageProcessorOwner;
16  import org.mule.util.StringUtils;
17  
18  import java.util.ArrayList;
19  import java.util.Collections;
20  import java.util.List;
21  
22  public class MessageEnricher extends AbstractMessageProcessorOwner implements MessageProcessor
23  {
24  
25      private List<EnrichExpressionPair> enrichExpressionPairs = new ArrayList<EnrichExpressionPair>();
26  
27      private MessageProcessor enrichmentProcessor;
28  
29      public MuleEvent process(MuleEvent event) throws MuleException
30      {
31          ExpressionManager expressionManager = event.getMuleContext().getExpressionManager();
32          MuleEvent enrichmentEvent = enrichmentProcessor.process(RequestContext.setEvent(event));
33  
34          if (enrichmentEvent != null)
35          {
36              for (EnrichExpressionPair pair : enrichExpressionPairs)
37              {
38                  enrich(event.getMessage(), enrichmentEvent.getMessage(), pair.getSource(), pair.getTarget(),
39                      expressionManager);
40              }
41          }
42          return event;
43      }
44  
45      protected void enrich(MuleMessage currentMessage,
46                            MuleMessage enrichmentMessage,
47                            String sourceExpressionArg,
48                            String targetExpressionArg,
49                            ExpressionManager expressionManager)
50      {
51          if (StringUtils.isEmpty(sourceExpressionArg))
52          {
53              sourceExpressionArg = "#[payload]";
54          }
55  
56          Object enrichmentObject = expressionManager.evaluate(sourceExpressionArg, enrichmentMessage);
57          if (enrichmentObject instanceof MuleMessage)
58          {
59              enrichmentObject = ((MuleMessage) enrichmentObject).getPayload();
60          }
61  
62          if (!StringUtils.isEmpty(targetExpressionArg))
63          {
64              expressionManager.enrich(targetExpressionArg, currentMessage, enrichmentObject);
65          }
66          else
67          {
68              currentMessage.setPayload(enrichmentObject);
69          }
70      }
71  
72      public void setEnrichmentMessageProcessor(MessageProcessor enrichmentProcessor)
73      {
74          this.enrichmentProcessor = enrichmentProcessor;
75      }
76  
77      /**
78       * For spring
79       */
80      public void setMessageProcessor(MessageProcessor enrichmentProcessor)
81      {
82          this.enrichmentProcessor = enrichmentProcessor;
83      }
84  
85      public void setEnrichExpressionPairs(List<EnrichExpressionPair> enrichExpressionPairs)
86      {
87          this.enrichExpressionPairs = enrichExpressionPairs;
88      }
89  
90      public void addEnrichExpressionPair(EnrichExpressionPair pair)
91      {
92          this.enrichExpressionPairs.add(pair);
93      }
94  
95      public static class EnrichExpressionPair
96      {
97  
98          private String source;
99          private String target;
100 
101         public EnrichExpressionPair()
102         {
103             // for spring
104         }
105 
106         public EnrichExpressionPair(String target)
107         {
108             this.target = target;
109         }
110 
111         public EnrichExpressionPair(String source, String target)
112         {
113             this.source = source;
114             this.target = target;
115         }
116 
117         public String getSource()
118         {
119             return source;
120         }
121 
122         public void setSource(String source)
123         {
124             this.source = source;
125         }
126 
127         public String getTarget()
128         {
129             return target;
130         }
131 
132         public void setTarget(String target)
133         {
134             this.target = target;
135         }
136     }
137 
138     @Override
139     protected List<MessageProcessor> getOwnedMessageProcessors()
140     {
141         return Collections.singletonList(enrichmentProcessor);
142     }
143 }