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.endpoint;
8   
9   import org.mule.api.MuleException;
10  import org.mule.api.config.ConfigurationException;
11  import org.mule.api.construct.FlowConstruct;
12  import org.mule.api.endpoint.EndpointMessageProcessorChainFactory;
13  import org.mule.api.endpoint.InboundEndpoint;
14  import org.mule.api.endpoint.OutboundEndpoint;
15  import org.mule.api.processor.MessageProcessor;
16  import org.mule.api.transport.Connector;
17  import org.mule.config.i18n.MessageFactory;
18  import org.mule.endpoint.inbound.InboundEndpointMimeTypeCheckingMessageProcessor;
19  import org.mule.endpoint.inbound.InboundEndpointPropertyMessageProcessor;
20  import org.mule.endpoint.inbound.InboundExceptionDetailsMessageProcessor;
21  import org.mule.endpoint.inbound.InboundLoggingMessageProcessor;
22  import org.mule.endpoint.inbound.InboundNotificationMessageProcessor;
23  import org.mule.endpoint.outbound.OutboundEndpointMimeTypeCheckingMessageProcessor;
24  import org.mule.endpoint.outbound.OutboundEndpointPropertyMessageProcessor;
25  import org.mule.endpoint.outbound.OutboundEventTimeoutMessageProcessor;
26  import org.mule.endpoint.outbound.OutboundLoggingMessageProcessor;
27  import org.mule.endpoint.outbound.OutboundResponsePropertiesMessageProcessor;
28  import org.mule.endpoint.outbound.OutboundRewriteResponseEventMessageProcessor;
29  import org.mule.endpoint.outbound.OutboundSessionHandlerMessageProcessor;
30  import org.mule.lifecycle.processor.ProcessIfStartedMessageProcessor;
31  import org.mule.processor.ExceptionHandlingMessageProcessor;
32  import org.mule.processor.TransactionalInterceptingMessageProcessor;
33  import org.mule.processor.chain.DefaultMessageProcessorChainBuilder;
34  import org.mule.routing.requestreply.ReplyToMessageProcessor;
35  
36  import java.util.ArrayList;
37  import java.util.List;
38  
39  public class DefaultEndpointMessageProcessorChainFactory implements EndpointMessageProcessorChainFactory
40  {
41      /** Override this method to change the default MessageProcessors. */
42      protected List<MessageProcessor> createInboundMessageProcessors(InboundEndpoint endpoint)
43      {
44          List<MessageProcessor> list = new ArrayList<MessageProcessor>();
45  
46          list.add(new ExceptionHandlingMessageProcessor());
47          list.add(new InboundEndpointMimeTypeCheckingMessageProcessor(endpoint));
48          list.add(new InboundEndpointPropertyMessageProcessor(endpoint));
49          list.add(new InboundNotificationMessageProcessor(endpoint));
50          list.add(new InboundLoggingMessageProcessor(endpoint));
51  
52          return list;
53      }
54      
55      /** Override this method to change the default MessageProcessors. */
56      protected List<MessageProcessor> createInboundResponseMessageProcessors(InboundEndpoint endpoint)
57      {
58          List<MessageProcessor> list = new ArrayList<MessageProcessor>();
59          list.add(new ExceptionHandlingMessageProcessor());
60          list.add(new ReplyToMessageProcessor());
61          list.add(new InboundExceptionDetailsMessageProcessor(endpoint.getConnector()));
62  
63          return list;
64      }
65      
66      /** Override this method to change the default MessageProcessors. */
67      protected List<MessageProcessor> createOutboundMessageProcessors(OutboundEndpoint endpoint) throws MuleException
68      {
69          Connector connector = endpoint.getConnector();
70  
71          List<MessageProcessor> list = new ArrayList<MessageProcessor>();
72  
73          // Log but don't proceed if connector is not started
74          list.add(new OutboundLoggingMessageProcessor());
75          list.add(new ProcessIfStartedMessageProcessor(connector, connector.getLifecycleState()));
76  
77          // Everything is processed within TransactionTemplate
78          list.add(new TransactionalInterceptingMessageProcessor(endpoint.getTransactionConfig()));
79  
80          list.add(new OutboundEventTimeoutMessageProcessor());
81  
82          list.add(new OutboundSessionHandlerMessageProcessor(connector.getSessionHandler()));
83          list.add(new OutboundEndpointPropertyMessageProcessor());
84          list.add(new OutboundResponsePropertiesMessageProcessor(endpoint));
85          list.add(new OutboundEndpointMimeTypeCheckingMessageProcessor(endpoint));
86  
87          return list;
88      }
89      
90      /** Override this method to change the default MessageProcessors. */
91      protected List<MessageProcessor> createOutboundResponseMessageProcessors(OutboundEndpoint endpoint) throws MuleException
92      {
93          List<MessageProcessor> list = new ArrayList<MessageProcessor>();
94  
95          list.add(new OutboundRewriteResponseEventMessageProcessor());
96  
97          return list;
98      }
99      
100     public MessageProcessor createInboundMessageProcessorChain(InboundEndpoint endpoint, FlowConstruct flowConstruct, MessageProcessor target) throws MuleException
101     {
102         // -- REQUEST CHAIN --
103         DefaultMessageProcessorChainBuilder requestChainBuilder = new EndpointMessageProcessorChainBuilder(endpoint, flowConstruct);
104         requestChainBuilder.setName("InboundEndpoint '" + endpoint.getEndpointURI().getUri() + "' request chain");
105         // Default MPs
106         requestChainBuilder.chain(createInboundMessageProcessors(endpoint));
107         // Configured MPs (if any)
108         requestChainBuilder.chain(endpoint.getMessageProcessors());
109         
110         // -- INVOKE SERVICE --
111         if (target == null)
112         {
113             throw new ConfigurationException(MessageFactory.createStaticMessage("No listener (target) has been set for this endpoint"));
114         }
115         requestChainBuilder.chain(target);
116 
117         // -- RESPONSE CHAIN --
118         DefaultMessageProcessorChainBuilder responseChainBuilder = new EndpointMessageProcessorChainBuilder(endpoint, flowConstruct);
119         responseChainBuilder.setName("InboundEndpoint '" + endpoint.getEndpointURI().getUri() + "' response chain");
120         // Default MPs
121         responseChainBuilder.chain(createInboundResponseMessageProcessors(endpoint));
122         // Configured MPs (if any)
123         responseChainBuilder.chain(endpoint.getResponseMessageProcessors());
124 
125         // Compose request and response chains. We do this so that if the request
126         // chain returns early the response chain is still invoked.
127         DefaultMessageProcessorChainBuilder compositeChainBuilder = new EndpointMessageProcessorChainBuilder(endpoint, flowConstruct);
128         compositeChainBuilder.setName("InboundEndpoint '"+ endpoint.getEndpointURI().getUri() +"' composite request/response chain");
129         compositeChainBuilder.chain(requestChainBuilder.build(), responseChainBuilder.build());
130         return compositeChainBuilder.build();
131     }
132 
133     public MessageProcessor createOutboundMessageProcessorChain(OutboundEndpoint endpoint, FlowConstruct flowConstruct, MessageProcessor target) throws MuleException
134     {
135         // -- REQUEST CHAIN --
136         DefaultMessageProcessorChainBuilder outboundChainBuilder = new EndpointMessageProcessorChainBuilder(endpoint, flowConstruct);
137         outboundChainBuilder.setName("OutboundEndpoint '" + endpoint.getEndpointURI().getUri() + "' request chain");
138         // Default MPs
139         outboundChainBuilder.chain(createOutboundMessageProcessors(endpoint));
140         // Configured MPs (if any)
141         outboundChainBuilder.chain(endpoint.getMessageProcessors());
142         
143         // -- OUTBOUND ROUTER --
144         if (target == null)
145         {
146             throw new ConfigurationException(MessageFactory.createStaticMessage("No listener (target) has been set for this endpoint"));
147         }
148         outboundChainBuilder.chain(target);
149         
150         // -- RESPONSE CHAIN --
151         DefaultMessageProcessorChainBuilder responseChainBuilder = new EndpointMessageProcessorChainBuilder(endpoint, flowConstruct);
152         responseChainBuilder.setName("OutboundEndpoint '" + endpoint.getEndpointURI().getUri() + "' response chain");
153         // Default MPs
154         responseChainBuilder.chain(createOutboundResponseMessageProcessors(endpoint));
155         // Configured MPs (if any)
156         responseChainBuilder.chain(endpoint.getResponseMessageProcessors());
157 
158         // Compose request and response chains. We do this so that if the request
159         // chain returns early the response chain is still invoked.
160         DefaultMessageProcessorChainBuilder compositeChainBuilder = new EndpointMessageProcessorChainBuilder(endpoint, flowConstruct);
161         compositeChainBuilder.setName("OutboundEndpoint '" + endpoint.getEndpointURI().getUri() + "' composite request/response chain");
162         compositeChainBuilder.chain(outboundChainBuilder.build(), responseChainBuilder.build());
163         return compositeChainBuilder.build();
164     }
165     
166 }
167 
168