import java.io.IOException; import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ChatProtocol { private final static List messageList = Collections.synchronizedList(new LinkedList()); private long lastLineTime; public ChatProtocol() { lastLineTime = new Date().getTime(); } private final static Pattern rxLine = Pattern.compile("<(.*?)>(.*)"); protected String username = null; private boolean authorized = true; private boolean quit = false; public final static String USERNAME_PASSWORD_SEP = ","; public final static String ERROR_STRING = ">ERR<"; public final static String OK_STRING = ">OK<"; public final static String MESSAGE_PREFIX = " "; public String preProcess(String inputLine) { return inputLine; } protected String returnE(String s) { return s; } protected String handleSpecialAction(String action, String value) { return null; } protected void postMessageSend(String username, String value) { } public String processInput(String inputLine) throws ProtocolException { inputLine = preProcess(inputLine); System.out.println("received " + inputLine); Matcher m = null; synchronized (rxLine) { m = rxLine.matcher(inputLine); } if (!m.find()) { throw new ProtocolException(inputLine); } quit = false; final String action = m.group(1).toLowerCase(); final String value = m.group(2); String specActionRes = handleSpecialAction(action, value); if (specActionRes != null) { return specActionRes; } else if (action.equals("quit")) { quit = true; return returnE(OK_STRING); } else if (authorized) { if (action.equals("send")) { final ChatLine line = new ChatLine(username, value, new Date().getTime()); messageList.add(line); postMessageSend(username, value); return returnE(OK_STRING); } else if (action.equals("get")) { final StringBuffer toSend = new StringBuffer(); synchronized(messageList) { ChatLine l = null; for (Iterator it = messageList.iterator(); it.hasNext();) { l = (ChatLine) it.next(); if (l.getTime() > lastLineTime /*&& !l.getUser().equals(username)*/) { toSend.append(l.getUser() + ": " + l.getLine() + "\\n"); lastLineTime = l.getTime(); } } } return returnE(MESSAGE_PREFIX + toSend.toString()); } } return returnE(ERROR_STRING); } public boolean isQuit() { return quit; } }