You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2008/08/04 21:05:42 UTC
svn commit: r682466 - in /activemq/camel/trunk/components/camel-xmpp/src:
main/java/org/apache/camel/component/xmpp/
test/java/org/apache/camel/component/xmpp/
Author: davsclaus
Date: Mon Aug 4 12:05:41 2008
New Revision: 682466
URL: http://svn.apache.org/viewvc?rev=682466&view=rev
Log:
CAMEL-757: Applied patch with thanks to Vadim.
Modified:
activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppBinding.java
activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppConsumer.java
activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppEndpoint.java
activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppExchange.java
activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppGroupChatProducer.java
activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppMessage.java
activemq/camel/trunk/components/camel-xmpp/src/test/java/org/apache/camel/component/xmpp/XmppRouteTest.java
Modified: activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppBinding.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppBinding.java?rev=682466&r1=682465&r2=682466&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppBinding.java (original)
+++ activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppBinding.java Mon Aug 4 12:05:41 2008
@@ -20,7 +20,6 @@
import java.util.Set;
import org.apache.camel.Exchange;
-
import org.jivesoftware.smack.packet.Message;
/**
@@ -30,6 +29,7 @@
* @version $Revision$
*/
public class XmppBinding {
+
/**
* Populates the given XMPP message from the inbound exchange
*/
@@ -52,9 +52,6 @@
/**
* Extracts the body from the XMPP message
- *
- * @param exchange
- * @param message
*/
public Object extractBodyFromXmpp(XmppExchange exchange, Message message) {
return message.getBody();
Modified: activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppConsumer.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppConsumer.java?rev=682466&r1=682465&r2=682466&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppConsumer.java (original)
+++ activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppConsumer.java Mon Aug 4 12:05:41 2008
@@ -16,17 +16,17 @@
*/
package org.apache.camel.component.xmpp;
-import java.util.Iterator;
-
import org.apache.camel.Processor;
import org.apache.camel.impl.DefaultConsumer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-
+import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.PacketListener;
+import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
-import org.jivesoftware.smack.packet.RosterPacket;
+import org.jivesoftware.smackx.muc.DiscussionHistory;
+import org.jivesoftware.smackx.muc.MultiUserChat;
/**
* A {@link org.apache.camel.Consumer Consumer} which listens to XMPP packets
@@ -36,6 +36,8 @@
public class XmppConsumer extends DefaultConsumer<XmppExchange> implements PacketListener {
private static final transient Log LOG = LogFactory.getLog(XmppConsumer.class);
private final XmppEndpoint endpoint;
+ private Chat privateChat;
+ private MultiUserChat muc;
public XmppConsumer(XmppEndpoint endpoint, Processor processor) {
super(endpoint, processor);
@@ -44,46 +46,43 @@
@Override
protected void doStart() throws Exception {
+ if (endpoint.getRoom() == null) {
+ privateChat = endpoint.getConnection().createChat(endpoint.getParticipant());
+ privateChat.addMessageListener(this);
+ LOG.info("Open chat to " + privateChat.getParticipant());
+ } else {
+ muc = new MultiUserChat(endpoint.getConnection(), endpoint.resolveRoom());
+ muc.addMessageListener(this);
+ DiscussionHistory history = new DiscussionHistory();
+ history.setMaxChars(0); // we do not want any historical messages
+ muc.join(endpoint.getNickname(), null, history, SmackConfiguration.getPacketReplyTimeout());
+ LOG.info("Joined room: " + muc.getRoom());
+ }
super.doStart();
- endpoint.getConnection().addPacketListener(this, endpoint.getFilter());
}
@Override
protected void doStop() throws Exception {
- endpoint.getConnection().removePacketListener(this);
super.doStop();
+ if (muc != null) {
+ muc.leave();
+ muc = null;
+ }
}
public void processPacket(Packet packet) {
+ Message message = (Message)packet;
- if (packet instanceof Message) {
- Message message = (Message)packet;
- if (LOG.isDebugEnabled()) {
- LOG.debug("<<<< message: " + message.getBody());
- }
- XmppExchange exchange = endpoint.createExchange(message);
- try {
- getProcessor().process(exchange);
- } catch (Exception e) {
- // TODO: what should we do when a processing failure occurs??
- e.printStackTrace();
- }
- } else if (packet instanceof RosterPacket) {
- // TODO: what to do with a RosterPacket other than debug logging it
- RosterPacket rosterPacket = (RosterPacket)packet;
- if (LOG.isDebugEnabled()) {
- LOG.debug("Roster packet with : " + rosterPacket.getRosterItemCount() + " item(s)");
- Iterator rosterItems = rosterPacket.getRosterItems();
- while (rosterItems.hasNext()) {
- Object item = rosterItems.next();
- LOG.debug("Roster item: " + item);
- }
- }
- } else {
- if (LOG.isDebugEnabled()) {
- LOG.debug("<<<< ignored packet: " + packet);
- }
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Recieved XMPP message: " + message.getBody());
+ }
+ XmppExchange exchange = endpoint.createExchange(message);
+ try {
+ getProcessor().process(exchange);
+ } catch (Exception e) {
+ LOG.error("Error while processing message", e);
}
}
+
}
Modified: activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppEndpoint.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppEndpoint.java?rev=682466&r1=682465&r2=682466&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppEndpoint.java (original)
+++ activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppEndpoint.java Mon Aug 4 12:05:41 2008
@@ -16,6 +16,9 @@
*/
package org.apache.camel.component.xmpp;
+import java.util.Iterator;
+
+import org.apache.camel.CamelException;
import org.apache.camel.Consumer;
import org.apache.camel.ExchangePattern;
import org.apache.camel.Processor;
@@ -26,9 +29,8 @@
import org.jivesoftware.smack.AccountManager;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
-import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.packet.Message;
-import org.jivesoftware.smack.packet.Presence;
+import org.jivesoftware.smackx.muc.MultiUserChat;
/**
* A XMPP Endpoint
@@ -45,7 +47,6 @@
private String password;
private String resource = "Camel";
private boolean login = true;
- private PacketFilter filter;
private boolean createAccount;
private String room;
private String participant;
@@ -61,7 +62,7 @@
public Producer<XmppExchange> createProducer() throws Exception {
if (room != null) {
- return createGroupChatProducer(room);
+ return createGroupChatProducer();
} else {
if (participant == null) {
throw new IllegalArgumentException("No room or participant configured on this endpoint: " + this);
@@ -70,8 +71,8 @@
}
}
- public Producer<XmppExchange> createGroupChatProducer(String room) throws Exception {
- return new XmppGroupChatProducer(this, room);
+ public Producer<XmppExchange> createGroupChatProducer() throws Exception {
+ return new XmppGroupChatProducer(this);
}
public Producer<XmppExchange> createPrivateChatProducer(String participant) throws Exception {
@@ -79,7 +80,7 @@
}
public Consumer<XmppExchange> createConsumer(Processor processor) throws Exception {
- return new XmppConsumer(this, processor);
+ return new XmppConsumer(this, processor);
}
@Override
@@ -156,14 +157,6 @@
this.login = login;
}
- public PacketFilter getFilter() {
- return filter;
- }
-
- public void setFilter(PacketFilter filter) {
- this.filter = filter;
- }
-
public boolean isCreateAccount() {
return createAccount;
}
@@ -189,7 +182,7 @@
}
public String getNickname() {
- return nickname;
+ return nickname != null ? nickname : getUser();
}
public void setNickname(String nickname) {
@@ -241,6 +234,32 @@
}
return connection;
}
+
+ /*
+ * If there is no "@" symbol in the room, find the chat service JID and return fully
+ * qualified JID for the room as room@conference.server.domain
+ */
+ public String resolveRoom() throws XMPPException, CamelException {
+ if (room == null) {
+ throw new IllegalArgumentException("room is not specified");
+ }
+
+ if (room.indexOf('@', 0) != -1) {
+ return room;
+ }
+
+ XMPPConnection conn = getConnection();
+ Iterator<String> iterator = MultiUserChat.getServiceNames(conn).iterator();
+ if (!iterator.hasNext()) {
+ throw new CamelException("Can not find Multi User Chat service");
+ }
+ String chatServer = iterator.next();
+ if (LOG.isInfoEnabled()) {
+ LOG.info("Detected chat server: " + chatServer);
+ }
+
+ return room + "@" + chatServer;
+ }
public boolean isSingleton() {
return true;
Modified: activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppExchange.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppExchange.java?rev=682466&r1=682465&r2=682466&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppExchange.java (original)
+++ activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppExchange.java Mon Aug 4 12:05:41 2008
@@ -46,7 +46,6 @@
this.binding = binding;
}
- @Override
public XmppMessage getIn() {
return (XmppMessage) super.getIn();
}
Modified: activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppGroupChatProducer.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppGroupChatProducer.java?rev=682466&r1=682465&r2=682466&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppGroupChatProducer.java (original)
+++ activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppGroupChatProducer.java Mon Aug 4 12:05:41 2008
@@ -16,12 +16,15 @@
*/
package org.apache.camel.component.xmpp;
+import org.apache.camel.CamelException;
import org.apache.camel.Exchange;
import org.apache.camel.impl.DefaultProducer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smackx.muc.DiscussionHistory;
import org.jivesoftware.smackx.muc.MultiUserChat;
/**
@@ -33,10 +36,10 @@
private final String room;
private MultiUserChat chat;
- public XmppGroupChatProducer(XmppEndpoint endpoint, String room) {
+ public XmppGroupChatProducer(XmppEndpoint endpoint) throws XMPPException, CamelException {
super(endpoint);
this.endpoint = endpoint;
- this.room = room;
+ this.room = endpoint.resolveRoom();
if (room == null) {
throw new IllegalArgumentException("No room property specified");
}
@@ -50,7 +53,7 @@
endpoint.getBinding().populateXmppMessage(message, exchange);
if (LOG.isDebugEnabled()) {
- LOG.debug(">>>> message: " + message.getBody());
+ LOG.debug("Sending XMPP message: " + message.getBody());
}
try {
chat.sendMessage(message);
@@ -61,12 +64,13 @@
@Override
protected void doStart() throws Exception {
- super.doStart();
if (chat == null) {
chat = new MultiUserChat(endpoint.getConnection(), room);
- String nickname = this.endpoint.getNickname();
- chat.join(nickname != null ? nickname : this.endpoint.getUser());
+ DiscussionHistory history = new DiscussionHistory();
+ history.setMaxChars(0); // we do not want any historical messages
+ chat.join(this.endpoint.getNickname(), null, history, SmackConfiguration.getPacketReplyTimeout());
}
+ super.doStart();
}
@Override
Modified: activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppMessage.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppMessage.java?rev=682466&r1=682465&r2=682466&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppMessage.java (original)
+++ activemq/camel/trunk/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppMessage.java Mon Aug 4 12:05:41 2008
@@ -56,8 +56,6 @@
/**
* Returns the underlying XMPP message
- *
- * @return the underlying XMPP message
*/
public Message getXmppMessage() {
return xmppMessage;
Modified: activemq/camel/trunk/components/camel-xmpp/src/test/java/org/apache/camel/component/xmpp/XmppRouteTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-xmpp/src/test/java/org/apache/camel/component/xmpp/XmppRouteTest.java?rev=682466&r1=682465&r2=682466&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-xmpp/src/test/java/org/apache/camel/component/xmpp/XmppRouteTest.java (original)
+++ activemq/camel/trunk/components/camel-xmpp/src/test/java/org/apache/camel/component/xmpp/XmppRouteTest.java Mon Aug 4 12:05:41 2008
@@ -41,7 +41,6 @@
* <p/>
* You can overload the <b>xmpp.url</b> system property to define the jabber connection URI
* to something like <b>xmpp://camel@localhost/?login=false&room=</b>
- *
* @version $Revision$
*/
public class XmppRouteTest extends TestCase {
@@ -73,7 +72,7 @@
//Thread.sleep(100000);
}
}
-
+
protected static boolean isXmppServerPresent() {
if (enabled) {
return true;
@@ -112,16 +111,20 @@
@Override
protected void setUp() throws Exception {
if (isXmppServerPresent()) {
- String uriPrefx = getUriPrefix();
- final String uri1 = uriPrefx + "a";
- final String uri2 = uriPrefx + "b";
+ String uriPrefix = getUriPrefix();
+ final String uri1 = uriPrefix + "&resource=camel-test-from&nickname=came-test-from";
+ final String uri2 = uriPrefix + "&resource=camel-test-to&nickname=came-test-to";
+ final String uri3 = uriPrefix + "&resource=camel-test-from-processor&nickname=came-test-from-processor";
LOG.info("Using URI " + uri1 + " and " + uri2);
+ endpoint = container.getEndpoint(uri1);
+ assertNotNull("No endpoint found!", endpoint);
+
// lets add some routes
container.addRoutes(new RouteBuilder() {
public void configure() {
from(uri1).to(uri2);
- from(uri2).process(new Processor() {
+ from(uri3).process(new Processor() {
public void process(Exchange e) {
LOG.info("Received exchange: " + e);
receivedExchange = (XmppExchange) e;
@@ -130,8 +133,6 @@
});
}
});
- endpoint = container.getEndpoint(uri1);
- assertNotNull("No endpoint found!", endpoint);
}
container.start();
@@ -143,7 +144,7 @@
}
return System.getProperty("xmpp.url", "xmpp://camel@localhost/?login=false&room=").trim();
}
-
+
@Override
protected void tearDown() throws Exception {
client.stop();