1
2
3
4
5
6
7
8
9
10 package org.mule.transport.ajax;
11
12 import org.mule.api.MuleEvent;
13 import org.mule.api.MuleException;
14 import org.mule.api.MuleMessage;
15 import org.mule.api.endpoint.EndpointBuilder;
16 import org.mule.api.endpoint.OutboundEndpoint;
17 import org.mule.api.transformer.Transformer;
18 import org.mule.api.transport.Connector;
19 import org.mule.endpoint.EndpointURIEndpointBuilder;
20 import org.mule.transport.DefaultReplyToHandler;
21
22 import java.util.List;
23
24 import org.cometd.Channel;
25 import org.cometd.Client;
26 import org.mortbay.cometd.AbstractBayeux;
27
28
29
30
31
32 public class AjaxReplyToHandler extends DefaultReplyToHandler
33 {
34
35
36
37 private static final long serialVersionUID = 1L;
38
39 public AjaxReplyToHandler(Connector connector)
40 {
41 super(connector.getMuleContext());
42 this.connector = connector;
43 }
44
45 @Override
46 public void processReplyTo(MuleEvent event, MuleMessage returnMessage, Object replyTo) throws MuleException
47 {
48 AbstractBayeux bayeux = ((BayeuxAware)connector).getBayeux();
49 Channel channel = bayeux.getChannel(replyTo.toString(), false);
50 if(channel==null)
51 {
52 logger.warn("No ajax Channel: " + replyTo + ". Maybe the client unregistered interest.");
53 return;
54 }
55
56 Object ret;
57 if(returnMessage.getExceptionPayload()!=null)
58 {
59
60 ret = returnMessage.getExceptionPayload().getMessage();
61 }
62 else
63 {
64 EndpointBuilder endpointBuilder = new EndpointURIEndpointBuilder(event.getMessageSourceURI().toString(), muleContext);
65 endpointBuilder.setConnector(connector);
66 OutboundEndpoint tempEndpoint = muleContext.getEndpointFactory().getOutboundEndpoint(endpointBuilder);
67
68 List<Transformer> defaultTransportTransformers = ((org.mule.transport.AbstractConnector) connector).getDefaultOutboundTransformers(tempEndpoint);
69
70 returnMessage.applyTransformers(event, defaultTransportTransformers);
71
72 ret = returnMessage.getPayload();
73 }
74
75 for (Client client : channel.getSubscribers())
76 {
77 channel.publish(client, ret, null);
78 }
79 }
80 }