Index: lams_build/3rdParty.userlibraries =================================================================== diff -u -rb73ec70cf1b266f9bea9e6fb30067f440fa5dd9e -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_build/3rdParty.userlibraries (.../3rdParty.userlibraries) (revision b73ec70cf1b266f9bea9e6fb30067f440fa5dd9e) +++ lams_build/3rdParty.userlibraries (.../3rdParty.userlibraries) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -100,11 +100,8 @@ - - - Index: lams_build/build.xml =================================================================== diff -u -r251c6d0f91641fcc339425c7e40bb96e449e4009 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_build/build.xml (.../build.xml) (revision 251c6d0f91641fcc339425c7e40bb96e449e4009) +++ lams_build/build.xml (.../build.xml) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -185,15 +185,12 @@ - - - Index: lams_build/lib/jabber/JabberHTTPBind-1.1.1.jar =================================================================== diff -u -r68d2988cca350af15ba4087814f74e1527a71997 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_build/lib/lams/lams-central.jar =================================================================== diff -u -r2b88dada3266a4b0f83f4b5c4cf617553496ca59 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_build/lib/lams/lams-learning.jar =================================================================== diff -u -rd56929f06ad90a63082d514e6521adc175f3de27 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r18ad44b2130cf96bc32e36b344f86bd8fc586851 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_build/lib/smack/smack.jar =================================================================== diff -u -re4535c9d21ff5984934f741f40275cfd9bbd3ed9 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_build/lib/smack/smackx.jar =================================================================== diff -u -re4535c9d21ff5984934f741f40275cfd9bbd3ed9 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_build/liblist.txt =================================================================== diff -u -rd52979b91e7990b87bee9415ec03930afd36713b -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_build/liblist.txt (.../liblist.txt) (revision d52979b91e7990b87bee9415ec03930afd36713b) +++ lams_build/liblist.txt (.../liblist.txt) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -83,10 +83,8 @@ reload-moonunit.jar quartz quartz.jar 1.5.2 OpenSymphony Quartz Enterprise Job Scheduler + -smack smack.jar - smackx.jar - spring spring.jar 1.2.8 Spring Framework struts antlr.jar Index: lams_central/conf/xdoclet/servlet-mappings.xml =================================================================== diff -u -r5214c46ae3e9c0f13c66fd4da0cb619165be1d1c -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_central/conf/xdoclet/servlet-mappings.xml (.../servlet-mappings.xml) (revision 5214c46ae3e9c0f13c66fd4da0cb619165be1d1c) +++ lams_central/conf/xdoclet/servlet-mappings.xml (.../servlet-mappings.xml) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -51,11 +51,6 @@ - JabberHTTPBindingServlet - /JHB/* - - - OpenIDServlet /OpenIDServlet \ No newline at end of file Index: lams_central/conf/xdoclet/servlets.xml =================================================================== diff -u -rd56929f06ad90a63082d514e6521adc175f3de27 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_central/conf/xdoclet/servlets.xml (.../servlets.xml) (revision d56929f06ad90a63082d514e6521adc175f3de27) +++ lams_central/conf/xdoclet/servlets.xml (.../servlets.xml) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -94,11 +94,6 @@ - JabberHTTPBindingServlet - org.jabber.JabberHTTPBind.JHBServlet - - - OpenIDServlet org.lamsfoundation.lams.web.SIFOpenIDServlet Index: lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java =================================================================== diff -u -rb8a97155817e7f95d73dc663de0c9a1ef27e2333 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java (.../HomeAction.java) (revision b8a97155817e7f95d73dc663de0c9a1ef27e2333) +++ lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java (.../HomeAction.java) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -171,8 +171,6 @@ String serverUrl = Configuration.get(ConfigurationKeys.SERVER_URL); req.setAttribute("serverUrl", serverUrl); - String presenceUrl = Configuration.get(ConfigurationKeys.XMPP_DOMAIN); - req.setAttribute("presenceUrl", presenceUrl); req.setAttribute(AttributeNames.PARAM_LESSON_ID, lessonId); //show lesson intro page if required Index: lams_central/src/java/org/lamsfoundation/lams/web/PresenceServlet.java =================================================================== diff -u -raffc66817dcbf5a677c7742c13fb93a9b35ae97a -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_central/src/java/org/lamsfoundation/lams/web/PresenceServlet.java (.../PresenceServlet.java) (revision affc66817dcbf5a677c7742c13fb93a9b35ae97a) +++ lams_central/src/java/org/lamsfoundation/lams/web/PresenceServlet.java (.../PresenceServlet.java) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -21,114 +21,32 @@ * **************************************************************** */ - package org.lamsfoundation.lams.web; -import java.io.IOException; -import java.io.PrintWriter; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Vector; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import org.apache.log4j.Logger; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; -import org.lamsfoundation.lams.learning.service.ICoreLearnerService; -import org.lamsfoundation.lams.learning.service.LearnerServiceProxy; -import org.lamsfoundation.lams.lesson.Lesson; -import org.lamsfoundation.lams.lesson.dto.LessonDTO; -import org.lamsfoundation.lams.usermanagement.dto.UserDTO; -import org.lamsfoundation.lams.usermanagement.dto.UserFlashDTO; import org.lamsfoundation.lams.web.action.LamsDispatchAction; -import org.lamsfoundation.lams.web.session.SessionManager; -import org.lamsfoundation.lams.web.util.AttributeNames; -import org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService; -import org.lamsfoundation.lams.workspace.web.WorkspaceAction; -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.wddx.FlashMessage; /** * @author Paul Georges - * @struts.action - * path = "/Presence" - * parameter = "method" - * validate = "false" + * @struts.action path = "/Presence" parameter = "method" validate = "false" * @struts.action-forward name = "success" path = "/index.jsp" */ -public class PresenceServlet extends LamsDispatchAction{ - - protected Logger log = Logger.getLogger(WorkspaceAction.class.getName()); - - /** Send the flash message back to Flash */ - private ActionForward returnWDDXPacket(FlashMessage flashMessage, HttpServletResponse response) throws IOException { - PrintWriter writer = response.getWriter(); - writer.println(flashMessage.serializeMessage()); - return null; - } +public class PresenceServlet extends LamsDispatchAction { - /** Send the flash message back to Flash */ - private ActionForward returnWDDXPacket(String serializedFlashMessage, HttpServletResponse response) throws IOException { - PrintWriter writer = response.getWriter(); - writer.println(serializedFlashMessage); - return null; - } - - public ActionForward createXmppId(ActionMapping mapping, - ActionForm form, - HttpServletRequest request, - HttpServletResponse response)throws Exception{ - - - HttpSession ss = SessionManager.getSession(); - UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); - String xmppIdCreated = XMPPUtil.createId(user); - - FlashMessage flashMessage = null; - try { - flashMessage = new FlashMessage("createXmppId", xmppIdCreated); - } catch (Exception e) { - } - - String wddxPacket = flashMessage.serializeMessage(); - return returnWDDXPacket(wddxPacket, response); - } - - public ActionForward createXmppRoom(ActionMapping mapping, - ActionForm form, - HttpServletRequest request, - HttpServletResponse response)throws Exception{ - - ICoreLearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); - - /* Date Format for Chat room append */ - DateFormat sfm = new SimpleDateFormat("yyyyMMdd_HHmmss"); - Long lessonId = (Long)WebUtil.readLongParam(request,"lessonId"); - Lesson lesson = learnerService.getLesson(lessonId); - String createDateTimeStr = sfm.format(lesson.getCreateDateTime()); - - String xmppRoomName = lessonId + "_" + createDateTimeStr + "@" + Configuration.get(ConfigurationKeys.XMPP_CONFERENCE); - xmppRoomName = xmppRoomName.replace(" ", "_"); - xmppRoomName = xmppRoomName.replace(":", "_"); - Boolean xmppRoomCreated = XMPPUtil.createMultiUserChat(xmppRoomName); - - FlashMessage flashMessage = null; - try { - flashMessage = new FlashMessage("createXmppRoom", xmppRoomCreated); - } catch (Exception e) { - } - - String wddxPacket = flashMessage.serializeMessage(); - return returnWDDXPacket(wddxPacket, response); - } -} + public ActionForward createXmppId(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + return null; + } + + public ActionForward createXmppRoom(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + + return null; + } +} \ No newline at end of file Index: lams_central/src/java/org/lamsfoundation/lams/webservice/PaintAction.java =================================================================== diff -u -rdaf00a52f630e4b979227c958b7d1e70e0a9b466 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_central/src/java/org/lamsfoundation/lams/webservice/PaintAction.java (.../PaintAction.java) (revision daf00a52f630e4b979227c958b7d1e70e0a9b466) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/PaintAction.java (.../PaintAction.java) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -55,7 +55,7 @@ */ public class PaintAction extends LamsDispatchAction { - private static Logger logger = Logger.getLogger(PresenceChatLoggerAction.class); + private static Logger logger = Logger.getLogger(PaintAction.class); /** * @deprecated Index: lams_central/src/java/org/lamsfoundation/lams/webservice/PresenceChatAction.java =================================================================== diff -u --- lams_central/src/java/org/lamsfoundation/lams/webservice/PresenceChatAction.java (revision 0) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/PresenceChatAction.java (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -0,0 +1,234 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +package org.lamsfoundation.lams.webservice; + +import java.io.IOException; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.apache.tomcat.util.json.JSONArray; +import org.apache.tomcat.util.json.JSONException; +import org.apache.tomcat.util.json.JSONObject; +import org.lamsfoundation.lams.presence.model.PresenceChatMessage; +import org.lamsfoundation.lams.presence.model.PresenceChatUser; +import org.lamsfoundation.lams.presence.service.IPresenceChatService; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.action.LamsDispatchAction; +import org.lamsfoundation.lams.web.util.AttributeNames; +import org.lamsfoundation.lams.web.util.HttpSessionManager; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +/** + * Gets all necessary content for Presence Chat in Learning. + * + * @author Paul Georges, Marcin Cieslak + * + * ----------------XDoclet Tags-------------------- + * + * @struts:action path="/PresenceChat" parameter="method" validate="false" + * + * ----------------XDoclet Tags-------------------- + */ +public class PresenceChatAction extends LamsDispatchAction { + /** + * Keeps information of users present in a Chat session. Needs to work with DB so presence is visible on clustered + * environment. + */ + private class Roster { + private final Long lessonId; + // when synchronisation with DB was last attempted + private long lastCheckTime = 0; + // users who currently poll messasages + private final Map activeUsers = new HashMap(); + // users stored in DB + private final Map roster = Collections.synchronizedMap(new HashMap()); + + private Roster(Long lessonId) { + this.lessonId = lessonId; + } + + private JSONArray getRosterJSON(String nickname) { + long currentTime = System.currentTimeMillis(); + + // roster is used also to get messages by other users, so we need to synchronise on it + synchronized (roster) { + Date currentDate = new Date(currentTime); + activeUsers.put(nickname, currentDate); + + if (currentTime - lastCheckTime > IPresenceChatService.PRESENCE_IDLE_TIMEOUT) { + // store active users + getPresenceChatService().updateUserPresence(lessonId, activeUsers); + activeUsers.clear(); + + // read active users from all nodes + List storedActiveUsers = getPresenceChatService().getUsersActiveByLessonId( + lessonId); + roster.clear(); + for (PresenceChatUser activeUser : storedActiveUsers) { + roster.put(activeUser.getNickname(), activeUser.getLastPresence()); + } + + lastCheckTime = currentTime; + } else { + roster.put(nickname, currentDate); + } + + return new JSONArray(roster.keySet()); + } + } + } + + private static IPresenceChatService presenceChatService; + + private static Logger logger = Logger.getLogger(PresenceChatAction.class); + + private static final Map rosters = Collections.synchronizedMap(new HashMap()); + + public ActionForward getChatContent(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) { + try { + long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + boolean presenceShown = Boolean.parseBoolean(request.getParameter("presenceShown")); + // this is the current user + String nickname = request.getParameter("to"); + + JSONObject responseJSON = new JSONObject(); + // no need to fetch messages if presence is collapsed + if (presenceShown) { + // this is the other user from opened tab, null if it is group chat + String from = request.getParameter("from"); + if (StringUtils.isBlank(from)) { + from = null; + } + + String lastMessageUid = request.getParameter("lastMessageUid"); + if (StringUtils.isBlank(lastMessageUid)) { + lastMessageUid = null; + } + + getMessages(nickname, from, lessonId, lastMessageUid == null ? null : Long.valueOf(lastMessageUid), + responseJSON); + } + // getRoster MUST be after getMessages + // as the latter depends on previous value of check date stored in roster + getRoster(nickname, lessonId, responseJSON); + + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + response.getWriter().write(responseJSON.toString()); + } catch (Exception e) { + PresenceChatAction.logger.error("Error while getting chat content", e); + } + + return null; + } + + public ActionForward sendMessage(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + try { + Long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + String from = request.getParameter("from"); + String to = request.getParameter("to"); + if (StringUtils.isBlank(to)) { + to = null; + } + String message = request.getParameter("message"); + getPresenceChatService().createPresenceChatMessage(lessonId, from, to, new Date(), message); + } catch (Exception e) { + PresenceChatAction.logger.error(e.getMessage()); + } + + return null; + } + + /** + * Gets users currently using the Chat instance. + */ + private void getRoster(String nickname, Long lessonId, JSONObject responseJSON) throws JSONException { + // this is equivalent of a chat room + Roster lessonRoster = PresenceChatAction.rosters.get(lessonId); + if (lessonRoster == null) { + lessonRoster = new Roster(lessonId); + PresenceChatAction.rosters.put(lessonId, lessonRoster); + } + + responseJSON.put("roster", lessonRoster.getRosterJSON(nickname)); + } + + private void getMessages(String nickname, String from, Long lessonId, Long lastMessageUid, JSONObject responseJSON) + throws JSONException { + Set newConversationsWith = new HashSet(); + + Roster roster = PresenceChatAction.rosters.get(lessonId); + Date lastCheck = roster == null ? null : roster.roster.get(nickname); + List messages = getPresenceChatService().getNewMessages(lessonId, nickname, from, + lastMessageUid, lastCheck); + + for (PresenceChatMessage message : messages) { + String messageFrom = message.getFrom(); + String messageTo = message.getTo(); + if (from == null ? messageTo == null : (from.equals(messageTo) && nickname.equals(messageFrom)) + || (from.equals(messageFrom) && nickname.equals(messageTo))) { + // this goes to opened tab, so get the whole message + JSONObject messageJSON = new JSONObject(); + messageJSON.put("uid", message.getUid()); + messageJSON.put("from", messageFrom); + messageJSON.put("dateSent", message.getDateSent()); + messageJSON.put("message", message.getMessage()); + + responseJSON.append("messages", messageJSON); + } else if (!nickname.equals(messageFrom)) { + // someone from other tab sent the user a message, just let him know + newConversationsWith.add(messageTo == null ? "group" : messageFrom); + } + + if (!newConversationsWith.isEmpty()) { + responseJSON.put("newConversations", newConversationsWith); + } + } + } + + private IPresenceChatService getPresenceChatService() { + if (PresenceChatAction.presenceChatService == null) { + WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(HttpSessionManager + .getInstance().getServletContext()); + PresenceChatAction.presenceChatService = (IPresenceChatService) ctx.getBean("presenceChatService"); + } + return PresenceChatAction.presenceChatService; + } +} \ No newline at end of file Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_central/src/java/org/lamsfoundation/lams/webservice/PresenceChatLoggerAction.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_central/web/includes/javascript/jsjac.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_central/web/includes/javascript/jsjac.packed.js'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_central/web/learner.jsp =================================================================== diff -u -raffc66817dcbf5a677c7742c13fb93a9b35ae97a -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_central/web/learner.jsp (.../learner.jsp) (revision affc66817dcbf5a677c7742c13fb93a9b35ae97a) +++ lams_central/web/learner.jsp (.../learner.jsp) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -14,7 +14,6 @@ - @@ -23,10 +22,10 @@ - &portfolioEnabled=&presenceEnabledPatch=&presenceImEnabled=&presenceUrl=&createDateTime=&title=&mode=¬ifyCloseURL="> + &portfolioEnabled=&presenceEnabledPatch=&presenceImEnabled=&createDateTime=&title=&mode=¬ifyCloseURL="> - &portfolioEnabled=&presenceEnabledPatch=&presenceImEnabled=&presenceUrl=&createDateTime=&title=&mode=¬ifyCloseURL="> + &portfolioEnabled=&presenceEnabledPatch=&presenceImEnabled=&createDateTime=&title=&mode=¬ifyCloseURL="> Index: lams_central/web/lessonIntro.jsp =================================================================== diff -u -r35a0e719d061c08b52e705135bb2f2126079ed21 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_central/web/lessonIntro.jsp (.../lessonIntro.jsp) (revision 35a0e719d061c08b52e705135bb2f2126079ed21) +++ lams_central/web/lessonIntro.jsp (.../lessonIntro.jsp) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -7,7 +7,7 @@ <%@ taglib uri="tags-core" prefix="c" %> <%@ taglib uri="tags-html" prefix="html" %> -mode=${mode}&portfolioEnabled=${portfolioEnabled}&presenceEnabledPatch=${presenceEnabledPatch}&presenceImEnabled=${presenceImEnabled}&title=${title}&createDateTime=${createDateTime}&serverUrl=${serverUrl}&presenceUrl=${presenceUrl}&lessonID=${lessonID} +mode=${mode}&portfolioEnabled=${portfolioEnabled}&presenceEnabledPatch=${presenceEnabledPatch}&presenceImEnabled=${presenceImEnabled}&title=${title}&createDateTime=${createDateTime}&serverUrl=${serverUrl}&lessonID=${lessonID} Index: lams_common/build.xml =================================================================== diff -u -r0eda5c297baa810556244c7a87bc1321964d3c63 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_common/build.xml (.../build.xml) (revision 0eda5c297baa810556244c7a87bc1321964d3c63) +++ lams_common/build.xml (.../build.xml) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -23,6 +23,8 @@ + + Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/presence/model/PresenceChatMessage.hbm.xml'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_common/src/java/org/lamsfoundation/lams/commonContext.xml =================================================================== diff -u -r2b88dada3266a4b0f83f4b5c4cf617553496ca59 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) +++ lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -200,9 +200,8 @@ - - - + + @@ -373,7 +372,7 @@ - + Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch02040014.sql =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch02040014.sql (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch02040014.sql (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -0,0 +1,27 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; + +-- LDEV-2949 +UPDATE lams_presence_chat_msgs SET room_name=SUBSTRING_INDEX(room_name, '_', 1); + +ALTER TABLE lams_presence_chat_msgs CHANGE COLUMN room_name lesson_id BIGINT(20) NOT NULL, + ADD CONSTRAINT FK_lams_presence_chat_msgs_lesson FOREIGN KEY (lesson_id) + REFERENCES lams_lesson (lesson_id) + ON UPDATE CASCADE ON DELETE CASCADE, + ADD INDEX idx_lams_presence_chat_msgs_from (from_user), + ADD INDEX idx_lams_presence_chat_msgs_to (to_user); + +CREATE TABLE lams_presence_user ( + nickname VARCHAR(255) NOT NULL, + lesson_id BIGINT(20) NOT NULL, + last_presence DATETIME, + PRIMARY KEY (nickname, lesson_id), + CONSTRAINT FK_lams_presence_user_lesson FOREIGN KEY (lesson_id) + REFERENCES lams_lesson (lesson_id) ON UPDATE CASCADE ON DELETE CASCADE +)ENGINE=InnoDB; + +DELETE FROM lams_configuration WHERE header_name='config.header.chat'; + +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/localCommonContext.xml =================================================================== diff -u -r7998a31f6d7d4f1eef3e866bafef22caa012eb7a -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_common/src/java/org/lamsfoundation/lams/localCommonContext.xml (.../localCommonContext.xml) (revision 7998a31f6d7d4f1eef3e866bafef22caa012eb7a) +++ lams_common/src/java/org/lamsfoundation/lams/localCommonContext.xml (.../localCommonContext.xml) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -103,6 +103,7 @@ classpath:org/lamsfoundation/lams/presence/model/PresenceChatMessage.hbm.xml + classpath:org/lamsfoundation/lams/presence/model/PresenceChatRoster.hbm.xml classpath:org/lamsfoundation/lams/events/Event.hbm.xml @@ -283,9 +284,8 @@ - - - + + @@ -417,7 +417,7 @@ - + Index: lams_common/src/java/org/lamsfoundation/lams/presence/dao/IPresenceChatDAO.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/presence/dao/IPresenceChatDAO.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/presence/dao/IPresenceChatDAO.java (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -0,0 +1,47 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ + +package org.lamsfoundation.lams.presence.dao; + +import java.util.Date; +import java.util.List; + +import org.lamsfoundation.lams.presence.model.PresenceChatMessage; +import org.lamsfoundation.lams.presence.model.PresenceChatUser; + +public interface IPresenceChatDAO { + + void saveOrUpdate(Object object); + + PresenceChatMessage getMessageById(Long id); + + List getMessagesByLessonId(Long lessonId); + + List getMessagesByConversation(Long lessonId, String from, String to); + + List getNewMessages(Long lessonId, String from, String to, Long lastMessageUid, Date lastCheck); + + List getUsersByLessonIdAndLastPresence(Long lessonId, Date oldestLastPresence); +} \ No newline at end of file Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_common/src/java/org/lamsfoundation/lams/presence/dao/IPresenceChatMessageDAO.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_common/src/java/org/lamsfoundation/lams/presence/dao/hibernate/PresenceChatDAO.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/presence/dao/hibernate/PresenceChatDAO.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/presence/dao/hibernate/PresenceChatDAO.java (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -0,0 +1,111 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ + +package org.lamsfoundation.lams.presence.dao.hibernate; + +import java.util.Date; +import java.util.List; + +import org.lamsfoundation.lams.dao.hibernate.BaseDAO; +import org.lamsfoundation.lams.presence.dao.IPresenceChatDAO; +import org.lamsfoundation.lams.presence.model.PresenceChatMessage; +import org.lamsfoundation.lams.presence.model.PresenceChatUser; + +public class PresenceChatDAO extends BaseDAO implements IPresenceChatDAO { + + private static final String MESSAGE_BY_MESSAGE_ID = "from " + PresenceChatMessage.class.getName() + " msg" + + " where msg.uid=?"; + + private static final String MESSAGE_BY_CONVERSATION = "from " + + PresenceChatMessage.class.getName() + + " msg" + + " where (msg.from=:from and msg.to=:to) or (msg.from=:to and msg.to=:from) and msg.lessonId=:lessonId order by msg.dateSent asc"; + + private static final String MESSAGE_BY_LESSON_ID = "from " + PresenceChatMessage.class.getName() + " msg" + + " where msg.lessonId=? and msg.to is null order by msg.dateSent asc"; + + // main query for getting new messages + private static final String MESSAGE_NEW = "FROM " + + PresenceChatMessage.class.getName() + + " msg" + + " WHERE msg.lessonId=:lessonId AND" + // below: get messages for opened tab, only if they have not been read yet; + // in HQL, CASE statement does notwork :( and this trick with 'NULL'=:to is really necessary + + " (msg.uid > :lastMessageUid AND (('NULL'=:to AND msg.to IS NULL) OR (msg.to=:to AND msg.from=:from) OR (msg.to=:from AND msg.from=:to)))" + // below: get new messages from other tabs/users, if they have not been checked yet + + " OR (msg.dateSent > :lastCheck AND (msg.to IS NULL OR msg.to=:from))" + " ORDER BY msg.dateSent ASC"; + + public static final String USER_BY_LESSON_ID_AND_TIME = "from " + PresenceChatUser.class.getName() + " r" + + " where r.lessonId=? and r.lastPresence > ?"; + + @Override + public void saveOrUpdate(Object object) { + this.getHibernateTemplate().saveOrUpdate(object); + this.getHibernateTemplate().flush(); + } + + @Override + @SuppressWarnings("unchecked") + public PresenceChatMessage getMessageById(Long id) { + List list = (getHibernateTemplate().find(PresenceChatDAO.MESSAGE_BY_CONVERSATION, + new Object[] { id })); + + if (!list.isEmpty()) { + return list.get(0); + } else { + return null; + } + } + + @Override + @SuppressWarnings("unchecked") + public List getMessagesByConversation(Long lessonId, String from, String to) { + return (getHibernateTemplate().findByNamedParam(PresenceChatDAO.MESSAGE_BY_CONVERSATION, new String[] { "from", + "to", "lessonId" }, new Object[] { from, to, lessonId })); + } + + @Override + @SuppressWarnings("unchecked") + public List getMessagesByLessonId(Long lessonId) { + return (getHibernateTemplate().find(PresenceChatDAO.MESSAGE_BY_LESSON_ID, new Object[] { lessonId })); + } + + @Override + @SuppressWarnings("unchecked") + public List getNewMessages(Long lessonId, String from, String to, Long lastMessageUid, + Date lastCheck) { + return (getHibernateTemplate().findByNamedParam(PresenceChatDAO.MESSAGE_NEW, new String[] { "lessonId", "from", + "to", "lastMessageUid", "lastCheck" }, new Object[] { lessonId, from, to == null ? "NULL" : to, + lastMessageUid == null ? 0 : lastMessageUid, lastCheck == null ? new Date(0) : lastCheck })); + } + + @Override + @SuppressWarnings("unchecked") + public List getUsersByLessonIdAndLastPresence(Long lessonId, Date oldestLastPresence) { + return this.getHibernateTemplate().find(PresenceChatDAO.USER_BY_LESSON_ID_AND_TIME, + new Object[] { lessonId, oldestLastPresence }); + + } +} Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_common/src/java/org/lamsfoundation/lams/presence/dao/hibernate/PresenceChatMessageDAO.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_common/src/java/org/lamsfoundation/lams/presence/dto/PresenceChatMessageDTO.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_common/src/java/org/lamsfoundation/lams/presence/model/PresenceChatMessage.java =================================================================== diff -u -r61df3f3f473a3619f93c63ceb879ae36438020e8 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_common/src/java/org/lamsfoundation/lams/presence/model/PresenceChatMessage.java (.../PresenceChatMessage.java) (revision 61df3f3f473a3619f93c63ceb879ae36438020e8) +++ lams_common/src/java/org/lamsfoundation/lams/presence/model/PresenceChatMessage.java (.../PresenceChatMessage.java) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -27,115 +27,100 @@ import java.util.Date; -import org.lamsfoundation.lams.presence.dto.PresenceChatMessageDTO; -import org.lamsfoundation.lams.usermanagement.User; - /** * @hibernate.class table="lams_presence_chat_msgs" */ public class PresenceChatMessage implements java.io.Serializable, Cloneable { - private Long uid; + private Long uid; - private String roomName; - - private String from; - - private String to; - - private Date dateSent; - - private String message; - - public PresenceChatMessage() { - - } - - public PresenceChatMessage(Long uid, String roomName, String from, - String to, Date dateSent, String message) { - super(); - this.uid = uid; - this.roomName = roomName; - this.from = from; - this.to = to; - this.dateSent = dateSent; - this.message = message; - } - - public PresenceChatMessage(PresenceChatMessageDTO presenceChatMessageDTO){ - this.uid = presenceChatMessageDTO.getUid(); - this.roomName = presenceChatMessageDTO.getRoomName(); - this.from = presenceChatMessageDTO.getFrom(); - this.to = presenceChatMessageDTO.getTo(); - this.dateSent = presenceChatMessageDTO.getDateSent(); - this.message = presenceChatMessageDTO.getMessage(); - } + private Long lessonId; - /** - * @hibernate.id generator-class="native" type="java.lang.Long" column="uid" - */ - public Long getUid() { - return uid; - } + private String from; - public void setUid(Long uid) { - this.uid = uid; - } + private String to; - /** - * @hibernate.property column="room_name" - */ - public String getRoomName() { - return roomName; - } + private Date dateSent; - public void setRoomName(String roomName) { - this.roomName = roomName; - } + private String message; - /** - * @hibernate.property column="from_user" - */ - public String getFrom() { - return from; - } + public PresenceChatMessage() { - public void setFrom(String from) { - this.from = from; - } + } - /** - * @hibernate.property column="to_user" - */ - public String getTo() { - return to; - } + public PresenceChatMessage(Long lessonId, String from, String to, Date dateSent, String message) { + super(); + this.lessonId = lessonId; + this.from = from; + this.to = to; + this.dateSent = dateSent; + this.message = message; + } - public void setTo(String to) { - this.to = to; - } - - /** - * @hibernate.property column="date_sent" - */ - public Date getDateSent() { - return dateSent; - } + /** + * @hibernate.id generator-class="native" type="java.lang.Long" column="uid" + */ + public Long getUid() { + return uid; + } - public void setDateSent(Date dateSent) { - this.dateSent = dateSent; - } + public void setUid(Long uid) { + this.uid = uid; + } - /** - * @hibernate.property column="message" - */ - public String getMessage() { - return message; - } + /** + * @hibernate.property column="lesson_id" + */ + public Long getLessonId() { + return lessonId; + } - public void setMessage(String message) { - this.message = message; - } - - + public void setLessonId(Long lessonId) { + this.lessonId = lessonId; + } + + /** + * @hibernate.property column="from_user" + */ + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + /** + * @hibernate.property column="to_user" + */ + public String getTo() { + return to; + } + + public void setTo(String to) { + this.to = to; + } + + /** + * @hibernate.property column="date_sent" + */ + public Date getDateSent() { + return dateSent; + } + + public void setDateSent(Date dateSent) { + this.dateSent = dateSent; + } + + /** + * @hibernate.property column="message" + */ + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + } Index: lams_common/src/java/org/lamsfoundation/lams/presence/model/PresenceChatUser.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/presence/model/PresenceChatUser.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/presence/model/PresenceChatUser.java (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -0,0 +1,82 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ + +package org.lamsfoundation.lams.presence.model; + +import java.util.Date; + +/** + * @hibernate.class table="lams_presence_user" + */ +public class PresenceChatUser implements java.io.Serializable, Cloneable { + + private String nickname; + + private Long lessonId; + + private Date lastPresence; + + public PresenceChatUser() { + } + + public PresenceChatUser(String nickname, Long lessonId, Date lastPresence) { + this.nickname = nickname; + this.lessonId = lessonId; + this.lastPresence = lastPresence; + } + + /** + * @hibernate.id generator-class="assigned" column="nickname" + */ + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + /** + * @hibernate.property column="lesson_id" + */ + public Long getLessonId() { + return lessonId; + } + + public void setLessonId(Long lessonId) { + this.lessonId = lessonId; + } + + /** + * @hibernate.property column="last_presence" + */ + public Date getLastPresence() { + return lastPresence; + } + + public void setLastPresence(Date lastPresence) { + this.lastPresence = lastPresence; + } +} \ No newline at end of file Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_common/src/java/org/lamsfoundation/lams/presence/service/IPresenceChatLoggerService.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_common/src/java/org/lamsfoundation/lams/presence/service/IPresenceChatService.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/presence/service/IPresenceChatService.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/presence/service/IPresenceChatService.java (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -0,0 +1,53 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ + +package org.lamsfoundation.lams.presence.service; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.lamsfoundation.lams.presence.model.PresenceChatMessage; +import org.lamsfoundation.lams.presence.model.PresenceChatUser; + +public interface IPresenceChatService { + final long PRESENCE_IDLE_TIMEOUT = 15 * 1000; + + PresenceChatMessage createPresenceChatMessage(Long lessonId, String from, String to, Date dateSent, String message); + + PresenceChatMessage getMessageById(Long id); + + List getMessagesByLessonId(Long lessonId); + + List getMessagesByConversation(Long lessonId, String from, String to); + + List getNewMessages(Long lessonId, String from, String to, Long lastMessageUid, Date lastCheck); + + void saveOrUpdatePresenceChatMessage(PresenceChatMessage presenceChatMessage); + + public void updateUserPresence(Long lessonId, Map presence); + + List getUsersActiveByLessonId(Long lessonId); +} \ No newline at end of file Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_common/src/java/org/lamsfoundation/lams/presence/service/PresenceChatLoggerService.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_common/src/java/org/lamsfoundation/lams/presence/service/PresenceChatService.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/presence/service/PresenceChatService.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/presence/service/PresenceChatService.java (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -0,0 +1,102 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ + +package org.lamsfoundation.lams.presence.service; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.lamsfoundation.lams.presence.dao.IPresenceChatDAO; +import org.lamsfoundation.lams.presence.model.PresenceChatMessage; +import org.lamsfoundation.lams.presence.model.PresenceChatUser; + +public class PresenceChatService implements IPresenceChatService { + + private static Logger log = Logger.getLogger(PresenceChatService.class); + + private IPresenceChatDAO presenceChatDAO; + + @Override + public PresenceChatMessage createPresenceChatMessage(Long lessonId, String from, String to, Date dateSent, + String message) { + PresenceChatMessage presenceChatMessage = new PresenceChatMessage(lessonId, from, to, dateSent, message); + + saveOrUpdatePresenceChatMessage(presenceChatMessage); + return presenceChatMessage; + } + + /** + * Stores information when users with given UIDs were last seen in their Chat session. + */ + @Override + public void updateUserPresence(Long lessonId, Map presence) { + for (String nickname : presence.keySet()) { + PresenceChatUser rosterEntry = new PresenceChatUser(nickname, lessonId, presence.get(nickname)); + presenceChatDAO.saveOrUpdate(rosterEntry); + } + } + + @Override + public List getUsersActiveByLessonId(Long lessonId) { + Date oldestLastPresence = new Date(System.currentTimeMillis() - IPresenceChatService.PRESENCE_IDLE_TIMEOUT); + return presenceChatDAO.getUsersByLessonIdAndLastPresence(lessonId, oldestLastPresence); + } + + @Override + public PresenceChatMessage getMessageById(Long id) { + return presenceChatDAO.getMessageById(id); + } + + @Override + public List getMessagesByLessonId(Long lessonId) { + return presenceChatDAO.getMessagesByLessonId(lessonId); + } + + @Override + public List getMessagesByConversation(Long lessonId, String from, String to) { + return presenceChatDAO.getMessagesByConversation(lessonId, from, to); + } + + @Override + public List getNewMessages(Long lessonId, String from, String to, Long lastMessageUid, + Date lastCheck) { + return presenceChatDAO.getNewMessages(lessonId, from, to, lastMessageUid, lastCheck); + } + + @Override + public void saveOrUpdatePresenceChatMessage(PresenceChatMessage presenceChatMessage) { + presenceChatDAO.saveOrUpdate(presenceChatMessage); + } + + public IPresenceChatDAO getPresenceChatMessageDAO() { + return this.presenceChatDAO; + } + + public void setPresenceChatDAO(IPresenceChatDAO presenceChatDAO) { + this.presenceChatDAO = presenceChatDAO; + } +} \ No newline at end of file Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_common/src/java/org/lamsfoundation/lams/util/XMPPUtil.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_learning/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -rfbcc39165dcd908171cee18188e528e176693a04 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_learning/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision fbcc39165dcd908171cee18188e528e176693a04) +++ lams_learning/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -106,6 +106,10 @@ label.print =Print message.released.lessons =You are now able to participate in following lessons: {0}. learner.im.title =Instant messaging +learner.im.group.chat =Group Chat +learner.im.users =Users +learner.im.send =Send +learner.im.ie6.warning =Sorry, Internet Explorer 6 is not compatible with Presence Chat label.learner.progress.open=CLOSE label.learner.progress.open.tooltip=Hide lesson progress label.learner.progress.closed=PROGRESS Index: lams_learning/web/css/presence.css =================================================================== diff -u --- lams_learning/web/css/presence.css (revision 0) +++ lams_learning/web/css/presence.css (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -0,0 +1,147 @@ +/* +************************************************* +LAMS 2.2 +Date modified: 29/04/2009 + +************************************************* +Presence stylesheet +********************************************** */ + +#presenceUserListings { + margin: 5px; + padding: 2px; +} + +#presenceChat { + position: absolute; + width: 600px; + height: 300px; + right: 18px; + z-index: 10; +} + +#presenceChatWarning { + position: absolute; + width: 400px; + right: 18px; + z-index: 10; + padding: 10px 10px 10px 40px; + margin: 0px; +} + +#presenceChatTabs { + position: absolute; + bottom: 0px; + left: 0px; + width: 73%; + height: 260px; +} + +#presenceChatRoster { + position: absolute; + right: 0pt; + bottom: 0pt; + width: 25%; + height: 100%; +} + +#presenceUserListings{ + height: 255px; + overflow-x: hidden; + overflow-y: scroll; +} + +#minMaxIcon{ + position:absolute; + top: 0px; + right:0px; +} + +#tabsHolder { + float: left; + width: 90%; + overflow:hidden; +} + +#leftSliderDiv { + float: left; + width: 5%; + text-align: left; +} + +#rightSliderDiv { + float: left; + width: 5%; + text-align: right; +} + +.smallImage { + width: 16px; + height: 16px; + border: none; +} + +.startHidden { + display: none; +} + +.presenceListing { + width:"100%"; +} + +.presenceListing:hover { + width:"100%"; + background-color: #CBDBFF; + cursor: pointer; +} + +.presenceListingNewMessage { + background-color: #88FF99; +} + +.presenceTabNewMessage { + text-decoration: underline; +} + +.presenceMessage { + padding-bottom: 4px; +} + +.presenceMessageFrom { + font-weight: bold; +} + +.presenceMessageEmote { + font-style: italic; + padding-bottom: 4px; +} + +.chatPanel { + width: 95%; + height: 220px; +} + +.messageArea { + width: 100%; + height: 80%; + overflow-x: hidden; + overflow-y: scroll; +} + +.sendArea { + width: 100%; + height: 20%; +} + +.messageInput { + float: left; + width: 85%; +} + +.sendButton { + float: left; +} + +table.tabLabelTable { + width: auto; +} \ No newline at end of file Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/JavaScriptFlashGateway.js'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_learning/web/includes/JavaScriptFlashGateway.swf =================================================================== diff -u -r0b7d091f6bf6d5b3b2bd72b450903f0dc0f8b76c -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_learning/web/includes/javascript/presence.js =================================================================== diff -u --- lams_learning/web/includes/javascript/presence.js (revision 0) +++ lams_learning/web/includes/javascript/presence.js (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -0,0 +1,321 @@ +var windowHeight; +var pollInProgress = false; + +var roster = { + users : [], + // map "tab" -> "last message in tab", so we don't fetch all messages every time, only new ones + lastMessageUids : [], + + // when user clicked another user in roster + handleUserClicked : function(index) { + var nick = roster.users[index]; + + if(nick != nickname){ + var tag = nickToTag(nick); + var tabLabel = tagToTabLabel(tag); + var tab = $('#' + tabLabel); + // if the clicked user's tab is open + if(tab.length){ + // make the sender's tab label unbold + tab.html(nick); + } else { + // if the clicked user's tab is not already open, create it and select it + addTab(nick, tag); + } + + // select the added tab + presenceChatTabs.tabs('select' , tag); + } + }, + + updateDisplay : function(users) { + // sort alphabetically + users.sort(); + this.users = users; + + // for all users + jQuery.each(this.users, function(index, nick){ + var tag = nickToTag(nick); + var listingName = tagToListing(tag); + var listing = $("#" + listingName); + + // if no listing in roster exists + if (listing.length == 0){ + // create listing div + var listingDiv = $('
' + + createPresenceListing(nick, tag) + + '
'); + + // add the listing div + rosterDiv.append(listingDiv); + } else { + // remove and append at the right place (from sort) + rosterDiv.append(listing.remove()); + } + }); + + // update presenceTabLabel + var presenceTabLabelDiv = $("#presence_tabLabel"); + presenceTabLabelDiv.html(labelUsers + " (" + this.users.length + ")"); + } +} + +/* ******* HTML write Functions ******* */ + +function createPrivateTabLabel(nick, tag){ + return '' + + '' + + '' + + '' + + '' + + '' + + '
' + nick + '
'; +} + +function createPrivateTabContent(nick, tag){ + return '

' + + '
' + + '' + + '' + + '
'; +} + +function createPresenceListing(nick, tag){ + return '' + + '' + + '' + + '' + + '' + + '
' + nick + '
'; +} + +/* ******* Helper Functions ******* */ +function generateMessageHTML(nick, message, date) { + var fromElem = $('
(' + date.substring(11, 19) + ') ' + nick + '
'); + var msgElem = $('
' + message + '
'); + + return completeElem = $('
').append(fromElem).append(msgElem); +} + +function resizeChat() { + // refresh the window height + windowHeight = $(window).height() - 30; + + // if presence is shown + if (presenceShown) { + // set presence chat to maximized height + presenceChat.css({ + 'top' : windowHeight - 270 + "px" + }); + } + // otherwise + else { + // set presence chat to minimized height + presenceChat.css({ + 'top' : windowHeight + "px" + }); + } + + $("#presenceChatWarning").css({ + 'top' : windowHeight - 10 + "px" + }); +} + +function getUserFromTabIndex(tabIndex) { + var tabLabelsLocal = $(".ui-tabs-label"); + var label = tabLabelsLocal[tabIndex].innerHTML; + + if (label == groupChatInfo.nick) { + return groupChatInfo.nick; + } else { + for ( var i = 0; i < roster.users.length; i++) { + if (roster.users[i] == label) { + return roster.users[i]; + } + } + } + + return null; +} + +function addTab(nick, tag) { + // add a tab with the the nick specified + presenceChatTabs.tabs('add', '#' + tag, + createPrivateTabLabel(nick, tag)); + // add the content + $("#" + tag).html(createPrivateTabContent(nick, tag)); +} + +function nickToTag(nick) { + return nick == groupChatInfo.nick ? groupChatInfo.tag : nick.replace(/ /g, "_"); +} + +function nickToMessageArea(nick) { + return nickToTag(nick) + '_messageArea'; +} + +function tagToListing(tag) { + return tag + '_listing'; +} + +function tagToTabLabel(tag) { + return tag + '_tabLabel'; +} + +function getTime() { + var currentTime = new Date(); + var hours = currentTime.getHours(); + var minutes = currentTime.getMinutes(); + var seconds = currentTime.getSeconds(); + + if (hours < 10) { + hours = "0" + hours; + } + + if (minutes < 10) { + minutes = "0" + minutes; + } + + if (seconds < 10) { + seconds = "0" + seconds; + } + + return "(" + hours + ":" + minutes + ":" + seconds + ")"; +} + +/* ******* Main chat functions ******* */ + +function sendMessage(receiver) { + var tag = nickToTag(receiver); + var messageInput = $('#' + tag + '_messageInput'); + var message = messageInput.val(); + if (!message || message == '') { + return false; // do not send empty messages. + } + + messageInput.val(''); + messageInput.focus(); + + $.ajax({ + url : actionUrl, + data : {'method' : 'sendMessage', + 'lessonID' : lessonId, + 'from' : nickname, + 'to' : tag == groupChatInfo.tag ? null : receiver, + 'message' : message + }, + cache : false, + complete : updateChat + }); +} + +function updateChat(){ + // skip another attempt if previous did not return yet (slow server?) + if (!pollInProgress) { + pollInProgress = true; + var selected = presenceChatTabs.tabs('option','selected'); + var from = getUserFromTabIndex(selected); + if (groupChatInfo.nick == from) { + from = null; + } + + $.ajax({ + url : actionUrl, + data : {'method' : 'getChatContent', + 'lessonID' : lessonId, + 'presenceShown' : presenceShown, + 'lastMessageUid' : roster.lastMessageUids[from ? from : 'group'], + 'to' : nickname, + 'from' : from + }, + cache : false, + dataType : 'json', + complete : function(){ + pollInProgress = false; + }, + success : function (result) { + roster.updateDisplay(result.roster); + + // real new messages for the opentab + if (result.messages) { + var messageArea = $("#" + (nickToMessageArea(from ? from : groupChatInfo.tag))); + var lastMessageUid = null; + jQuery.each(result.messages, function(){ + messageArea.append(generateMessageHTML(this.from, this.message, this.dateSent)); + lastMessageUid = this.uid; + }); + // store last message uid and get new messages starting from this one + roster.lastMessageUids[from ? from : 'group'] = lastMessageUid; + messageArea.scrollTop(messageArea.prop('scrollHeight')); + } + + // check if other users wrote something new + if (result.newConversations) { + var selectedTabTag = nickToTag(getUserFromTabIndex(selected)); + jQuery.each(result.newConversations, function(index, nick){ + var tag = nick == 'group' ? groupChatInfo.tag : nickToTag(nick); + if (tag != selectedTabTag) { + var tab = $("#" + tagToTabLabel(tag)); + if (tab.length == 0) { + addTab(this, tag); + tab = $("#" + tagToTabLabel(tag)); + } + + // notify of new message + tab.addClass('presenceTabNewMessage'); + if (tag != groupChatInfo.tag) { + $("#" + tagToListing(tag)).addClass('presenceListingNewMessage'); + } + } + }); + } + } + }); + } +} + + +/* ******* Click handlers ******* */ + + +function handleCloseTab(label){ + var tabLabelsLocal = $(".ui-tabs-label"); + for (var i = 0; i < tabLabelsLocal.length; i++){ + if(tabLabelsLocal[i].innerHTML == label){ + presenceChatTabs.tabs('remove' , i); + roster.lastMessageUids[label] = null; + } + } +} + +function handleLeftScrollClick(){ + presenceChatTabs.tabs('scrollLeft'); +} + +function handleRightScrollClick(){ + presenceChatTabs.tabs('scrollRight'); +} + +function handlePresenceClick() { + if (presenceShown) { + presenceChat.animate({ + top : windowHeight + "px" + }, 1000); + minMaxIcon.attr("src", lamsUrl + "images/icons/bullet_arrow_top.png") + presenceShown = false; + } else { + presenceChat.animate({ + top : windowHeight - 270 + "px" + }, 1000); + minMaxIcon.attr("src", lamsUrl + "images/icons/bullet_arrow_bottom.png"); + presenceShown = true; + } +} + +function handleMessageInput(e, nick) { + if (e.which == 13) { + e.preventDefault(); + sendMessage(nick); + } +} \ No newline at end of file Index: lams_learning/web/includes/jquery-contextmenu/images/cut.png =================================================================== diff -u -r35a0e719d061c08b52e705135bb2f2126079ed21 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_learning/web/includes/jquery-contextmenu/images/door.png =================================================================== diff -u -r35a0e719d061c08b52e705135bb2f2126079ed21 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_learning/web/includes/jquery-contextmenu/images/page_white_copy.png =================================================================== diff -u -r35a0e719d061c08b52e705135bb2f2126079ed21 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_learning/web/includes/jquery-contextmenu/images/page_white_delete.png =================================================================== diff -u -r35a0e719d061c08b52e705135bb2f2126079ed21 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_learning/web/includes/jquery-contextmenu/images/page_white_edit.png =================================================================== diff -u -r35a0e719d061c08b52e705135bb2f2126079ed21 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Index: lams_learning/web/includes/jquery-contextmenu/images/page_white_paste.png =================================================================== diff -u -r35a0e719d061c08b52e705135bb2f2126079ed21 -re64a90c0cc74118c5b88f5cbae323065abd59cac Binary files differ Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jquery-contextmenu/jquery.contextMenu.css'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jquery-contextmenu/jquery.contextMenu.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jquery-contextmenu/jqueryContextMenu.html'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/AUTHORS'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/COPYING'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/ChangeLog'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/MPL-1.1.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/Makefile'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/README'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/examples/simpleclient.html'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/gpl-2.0.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/jsjac.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/jsjac.packed.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/lgpl-2.1.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaC.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCBuilder.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCConfig.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCConnection.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCConsoleLogger.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCConstants.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCCookie.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCError.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCHttpBindingConnection.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCHttpPollingConnection.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCJID.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCJSON.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCKeys.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/JSJaCPacket.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/Makefile'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/crypt.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/header.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/jsextras.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/jsjac-1.3.1/src/xmlextras.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/presence.css'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/presence.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag e64a90c0cc74118c5b88f5cbae323065abd59cac refers to a dead (removed) revision in file `lams_learning/web/includes/presenceChat.jsp'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_learning/web/lessonChat.jsp =================================================================== diff -u -r35a0e719d061c08b52e705135bb2f2126079ed21 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_learning/web/lessonChat.jsp (.../lessonChat.jsp) (revision 35a0e719d061c08b52e705135bb2f2126079ed21) +++ lams_learning/web/lessonChat.jsp (.../lessonChat.jsp) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -52,12 +52,8 @@ - <% - String jabberServer = Configuration.get(ConfigurationKeys.XMPP_DOMAIN); - %> - <%=jabberServer%> - <%@ include file="/includes/presenceChat.jsp" %> + <%@ include file="presenceChat.jsp" %> Index: lams_learning/web/mainflash.jsp =================================================================== diff -u -r35a0e719d061c08b52e705135bb2f2126079ed21 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_learning/web/mainflash.jsp (.../mainflash.jsp) (revision 35a0e719d061c08b52e705135bb2f2126079ed21) +++ lams_learning/web/mainflash.jsp (.../mainflash.jsp) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -166,11 +166,10 @@ String clientVersion = Configuration.get(ConfigurationKeys.LEARNER_CLIENT_VERSION); String serverLanguage = Configuration.get(ConfigurationKeys.SERVER_LANGUAGE); String languageDate = Configuration.get(ConfigurationKeys.DICTIONARY_DATE_CREATED); - String jabberServer = Configuration.get(ConfigurationKeys.XMPP_DOMAIN); %> - ?userID=&firstName=&lastName=&serverURL=&presenceServerUrl=<%=jabberServer%>&build=<%=clientVersion%>&lang=&country=&langDate=<%=languageDate%>&theme=&lessonID=&uniqueID=&mode= + ?userID=&firstName=&lastName=&serverURL=&build=<%=clientVersion%>&lang=&country=&langDate=<%=languageDate%>&theme=&lessonID=&uniqueID=&mode= lams_learner lams_learner.swf @@ -209,9 +208,8 @@
- - <%@ include file="/includes/presenceChat.jsp" %> + <%@ include file="presenceChat.jsp" %> Index: lams_learning/web/mainnoflash.jsp =================================================================== diff -u -r35a0e719d061c08b52e705135bb2f2126079ed21 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_learning/web/mainnoflash.jsp (.../mainnoflash.jsp) (revision 35a0e719d061c08b52e705135bb2f2126079ed21) +++ lams_learning/web/mainnoflash.jsp (.../mainnoflash.jsp) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -68,10 +68,9 @@ ')">    - - + - <%@ include file="/includes/presenceChat.jsp" %> + <%@ include file="presenceChat.jsp" %> Index: lams_learning/web/presenceChat.jsp =================================================================== diff -u --- lams_learning/web/presenceChat.jsp (revision 0) +++ lams_learning/web/presenceChat.jsp (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -0,0 +1,143 @@ +<%-- css --%> + + + +<%-- javascript --%> + + + + + +<%-- initial html / presence.js adds on html into here --%> +
+ <%-- only pop the message box if im is enabled --%> + +
+
+
+ +
+
+ +
+
+
+
+
+ + " class="sendButton" + onclick="javascript:sendMessage('groupchat')" /> +
+
+
+
+ +
+
+
+
+ + <%-- always pop the roster --%> +
+ +
+
+
+
+ +<%-- floating div shown when IE6 is being used --%> +
+ +
\ No newline at end of file Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/ChatService.java =================================================================== diff -u -r4a3d1ca484773efa5f184bcdbd374a53378f8e6f -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/ChatService.java (.../ChatService.java) (revision 4a3d1ca484773efa5f184bcdbd374a53378f8e6f) +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/service/ChatService.java (.../ChatService.java) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -435,7 +435,7 @@ return chatUserDAO.getByNicknameAndSessionID(nickname, sessionID); } - /* + /** * Stores information when users with given UIDs were last seen in their Chat session. */ public void updateUserPresence(Map presence) { Index: lams_tool_chat/web/includes/javascript/learning.js =================================================================== diff -u -recb763befc0380d0810f5794203bfcdf9ca0bfe7 -re64a90c0cc74118c5b88f5cbae323065abd59cac --- lams_tool_chat/web/includes/javascript/learning.js (.../learning.js) (revision ecb763befc0380d0810f5794203bfcdf9ca0bfe7) +++ lams_tool_chat/web/includes/javascript/learning.js (.../learning.js) (revision e64a90c0cc74118c5b88f5cbae323065abd59cac) @@ -52,17 +52,17 @@ } rosterDiv.html(''); - jQuery.each(result.roster, function(){ + jQuery.each(result.roster, function(index, value){ var userDiv = $('
', { - 'class' : (this == selectedUser ? 'selected' : 'unselected'), - 'text' : this - }).css('color', getColour(this)) + 'class' : (value == selectedUser ? 'selected' : 'unselected'), + 'text' : value + }).css('color', getColour(value)) .appendTo(rosterDiv); // only Monitor can send a personal message if (MODE == 'teacher') { userDiv.click(function(){ - userSelected($(this)); + userSelected($(value)); }); } });