1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.xmpp;
12
13 import org.mule.DefaultMuleMessage;
14 import org.mule.api.MuleEvent;
15 import org.mule.api.MuleMessage;
16 import org.mule.api.endpoint.EndpointURI;
17 import org.mule.api.endpoint.OutboundEndpoint;
18 import org.mule.transport.AbstractMessageDispatcher;
19
20 import org.jivesoftware.smack.Chat;
21 import org.jivesoftware.smack.GroupChat;
22 import org.jivesoftware.smack.XMPPConnection;
23 import org.jivesoftware.smack.packet.Message;
24
25
26
27
28
29 public class XmppMessageDispatcher extends AbstractMessageDispatcher
30 {
31 private final XmppConnector connector;
32 private volatile XMPPConnection xmppConnection = null;
33 private volatile Chat chat;
34 private volatile GroupChat groupChat;
35
36 public XmppMessageDispatcher(OutboundEndpoint endpoint)
37 {
38 super(endpoint);
39 this.connector = (XmppConnector)endpoint.getConnector();
40 }
41
42 protected void doConnect() throws Exception
43 {
44 if (xmppConnection == null)
45 {
46 EndpointURI uri = endpoint.getEndpointURI();
47 xmppConnection = connector.createXmppConnection(uri);
48 }
49 }
50
51 protected void doDisconnect() throws Exception
52 {
53 try
54 {
55 if (groupChat != null)
56 {
57 groupChat.leave();
58 }
59 if (xmppConnection != null)
60 {
61 xmppConnection.close();
62 }
63 }
64 finally
65 {
66 xmppConnection = null;
67 }
68 }
69
70 protected void doDispose()
71 {
72
73 }
74
75 protected void doDispatch(MuleEvent event) throws Exception
76 {
77 sendMessage(event);
78 }
79
80 protected MuleMessage doSend(MuleEvent event) throws Exception
81 {
82 sendMessage(event);
83
84 if (useRemoteSync(event))
85 {
86 Message response;
87
88 if (groupChat != null)
89 {
90 response = groupChat.nextMessage(event.getTimeout());
91 }
92 else
93 {
94 response = chat.nextMessage(event.getTimeout());
95 }
96
97 if (response != null)
98 {
99 if (logger.isDebugEnabled())
100 {
101 logger.debug("Got a response from chat: " + chat);
102 }
103 return new DefaultMuleMessage(connector.getMessageAdapter(response));
104 }
105 }
106 return null;
107 }
108
109 protected void sendMessage(MuleEvent event) throws Exception
110 {
111 if (chat == null && groupChat == null)
112 {
113 MuleMessage msg = event.getMessage();
114 boolean group = msg.getBooleanProperty(XmppConnector.XMPP_GROUP_CHAT, false);
115 String nickname = msg.getStringProperty(XmppConnector.XMPP_NICKNAME, "mule");
116 String recipient = event.getEndpoint().getEndpointURI().getPath().substring(1);
117
118 if (group)
119 {
120 groupChat = new GroupChat(xmppConnection, recipient);
121 if (!groupChat.isJoined())
122 {
123 groupChat.join(nickname);
124 }
125 }
126 else
127 {
128 chat = new Chat(xmppConnection, recipient);
129 }
130 }
131
132 Object msgObj = event.getMessage().getPayload();
133 Message message;
134
135 if (!(msgObj instanceof Message))
136 {
137 message = (Message)event.transformMessage();
138 }
139 else
140 {
141 message = (Message)msgObj;
142 }
143
144 if (logger.isTraceEnabled())
145 {
146 logger.trace("Transformed packet: " + message.toXML());
147 }
148
149
150 if (message.getTo() != null)
151 {
152 xmppConnection.sendPacket(message);
153 }
154 else if (chat != null)
155 {
156 chat.sendMessage(message);
157 }
158 else
159 {
160 groupChat.sendMessage(message);
161 }
162
163 if (logger.isDebugEnabled())
164 {
165 logger.debug("Packet successfully sent");
166 }
167 }
168
169 }