package com.github.bjuvensjo.rsimulator.socket; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.name.Named; import com.github.bjuvensjo.rsimulator.core.Simulator; import com.github.bjuvensjo.rsimulator.core.SimulatorResponse; import com.github.bjuvensjo.rsimulator.socket.config.GlobalConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Optional; /** * Manager * * @author Magnus Bjuvensjö */ @Singleton public class Manager { @Inject private RequestReader requestReader; @Inject private ResponseWriter responseWriter; @Inject private Simulator simulator; @Inject @Named("simulatorContentType") private String simulatorContentType; public void handle(Socket s) throws IOException { Worker worker = new Worker(s); new Thread(worker).start(); } class Worker implements Runnable { private final Logger log = LoggerFactory.getLogger(Worker.class); private Socket s; public Worker(Socket s) throws IOException { this.s = s; } private RequestReader.Request read(InputStream in) throws IOException { return requestReader.read(in); } private void write(RequestReader.Request request, SimulatorResponse simulatorResponse, OutputStream out) throws IOException { responseWriter.write(request, simulatorResponse, out); } private String getRootRelativePath(RequestReader.Request request) { if (GlobalConfig.useRootRelativePath) { return request.getBody().substring(0, 3); // the name of the service } return ""; } public void run() { boolean connected = true; while (!s.isClosed() && connected) { InputStream in = null; OutputStream out = null; try { in = s.getInputStream(); out = s.getOutputStream(); RequestReader.Request request = read(in); if (request.isValid()) { Optional<SimulatorResponse> simulatorResponseOptional = simulator.service(GlobalConfig.rootPath, getRootRelativePath(request), request.getBody(), simulatorContentType); SimulatorResponse simulatorResponse = simulatorResponseOptional.get(); write(request, simulatorResponse, out); } } catch (Exception e) { log.error(null, e); try { if (!s.isClosed()) { s.close(); } } catch (IOException e1) { log.debug(null, e1); } } finally { connected = false; } } } } }