package com.dgrid.service.impl; import java.util.Iterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jivesoftware.smack.AccountManager; import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.MessageTypeFilter; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smackx.Form; import org.jivesoftware.smackx.FormField; import org.jivesoftware.smackx.muc.DiscussionHistory; import org.jivesoftware.smackx.muc.MultiUserChat; import com.dgrid.service.XmppConnection; public class SmackXMPPConnectionImpl implements XmppConnection { private Log log = LogFactory.getLog(getClass()); private String server; private String serviceName; private int port = 5222; private String username; private String password; private XMPPConnection conn; /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#setPassword(java.lang.String) */ public void setPassword(String password) { this.password = password; } public int getPort() { return port; } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#setPort(int) */ public void setPort(int port) { this.port = port; } public String getServer() { return server; } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#setServer(java.lang.String) */ public void setServer(String server) { this.server = server; } public String getServiceName() { return serviceName; } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#setServiceName(java.lang.String) */ public void setServiceName(String serviceName) { this.serviceName = serviceName; } public String getUsername() { return username; } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#setUsername(java.lang.String) */ public void setUsername(String username) { this.username = username; } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#connect() */ public void connect() throws XMPPException { log.trace("connect()"); ConnectionConfiguration conf = new ConnectionConfiguration(server, port, serviceName); conn = new XMPPConnection(conf); conn.connect(); conn.login(username, password); } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#createAccount() */ public void createAccount() throws XMPPException { log.trace("createAccount()"); ConnectionConfiguration conf = new ConnectionConfiguration(server, port, serviceName); conn = new XMPPConnection(conf); conn.connect(); AccountManager mgr = conn.getAccountManager(); mgr.createAccount(username, password); } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#disconnect() */ public void disconnect() { log.trace("disconnect()"); conn.disconnect(); } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#getJid() */ public String getJid() { if ((conn == null) || (conn.isConnected() == false)) return null; else { String user = conn.getUser(); return user.substring(0, user.indexOf((int) '/')); } } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#sendMessage(org.jivesoftware.smack.packet.Message) */ public void sendMessage(Message msg) { this.sendPacket(msg); } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#sendPacket(org.jivesoftware.smack.packet.Packet) */ public void sendPacket(Packet packet) { try { conn.sendPacket(packet); } catch (IllegalStateException e) { // thrown when disconnected try { conn.connect(); conn.sendPacket(packet); } catch (XMPPException e1) { log.warn("Could not reconnect inside sendPacket()", e); } } } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#sendTextMessage(java.lang.String, * java.lang.String) */ public void sendTextMessage(String to, String subject, String body) { Message msg = new Message(to, Message.Type.normal); msg.setSubject(subject); msg.setBody(body); this.sendMessage(msg); } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#addPacketListener(org.jivesoftware.smack.PacketListener) */ public void addPacketListener(PacketListener listener) { conn.addPacketListener(listener, new MessageTypeFilter( Message.Type.normal)); } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#addPacketListener(org.jivesoftware.smack.PacketListener, * org.jivesoftware.smack.filter.PacketFilter) */ public void addPacketListener(PacketListener listener, PacketFilter filter) { conn.addPacketListener(listener, filter); } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#createRoom(java.lang.String, * java.lang.String) */ public MultiUserChat createRoom(String name, String nickname) throws XMPPException { log.trace("createRoom()"); try { MultiUserChat muc = new MultiUserChat(conn, name + "@conference." + server); muc.create(nickname); Form form = muc.getConfigurationForm(); Form submitForm = form.createAnswerForm(); for (Iterator<FormField> fields = form.getFields(); fields .hasNext();) { FormField field = fields.next(); if (!FormField.TYPE_HIDDEN.equals(field.getType()) && field.getVariable() != null) { // Sets the default value as the answer submitForm.setDefaultAnswer(field.getVariable()); } } // this is the default - change to true for persistent room submitForm.setAnswer("muc#roomconfig_persistentroom", false); muc.sendConfigurationForm(submitForm); // or just use this line // muc.sendConfigurationForm(new Form(Form.TYPE_SUBMIT)); return muc; } catch (XMPPException e) { log .info("XMPPException creating room. The room may exist, calling joinRoom() instead..."); MultiUserChat muc = joinRoom(name, nickname); return muc; } } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#joinRoom(java.lang.String, * java.lang.String) */ public MultiUserChat joinRoom(String room, String nickname) throws XMPPException { log.trace("joinRoom()"); MultiUserChat muc = new MultiUserChat(conn, room + "@conference." + server); DiscussionHistory history = new DiscussionHistory(); history.setMaxChars(0); muc.join(nickname, null, history, 5000); // muc.join(nickname); return muc; } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#getSmackXMPPConnection() */ public XMPPConnection getSmackXMPPConnection() { return conn; } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#getRoster() */ public Roster getRoster() { return conn.getRoster(); } /* * (non-Javadoc) * * @see com.dgrid.xmpp.XmppConnection#addRosterListener(org.jivesoftware.smack.RosterListener) */ public void addRosterListener(RosterListener listener) { conn.getRoster().addRosterListener(listener); } public void finalize() throws Throwable { log.trace("finalize()"); this.disconnect(); } }