package com.framsticks.communication; import com.framsticks.communication.queries.*; import com.framsticks.params.SourceInterface; import com.framsticks.util.lang.Pair; import com.framsticks.util.lang.Strings; import org.apache.log4j.Logger; import java.net.Socket; import com.framsticks.util.dispatching.RunAt; /** * @author Piotr Sniegowski */ public class ServerConnection extends Connection { private final static Logger log = Logger.getLogger(ServerConnection.class); RequestHandler requestHandler; public ServerConnection(Socket socket, RequestHandler requestHandler) { super("todo"); this.socket = socket; this.requestHandler = requestHandler; connected = true; } @Override public String toString() { return socket.getInetAddress().getHostAddress(); } @Override protected void receiverThreadRoutine() { while (connected) { processNextRequest(); } } protected void handleRequest(Request request, ResponseCallback responseCallback) { if (request instanceof ApplicationRequest) { requestHandler.handle((ApplicationRequest) request, responseCallback); return; } if (request instanceof ProtocolRequest) { if (request instanceof VersionRequest) { responseCallback.process(new Response(true, null, null)); return; } if (request instanceof UseRequest) { String feature = ((UseRequest)request).getFeature(); if (feature.equals("request_id")) { requestIdEnabled = true; responseCallback.process(new Response(true, null, null)); return; } responseCallback.process(new Response(false, "\"unknown feature: " + feature + "\"", null)); return; } } log.error("unhandled request: " + request); responseCallback.process(new Response(false, "unhandled", null)); } protected final void respond(final Response response, final Integer id) { senderThread.dispatch(new RunAt() { @Override public void run() { String outId = id != null ? " " + id : ""; if (response.getFiles() != null) { for (File f : response.getFiles()) { output.print("file" + outId/* + " " + f.getPath()*/ + "\n"); SourceInterface content = f.getContent(); String line; while ((line = content.readLine()) != null) { output.print(line); output.print('\n'); } output.print("eof\n"); } } output.print(response.getOk() ? "ok" : "error"); output.print(outId); if (Strings.notEmpty(response.getComment())) { output.print(' '); output.print(response.getComment()); } output.print('\n'); output.flush(); } }); } protected void processNextRequest() { String line = getLine(); Pair command = Strings.splitIntoPair(line, ' ', "\n"); final Pair rest = parseRest(command.second); if (rest == null) { respond(new Response(false, "\"invalid input\"", null), null); return; } final Request request = Request.createRequestByTypeString(command.first); if (request == null) { respond(new Response(false, "\"invalid input\"", null), null); return; } request.parseRest(rest.second); if (log.isTraceEnabled()) { log.trace("read request: " + request); } handleRequest(request, new ResponseCallback() { @Override public void process(Response response) { respond(response, rest.first); } }); } @Override protected void joinableStart() { // TODO Auto-generated method stub } }