?? chat.java
字號:
package org.ellab.elchat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.javabb.bbcode.ProcessBBCode;
import uk.ltd.getahead.dwr.ExecutionContext;
/**
* The main DWR interface for the chating logic.
*/
public class Chat {
//private static Log log = LogFactory.getLog(Chat.class);
private static LinkedList messages;
private static LinkedList stickyMessages;
private static MessageDatabase messageDatabase;
private static ChatConfig config = ChatConfig.getInstance();
// for apache mod_proxy
private static final String HTTP_HEADER_FORWARDED_FOR = "x-forwarded-for";
private static final String IMG_SRC_PREFIX = "___IMAGE_SRC_PREFIX___";
private static final String MATCH_URL = "[-:\\w\\.]+(/([-:/?~!@#$%^&*()-_=+\\w\\.]*";
static void init(String persistFile) {
if (persistFile != null && persistFile.trim().length() > 0) {
messageDatabase = MessageDatabase.load(persistFile);
messages = messageDatabase.getMessages();
stickyMessages = messageDatabase.getStickyMessages();
}
else {
messages = new LinkedList();
stickyMessages = new LinkedList();
}
}
public List addMessage(String user, String text, boolean preview, boolean enableEmotIcon, boolean enableImage,
boolean enableBBCode) {
if (text != null && text.trim().length() > 0) {
text = text.trim();
if (!Command.process(text, this, config)) {
if (config.isSuspend()) {
return null;
}
String ip = getRemoteAddr(ExecutionContext.get().getHttpServletRequest());
Message message = createMessage(ip, user, text, enableEmotIcon, enableImage, enableBBCode);
messages.addFirst(message);
while (messages.size() > config.getLimit()) {
removeLastMessage();
}
persistMessage();
}
}
return getMessages();
}
Message createMessage(String ip, String user, String text, boolean enableEmotIcon, boolean enableImage,
boolean enableBBCode) {
String newUser;
String plainUser;
String newText = text;
String plainText;
if (newText.length() > config.getMsgLength()) {
newText = newText.substring(0, config.getMsgLength());
}
newUser = encodeHTML(user);
if (config.isEnableHtmlEscape()) {
newText = encodeHTML(newText);
}
plainUser = newUser;
plainText = newText;
//BBCode is disabled until find a releasd bbcode library
if (enableBBCode) {
ProcessBBCode bbcode = new ProcessBBCode();
bbcode.setAcceptBBCode(true);
bbcode.setAcceptHTML(true);
newText = bbcode.preparePostText(newText);
}
if (config.isEnableImage() && enableImage) {
// image
// replace http to PREFIX to skip http replacement
newText = (newText + " ").replaceAll(
"http(s?://" + MATCH_URL + ")?\\."
+ "(([jJ][pP][eE]?[gG])|([gG][iI][fF])|([pP][nN][gG])|([bB][mM][pP])|([tT][iI][fF]?[fF]))"
+ "))(\\s|<br\\/?>)", "<img src='" + IMG_SRC_PREFIX + "$1' border='0'/>").trim();
}
if (config.isEnableUrl()) {
// http(s)://
newText = (newText + " ").replaceAll("(https?://" + MATCH_URL + "))?)(\\s|<br\\/?>)",
"<a href='$1' target='_blank'>$1</a>$4").trim();
// news://
newText = (newText + " ").replaceAll(
"(news://" + MATCH_URL + "))?)(\\s|<br\\/?>)",
"<a href='http://ellab.org:8080/elnews/readNews.do"
+ "?formAction=readNews&host=&submit=Submit&showImage=on&showMime=on&url=" + "$1"
+ "' target='_blank'>$1</a>$4").trim();
}
if (config.isEnableImage() && enableImage) {
// replace back PREFIX to http
newText = newText.replaceAll("<img src='" + IMG_SRC_PREFIX, "<img src='http");
}
if (config.isEnableMsgEmotIcon() && enableEmotIcon) {
newText = EmotIcon.process(newText);
}
if (config.isEnableUserEmotIcon()) {
newUser = EmotIcon.processUserEmot(newUser.toLowerCase());
}
return new Message(user, newUser, plainUser, ip, text, newText, plainText);
}
void setSticky(long messageId) {
for (Iterator it = messages.iterator(); it.hasNext();) {
Message msg = (Message) it.next();
if (msg.getId() == messageId) {
Message newMsg = msg.copyTo();
newMsg.setSticky(true);
stickyMessages.addFirst(newMsg);
persistMessage();
return;
}
}
}
void removeSticky(long messageId) {
for (Iterator it = stickyMessages.iterator(); it.hasNext();) {
Message msg = (Message) it.next();
if (msg.getId() == messageId) {
msg.setSticky(false);
stickyMessages.remove(msg);
messages.addLast(msg);
persistMessage();
return;
}
}
}
void removeFirstMessage() {
if (messages.size() > 0) {
messages.removeFirst();
}
}
void removeLastMessage() {
if (messages.size() > 0) {
messages.removeLast();
}
}
void clearMessage() {
messages.clear();
}
List getNonStickyMessage() {
return messages;
}
void clearSticky() {
stickyMessages.clear();
}
private static String encodeHTML(String s) {
s = s.replaceAll("&", "&");
s = s.replaceAll("<", "<");
s = s.replaceAll(">", ">");
s = s.replaceAll("\"", """);
s = s.replaceAll("(\r\n|\n\r|\n|\r)", "<br/>");
return s;
}
public List getMessages() {
HttpServletRequest request = ExecutionContext.get().getHttpServletRequest();
HttpSession session = request.getSession();
if (session != null) {
String sessionId = session.getId();
String ip = getRemoteAddr(request);
SessionMap.access(sessionId, ip);
}
if (config.isSuspend()) {
throw new SuspendException();
}
List list = new ArrayList();
list.addAll(messages);
list.addAll(stickyMessages);
return list;
}
public List getUserList(String user) {
HttpSession session = ExecutionContext.get().getHttpServletRequest().getSession();
if (session != null) {
String sessionId = session.getId();
SessionMap.setSessionUser(sessionId, user);
}
return SessionMap.getUserList();
}
private void persistMessage() {
if (messageDatabase != null) {
messageDatabase.persist();
}
}
private static String getRemoteAddr(HttpServletRequest request) {
String addr = request.getHeader(HTTP_HEADER_FORWARDED_FOR);
if (addr == null || addr.length() == 0 || addr.trim().length() == 0) {
addr = request.getRemoteAddr();
}
return addr;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -