From bbbfe09c31c077dc7527eba8175e658759a94859 Mon Sep 17 00:00:00 2001 From: Matt Tucker Date: Mon, 17 Jul 2006 08:39:08 +0000 Subject: [PATCH] Phase 1 of large refactoring. Removing dead code, bug fixes, updates to JDK 1.5. git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@4511 b35dd754-fafc-0310-a699-88a17e54d16e --- apps/webchat/build/ant | 42 - apps/webchat/build/ant.bat | 52 -- apps/webchat/build/build.xml | 91 --- apps/webchat/build/lib/servlet.jar | Bin 78351 -> 0 bytes apps/webchat/source/config/WEB-INF/web.xml | 167 ---- .../jivesoftware/webchat/EmoticonFilter.java | 292 ------- .../jivesoftware/webchat/JiveChatServlet.java | 729 ------------------ .../org/jivesoftware/webchat/TextStyle.java | 126 --- .../org/jivesoftware/webchat/URLFilter.java | 312 -------- .../jivesoftware/webchat/URLTranscoder.java | 188 ----- apps/webchat/source/web/account_creation.jsp | 116 --- apps/webchat/source/web/chat-hiddenform.jsp | 19 - apps/webchat/source/web/chat-launcher.jsp | 39 - apps/webchat/source/web/common.js | 182 ----- apps/webchat/source/web/frame_master.jsp | 33 - .../source/web/images/emoticons/angry.gif | Bin 692 -> 0 bytes .../source/web/images/emoticons/blush.gif | Bin 688 -> 0 bytes .../source/web/images/emoticons/confused.gif | Bin 688 -> 0 bytes .../source/web/images/emoticons/cool.gif | Bin 687 -> 0 bytes .../source/web/images/emoticons/cry.gif | Bin 693 -> 0 bytes .../source/web/images/emoticons/devil.gif | Bin 1093 -> 0 bytes .../source/web/images/emoticons/grin.gif | Bin 680 -> 0 bytes .../source/web/images/emoticons/happy.gif | Bin 675 -> 0 bytes .../source/web/images/emoticons/laugh.gif | Bin 670 -> 0 bytes .../source/web/images/emoticons/love.gif | Bin 1084 -> 0 bytes .../source/web/images/emoticons/mischief.gif | Bin 693 -> 0 bytes .../source/web/images/emoticons/plain.gif | Bin 678 -> 0 bytes .../source/web/images/emoticons/sad.gif | Bin 694 -> 0 bytes .../source/web/images/emoticons/shocked.gif | Bin 688 -> 0 bytes .../source/web/images/emoticons/silly.gif | Bin 685 -> 0 bytes .../source/web/images/emoticons/wink.gif | Bin 634 -> 0 bytes apps/webchat/source/web/images/logo.gif | Bin 925 -> 0 bytes .../source/web/images/logout-16x16.gif | Bin 325 -> 0 bytes apps/webchat/source/web/index.jsp | 164 ---- apps/webchat/source/web/input_frame.jsp | 75 -- .../webchat/source/web/participants_frame.jsp | 46 -- apps/webchat/source/web/style_sheet.jsp | 132 ---- apps/webchat/source/web/transcript_frame.html | 13 - build/build.xml | 21 +- build/projects/Smack.iml | 3 +- build/projects/Smack.ipr | 2 +- source/org/jivesoftware/smack/GroupChat.java | 353 --------- .../jivesoftware/smack/PacketCollector.java | 27 +- source/org/jivesoftware/smack/Roster.java | 106 +-- .../org/jivesoftware/smack/RosterEntry.java | 25 +- .../org/jivesoftware/smack/RosterGroup.java | 12 +- .../jivesoftware/smack/XMPPConnection.java | 24 +- .../jivesoftware/smack/packet/Presence.java | 182 ++--- .../smack/packet/RosterPacket.java | 46 +- .../smack/util/PacketParserUtils.java | 23 +- .../smackx/RosterExchangeManager.java | 5 +- .../smackx/muc/DeafOccupantInterceptor.java | 2 +- .../smackx/muc/MultiUserChat.java | 14 +- .../smackx/packet/RosterExchange.java | 15 +- test/config/test-case.xml | 6 +- test/org/jivesoftware/smack/MessageTest.java | 4 +- .../smack/PresencePriorityTest.java | 32 +- test/org/jivesoftware/smack/RosterTest.java | 57 +- .../smack/test/SmackTestCase.java | 6 +- .../smackx/OfflineMessageManagerTest.java | 8 +- .../smackx/RosterExchangeManagerTest.java | 8 +- .../smackx/muc/MultiUserChatTest.java | 16 +- 62 files changed, 291 insertions(+), 3524 deletions(-) delete mode 100644 apps/webchat/build/ant delete mode 100644 apps/webchat/build/ant.bat delete mode 100644 apps/webchat/build/build.xml delete mode 100644 apps/webchat/build/lib/servlet.jar delete mode 100644 apps/webchat/source/config/WEB-INF/web.xml delete mode 100644 apps/webchat/source/java/org/jivesoftware/webchat/EmoticonFilter.java delete mode 100644 apps/webchat/source/java/org/jivesoftware/webchat/JiveChatServlet.java delete mode 100644 apps/webchat/source/java/org/jivesoftware/webchat/TextStyle.java delete mode 100644 apps/webchat/source/java/org/jivesoftware/webchat/URLFilter.java delete mode 100644 apps/webchat/source/java/org/jivesoftware/webchat/URLTranscoder.java delete mode 100644 apps/webchat/source/web/account_creation.jsp delete mode 100644 apps/webchat/source/web/chat-hiddenform.jsp delete mode 100644 apps/webchat/source/web/chat-launcher.jsp delete mode 100644 apps/webchat/source/web/common.js delete mode 100644 apps/webchat/source/web/frame_master.jsp delete mode 100644 apps/webchat/source/web/images/emoticons/angry.gif delete mode 100644 apps/webchat/source/web/images/emoticons/blush.gif delete mode 100644 apps/webchat/source/web/images/emoticons/confused.gif delete mode 100644 apps/webchat/source/web/images/emoticons/cool.gif delete mode 100644 apps/webchat/source/web/images/emoticons/cry.gif delete mode 100644 apps/webchat/source/web/images/emoticons/devil.gif delete mode 100644 apps/webchat/source/web/images/emoticons/grin.gif delete mode 100644 apps/webchat/source/web/images/emoticons/happy.gif delete mode 100644 apps/webchat/source/web/images/emoticons/laugh.gif delete mode 100644 apps/webchat/source/web/images/emoticons/love.gif delete mode 100644 apps/webchat/source/web/images/emoticons/mischief.gif delete mode 100644 apps/webchat/source/web/images/emoticons/plain.gif delete mode 100644 apps/webchat/source/web/images/emoticons/sad.gif delete mode 100644 apps/webchat/source/web/images/emoticons/shocked.gif delete mode 100644 apps/webchat/source/web/images/emoticons/silly.gif delete mode 100644 apps/webchat/source/web/images/emoticons/wink.gif delete mode 100644 apps/webchat/source/web/images/logo.gif delete mode 100644 apps/webchat/source/web/images/logout-16x16.gif delete mode 100644 apps/webchat/source/web/index.jsp delete mode 100644 apps/webchat/source/web/input_frame.jsp delete mode 100644 apps/webchat/source/web/participants_frame.jsp delete mode 100644 apps/webchat/source/web/style_sheet.jsp delete mode 100644 apps/webchat/source/web/transcript_frame.html delete mode 100644 source/org/jivesoftware/smack/GroupChat.java diff --git a/apps/webchat/build/ant b/apps/webchat/build/ant deleted file mode 100644 index b4319cf79..000000000 --- a/apps/webchat/build/ant +++ /dev/null @@ -1,42 +0,0 @@ -#! /bin/sh - -# //--------------------------------------------------------------------------// -# // $RCSfile$ -# // $Revision$ -# // $Date$ -# // -# // Standard Jive Software ant file. Do not change this file. If you do, -# // you will have seven years of bad luck and bad builds. -# //--------------------------------------------------------------------------// - -# //--------------------------------------------------------------------------// -# // Uncomment the following lines if you wish to set JAVA_HOME in this script -# //--------------------------------------------------------------------------// -# JAVA_HOME= -# EXPORT JAVA_HOME - -# //--------------------------------------------------------------------------// -# // Check for the JAVA_HOME environment variable // -# //--------------------------------------------------------------------------// -if [ "$JAVA_HOME" != "" ] ; then - # //----------------------------------------------------------------------// - # // Create Ant's classpath // - # //----------------------------------------------------------------------// - CP=$JAVA_HOME/lib/tools.jar:../../../build/ant.jar - - # //----------------------------------------------------------------------// - # // Run ant // - # //----------------------------------------------------------------------// - $JAVA_HOME/bin/java -classpath $CP -Dant.home=. org.apache.tools.ant.Main $@ -else - # //----------------------------------------------------------------------// - # // No JAVA_HOME error message // - # //----------------------------------------------------------------------// - echo "Jive Forums Build Error:" - echo "" - echo "The JAVA_HOME environment variable is not set. JAVA_HOME should point" - echo "to your java directory, ie: /usr/local/bin/jdk1.3. You can set" - echo "this via the command line like so:" - echo " export JAVA_HOME=/usr/local/bin/jdk1.3" -fi - diff --git a/apps/webchat/build/ant.bat b/apps/webchat/build/ant.bat deleted file mode 100644 index fcbd96e70..000000000 --- a/apps/webchat/build/ant.bat +++ /dev/null @@ -1,52 +0,0 @@ -@echo off - -rem //------------------------------------------------------------------------// -rem // $RCSfile$ -rem // $Revision$ -rem // $Date$ -rem // -rem // Standard Jive Software ant.bat file. Do not change this file. If you do, -rem // you will have seven years of bad luck and bad builds. -rem //------------------------------------------------------------------------// - -rem //------------------------------------------------------------------------// -rem // Uncomment the following if you wish to set JAVA_HOME in this bat file: -rem //------------------------------------------------------------------------// -rem SET JAVA_HOME= - -rem //------------------------------------------------------------------------// -rem // Check for the JAVA_HOME environment variable -rem //------------------------------------------------------------------------// -if "%JAVA_HOME%" == "" goto noJavaHome - -rem //------------------------------------------------------------------------// -rem // Make the correct classpath (should include the java jars and the -rem // Ant jars) -rem //------------------------------------------------------------------------// -SET CP=%JAVA_HOME%\lib\tools.jar;..\..\..\build\ant.jar - -rem //------------------------------------------------------------------------// -rem // Run Ant -rem // Note for Win 98/95 users: You need to change "%*" in the following -rem // line to be "%1 %2 %3 %4 %5 %6 %7 %8 %9" -rem //------------------------------------------------------------------------// - -%JAVA_HOME%\bin\java -Xms32m -Xmx128m -classpath %CP% -Dant.home=. org.apache.tools.ant.Main %* -goto end - -rem //------------------------------------------------------------------------// -rem // Error message for missing JAVA_HOME -rem //------------------------------------------------------------------------// -:noJavaHome -echo. -echo Jive Forums Build Error: -echo. -echo The JAVA_HOME environment variable is not set. JAVA_HOME should point to -echo your java directory, ie: c:\jdk1.3.1. You can set this via the command -echo line like so: -echo SET JAVA_HOME=c:\jdk1.3 -echo. -goto end - -:end - diff --git a/apps/webchat/build/build.xml b/apps/webchat/build/build.xml deleted file mode 100644 index eb9095f21..000000000 --- a/apps/webchat/build/build.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/webchat/build/lib/servlet.jar b/apps/webchat/build/lib/servlet.jar deleted file mode 100644 index cda22d2a4f61a3a3398569ceab9cedc2a1ea8722..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78351 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�E;^w&iBptzL}R$7mD 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 - - - - - - WebChat - Smack-powered WebChat Application - - - host - jivesoftware.com - - - - - - - allowAnonymous - true - - - - - allowAccountCreation - true - - - - - allowLogin - true - - - - - logoFilename - images/logo.gif - - - - - chat.announcement-color - #009d00 - - - - - chat.owner-label-color - #aa0000 - - - - - chat.participant-label-color - #0000aa - - - - - chat.text-color - #434343 - - - - - error.text-color - #ff0000 - - - - - link.color - #045d30 - - - - - link.hover-color - #350000 - - - - - link.visited-color - #3b3757 - - - - - body.background-color - #ffffff - - - - - body.text-color - #362f2d - - - - - frame.divider-color - #83272b - - - - - button.color - #d6dfdf - - - - - button.text-color - #333333 - - - - - textfield.color - #f7f7fb - - - - - textfield.text-color - #333333 - - - - - - org.jivesoftware.webchat.JiveChatServlet - - - - - ChatServlet - org.jivesoftware.webchat.JiveChatServlet - 1 - - - - - ChatServlet - /ChatServlet/* - - - - 3 - - - - - index.jsp - - - \ No newline at end of file diff --git a/apps/webchat/source/java/org/jivesoftware/webchat/EmoticonFilter.java b/apps/webchat/source/java/org/jivesoftware/webchat/EmoticonFilter.java deleted file mode 100644 index 293edf0ff..000000000 --- a/apps/webchat/source/java/org/jivesoftware/webchat/EmoticonFilter.java +++ /dev/null @@ -1,292 +0,0 @@ -/** - * $RCSfile$ - * $Revision$ - * $Date$ - * - * Copyright (C) 2003 Jive Software. All rights reserved. - * - * This software is the proprietary information of Jive Software. Use is subject to license terms. - */ - -package org.jivesoftware.webchat; - -/** - * A Filter that converts ASCII emoticons into image equivalents. - * This filter should only be run after any HTML stripping filters.

