package com.google.gwt.dist.compiler.agent.impl; import java.io.File; import java.io.IOException; import java.net.Socket; import java.util.regex.Pattern; import com.google.gwt.dist.ProcessingState; import com.google.gwt.dist.comm.CommMessage; import com.google.gwt.dist.comm.CommMessagePayload; import com.google.gwt.dist.comm.ProcessingResultPayload; import com.google.gwt.dist.comm.ProcessingStatePayload; import com.google.gwt.dist.comm.impl.ProcessingResultMessage; import com.google.gwt.dist.comm.impl.SendDataMessage; import com.google.gwt.dist.compiler.agent.SessionManager; import com.google.gwt.dist.compiler.agent.communicator.Communicator; import com.google.gwt.dist.compiler.agent.processor.DataProcessor; import com.google.gwt.dist.util.ZipCompressor; import com.google.gwt.dist.util.ZipDecompressor; /** * SessionManager handles sessions towards a node, for this agent. */ public class SessionManagerImpl implements SessionManager, Runnable { private Communicator communicator; private ZipCompressor compressor; private ZipDecompressor decompressor; private DataProcessor dataProcessor; public SessionManagerImpl() { } public SessionManagerImpl(DataProcessor dataProcessor) { this.dataProcessor = dataProcessor; } public Communicator getCommunicator() { return this.communicator; } public ZipCompressor getCompressor() { return this.compressor; } public ZipDecompressor getDecompressor() { return this.decompressor; } public ProcessingState getProcessingState() { return this.dataProcessor.getCurrentState(); } public void processConnection(Socket client) { CommMessage<CommMessagePayload> message = communicator.getData(client); message.setResponse(decideResponse(message)); communicator.sendData(message, client); communicator.closeConnection(client); } public void setCompressor(ZipCompressor compressor) { this.compressor = compressor; } public void setDecompressor(ZipDecompressor decompressor) { this.decompressor = decompressor; } public void setCommunicator(Communicator communicator) { this.communicator = communicator; } @SuppressWarnings("unchecked") private <T extends CommMessagePayload> T decideResponse( CommMessage<T> message) { T responseToReturn = null; switch (message.getCommMessageType()) { case DELIVERY_DATA: System.out.println("Data was delivered."); dataProcessor.onDataReceived(((SendDataMessage) message) .getResponse()); break; case ECHO: responseToReturn = message.getResponse(); break; case QUERY: responseToReturn = (T) new ProcessingStatePayload( getProcessingState()); break; case RETURN_RESULT: try { ProcessingResultPayload payload = new ProcessingResultPayload(); payload = ((ProcessingResultMessage) message) .getResponse(); File folderFromWhichToPickData = new File(System .getProperty("user.dir") + File.separator + payload.getUUID() + File.separator + "work"); byte[] data = compressor.archiveAndCompressDir( folderFromWhichToPickData, Pattern.compile("permutation-[0-9+].js")).toByteArray(); payload.setResponseValue(data); responseToReturn = (T) payload; deleteDataStoredOnDisk(payload); } catch (IOException e) { e.printStackTrace(); } break; } return responseToReturn; } /** * Deletes data store on disk, for a compiler identified by uuid contained * in payload. * * @param payload * Payload which contains information about what data to delete. */ private void deleteDataStoredOnDisk(ProcessingResultPayload payload) { deleteDir(new File(System.getProperty("user.dir") + File.separator + payload.getUUID())); dataProcessor.reset(); } //TODO: candidate for removal. @Override public void run() { System.out.println("running..."); } /** * Delete directory and all the files and folders in it. * @param dir Directory to delete. */ private void deleteDir(File dir) { for (File f : dir.listFiles()) { if (f.isDirectory()) { deleteDir(f); f.delete(); } else { f.delete(); } } } }