Index: lams_common/src/java/org/lamsfoundation/lams/util/XMPPUtil.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/util/XMPPUtil.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/util/XMPPUtil.java (revision ea902e25fa390b0cf4a686c9e16d6551e66ee01f) @@ -0,0 +1,94 @@ +package org.lamsfoundation.lams.util; + +import java.util.Iterator; + +import org.apache.log4j.Logger; +import org.jivesoftware.smack.AccountManager; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smackx.Form; +import org.jivesoftware.smackx.FormField; +import org.jivesoftware.smackx.muc.MultiUserChat; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; + +public class XMPPUtil { + + private static final Logger logger = Logger.getLogger(XMPPUtil.class); + + /** + * Creates a new id on the xmpp server. + * + * @param user + * @return id if user is successfully created, otherwise null. + */ + public static String createId(UserDTO user) { + try { + XMPPConnection con = new XMPPConnection(Configuration.get(ConfigurationKeys.XMPP_DOMAIN)); + + AccountManager manager = con.getAccountManager(); + if (manager.supportsAccountCreation()) { + // using the lams userId as xmpp username and password. + manager.createAccount(user.getUserID().toString(), user.getUserID().toString()); + } + + } catch (XMPPException e) { + if (e.getXMPPError().getCode() != 409) { + logger.error(e); + return null; + } // else conflict error, user already exists + } + return user.getUserID() + "@" + Configuration.get(ConfigurationKeys.XMPP_DOMAIN); + } + + /** + * Creates a MUC room called on the xmpp server. + * + * @param room + * @return Returns true if MUC room successfully created. + */ + public static boolean createMultiUserChat(String room) { + try { + XMPPConnection.DEBUG_ENABLED = false; + XMPPConnection con = new XMPPConnection(Configuration.get(ConfigurationKeys.XMPP_DOMAIN)); + + con.login(Configuration.get(ConfigurationKeys.XMPP_ADMIN), Configuration + .get(ConfigurationKeys.XMPP_PASSWORD)); + + MultiUserChat muc = new MultiUserChat(con, room); + + // Create the room + muc.create("nick"); + + // Get the the room's configuration form + Form form = muc.getConfigurationForm(); + + // Create a new form to submit based on the original form + Form submitForm = form.createAnswerForm(); + + // Add default answers to the form to submit + for (Iterator fields = form.getFields(); fields.hasNext();) { + FormField field = (FormField) fields.next(); + if (!FormField.TYPE_HIDDEN.equals(field.getType()) && field.getVariable() != null) { + // Sets the default value as the answer + submitForm.setDefaultAnswer(field.getVariable()); + } + } + + // Sets the new owner of the room + submitForm.setAnswer("muc#roomconfig_persistentroom", true); + // Send the completed form (with default values) to the server to + // configure the room + muc.sendConfigurationForm(submitForm); + + con.close(); + + return true; + + } catch (XMPPException e) { + logger.error(e); + logger.error(e.getXMPPError()); + return false; + } + } + +} Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/ChatService.java =================================================================== diff -u -rdf4aa68adb6fd5c4d0c063c1bd6294d91f2a2330 -rea902e25fa390b0cf4a686c9e16d6551e66ee01f --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/ChatService.java (.../ChatService.java) (revision df4aa68adb6fd5c4d0c063c1bd6294d91f2a2330) +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/ChatService.java (.../ChatService.java) (revision ea902e25fa390b0cf4a686c9e16d6551e66ee01f) @@ -51,12 +51,6 @@ import org.hibernate.id.Configurable; import org.hibernate.id.IdentifierGenerator; import org.hibernate.id.UUIDHexGenerator; -import org.jivesoftware.smack.AccountManager; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smackx.Form; -import org.jivesoftware.smackx.FormField; -import org.jivesoftware.smackx.muc.MultiUserChat; import org.lamsfoundation.lams.contentrepository.AccessDeniedException; import org.lamsfoundation.lams.contentrepository.ICredentials; import org.lamsfoundation.lams.contentrepository.ITicket; @@ -104,6 +98,7 @@ import org.lamsfoundation.lams.util.Configuration; import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.util.XMPPUtil; import org.lamsfoundation.lams.util.audit.IAuditService; import org.lamsfoundation.lams.util.wddx.WDDXProcessor; import org.lamsfoundation.lams.util.wddx.WDDXProcessorConversionException; @@ -518,7 +513,12 @@ public synchronized ChatUser createChatUser(UserDTO user, ChatSession chatSession) { ChatUser chatUser = new ChatUser(user, chatSession); - chatUser.setJabberId(createJabberId(user)); + String jabberId = XMPPUtil.createId(user); + if (jabberId == null) { + logger.error("Unable to create jabber id for user: " + user.getUserID()); + throw new RuntimeException(); + } + chatUser.setJabberId(jabberId); chatUser.setJabberNickname(createJabberNickname(chatUser)); saveOrUpdateChatUser(chatUser); return chatUser; @@ -545,55 +545,6 @@ return jabberNickname; } - public void createJabberRoom(ChatSession chatSession) { - try { - XMPPConnection.DEBUG_ENABLED = false; - XMPPConnection con = new XMPPConnection(Configuration.get(ConfigurationKeys.XMPP_DOMAIN)); - - con.login(Configuration.get(ConfigurationKeys.XMPP_ADMIN), Configuration - .get(ConfigurationKeys.XMPP_PASSWORD)); - - // Create a MultiUserChat using an XMPPConnection for a room - // String jabberRoom = new Long(System.currentTimeMillis()).toString() - // + "@" - // + Configuration.get(ConfigurationKeys.XMPP_CONFERENCE); - - MultiUserChat muc = new MultiUserChat(con, chatSession.getJabberRoom()); - - // Create the room - muc.create("nick"); - - // Get the the room's configuration form - Form form = muc.getConfigurationForm(); - - // Create a new form to submit based on the original form - Form submitForm = form.createAnswerForm(); - - // Add default answers to the form to submit - for (Iterator fields = form.getFields(); fields.hasNext();) { - FormField field = (FormField) fields.next(); - if (!FormField.TYPE_HIDDEN.equals(field.getType()) && field.getVariable() != null) { - // Sets the default value as the answer - submitForm.setDefaultAnswer(field.getVariable()); - } - } - - // Sets the new owner of the room - submitForm.setAnswer("muc#roomconfig_persistentroom", true); - // Send the completed form (with default values) to the server to - // configure the room - muc.sendConfigurationForm(submitForm); - - chatSession.setRoomCreated(true); - con.close(); - - } catch (XMPPException e) { - logger.error(e); - logger.error(e.getXMPPError()); - // TODO should we continue ? - } - } - public void processIncomingMessages(NodeList messageElems) { for (int i = 0; i < messageElems.getLength(); i++) { @@ -889,28 +840,6 @@ return body; } - /** - * Registers a new Jabber Id on the jabber server using the users login as the jabber name and password TODO This is - * only temporary, most likely it will need to be moved to the lams core service since it will be used by both IM - * Chat Tool. Users in the system should only have a single jabber id - */ - private String createJabberId(UserDTO user) { - try { - XMPPConnection con = new XMPPConnection(Configuration.get(ConfigurationKeys.XMPP_DOMAIN)); - - AccountManager manager = con.getAccountManager(); - if (manager.supportsAccountCreation()) { - // using the lams userId as jabber username and password. - manager.createAccount(user.getUserID().toString(), user.getUserID().toString()); - } - - } catch (XMPPException e) { - logger.error(e); - // TODO handle exception - } - return user.getUserID() + "@" + Configuration.get(ConfigurationKeys.XMPP_DOMAIN); - } - private NodeKey processFile(FormFile file, String type) { NodeKey node = null; if (file != null && !StringUtils.isEmpty(file.getFileName())) { Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/IChatService.java =================================================================== diff -u -rdf4aa68adb6fd5c4d0c063c1bd6294d91f2a2330 -rea902e25fa390b0cf4a686c9e16d6551e66ee01f --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/IChatService.java (.../IChatService.java) (revision df4aa68adb6fd5c4d0c063c1bd6294d91f2a2330) +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/IChatService.java (.../IChatService.java) (revision ea902e25fa390b0cf4a686c9e16d6551e66ee01f) @@ -185,12 +185,6 @@ /** * - * @param chatSession - */ - public void createJabberRoom(ChatSession chatSession); - - /** - * * @param messageElems */ public void processIncomingMessages(NodeList messageElems); Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningAction.java =================================================================== diff -u -rdf4aa68adb6fd5c4d0c063c1bd6294d91f2a2330 -rea902e25fa390b0cf4a686c9e16d6551e66ee01f --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningAction.java (.../LearningAction.java) (revision df4aa68adb6fd5c4d0c063c1bd6294d91f2a2330) +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningAction.java (.../LearningAction.java) (revision ea902e25fa390b0cf4a686c9e16d6551e66ee01f) @@ -55,6 +55,7 @@ import org.lamsfoundation.lams.util.Configuration; import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.util.XMPPUtil; import org.lamsfoundation.lams.web.action.LamsDispatchAction; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; @@ -108,7 +109,13 @@ // Create the room if it doesnt exist log.debug(chatSession.isRoomCreated()); if (!chatSession.isRoomCreated()) { - chatService.createJabberRoom(chatSession); + if (XMPPUtil.createMultiUserChat(chatSession.getJabberRoom())) { + chatSession.setRoomCreated(true); + } else { + log.error("Unable to create chat room " + chatSession.getJabberRoom()); + throw new RuntimeException(); + } + chatService.saveOrUpdateChatSession(chatSession); }