- * - * The filter must be configured with information about where the image files - * are located. A table containing all the supported emoticons with their - * ASCII representations and image file names is as follows:

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
EmotionASCIIImage
Happy:) or :-)happy.gif
Sad:( or :-(sad.gif
Grin:Dgrin.gif
Love:xlove.gif
Mischief;\mischief.gif
CoolB-)cool.gif
Devil]:)devil.gif
Silly:psilly.gif
AngryX-(angry.gif
Laugh:^Olaugh.gif
Wink;) or ;-)wink.gif
Blush:8}blush.gif
Cry:_|cry.gif
Confused?:|confused.gif
Shocked:Oshocked.gif
Plain:|plain.gif
- * - * Note: special thanks to August Harrison for implementing an earlier version of this filter. - */ -public class EmoticonFilter { - - private static String imageHappy = "happy.gif"; - private static String imageSad = "sad.gif"; - private static String imageGrin = "grin.gif"; - private static String imageLove = "love.gif"; - private static String imageMischief = "mischief.gif"; - private static String imageCool = "cool.gif"; - private static String imageDevil = "devil.gif"; - private static String imageSilly = "silly.gif"; - private static String imageAngry = "angry.gif"; - private static String imageLaugh = "laugh.gif"; - private static String imageWink = "wink.gif"; - private static String imageBlush = "blush.gif"; - private static String imageCry = "cry.gif"; - private static String imageConfused = "confused.gif"; - private static String imageShocked = "shocked.gif"; - private static String imagePlain = "plain.gif"; - private static String imageURL = "images/emoticons"; - - // Placeholders for the built image tags - private static String imgHappy; - private static String imgSad; - private static String imgGrin; - private static String imgLove; - private static String imgMischief; - private static String imgCool; - private static String imgDevil; - private static String imgSilly; - private static String imgAngry; - private static String imgLaugh; - private static String imgWink; - private static String imgBlush; - private static String imgCry; - private static String imgConfused; - private static String imgShocked; - private static String imgPlain; - - public EmoticonFilter() { - buildImageTags(); - } - - public String applyFilter(String string) { - if (string == null || string.length() < 1) { - return string; - } - - int length = string.length(); - StringBuffer filtered = new StringBuffer(string.length() + 100); - char[] chars = string.toCharArray(); - - int length1 = length - 1; - int length2 = length - 2; - - int index = -1, i = 0, oldend = 0; - String imgTag; - - // Replace each of the emoticons, expanded search for performance - while (++index < length1) { - // no tag found yet... - imgTag = null; - - switch (chars[i = index]) { - case ']': - // "]:)" - if (i < length2 && chars[++i] == ':' && chars[++i] == ')') { - imgTag = imgDevil; - } - break; - case ':': - switch (chars[++i]) { - case ')': - // ":)" - imgTag = imgHappy; - break; - case '-': - // ":-)" - if (i < length1 && chars[++i] == ')') { - imgTag = imgHappy; - } - // ":-(" - else if (chars[i] == '(') { - imgTag = imgSad; - } - break; - case '(': - // ":(" - imgTag = imgSad; - break; - case 'D': - // ":D" - imgTag = imgGrin; - break; - case 'x': - // ":x" - imgTag = imgLove; - break; - case 'p': - // ":p" - imgTag = imgSilly; - break; - case '^': - // ":^O" - if (i < length1 && chars[++i] == 'O') { - imgTag = imgLaugh; - } - break; - case '8': - // ":8}" - if (i < length1 && chars[++i] == '}') { - imgTag = imgBlush; - } - break; - case '_': - // ":_|" - if (i < length1 && chars[++i] == '|') { - imgTag = imgCry; - } - break; - case 'O': - // ":O" - imgTag = imgShocked; - break; - case '|': - // ":|" - imgTag = imgPlain; - break; - default: - break; - } - break; - case ';': - switch (chars[++i]) { - case ')': - // ";)" - imgTag = imgWink; - break; - case '-': - // ";-)" - if (i < length1 && chars[++i] == ')') { - imgTag = imgWink; - } - break; - case '\\': - // ";\\" - imgTag = imgMischief; - break; - default: - break; - } - break; - case 'B': - // "B-)" - if (i < length2 && chars[++i] == '-' && chars[++i] == ')') { - imgTag = imgCool; - } - break; - case 'X': - // "X-(" - if (i < length2 && chars[++i] == '-' && chars[++i] == '(') { - imgTag = imgAngry; - } - break; - case '?': - // "?:|" - if (i < length2 && chars[++i] == ':' && chars[++i] == '|') { - imgTag = imgConfused; - } - break; - default: - break; - } - - // if we found one, replace - if (imgTag != null) { - filtered.append(chars, oldend, index-oldend); - filtered.append(imgTag); - - oldend = i + 1; - index = i; - } - } - - if (oldend < length) { - filtered.append(chars, oldend, length-oldend); - } - - return filtered.toString(); - } - - /** - * Returns the base URL for emoticon images. This can be specified as - * an absolute or relative path. - * - * @return the base URL for smiley images. - */ - public String getImageURL() { - return imageURL; - } - - /** - * Sets the base URL for emoticon images. This can be specified as - * an absolute or relative path. - * - * @param imageURL the base URL for emoticon images. - */ - public void setImageURL(String imageURL) { - if (imageURL != null && imageURL.length() > 0) { - if (imageURL.charAt(imageURL.length()-1) == '/') { - imageURL = imageURL.substring(0, imageURL.length()-1); - } - } - this.imageURL = imageURL; - - // rebuild the image tags - buildImageTags(); - } - - /** - * Build image tags - */ - private void buildImageTags() { - imgHappy = buildURL(imageHappy); - imgSad = buildURL(imageSad); - imgGrin = buildURL(imageGrin); - imgLove = buildURL(imageLove); - imgMischief = buildURL(imageMischief); - imgCool = buildURL(imageCool); - imgDevil = buildURL(imageDevil); - imgSilly = buildURL(imageSilly); - imgAngry = buildURL(imageAngry); - imgLaugh = buildURL(imageLaugh); - imgWink = buildURL(imageWink); - imgBlush = buildURL(imageBlush); - imgCry = buildURL(imageCry); - imgConfused = buildURL(imageConfused); - imgShocked = buildURL(imageShocked); - imgPlain = buildURL(imagePlain); - } - - /** - * Returns an HTML image tag using the base image URL and image name. - */ - private String buildURL(String imageName) { - String tag = ""; - - return tag; - } -} \ No newline at end of file diff --git a/apps/webchat/source/java/org/jivesoftware/webchat/JiveChatServlet.java b/apps/webchat/source/java/org/jivesoftware/webchat/JiveChatServlet.java deleted file mode 100644 index b509da321..000000000 --- a/apps/webchat/source/java/org/jivesoftware/webchat/JiveChatServlet.java +++ /dev/null @@ -1,729 +0,0 @@ -/** - * $RCSfile$ - * $Revision$ - * $Date$ - * - * Copyright (C) 2003 Jive Software. All rights reserved. - * - * This software is the proprietary information of Jive Software. Use is subject to license terms. - */ - -package org.jivesoftware.webchat; - -import java.io.*; -import java.util.*; - -import javax.servlet.*; -import javax.servlet.http.*; - -import org.jivesoftware.smack.*; -import org.jivesoftware.smack.filter.*; -import org.jivesoftware.smack.packet.*; -import org.jivesoftware.smack.util.StringUtils; - - -/** - * An extension of HttpServlet customized to handle transactions between N webclients - * and M chats located on a given XMPP server. While N >= M in the case of group chats, - * the code will currently, never the less, hold onto N connections to the XMPP server.
- * - * It is assumed that all JSP pages are in the context root. The init params should be: - *

    - *
  • host
  • - *
  • port (optional)
  • - *
  • SSLEnabled (optional)
  • - *
- * - * @author Bill Lynch - * @author loki der quaeler - */ -public class JiveChatServlet - extends HttpServlet - implements HttpSessionListener, PacketListener { - - static public final String JIVE_WEB_CHAT_RESOURCE_NAME = "WebChat"; - - static protected long PACKET_RESPONSE_TIMEOUT_MS = 5000; - - static protected String CHAT_LAUNCHER_URI_SUFFIX = "/chat-launcher.jsp"; - static protected String CREATE_ACCOUNT_URI = "/account_creation.jsp"; - static protected String LOGIN_URI = "/index.jsp"; - - static protected String ERRORS_ATTRIBUTE_STRING = "messenger.servlet.errors"; - static protected String NICKNAME_ATTRIBUTE_STRING = "messenger.servlet.nickname"; - static protected String ROOM_ATTRIBUTE_STRING = "messenger.servlet.room"; - - static protected String HOST_PARAM_STRING = "host"; - static protected String PORT_PARAM_STRING = "port"; - static protected String SSL_PARAM_STRING = "SSLEnabled"; - - static protected String COMMAND_PARAM_STRING = "command"; - static protected String NICKNAME_PARAM_STRING = "nickname"; - static protected String PASSWORD_PARAM_STRING = "password"; - static protected String RETYPED_PASSWORD_PARAM_STRING = "password_zwei"; - static protected String ROOM_PARAM_STRING = "room"; - static protected String USERNAME_PARAM_STRING = "username"; - - static protected String ANON_LOGIN_COMMAND_STRING = "anon_login"; - static protected String CREATE_ACCOUNT_COMMAND_STRING = "create_account"; - static protected String LOGIN_COMMAND_STRING = "login"; - static protected String LOGOUT_COMMAND_STRING = "logout"; - static protected String READ_COMMAND_STRING = "read"; - static protected String SILENCE_COMMAND_STRING = "silence"; - static protected String WRITE_COMMAND_STRING = "write"; - - static protected String MESSAGE_REQUEST_STRING = "message"; - - // is this value used elsewhere? (if not, why a string?) PENDING - static protected String ERROR_RETURN_CODE_STRING = "error"; - static protected String SUCCESS_RETURN_CODE_STRING = "success"; - - // k/v :: S(session id) / ChatData - static protected Map SESSION_CHATDATA_MAP = new HashMap(); - // k/v :: S(unique root of packet ids) / ChatData - static protected Map PACKET_ROOT_CHATDATA_MAP = new HashMap(); - - static protected EmoticonFilter EMOTICONFILTER = new EmoticonFilter(); - static protected URLTranscoder URLTRANSCODER = new URLTranscoder(); - - - protected String host; - protected int port; - protected boolean sslEnabled; - - public void init (ServletConfig config) - throws ServletException { - ServletContext context = null; - String portParameter = null; - - super.init(config); - -// XMPPConnection.DEBUG_ENABLED = true; - - context = config.getServletContext(); - - this.host = context.getInitParameter(HOST_PARAM_STRING); - if (this.host == null) { - throw new ServletException("Init parameter \"" + HOST_PARAM_STRING + "\" must be set."); - } - - this.port = -1; - - portParameter = context.getInitParameter(PORT_PARAM_STRING); - if (portParameter != null) { - try { - this.port = Integer.parseInt(portParameter); - } catch (NumberFormatException nfe) { - throw new ServletException("Init parameter \"" + PORT_PARAM_STRING - + "\" must be a valid number.", nfe); - } - } - - this.sslEnabled - = Boolean.valueOf(context.getInitParameter(SSL_PARAM_STRING)).booleanValue(); - } - - /** - * Take care of closing down everything we're holding on to, then bubble up the destroy - * to our superclass. - */ - public void destroy () { - synchronized (SESSION_CHATDATA_MAP) { - for (Iterator i = SESSION_CHATDATA_MAP.values().iterator(); i.hasNext(); ) { - ChatData chatData = (ChatData)i.next(); - - if (chatData.groupChat != null) { - chatData.groupChat.leave(); - } - - chatData.connection.close(); - } - } - - super.destroy(); - } - - protected void service (HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - HttpSession session = request.getSession(); - String sessionID = session.getId(); - String path = request.getContextPath(); - String command = request.getParameter(COMMAND_PARAM_STRING); - - if (READ_COMMAND_STRING.equals(command)) { - ChatData chatData = (ChatData)SESSION_CHATDATA_MAP.get(sessionID); - StringBuffer reply = null; - boolean foundData = false; - Message message = null; - int i = 0; - - if (chatData == null) { - this.writeData("Must login first.", response); - - return; - } - - reply = new StringBuffer(); - reply.append("\n"); - reply.append("Chat Read Page\n"); - reply.append("\n"); - reply.append(""); - reply.append("\n"); - - this.writeData(reply.toString(), response); - } else if (WRITE_COMMAND_STRING.equals(command)) { - String message = request.getParameter(MESSAGE_REQUEST_STRING); - ChatData chatData = (ChatData)SESSION_CHATDATA_MAP.get(sessionID); - - if (message == null) { - this.writeData("Parameter \"" + MESSAGE_REQUEST_STRING + "\" is required.", - response); - - return; - } else if (chatData == null) { - this.writeData("Must login first.", response); - - return; - } - - try { - StringBuffer reply = new StringBuffer(); - - chatData.groupChat.sendMessage(message.trim()); - - reply.append("\n"); - reply.append("\n"); - reply.append( - "\n"); - reply.append("Chat Form"); - reply.append("\n"); - reply.append("
\n"); - reply.append("\n"); - reply.append("\n"); - reply.append("
"); - - this.writeData(reply.toString(), response); - } catch (XMPPException e) { - // PENDING - better handling - e.printStackTrace(); - } - } else if (LOGOUT_COMMAND_STRING.equals(command)) { - ChatData chatData = null; - - synchronized (SESSION_CHATDATA_MAP) { - chatData = (ChatData)SESSION_CHATDATA_MAP.remove(sessionID); - } - - if (chatData != null) { - if (chatData.groupChat != null) { - chatData.groupChat.leave(); - } - - synchronized (PACKET_ROOT_CHATDATA_MAP) { - Packet p = new IQ(); - String root = this.getPacketIDRoot(p); - - PACKET_ROOT_CHATDATA_MAP.remove(root); - } - - chatData.connection.close(); - } - } else if (ANON_LOGIN_COMMAND_STRING.equals(command)) { - String returnCode = this.handleLogin(request, true); - - if (SUCCESS_RETURN_CODE_STRING.equals(returnCode)) { - response.sendRedirect(path + CHAT_LAUNCHER_URI_SUFFIX); - } else { - // error, return to the original page to display errors and allow re-attempts - RequestDispatcher rd = request.getRequestDispatcher(LOGIN_URI); - - rd.forward(request, response); - } - } else if (LOGIN_COMMAND_STRING.equals(command)) { - String returnCode = this.handleLogin(request, false); - - if (SUCCESS_RETURN_CODE_STRING.equals(returnCode)) { - response.sendRedirect(path + CHAT_LAUNCHER_URI_SUFFIX); - } else { - // error, return to the original page to display errors and allow re-attempts - RequestDispatcher rd = request.getRequestDispatcher(LOGIN_URI); - - rd.forward(request, response); - } - } else if (CREATE_ACCOUNT_COMMAND_STRING.equals(command)) { - String returnCode = this.createAccount(request); - - if (SUCCESS_RETURN_CODE_STRING.equals(returnCode)) { - response.sendRedirect(path + LOGIN_URI); - } else { - // error, return to the original page to display errors and allow re-attempts - RequestDispatcher rd = request.getRequestDispatcher(CREATE_ACCOUNT_URI); - - rd.forward(request, response); - } - } else if (SILENCE_COMMAND_STRING.equals(command)) { - // do nothing - } else if (command != null) { - this.writeData(("Invalid command: " + command), response); - } else { - this.writeData("Jive Messenger Chat Servlet", response); - } - } - - protected String getPacketIDRoot (Packet p) { - if (p == null) { - return null; - } - - return p.getPacketID().substring(0, 5); - } - - /** - * Creates an account for the user data specified. - */ - private String createAccount (HttpServletRequest request) { - String sessionID = request.getSession().getId(); - String username = request.getParameter(USERNAME_PARAM_STRING); - String password = request.getParameter(PASSWORD_PARAM_STRING); - String retypedPassword = request.getParameter(RETYPED_PASSWORD_PARAM_STRING); - Map errors = new HashMap(); - - // PENDING: validate already taken username - - if ((username == null) || (username.trim().length() == 0)) { - errors.put("empty_username", ""); - } - - if ((password == null) || (password.trim().length() == 0)) { - errors.put("empty_password", ""); - } - - if ((retypedPassword == null) || (retypedPassword.trim().length() == 0)) { - errors.put("empty_password_two", ""); - } - - if ((retypedPassword != null) && (password != null) - && (! retypedPassword.equals(password))) { - errors.put("mismatch_password", ""); - } - - // If there were no errors, continue - if (errors.size() == 0) { - ChatData chatData = (ChatData)SESSION_CHATDATA_MAP.get(sessionID); - - // If a connection already exists for this session, close it before creating - // another. - if (chatData != null) { - if (chatData.groupChat != null) { - chatData.groupChat.leave(); - } - - chatData.connection.close(); - } - - chatData = new ChatData(); - - try { - AccountManager am = null; - - // Create connection. - if (! this.sslEnabled) { - if (port != -1) { - chatData.connection = new XMPPConnection(this.host, this.port); - } else { - chatData.connection = new XMPPConnection(this.host); - } - } else { - if (port != -1) { - chatData.connection = new SSLXMPPConnection(this.host, this.port); - } - else { - chatData.connection = new SSLXMPPConnection(this.host); - } - } - - am = chatData.connection.getAccountManager(); - - // PENDING check whether the server even supports account creation - am.createAccount(username, password); - } catch (XMPPException e) { - errors.put("general", "The server reported an error in account creation: " - + e.getXMPPError().getMessage()); - } - } - - if (errors.size() > 0) { - request.setAttribute(ERRORS_ATTRIBUTE_STRING, errors); - - return ERROR_RETURN_CODE_STRING; - } - - return SUCCESS_RETURN_CODE_STRING; - } - - /** - * Handles login logic. - */ - private String handleLogin (HttpServletRequest request, boolean anonymous) { - String sessionID = request.getSession().getId(); - String username = request.getParameter(USERNAME_PARAM_STRING); - String password = request.getParameter(PASSWORD_PARAM_STRING); - String room = request.getParameter(ROOM_PARAM_STRING); - String nickname = request.getParameter(NICKNAME_PARAM_STRING); - Map errors = new HashMap(); - - // Validate parameters - if ((! anonymous) && ((username == null) || (username.trim().length() == 0))) { - errors.put(USERNAME_PARAM_STRING, ""); - } - - if ((! anonymous) && ((password == null) || (password.trim().length() == 0))) { - errors.put(PASSWORD_PARAM_STRING, ""); - } - - if ((room == null) || (room.trim().length() == 0)) { - errors.put(ROOM_PARAM_STRING, ""); - } - - if ((nickname == null) || (nickname.trim().length() == 0)) { - errors.put(NICKNAME_PARAM_STRING, ""); - } - - // If there were no errors, continue - if (errors.size() == 0) { - ChatData chatData = (ChatData)SESSION_CHATDATA_MAP.get(sessionID); - - // If a connection already exists for this session, close it before creating - // another. - if (chatData != null) { - if (chatData.groupChat != null) { - chatData.groupChat.leave(); - } - - chatData.connection.close(); - } - - chatData = new ChatData(); - - try { - // Create connection. - if (! this.sslEnabled) { - if (port != -1) { - chatData.connection = new XMPPConnection(this.host, this.port); - } else { - chatData.connection = new XMPPConnection(this.host); - } - } else { - if (port != -1) { - chatData.connection = new SSLXMPPConnection(this.host, this.port); - } - else { - chatData.connection = new SSLXMPPConnection(this.host); - } - } - - if (anonymous) { - Authentication a = new Authentication(); - PacketCollector pc = chatData.connection.createPacketCollector( - new PacketIDFilter(a.getPacketID())); - Authentication responsePacket = null; - - a.setType(IQ.Type.SET); - - chatData.connection.sendPacket(a); - - responsePacket = (Authentication)pc.nextResult(PACKET_RESPONSE_TIMEOUT_MS); - if (responsePacket == null) { -// throw new XMPPException("No response from the server."); - } - // check for error response - - pc.cancel(); - - // since GroupChat isn't setting the 'from' in it's message sends, - // i can't see a problem in not doing anything with the unique resource - // we've just been given by the server. if GroupChat starts setting the - // from, it would probably grab the information from the XMPPConnection - // instance it holds, and as such we would then need to introduce the - // concept of anonymous logins to XMPPConnection, or tell GroupChat what - // to do what username is null or blank but a resource exists... PENDING - } else { - chatData.connection.login(username, password, JIVE_WEB_CHAT_RESOURCE_NAME); - } - - chatData.connection.addPacketListener(this, - new PacketTypeFilter(Presence.class)); - - synchronized (SESSION_CHATDATA_MAP) { - SESSION_CHATDATA_MAP.put(sessionID, chatData); - } - - synchronized (PACKET_ROOT_CHATDATA_MAP) { - Packet p = new IQ(); - String root = this.getPacketIDRoot(p); - - // PENDING -- we won't do anything with this packet, so it will ultimately look - // to the server as though a packet has disappeared -- is this ok with the - // server? - PACKET_ROOT_CHATDATA_MAP.put(root, chatData); - } - - // Join groupChat room. - chatData.groupChat = chatData.connection.createGroupChat(room); - chatData.groupChat.join(nickname); - - // Put the user's nickname in the session - this is used by the view to correctly - // display the user's messages in a different color: - request.getSession().setAttribute(NICKNAME_ATTRIBUTE_STRING, nickname); - request.getSession().setAttribute(ROOM_ATTRIBUTE_STRING, room); - } catch (XMPPException e) { - XMPPError err = e.getXMPPError(); - - errors.put("general", ((err != null) ? err.getMessage() : e.getMessage())); - - if (chatData.groupChat != null) { - chatData.groupChat.leave(); - } - } - } - - if (errors.size() > 0) { - request.setAttribute(ERRORS_ATTRIBUTE_STRING, errors); - - return ERROR_RETURN_CODE_STRING; - } - - return SUCCESS_RETURN_CODE_STRING; - } - - private void writeData (String data, HttpServletResponse response) { - try { - PrintWriter responseWriter = response.getWriter(); - - response.setContentType("text/html"); - - responseWriter.println(data); - responseWriter.close(); - } catch (IOException ioe) { - // PENDING - } - } - - // a hack class to hold a data glom (really hacky) - private class ChatData { - - private XMPPConnection connection; - private GroupChat groupChat; - private Set newJoins = new HashSet(); - private Set newDepartures = new HashSet(); - - } - - /** - * Replaces all instances of oldString with newString in string. - * - * PENDING - why is this final? - * PENDING - take this out -- it fails under some cases... - * - * @param string the String to search to perform replacements on - * @param oldString the String that should be replaced by newString - * @param newString the String that will replace all instances of oldString - * - * @return a String will all instances of oldString replaced by newString - */ - static public final String replace (String string, String oldString, String newString) { - int i = 0; - - // MAY RETURN THIS BLOCK - if (string == null) { - return null; - } - - if (newString == null) { - return string; - } - - // Make sure that oldString appears at least once before doing any processing. - if (( i=string.indexOf(oldString, i)) >= 0) { - // Use char []'s, as they are more efficient to deal with. - char[] string2 = string.toCharArray(); - char[] newString2 = newString.toCharArray(); - int oLength = oldString.length(); - StringBuffer buf = new StringBuffer(string2.length); - int j = 1; - - buf.append(string2, 0, i).append(newString2); - - i += oLength; - - // Replace all remaining instances of oldString with newString. - while ((i=string.indexOf(oldString, i)) > 0) { - buf.append(string2, j, (i - j)).append(newString2); - - i += oLength; - j = i; - } - - buf.append(string2, j, (string2.length - j)); - - return buf.toString(); - } - - return string; - } - - /** - * - * HttpSessionListener implementation - * - */ - public void sessionCreated (HttpSessionEvent event) { } - - public void sessionDestroyed (HttpSessionEvent event) { - String sessionID = event.getSession().getId(); - ChatData chatData = null; - - synchronized (SESSION_CHATDATA_MAP) { - chatData = (ChatData)SESSION_CHATDATA_MAP.remove(sessionID); - } - - if (chatData != null) { - if (chatData.groupChat != null) { - chatData.groupChat.leave(); - } - - synchronized (PACKET_ROOT_CHATDATA_MAP) { - Packet p = new IQ(); - String root = this.getPacketIDRoot(p); - - PACKET_ROOT_CHATDATA_MAP.remove(root); - } - - chatData.connection.close(); - } - } - - /** - * - * PacketListener implementation - * - */ - public void processPacket (Packet packet) { - Presence presence = (Presence)packet; - String root = null; - ChatData chatData = null; - String userName = null; - - // MAY RETURN THIS BLOCK - if (presence.getMode() == Presence.Mode.INVISIBLE) { - return; - } - - root = this.getPacketIDRoot(presence); - chatData = (ChatData)PACKET_ROOT_CHATDATA_MAP.get(root); - - // MAY RETURN THIS BLOCK - if (chatData == null) { - return; - } - - userName = StringUtils.parseResource(packet.getFrom()); - - if (presence.getType() == Presence.Type.UNAVAILABLE) { - synchronized (chatData.newDepartures) { - synchronized (chatData.newJoins) { - chatData.newJoins.remove(userName); - - chatData.newDepartures.add(userName); - } - } - } else if (presence.getType() == Presence.Type.AVAILABLE) { - synchronized (chatData.newJoins) { - synchronized (chatData.newDepartures) { - chatData.newDepartures.remove(userName); - - chatData.newJoins.add(userName); - } - } - } - } - -} diff --git a/apps/webchat/source/java/org/jivesoftware/webchat/TextStyle.java b/apps/webchat/source/java/org/jivesoftware/webchat/TextStyle.java deleted file mode 100644 index 3e6aa955e..000000000 --- a/apps/webchat/source/java/org/jivesoftware/webchat/TextStyle.java +++ /dev/null @@ -1,126 +0,0 @@ -/** - * $RCSfile$ - * $Revision$ - * $Date$ - * - * Copyright (C) 1999-2002 CoolServlets, Inc. All rights reserved. - * - * This software is the proprietary information of CoolServlets, Inc. - * Use is subject to license terms. - */ - -package org.jivesoftware.webchat; - -/** - * A Filter that replaces [b][/b], [i][/i], [u][/u], [pre][/pre] tags with their HTML - * tag equivalents. - */ -public class TextStyle { - - public String applyFilter(String string) { - if (string == null || string.length() == 0) { - return string; - } - - // To figure out how many times we've made text replacements, we - // need to pass around integer count objects. - int[] boldStartCount = new int[1]; - int[] italicsStartCount = new int[1]; - int[] boldEndCount = new int[1]; - int[] italicsEndCount = new int[1]; - int[] underlineStartCount = new int[1]; - int[] underlineEndCount = new int[1]; - int[] preformatStartCount = new int[1]; - int[] preformatEndCount = new int[1]; - - // Bold - string = replaceIgnoreCase(string, "[b]", "", boldStartCount); - string = replaceIgnoreCase(string, "[/b]", "", boldEndCount); - int bStartCount = boldStartCount[0]; - int bEndCount = boldEndCount[0]; - - while (bStartCount > bEndCount) { - string = string.concat("
"); - bEndCount++; - } - - // Italics - string = replaceIgnoreCase(string, "[i]", "", italicsStartCount); - string = replaceIgnoreCase(string, "[/i]", "", italicsEndCount); - int iStartCount = italicsStartCount[0]; - int iEndCount = italicsEndCount[0]; - - while (iStartCount > iEndCount) { - string = string.concat(""); - iEndCount++; - } - - // Underline - string = replaceIgnoreCase(string, "[u]", "", underlineStartCount); - string = replaceIgnoreCase(string, "[/u]", "", underlineEndCount); - int uStartCount = underlineStartCount[0]; - int uEndCount = underlineEndCount[0]; - - while (uStartCount > uEndCount) { - string = string.concat(""); - uEndCount++; - } - - // Pre - string = replaceIgnoreCase(string, "[pre]", "
", preformatStartCount);
-        string = replaceIgnoreCase(string, "[/pre]", "
", preformatEndCount); - int preStartCount = preformatStartCount[0]; - int preEndCount = preformatEndCount[0]; - - while (preStartCount > preEndCount) { - string = string.concat(""); - preEndCount++; - } - - return string; - } - - /** - * Replaces all instances of oldString with newString in line with the - * added feature that matches of newString in oldString ignore case. - * The count paramater is set to the number of replaces performed. - * - * @param line the String to search to perform replacements on - * @param oldString the String that should be replaced by newString - * @param newString the String that will replace all instances of oldString - * @param count a value that will be updated with the number of replaces - * performed. - * - * @return a String will all instances of oldString replaced by newString - */ - private static final String replaceIgnoreCase(String line, String oldString, - String newString, int [] count) - { - if (line == null) { - return null; - } - String lcLine = line.toLowerCase(); - String lcOldString = oldString.toLowerCase(); - int i=0; - if ((i=lcLine.indexOf(lcOldString, i)) >= 0) { - int counter = 1; - char [] line2 = line.toCharArray(); - char [] newString2 = newString.toCharArray(); - int oLength = oldString.length(); - StringBuffer buf = new StringBuffer(line2.length); - buf.append(line2, 0, i).append(newString2); - i += oLength; - int j = i; - while ((i=lcLine.indexOf(lcOldString, i)) > 0) { - counter++; - buf.append(line2, j, i-j).append(newString2); - i += oLength; - j = i; - } - buf.append(line2, j, line2.length - j); - count[0] = counter; - return buf.toString(); - } - return line; - } -} \ No newline at end of file diff --git a/apps/webchat/source/java/org/jivesoftware/webchat/URLFilter.java b/apps/webchat/source/java/org/jivesoftware/webchat/URLFilter.java deleted file mode 100644 index de2f972b5..000000000 --- a/apps/webchat/source/java/org/jivesoftware/webchat/URLFilter.java +++ /dev/null @@ -1,312 +0,0 @@ -/** - * $RCSfile$ - * $Revision$ - * $Date$ - * - * Copyright (C) 1999-2002 CoolServlets, Inc. All rights reserved. - * - * This software is the proprietary information of CoolServlets, Inc. - * Use is subject to license terms. - */ - -package org.jivesoftware.webchat; - -import java.util.*; - -/** - * A Filter that converts URL's to working HTML web links.

- * - * The default set of patterns recognized are ftp://path-of-url, - * http://path-of-url, https://path-of-url but can be expanded upon.

- * - * In addition, the following patterns are also recognized. - * - * [url path-of-url]descriptive text[/url] and - * [url=path-of-url]descriptive text[/url].

- * - * The [url] allows any path to be defined as link. - */ -public class URLFilter{ - - private ArrayList schemes = new ArrayList(); - - // define a preset default set of schemes - public URLFilter() { - schemes.add("http://"); - schemes.add("https://"); - schemes.add("ftp://"); - } - - public String applyFilter(String string) { - if (string == null || string.length() == 0) { - return string; - } - - int length = string.length(); - StringBuffer filtered = new StringBuffer((int) (length * 1.5)); - ArrayList urlBlocks = new ArrayList(5); - - // search for url's such as [url=..]text[/url] or [url ..]text[/url] - int start = string.indexOf("[url"); - while (start != -1 && (start + 5 < length)) { - // check to verify we're not in another block - if (withinAnotherBlock(urlBlocks, start)) { - start = string.indexOf("[url", start + 5); - continue; - } - - int end = string.indexOf("[/url]", start + 5); - - if (end == -1 || end >= length) { - // went past end of string, skip - break; - } - - String u = string.substring(start, end + 6); - int startTagClose = u.indexOf(']'); - String url; - String description; - if (startTagClose > 5) { - url = u.substring(5, startTagClose); - description = u.substring(startTagClose + 1, u.length() - 6); - - // Check the user entered URL for a "javascript:" or "file:" link. Only - // append the user entered link if it doesn't contain 'javascript:' and 'file:' - String lcURL = url.toLowerCase(); - if (lcURL.indexOf("javascript:") == -1 && lcURL.indexOf("file:") == -1) { - URLBlock block = new URLBlock(start, end + 5, url, description); - urlBlocks.add(block); - } - } - else { - url = description = u.substring(startTagClose + 1, u.length() - 6); - // Check the user entered URL for a "javascript:" or "file:" link. Only - // append the user entered link if it doesn't contain 'javascript:' and 'file:' - String lcURL = url.toLowerCase(); - if (lcURL.indexOf("javascript:") == -1 && lcURL.indexOf("file:") == -1) { - URLBlock block = new URLBlock(start, end + 5, url); - urlBlocks.add(block); - } - } - - start = string.indexOf("[url", end + 6); - } - - // now handle all the other urls - Iterator iter = schemes.iterator(); - - while (iter.hasNext()) { - String scheme = (String) iter.next(); - start = string.indexOf(scheme, 0); - - while (start != -1) { - int end = start; - - // check context, don't handle patterns preceded by any of '"<= - if (start > 0) { - char c = string.charAt(start - 1); - - if (c == '\'' || c == '"' || c == '<' || c == '=') { - start = string.indexOf(scheme, start + scheme.length()); - continue; - } - } - - // check to verify we're not in another block - if (withinAnotherBlock(urlBlocks, start)) { - start = string.indexOf(scheme, start + scheme.length()); - continue; - } - - // find the end of the url - int cur = start + scheme.length(); - while (end == start && cur < length) { - char c = string.charAt(cur); - - switch (c) { - case ' ': - end = cur; - break; - case '\t': - end = cur; - break; - case '\'': - end = cur; - break; - case '\"': - end = cur; - break; - case '<': - end = cur; - break; - case '[': - end = cur; - break; - case '\n': - end = cur; - break; - case '\r': - end = cur; - break; - default: - // acceptable character - } - - cur++; - } - - // if this is true it means the url goes to the end of the string - if (end == start) { - end = length - 1; - } - - URLBlock block = new URLBlock(start, end-1, string.substring(start, end)); - urlBlocks.add(block); - - start = string.indexOf(scheme, end); - } - } - - // sort the blocks so that they are in start index order - sortBlocks(urlBlocks); - - // now, markup the urls and pass along the filter chain the rest - Iterator blocks = urlBlocks.iterator(); - int last = 0; - - while (blocks.hasNext()) { - URLBlock block = (URLBlock) blocks.next(); - - if (block.getStart() > 0) { - filtered.append(string.substring(last, block.getStart())); - } - - last = block.getEnd() + 1; - - filtered.append(""); - if (block.getDescription().length() > 0) { - filtered.append(block.getDescription()); - } - else { - filtered.append(block.getUrl()); - } - filtered.append(""); - } - - if (last < string.length() - 1) { - filtered.append(string.substring(last)); - } - - return filtered.toString(); - } - - /** - * Returns the current supported uri schemes as a comma seperated string. - * - * @return the current supported uri schemes as a comma seperated string. - */ - public String getSchemes() { - StringBuffer buf = new StringBuffer(50); - - for (int i = 0; i < schemes.size(); i++) { - buf.append((String) schemes.get(i)).append(","); - } - buf.deleteCharAt(buf.length() - 1); - - return buf.toString(); - } - - /** - * Sets the current supported uri schemes as a comma seperated string. - * - * @param schemes a comma seperated string of uri schemes. - */ - public void setSchemes(String schemes) { - if (schemes == null) { - return; - } - - // enpty the current list - this.schemes.clear(); - - StringTokenizer st = new StringTokenizer(schemes, ","); - - while (st.hasMoreElements()) { - this.schemes.add(st.nextElement()); - } - } - - private void sortBlocks(ArrayList blocks) { - Collections.sort(blocks, new Comparator() { - public int compare(Object object1, Object object2) { - URLBlock b1 = (URLBlock) object1; - URLBlock b2 = (URLBlock) object2; - return (b1.getStart() > b2.getStart()) ? 1 : -1; - } - }); - } - - private boolean withinAnotherBlock(List blocks, int start) { - for (int i = 0; i < blocks.size(); i++) { - URLBlock block = (URLBlock) blocks.get(i); - - if (start >= block.getStart() && start < block.getEnd()) { - return true; - } - } - - return false; - } - - class URLBlock { - int start = 0; - int end = 0; - String description = ""; - String url = ""; - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - URLBlock(int start, int end, String url) { - this.start = start; - this.end = end; - this.url = url; - } - - URLBlock(int start, int end, String url, String description) { - this.start = start; - this.end = end; - this.description = description; - this.url = url; - } - - public int getStart() { - return start; - } - - public void setStart(int start) { - this.start = start; - } - - public int getEnd() { - return end; - } - - public void setEnd(int end) { - this.end = end; - } - } -} \ No newline at end of file diff --git a/apps/webchat/source/java/org/jivesoftware/webchat/URLTranscoder.java b/apps/webchat/source/java/org/jivesoftware/webchat/URLTranscoder.java deleted file mode 100644 index 84310eca0..000000000 --- a/apps/webchat/source/java/org/jivesoftware/webchat/URLTranscoder.java +++ /dev/null @@ -1,188 +0,0 @@ -/** - * $RCSfile$ - * $Revision$ - * $Date$ - * - * Copyright (C) 1999-2003 Jive Software. All rights reserved. - * - * This software is the proprietary information of Jive Software. - * Use is subject to license terms. - */ - -package org.jivesoftware.webchat; - -import java.util.*; - -/** - * This is a really good example of why software development projects have frameworks, and the - * other apps in their own modules that sit on top of the frameworks... this class should not - * be confused with com.jivesoftware.messenger.operator.util.URLTranscoder, which does a - * variant of the functionality found here.
- * - * The default set of patterns recognized are ftp://path-of-url, - * http://path-of-url, https://path-of-url but can be expanded upon.
- * - * This was originally URLTranscoder, from CoolServlets, but that class did basically nothing that - * i wanted, so i kept the schemes collection and that was about it.
- * - * @author loki der quaeler - */ -public class URLTranscoder { - - static protected final String A_HREF_PREFIX = ""; - static protected final String A_HREF_CLOSING_TAG = ""; - - - protected ArrayList schemes; - - public URLTranscoder () { - super(); - - this.schemes = new ArrayList(); - - this.schemes.add("http://"); - this.schemes.add("https://"); - this.schemes.add("ftp://"); - } - - /** - * Sets the current supported uri schemes. - * - * @param schemeCollection a collection of String instances of uri schemes. - */ - public synchronized void setSchemes (Collection schemeCollection) { - // MAY EXIT THIS BLOCK - if (schemes == null) { - return; - } - - this.schemes.clear(); - - this.schemes.addAll(schemeCollection); - } - - /** - * Returns a String based off the original text, but now with any a.href blocks html-ized - * inside. (for example, supplying the string "this: http://dict.leo.org/ is a cool url" - * returns "this: http://dict.leo.org/ - * is a cool url" - */ - public String encodeURLsInText (String text) { - StringBuffer rhett = null;; - List runs = this.getURLRunsInString(text); - Iterator it = null; - int lastStart = 0; - - // MAY RETURN THIS BLOCK - if (runs.size() == 0) { - return text; - } - - rhett = new StringBuffer(); - it = runs.iterator(); - while (it.hasNext()) { - URLRun run = (URLRun)it.next(); - String url = text.substring(run.getStartIndex(), run.getEndIndex()); - - if (lastStart < run.getStartIndex()) { - rhett.append(text.substring(lastStart, run.getStartIndex())); - - lastStart += run.getEndIndex(); - } - - rhett.append(A_HREF_PREFIX).append(url).append(A_HREF_SUFFIX).append(url); - rhett.append(A_HREF_CLOSING_TAG); - } - - if (lastStart < text.length()) { - rhett.append(text.substring(lastStart, text.length())); - } - - return rhett.toString(); - } - - protected List getURLRunsInString (String text) { - ArrayList rhett = new ArrayList(); - Vector vStarts = new Vector(); - Iterator sIt = this.schemes.iterator(); - Integer[] iStarts = null; - char[] tArray = null; - - while (sIt.hasNext()) { - String scheme = (String)sIt.next(); - int index = text.indexOf(scheme); - - while (index != -1) { - vStarts.add(new Integer(index)); - - index = text.indexOf(scheme, (index + 1)); - } - } - - // MAY RETURN THIS BLOCK - if (vStarts.size() == 0) { - return rhett; - } - - iStarts = (Integer[])vStarts.toArray(new Integer[0]); - Arrays.sort(iStarts); - - tArray = text.toCharArray(); - - for (int i = 0; i < iStarts.length; i++) { - int start = iStarts[i].intValue(); - int end = start + 1; - - while ((end < tArray.length) && (! this.characterIsURLTerminator(tArray[end]))) { - end++; - } - - if (end == tArray.length) { - end--; - } - - rhett.add(new URLRun(start, end)); - } - - return rhett; - } - - protected boolean characterIsURLTerminator (char c) { - switch (c) { - case ' ': - case '\n': - case '(': - case ')': - case '>': - case '\t': - case '\r': return true; - } - - return false; - } - - - protected class URLRun { - - protected int start; - protected int end; - - protected URLRun (int s, int e) { - super(); - - this.start = s; - this.end = e; - } - - protected int getStartIndex () { - return this.start; - } - - protected int getEndIndex () { - return this.end; - } - - } - -} \ No newline at end of file diff --git a/apps/webchat/source/web/account_creation.jsp b/apps/webchat/source/web/account_creation.jsp deleted file mode 100644 index b30e1f503..000000000 --- a/apps/webchat/source/web/account_creation.jsp +++ /dev/null @@ -1,116 +0,0 @@ -<%-- - - - - ---%> - -<%@ page import="java.util.*" %> - -<% // Get error map as a request attribute: - Map errors = (Map)request.getAttribute("messenger.servlet.errors"); - if (errors == null) { errors = new HashMap(); } -%> - - - - - - Create an account - - - - - - - - - - -
- - - - - - - - - - - - - -
-

Jive Account Creation

- - <% if (errors.get("general") != null) { %> -

- - Error creating account. <%= errors.get("general") %> - -

-
- <% } %> -
-
- - - - - - - - - - - - - - - -
Desired username: - - <% if (errors.get("empty_username") != null) { %> -
- Please enter a username. -
- <% } %> -
Desired password: - - <% if (errors.get("empty_password") != null) { %> -
- Please enter a password. -
- <% } %> - <% if (errors.get("mismatch_password") != null) { %> -
- Your passwords did not match. -
- <% } %> -
Retype your password: - - <% if (errors.get("empty_password_two") != null) { %> -
- You must retype your password. -
- <% } %> -
-
-
- - -
-
Click here to return to the login page. -
-
- - - - diff --git a/apps/webchat/source/web/chat-hiddenform.jsp b/apps/webchat/source/web/chat-hiddenform.jsp deleted file mode 100644 index c29c3d0a4..000000000 --- a/apps/webchat/source/web/chat-hiddenform.jsp +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - Chat Form - - - - - -

- - -
- - - diff --git a/apps/webchat/source/web/chat-launcher.jsp b/apps/webchat/source/web/chat-launcher.jsp deleted file mode 100644 index fba6cceb2..000000000 --- a/apps/webchat/source/web/chat-launcher.jsp +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - Web Chat Session - - - - - - - -

Chat Session Options

- - Your chat session should have already started. If for some reason it did - not, click this link - to start your chat session. - -

- - Other options: - - - - - diff --git a/apps/webchat/source/web/common.js b/apps/webchat/source/web/common.js deleted file mode 100644 index ace272e48..000000000 --- a/apps/webchat/source/web/common.js +++ /dev/null @@ -1,182 +0,0 @@ -function addChatText (someText, isAnnouncement) { - var yakDiv = window.parent.frames['yak'].document.getElementById('ytext'); - var children = yakDiv.childNodes.length; - var appendFailed = false; - var spanElement = document.createElement("span"); - - if (! isAnnouncement) { - spanElement.setAttribute("class", "chat_text"); - } else { - spanElement.setAttribute("class", "chat_announcement"); - } - // it's easier to dump the possibily html-containing text into the innerHTML - // of the span element than deciphering and building sub-elements. - spanElement.innerHTML = someText; - - try { - // various versions of IE crash out on this, and safari - yakDiv.appendChild(spanElement); - } catch (exception) { - appendFailed = true; - } - - if (! appendFailed) { - // really make sure the browser appended - appendFailed = (children == yakDiv.childNodes.length); - } - - if (appendFailed) { - // try this, the only way left - var inn = yakDiv.innerHTML; - - inn += "" : "chat_text\">"); - inn += someText + "
"; - - yakDiv.innerHTML = inn; - } else { - yakDiv.appendChild(document.createElement("br")); - } - - scrollYakToEnd(); -} - -function addUserName (userName) { - var yakDiv = window.parent.frames['yak'].document.getElementById('ytext'); - var children = yakDiv.childNodes.length; - var appendFailed = false; - var spanElement = document.createElement("span"); - var userIsClientOwner = false; - var announcement = false; - - if (userName == "") { - announcement = true; - - spanElement.setAttribute("class", "chat_announcement"); - - userName = "room announcement"; - } else if (userName == nickname) { - userIsClientOwner = true; - - spanElement.setAttribute("class", "chat_owner"); - } else { - spanElement.setAttribute("class", "chat_participant"); - } - - try { - spanElement.appendChild(document.createTextNode(userName + ": ")); - - // various versions of IE crash out on this, and safari - yakDiv.appendChild(spanElement); - } catch (exception) { - appendFailed = true; - } - - if (! appendFailed) { - // really make sure the browser appended - appendFailed = (children == yakDiv.childNodes.length); - } - - if (appendFailed) { - // try this, the only way left - var inn = yakDiv.innerHTML - - inn += "" + userName + ": "; - - yakDiv.innerHTML = inn; - } -} - -function scrollYakToEnd () { - var endDiv = window.parent.frames['yak'].document.getElementById('enddiv'); - - window.parent.frames['yak'].window.scrollTo(0, endDiv.offsetTop); -} - -function userJoined (username) { - var parentDIV = window.parent.frames['participants'].document.getElementById('par__list'); - var children = parentDIV.childNodes.length; - var appendFailed = false; - var divElement = document.createElement("div"); - - divElement.setAttribute("id", username); - - try { - divElement.appendChild(document.createTextNode(username)); - divElement.appendChild(document.createElement("br")); - - parentDIV.appendChild(divElement); - } catch (exception) { - appendFailed = true; - } - - if (! appendFailed) { - // really make sure the browser appended - appendFailed = (children == parentDIV.childNodes.length); - } - - if (appendFailed) { - // try this, the only way left - var inn = parentDIV.innerHTML; - - inn += "
· " + username + "
"; - - parentDIV.innerHTML = inn; - } -} - -function userDeparted (username) { - var partDoc = window.parent.frames['participants'].document; - var parentDIV = partDoc.getElementById('par__list'); - var userDIV = partDoc.getElementById(username); - var children = parentDIV.childNodes.length; - var removeFailed = false; - - // MAY RETURN THIS BLOCK - if (userDIV == null) { - return; - } - - try { - parentDIV.removeChild(userDIV); - } catch (exception) { - removeFailed = true; - } - - if (! removeFailed) { - // really make sure the browser appended - removeFailed = (children == parentDIV.childNodes.length); - } - - if (removeFailed) { - // try this, the only way left - var inn = parentDIV.innerHTML; - var openingTag = "
"; - var index = inn.toLowerCase().indexOf(openingTag); - var patchedHTML = inn.substring(0, index); - var secondIndex = openingTag.length + username.length + 13; - - patchedHTML += inn.substring(secondIndex, (inn.length)); - - parentDIV.innerHTML = inn; - } -} - -function writeDate () { - var msg = "This frame loaded at: "; - var now = new Date(); - - msg += now + "

"; - - document.write(msg); -} diff --git a/apps/webchat/source/web/frame_master.jsp b/apps/webchat/source/web/frame_master.jsp deleted file mode 100644 index a96b88f4c..000000000 --- a/apps/webchat/source/web/frame_master.jsp +++ /dev/null @@ -1,33 +0,0 @@ - - - <%= request.getSession().getAttribute("messenger.servlet.room") %> - - Jive Web Chat Client - - - - - - - - - - - - - - - - diff --git a/apps/webchat/source/web/images/emoticons/angry.gif b/apps/webchat/source/web/images/emoticons/angry.gif deleted file mode 100644 index 6489c9bc9ffaa5448b597b17249d090228556243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 692 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 diff --git a/apps/webchat/source/web/images/emoticons/devil.gif b/apps/webchat/source/web/images/emoticons/devil.gif deleted file mode 100644 index 31bca49fb84673af853fdd6ca0b7f124930cc901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1093 zcmZ?wbhEHb6krfw_&$YU*Up_*rskK9T|B=2z>Q0{uAaVXX=)x79#L0W>+0yddfA$b zM=zY%cyRyR%}18+x_J2fg+u2~Z$EbZ!p-X!Z)N(#p51fm{DHG8`}?;vEjYXPR9-;f z!G+rnF51@L(zC8)+S%jh=S`n?{rt_$u*8gzgpIXxuAaTNy=&>@p2>?U`!Aooa%}b9 zdEGOPuG~|dS-haEr>(AKUQSW9Tk4flSCT_x56s;>DJ1sn{u3uRA9i(c-aBLcfq9#c zuiJla{~2Rd9VZ=&`Lh<3c_nXYS(p`_a%9D>gL@87>6@}5t#^6T%!2H^iJcS9?mjuU zed^hL$7{-}>-@9oD(j5ZbXsd$f{a~{t=;FOZE@q`t>nn~LkqVpOYGV=Yvbg;$=A-` z*i=97!2B&qA<@xck=gO-t8ympnX~pHxosUw^0RZ#A3S?>)t((a z%ZrnCMFoi(}WD6+!FmQZl zP!E*y*pP70lf6Y@p~=fjbKG@*#R$z{Khx+L<@Y5+xs!XIiNp>nx#Pnd&L>WO5 zQ%;8l2L@wJt%45)FNKyE+uZTlaO9d0qXYjk7ESLa))sx2TT#Cp+!>gKr!yQVT)@uT zXU`>K!^x0zu)&-`YkF%;xshjQy z9BJ`kl;&58(M&0DQ5NmcN@*}`a8qe!-n&EMii10^i17sBJqsF{Sb4>H*jN~>0cN^+ AtpET3 diff --git a/apps/webchat/source/web/images/emoticons/grin.gif b/apps/webchat/source/web/images/emoticons/grin.gif deleted file mode 100644 index e5c92e2d588ee89b770d2fc9e0edbb3b8a75a13b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680 zcmZ?wbhEHb6krfwcoxcV;`s6OIOWebOnyJtjSTkr@z9_#&7iMAqp7B>AQDqF+{A z5*et{->mlMxz3LV2EU)`UD%_0aj&kAi}LJl&By?i@AnPgpSOqz^6_?2etkuMR+rY# zM+Qx`W%DMgeZOb;=Y>vxS4&io@`M((j~_o?yL$ESOYQ$)z(9AP_)p!&**_rC&N;uJ zvM4h>qeQ_gvn*91I6tkVJh3QM!N|bCNEb*LGbsLKVPs$kWzYdR5)^$5?6(?1o0=@m zIoVA4o4Z4UM6`{yR5W!=f_gj!4VeO1h1@N8Bw3n+1U&-Gm;(dt9UW8!riY3c28h`) zhKDnTFtbYWhFWSfnFR(1?>-qWW~9eqZXCcI?jN!{#40?{mrtBii#2ff)2E^m23%|^ zLQkGOmyqT*)$|cQ8S*QHF<97DCe9|I@vsMn4ucTW0ii|gQ}}IGT}asA+{vyZv9Uto z5@QR8W0295h@wL--C}BfB?1OaM-`X^Oil+TW PdKwWQ4skAaV6X-NY#!&a diff --git a/apps/webchat/source/web/images/emoticons/happy.gif b/apps/webchat/source/web/images/emoticons/happy.gif deleted file mode 100644 index 20a93e32b9fc9798bf305cad7f8dc8ec5a0678b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 675 zcmZ?wbhEHb6krfwcoxL)>xq6;kn)d*29d!&pKqA_ey%&AMXfqF==BN9pN|Y0tIOV< zvzRwg?a%`A-_LYga`jqr^cyque?HRxc-idz9j%X7Oj~mGe?Bz$`B?wgQ@!SF{iDlG z8`BKF-7)%p-|)sp>w9}G`kU20UNL)r-u&Gei}x4I-<-BwJy*RZKQKK`xv8eCIwz8R*ZFkSw6Uh_!$tGEyDa~{(5Wd1e09v~)>f-Si_CvKFqk_* zy}!HV%Pr$8hc!#GRNtSs`2AEbJx;~WLhz|milH89Z7$y&*3dXS)+KcAvzNQfpIE0YO- z5SKiQWFRBs?vo*WvZh+v7XGXuJZ!t!)I$O}xixh3nF4n|eQL%aEFhyI{^Z$n22n9~ z4mraQPXmQi&5bSXCTv-d(C5^xmwdxq3&Jo8H@N(VVS+ zW25!^^X6Y}8P^m9e!OD(_KZbKuD+p;;)jdoKAv9R?;GCQYE_b@`tFQHYk}VWSr&&D zn18!tba$8Kj|T=n9~v}f=zqLoc4(1#V|Ce;!uz15-B_mf;H=Kuo4OG}K0hDn|9Ywy8K7ck zssH<#?$NE9-|rblg-7&vwS4^e@x<}t*REcj(4zMDrM9xX!vFvO8R!la|Eb$J`v*kY zIp-Ht7GiF32F0H&j0_CH3_2i3f})Rs{X#=< zQ-iJH*)}^ftsAG4pVcGwnKoU4GW9EhrW^V^k75o z0C(jG28IY_5k?h>U=tZ;Z(&o0@NfoGVLx3xR!)Hcm(w?Huvqbnu_-dzhdqAsgv(q= zRMWsW3BqUF0kW`5hNj#9iK80J-Lw8cs!K2O63IZ7cfs-aKU=ma5_|ecD IsK8(i0Nbz>% diff --git a/apps/webchat/source/web/images/emoticons/love.gif b/apps/webchat/source/web/images/emoticons/love.gif deleted file mode 100644 index d1c320e3db12012e643d97224823da4e99dc531e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 zcmZ?wbhEHb6krfw_|CwvX7%ciA3t8ZdbPR8;O`6bw4|t)XYG{b6~5lHdUwV4{T;J6 zmu&4Ulg8Uzt^srCE>>P?hiY>xo5rocf!KcHiz>JwI*VR9p7$s_om$w!3!j z{CwN`@*(4!`)ohmvVPH%`}vObmBYpr*;eJ5R^RSf&2Be&(VO@4vBmse;|FI=@0>8- zGS}kWEwdNR$q$a%+&^Rb;fBqfhUASiEs}i=s-e^;r zrI`?7b|=jG&ohe;*KJZ_{a)0>yuWIruc>69t#tc#4=7s}_-gYHb$Uug=^3eroaK zv1LJw){lpl@2}c^ykXOrZ}_4w??rdcym;>;n~e&5T@Pcrzh;^bea^TYQ4Q-_T{ei!}BJ2J{G0fn$iF3 z2F0H&j3A43Km;iJFmSwMVC0bb(a<6x#LuQBvLdZbhB=zY#_(gBVuM_$RtsmMx=SCc zoDxrtaEiN>enf!JgilM|*!Wo)UcB7=;+UX(ww26_hQ%GyylM;?f|HgA%+w59AXBmA z@qzjL;s$dH3!N@-I+)1>RxDBQmSquDVQ64Z;^C0ul3Q8p^1yu&3p0a&rZRIshhX;2 zZ4na{^A?EYB;2{V%dD%*P5+3}&JPFsg*YlN2}LaG;FITJl2p|&OypN&vr#bUU`{*d z;NsUXjrW#8^w{d!_iQyld6vTb!?(2qx!%|!;kpIW>+ zXZPp1`IkG^ks&_cA6m|vsQdew#h1I*jroS@aq91`*uK4FdwsXvorAVNA6tICXZ_-g z{nxwJuP@p))|MSuVbxe*@b`uJ$D1}$L2A!W+y8lP@#dmkONl{Kp}~#4wmVlDG~^rp zd}7g5Wbo^$#l9t0w+`4ISZ;M_wdMB*mUb4(vwQT4Gc_;mH;D{XdwLX`bI>`uUFamBYsKCg`5oY4-8s$7@%w_IJ1Z zd13zdrTPE={~2fu6#uE)IQs`g+BxSJR2F5XXOt*-WtOEX1m~xflqVLYDi|3U80i8D zV+O^aEQ|~cQ4BgDCxN1mf&Fdevpe3Z={1A zgCSpYj6MTnsF{wrq^TpD{PZXVA4YyXo7h-y4_96_&L}zY0A{@qkvJ`{SV4Xz115GA zMh+ee@OzV@vcRF6g;$c5iNP8G4(sr0 diff --git a/apps/webchat/source/web/images/emoticons/plain.gif b/apps/webchat/source/web/images/emoticons/plain.gif deleted file mode 100644 index a5beeea43d6524c0159b811f3decae667faa7773..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 678 zcmZ?wbhEHb6krfwc;?A4p+)D%Bg@wp?3!xJUY)b6E)4o|$NI}%>t9bSYKnv2Ubby6 zGKdWEIkMU4&vWySH*MZtvVDKe_Rc}u*B9*$t+sr3#rE$D^QJZ)Bb(_z3tec7q8f(jb zKef1Z!1ntC%k(()pN}mY3k+`TwS95M{^eP_?+-1HY%)5($220?XWj(epN}mjH0#Xm z*ZuX>qQ6P!&vT2i;*$5*Z01hT?Q7Dxu-9buT)j`XtiRp2`t!p47IrrZl=!q9v=F3jBLu>p4y6n?zWPuK0d0FvZnmH%&aPIjC__1 zrx{%NIM|su)mhl&Jx;&y@z8M>(2`rfD+*5+1bmvT1Zya5yD~39(7L*;o`j;b2o1 f)tC^qCB>1OQ9#6J0>dHI#f+RGIvOW51Q@IVtmn`@ diff --git a/apps/webchat/source/web/images/emoticons/sad.gif b/apps/webchat/source/web/images/emoticons/sad.gif deleted file mode 100644 index 0320885df0790a2be3ba5eed317e02a461d32c90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 694 zcmZ?wbhEHb6krfwc$UO);rYiCkKVU+^&NfiZq>zC?wJjnuD-6SX$S}kt7`7tapO%y zY~qG1uiLx&CLDe`@AQjv&pw=g_Q5wGr0d|5>BpaKy!v{}wb#>*J==5p?a>GCXB>aF z`qHb4>V~vgd)HrnHR;IHeRtljz5L2GqdsrmzKm5@wqAcd zqNeR$e*R@eO+)+sCyUO$h{&$=&2G$Jd$pshFE+2rHnq+swXW~*)80c*{R2ZHb1FSE z8xGukcl6eiV-Mc%y7^}NjW>RQAx(Q9r_9<@yZQRTd+%27I}w*x<&ai?^3i)|7x((z zkIITm^2@9H=PWvQ`^nr5yI1Wyaq#ZD`KMn528SJg_`d(})0Y0JRh^S9Ev)MIJnEmb zc;(&``)s^e+KFS#eeEH&i(cV(8;l8}><I~#U^noVcGV2$OiktVOJ-)XFfmgXWlm`l>!h1XL0_*w_@>v`MkdVY8>c(5P b;6Pzx6SIeY$1+<*xPbXBKZS+5UWD@$QQ4^V9Y(&)VJCYkPgSU1Xrz^NW^^wPl+Z8NE1T ze`vL3L%!j!rxx$;nEiZgxo?Tp>x*{jaq71Y*v^}vdtkX$Q<1@rl?Im&8n=`f+&O6b z_l3EEw$j&o)^9G_H5M2&6&geZseQX|bzp_n$D204pIS8L8{Ru&6A|q5;J9^Rs@9+9 z7N74}f4yt{`L^|k>o&`$8{9i;Q&wEEVur!G*(O_;7%rY{`17&F(kX_AHX0YEX|11Q za%`L7-4kZ}R-0^HYWV$u<@;;4cTWPjriV8f9p7g7{+f-lyuzOs<{v+Pyms|!e|O8@ zm*)Tf|7V~*Q2eKE8LUm06am5S*V@Ql40ps$gVbV5AEqj2RSv zvM@3*L^0@qTm_0g2KGk{QB6&fY_jHT49(q9F$QA7Oia?EhA};siXyHdoP7R17HZth zF^W#sZtQ{_3IX0$Cexz~MBKgP7$YMY`9nSRnWH4df*j>ERAXaRHTYdjRT$WWdD$7o zjZPbhGjj0pu*foT3P!RjpH^m#G&2@ZH)rDGh>Vp#{X^#+7c-l*y#q^x+Xinj7CRRK zh5$y7DeRH6L^KjwS^JrJ!+0(VH9Ph*Yi{T`GKr~^n^TLW&~Twb<76?VXrIEu*26lw q+!=dTG&(l3@$jk?C~WOG%^<|1pdql)>8P(81IHYR4HE(t7_0#s@9g~m diff --git a/apps/webchat/source/web/images/emoticons/silly.gif b/apps/webchat/source/web/images/emoticons/silly.gif deleted file mode 100644 index a162605bd4cd0a6f36c3cf2b0c669d528e1021fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 685 zcmZ?wbhEHb6krfwcoxa<=Y@GwZP}+=)~_$veYs;@Qylc_oZZ{Ywm%+OHWwLuyKhxp z7!(=e^XrMlm%G;AA6iam(K)o*vZ=`6#$MZ(XYKABwEcYB`qly4-%l+*-?4si#{S(E z+v~gSKHju>d&#!3w(P@on*%GX{yaB-n&ft1xz*1n7H=-v?F+GQ$T$3Y&pI_kvoYUr z-x90zIQ5nigQ!5Y$UwE%7wz6(vyBQ;o9=G@{Iq>jp+RGTK}4{RorUuIYc{X1nZLen z{`Ic4x2@`%8|HOcx<4OV_BZKVK4|>=nZ>bfhWAdHK0RmESf>5_qUGNg=IOB-rP-R@ z35I3GCC9cJ)@AFio~t)+g6_*J7T+IO-iUSi_0-~1nrB~=&c}}*uU);`-`(=}rTPE= z{~7246#uE)IQs`g+BxSJR2F5XXOt*-WtOEX1m~xflqVLYDi|3U80i8DV+O^aEQ|~c zkqkN@hk>Gxf&G3%WK)wow}v)1V{><8w7HBa8=I7{S#*zuj))Nx3!j(*vkFghv<@>9 z7l$gZV~8ZX;`B&!5hnf!T?PhSCk_@h&PaI~Bd#z5{g@bi0~dZ-aYk-aCJv<_fztwk zO1yl`tQu@Astl)J#4t#3$q8w*@$o)?8RPYaos(Ni%*Ov~OxK?mf{Ps*I2D#DoHT6a zY>~8^_C_G!pr@ELvyp;?)8iwZS|&Y9Zai?hAST4lVH05Z=oE*jW{Jy;sjZG2!m^Vb kGMS#7XyaHSmg`xN*wD^wsI_CkNeu@^PEH;pE*1uB06o|0lK=n! diff --git a/apps/webchat/source/web/images/emoticons/wink.gif b/apps/webchat/source/web/images/emoticons/wink.gif deleted file mode 100644 index 6d91b0fa25aa104127aba70ba3a81baa17f958b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 zcmZ?wbhEHb6krfwcoxj?`?+pZkn*o5`ad2Te7<248SK+kt~zg`T4}aQbxzQq=Q=+h z>93xv-jb`|SY6hft$%B))uBb^ExCG)8T$KYSsYqm-ddpd=CoyFnn8be%f~CGzn<#d z-DUayg8BFRhTrZOeY$FTW25!YM+R@tShVEmzdK`bbh&9$P1(<_&2E@6K7&6a?PeYw_rUmXE8_gch|A7tI@M%06B(`*O>;IydO!WwX~OEE~(z z-rv#cZ&H7CMgQS>t)p8t-`~+bwoS9Fxa9XU-J@Hy-rmxQ2=Y;uSNQ!@FFj8A{do&J z3&p0|vbht~e>^bwe$TMKtL5XzkAGh1T)TSp?@R6f|Nk=#5K#Qd!pOi7%%B6Z9~37H z?AIHDo0|AI^&~9Kn!AI8gcY@vRjmd1gL*tf#90EFHRLRGMOmAJM0^6J8A3w1yaLPx zrw0p*2ip0E?b^k_Y$_DYr^q7h$r#4Y6J`|VDlenXsTIh;=pAOu!N_P7qNJ~_r_3C( z`&pPKla-2us>ajjyIxB1T3X9-ePjy@;g&TpQ+QxdbU>zAl8wQo(=p{#vzUE_$wJ3u zHYUZ8h=vUc9$u}|%zZ49Of6gtVk|x>5+Mpsz5Gfn91#MnEu2B!OFSNYaB6SkGt^m= SqVnPhmk@7)MWP4?gEau!n$Kwf diff --git a/apps/webchat/source/web/images/logo.gif b/apps/webchat/source/web/images/logo.gif deleted file mode 100644 index ad9573d9240bcf918ba05bc22c75b8c443c65a05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 925 zcmZ?wbhEHbT+blGa72K?p?*)ps>=fLYuXZK%u$q=&a|Ns9CqyWXAEQ|~c0t`AJO&~iNSpO@i^rd9Z%UHE8=k>k< zo%1ER_bb-DuX+Ffz=8q~9jX2kOFmf?SjaL*f8M#KOQt{P8sot%M%TlRt8F#Xct3sP zVu4EBz|EOus<`Zg{Vs;cvV6x9{^FEod$z3PtQdWs6eb3ilCBoJwh89`bF?O< z3b0nG2J>;NHAZoScUmpyW7THeq`K8F&~kQcXGK)HKy6et^Zw5Ht0r?C%jIQcQ|4Qp z%DArX2LEyXmCTcsxKpY*IO}+JF{V6?b*F(e{cMBr7P{+A8ve7&#dGV$Z%~E zG-La^>8YcG+APN~0XaK|0|wF7954U8iCkVNC+QNeU~$Um!0c&dKUx0w)F?Pi@2tJa zCtz~K(3`=TYqP_H<-ATBNp@Q~8Ui-=%?gwJtmAR2FOE0vdt0iZ!bOIaMuBy99A%3R zoU*yN<=w;^mmGar{g&8yJYZouz|LN_O7hfZ#$#q5cI0e679t(GGb(MR>yIh-_A=UV z%4DxJb8KL^&9U6Uq2amt>6I>%W=`e5WGfiHdBxRF-wv)3WaSa~aca6x%!SEv#O{tv99Y zQs%>n8+gN&6cX-E+VW(wN7}oH^1dRuThrN9DmIxkrRqJrF}I6xQh-BX6T`1V3<7q` z7#3csJd~xgEKV`HW#hb=uaY?&yqH#Pl3egwV;%$7;+%j5-&hvzIAL*!iED+G_of(~ r2PfArF#SD4YW>WV)o-`mDSQ2P`-3*^cRQX;%YL`>#jQI$YcUHsvRY13ihgA- zZpD|rB}7VBR9szn!p90LU(?+$)}Q>bclZ8XX8ZVcX7E^@7BrkHpxePOZqKP_p!@#~ z^Z%Qy`=_(+?_=NJ#!(;67U1o;zm7A&%P}D;Fy4YSz|-;l`}gP1pPxT}et&;|eSLjG zLV|;XgMop8f`S6bO+*95pDaL6Ff!WdG25SIWA7SzU diff --git a/apps/webchat/source/web/index.jsp b/apps/webchat/source/web/index.jsp deleted file mode 100644 index 617b63b77..000000000 --- a/apps/webchat/source/web/index.jsp +++ /dev/null @@ -1,164 +0,0 @@ -<%-- - - - - ---%> - -<%@ page import="java.util.*" %> - -<% // Get error map as a request attribute: - Map errors = (Map)request.getAttribute("messenger.servlet.errors"); - boolean allowAnonymous = true; - boolean allowAccountCreate = true; - boolean allowLogin = true; - String param = null; - if (errors == null) { errors = new HashMap(); } - param = application.getInitParameter("allowAnonymous"); - if ((param != null) && (param.equalsIgnoreCase("false"))) { - allowAnonymous = false; - } - param = application.getInitParameter("allowAccountCreation"); - if ((param != null) && (param.equalsIgnoreCase("false"))) { - allowAccountCreate = false; - } - param = application.getInitParameter("allowLogin"); - if ((param != null) && (param.equalsIgnoreCase("false"))) { - allowLogin = false; - } -%> - - - - - - Jive Web Chat Client Login - - - - - - - - - - - - -
- - - - - - - - - - - <% if (allowAccountCreate) { %> - - - - <% } %> -
-

Welcome to the Jive Web Chat Client - Please Login

- <% if (errors.get("general") != null) { %> -

- Error logging in. Make sure your username and - password are correct. <%= errors.get("general") %> -

- <% } %> -
-
- - - - <% if (allowLogin) { %> - - - - - - - - - <% } %> - - - - - - - - -
Username: - - <% if (errors.get("username") != null) { %> -
- Please enter a valid username. -
- <% } %> -
Password: - - <% if (errors.get("password") != null) { %> -
- Please enter a valid password. -
- <% } %> -
Nickname: - - <% if (errors.get("nickname") != null) { %> -
- Please enter a nickname. -
- <% } %> -
Room: - - <% if (errors.get("room") != null) { %> -
- Please enter a valid room. -
- <% } %> -
-
-
- <% if (allowLogin) { %> - - <% } %> - <% if (allowAnonymous) { %> - - <% } %> - -
-
Don't have an account and would like to create one? - Click here. -
-
- - - - - diff --git a/apps/webchat/source/web/input_frame.jsp b/apps/webchat/source/web/input_frame.jsp deleted file mode 100644 index 352863160..000000000 --- a/apps/webchat/source/web/input_frame.jsp +++ /dev/null @@ -1,75 +0,0 @@ -<%@ page import="javax.servlet.*" %> - -<% // Get error map as a request attribute: - String logoFilename = application.getInitParameter("logoFilename"); - if (logoFilename == null) { - logoFilename = "images/logo.gif"; - } -%> - - - - - - - - - - - -
-
- -
- -
-
- - - - - diff --git a/apps/webchat/source/web/participants_frame.jsp b/apps/webchat/source/web/participants_frame.jsp deleted file mode 100644 index a2369de83..000000000 --- a/apps/webchat/source/web/participants_frame.jsp +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - -
In the room:
-
-
- -
- -
- -
- - - - Logout - - - diff --git a/apps/webchat/source/web/style_sheet.jsp b/apps/webchat/source/web/style_sheet.jsp deleted file mode 100644 index 381dceeef..000000000 --- a/apps/webchat/source/web/style_sheet.jsp +++ /dev/null @@ -1,132 +0,0 @@ -<% // Set the content type of the this page to be CSS - String contentType = "text/css"; - String chatAnnouncementColor = application.getInitParameter("chat.announcement-color"); - String chatOwnerLabelColor = application.getInitParameter("chat.owner-label-color"); - String chatParticipantLabelColor = application.getInitParameter("chat.participant-label-color"); - String chatTextColor = application.getInitParameter("chat.text-color"); - String errorTextColor = application.getInitParameter("error.text-color"); - String linkColor = application.getInitParameter("link.color"); - String linkHoverColor = application.getInitParameter("link.hover-color"); - String linkVisitedColor = application.getInitParameter("link.visited-color"); - String bodyBGColor = application.getInitParameter("body.background-color"); - String bodyTextColor = application.getInitParameter("body.text-color"); - String frameDividerColor = application.getInitParameter("frame.divider-color"); - String buttonColor = application.getInitParameter("button.color"); - String buttonTextColor = application.getInitParameter("button.text-color"); - String textFieldColor = application.getInitParameter("textfield.color"); - String textFieldTextColor = application.getInitParameter("textfield.text-color"); - response.setContentType(contentType); - if (chatAnnouncementColor == null) { - chatAnnouncementColor = "#009d00"; - } - if (chatOwnerLabelColor == null) { - chatOwnerLabelColor = "#aa0000"; - } - if (chatParticipantLabelColor == null) { - chatParticipantLabelColor = "#0000aa"; - } - if (chatTextColor == null) { - chatTextColor = "#434343"; - } - if (errorTextColor == null) { - errorTextColor = "#ff0000"; - } - if (linkColor == null) { - linkColor = "#045d30"; - } - if (linkHoverColor == null) { - linkHoverColor = "#350000"; - } - if (linkVisitedColor == null) { - linkVisitedColor = "#3b3757"; - } - if (bodyBGColor == null) { - bodyBGColor = "#ffffff"; - } - if (bodyTextColor == null) { - bodyTextColor = "#362f2d"; - } - if (frameDividerColor == null) { - frameDividerColor = "#83272b"; - } - if (buttonColor == null) { - buttonColor = "#d6dfdf"; - } - if (buttonTextColor == null) { - buttonTextColor = "#333333"; - } - if (textFieldColor == null) { - textFieldColor = "#f7f7fb"; - } - if (textFieldTextColor == null) { - textFieldTextColor = "#333333"; - } -%> - -BODY, TD, TH { font-family : Tahoma, Arial, Verdana, sans serif; font-size: 13px; } - -H3 { font-size : 1.2em; } - -.error-text { color : <%= errorTextColor %>; } - - -/* default unvisited, visited and hover link presentation */ -A:link { background: transparent; color: <%= linkColor %>; - text-decoration: none; } -A:visited { background: transparent; color: <%= linkVisitedColor %>; - text-decoration: none; } -A:hover { background: transparent; color: <%= linkHoverColor %>; - text-decoration: underline; } - -/** - * site wide BODY style rule; the scrollbar stuff only works in IE for windows, - * but doesn't seem to hurt on other browsers.. - */ -BODY.deffr { background-color: <%= bodyBGColor %>; color: <%= bodyTextColor %>; - scrollbar-face-color: <%= bodyBGColor %>; - scrollbar-shadow-color: <%= bodyTextColor %>; - scrollbar-highlight-color: <%= bodyBGColor %>; - scrollbar-darkshadow-color: <%= bodyBGColor %>; - scrollbar-track-color: <%= bodyBGColor %>; - scrollbar-arrow-color: <%= bodyTextColor %>; } - - -FRAME.bordered_left { border-left: 3px solid <%= frameDividerColor %>; } - - -IMG.logo { position: absolute; bottom: 12px; left: 10px; } - -IMG.logout { vertical-align: middle; } - - -INPUT.submit { background-color: <%= buttonColor %>; color: <%= buttonTextColor %>; - font-size: 12px; font-family: Arial, Verdana, sans serif; - border-style: ridge; margin: 1px 5px 1px 5px; } - -INPUT.submit_right { background-color: <%= buttonColor %>; color: <%= buttonTextColor %>; - font-size: 12px; font-family: Arial, Verdana, sans serif; - border-style: ridge; margin: 1px 5px 1px 5px; - position: absolute; right: 10px; } - -INPUT.text { background-color: <%= textFieldColor %>; color: <%= textFieldTextColor %>; - font: normal 12px Arial, Verdana, sans serif; height: 20px; width: 271px; - border-style: groove; margin-left: 10px; } - - -SPAN.chat_text { font: normal 11px Arial, Verdana, sans serif; - color: <%= chatTextColor %>; } - -SPAN.chat_announcement { font: italic 11px Arial, Verdana, sans serif; - color: <%= chatAnnouncementColor %>; } - -SPAN.chat_owner { font: bold 11px Arial, Verdana, sans serif; - color: <%= chatOwnerLabelColor %>; } - -SPAN.chat_participant { font: bold 11px Arial, Verdana, sans serif; - color: <%= chatParticipantLabelColor %>; } - -SPAN.logout { position: absolute; bottom: 12px; right: 15px; } - - -TEXTAREA { color: <%= textFieldTextColor %>; font: normal 12px Arial, Verdana, sans serif; - width: 500px; height: 130px; } diff --git a/apps/webchat/source/web/transcript_frame.html b/apps/webchat/source/web/transcript_frame.html deleted file mode 100644 index a4cc1faf5..000000000 --- a/apps/webchat/source/web/transcript_frame.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - -

- - - diff --git a/build/build.xml b/build/build.xml index 00f86257b..683d31dbe 100644 --- a/build/build.xml +++ b/build/build.xml @@ -24,8 +24,14 @@ - + + + + + + + @@ -35,11 +41,6 @@ - - - - - @@ -78,8 +79,8 @@ destdir="${compile.dir}" includeAntRuntime="no" debug="on" - source="1.3" - target="1.2" + source="1.5" + target="1.5" > @@ -102,8 +103,8 @@ destdir="${compile.test.dir}" includeAntRuntime="no" debug="on" - source="1.3" - target="1.2" + source="1.5" + target="1.5" > diff --git a/build/projects/Smack.iml b/build/projects/Smack.iml index 41e9e7ce2..73ac27096 100644 --- a/build/projects/Smack.iml +++ b/build/projects/Smack.iml @@ -8,7 +8,8 @@ - + + diff --git a/build/projects/Smack.ipr b/build/projects/Smack.ipr index 6a0e8eafd..b168f4e95 100644 --- a/build/projects/Smack.ipr +++ b/build/projects/Smack.ipr @@ -201,7 +201,7 @@ - +