1
2
3
4
5
6
7 package org.mule.transport.polling;
8
9 import org.mule.DefaultMuleEvent;
10 import org.mule.DefaultMuleMessage;
11 import org.mule.api.MuleEvent;
12 import org.mule.api.MuleMessage;
13 import org.mule.api.construct.FlowConstruct;
14 import org.mule.api.endpoint.ImmutableEndpoint;
15 import org.mule.api.endpoint.InboundEndpoint;
16 import org.mule.api.endpoint.OutboundEndpoint;
17 import org.mule.api.lifecycle.CreateException;
18 import org.mule.api.lifecycle.InitialisationException;
19 import org.mule.api.processor.MessageProcessor;
20 import org.mule.api.transport.Connector;
21 import org.mule.config.i18n.CoreMessages;
22 import org.mule.session.DefaultMuleSession;
23 import org.mule.transport.AbstractConnector;
24 import org.mule.transport.AbstractPollingMessageReceiver;
25 import org.mule.transport.NullPayload;
26 import org.mule.util.StringUtils;
27
28 import java.util.Map;
29
30 public class MessageProcessorPollingMessageReceiver extends AbstractPollingMessageReceiver
31 {
32 public static final String SOURCE_MESSAGE_PROCESSOR_PROPERTY_NAME = "sourceMessageProcessor";
33
34 protected MessageProcessor sourceMessageProcessor;
35
36 public MessageProcessorPollingMessageReceiver(Connector connector,
37 FlowConstruct flowConstruct,
38 InboundEndpoint endpoint) throws CreateException
39 {
40 super(connector, flowConstruct, endpoint);
41 }
42
43 @Override
44 protected void doInitialise() throws InitialisationException
45 {
46 super.doInitialise();
47
48 sourceMessageProcessor = (MessageProcessor) endpoint.getProperty(SOURCE_MESSAGE_PROCESSOR_PROPERTY_NAME);
49
50 if (sourceMessageProcessor instanceof OutboundEndpoint
51 && !((OutboundEndpoint) sourceMessageProcessor).getExchangePattern().hasResponse())
52 {
53
54 throw new InitialisationException(CoreMessages.createStaticMessage(String.format(
55 "The endpoint %s does not return responses and therefore can't be used for polling.",
56 sourceMessageProcessor)), this);
57 }
58
59 Long tempPolling = (Long) endpoint.getProperties().get(AbstractConnector.PROPERTY_POLLING_FREQUENCY);
60 if (tempPolling != null)
61 {
62 setFrequency(tempPolling);
63 }
64 }
65
66 @Override
67 public void poll() throws Exception
68 {
69 MuleMessage request = new DefaultMuleMessage(StringUtils.EMPTY, (Map<String, Object>) null,
70 connector.getMuleContext());
71 ImmutableEndpoint ep = endpoint;
72 if (sourceMessageProcessor instanceof ImmutableEndpoint)
73 {
74 ep = (ImmutableEndpoint) sourceMessageProcessor;
75 }
76
77 MuleEvent event = new DefaultMuleEvent(request, ep, new DefaultMuleSession(flowConstruct,
78 connector.getMuleContext()));
79
80 MuleEvent sourceEvent = sourceMessageProcessor.process(event);
81 if (isNewMessage(sourceEvent))
82 {
83 routeMessage(sourceEvent.getMessage());
84 }
85 else
86 {
87
88 logger.info(String.format("Polling of '%s' returned null, the flow will not be invoked.",
89 sourceMessageProcessor));
90 }
91 }
92
93
94
95 protected boolean isNewMessage(MuleEvent sourceEvent)
96 {
97 if (sourceEvent != null && sourceEvent.getMessage() != null)
98 {
99 MuleMessage message = sourceEvent.getMessage();
100 if (message.getPayload().equals(NullPayload.getInstance()))
101 {
102 return false;
103 }
104 else
105 {
106 return true;
107 }
108 }
109 return false;
110 }
111 }