import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Iterator; import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import java.util.TreeSet ; import java.util.ArrayList ; public class BasicServer { final private int iPort; final private ArrayList handlers; public BasicServer(int port) { iPort = port; handlers = new ArrayList(); } public void attach(HttpHandler handler) { handlers.add(handler); sort() ; }; public void detach(HttpHandler handler) { handlers.remove(handlers.indexOf(handler)); }; private void sort() { Object [] sortList = handlers.toArray() ; Arrays.sort(sortList) ; handlers.clear() ; for (int i = 0 ; i < sortList.length ; i ++) handlers.add((HttpHandler)sortList[i]) ; } public void run() { try { ServerSocket server = new ServerSocket(iPort); while (true) { Socket client = server.accept(); StringBuffer strBuffer = new StringBuffer(); InputStream iStream = client.getInputStream(); OutputStream oStream = client.getOutputStream(); HttpRequest request = HttpGetRequestSimple.readRequest(iStream, oStream); HttpResponse response = null; if (request != null) { try { boolean bExclusiveHandlerInvoked = false; boolean isHandled = false ; Iterator it = handlers.iterator(); while (it.hasNext()) { HttpHandler handler = (HttpHandler) it.next(); if (handler.isExclusive()) { if (bExclusiveHandlerInvoked) { continue; } else { bExclusiveHandlerInvoked = handler.handleRequest(request, strBuffer); isHandled = isHandled || bExclusiveHandlerInvoked ; } } else { isHandled = handler.handleRequest(request, strBuffer) || isHandled; } } if (strBuffer.length() == 0) { strBuffer = strBuffer.append( "No output" + "No output generated for request : " + request.getRequestName() + "\n" ) ; } if (!isHandled) response = HttpResponse.errorResponse("Fail to match request " + request.getRequestName()) ; else response = HttpResponse.successResponse(strBuffer.toString()); } catch (HandlerException hException) { response = HttpResponse.errorResponse(hException.getHtmlMsg()); } catch (Exception e) { response = HttpResponse.errorResponse(strBuffer.toString()); } finally { if (response != null) response.sendResponse(oStream); } } client.close(); } } catch (Exception e) { e.printStackTrace(); } }; }