package com.google.gwt.dist.compiler.agent.communicator.impl; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.Socket; import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; import org.apache.log4j.Level; import org.apache.log4j.Logger; import com.google.gwt.dist.comm.CommMessage; import com.google.gwt.dist.comm.CommMessagePayload; import com.google.gwt.dist.comm.SendDataPayload; import com.google.gwt.dist.compiler.agent.SessionManager; import com.google.gwt.dist.compiler.agent.communicator.Communicator; import com.google.gwt.dist.compiler.agent.events.DataReceivedListener; import com.google.gwt.dist.util.ZipCompressor; public class CommunicatorImpl implements Communicator { private ZipCompressor compressor; private Set<DataReceivedListener> dataReceivedListeners; private SessionManager sessionManager; private static final Logger logger = Logger.getLogger(CommunicatorImpl.class); public CommunicatorImpl() { this.dataReceivedListeners = new HashSet<DataReceivedListener>(); compressor = new ZipCompressor(); compressor.setExcludePattern(Pattern .compile("bin|\\.settings\\.classpath\\.project")); } /** * Closes a connection towards a client. */ public void closeConnection(Socket client) { try { client.close(); } catch (IOException e) { e.printStackTrace(); } } /** * Notify DataReceivedListeners about data transfer being finished. */ public void dataReceived(SendDataPayload receivedData) { for (DataReceivedListener l : dataReceivedListeners) { l.onDataReceived(receivedData); } } @SuppressWarnings("unchecked") public CommMessage<CommMessagePayload> getData(Socket client) { logger.log(Level.INFO, "Getting data from client: " + client.getInetAddress()); CommMessage<CommMessagePayload> message = null; try { InputStream is = client.getInputStream(); ObjectInputStream ois = new ObjectInputStream(is); message = (CommMessage<CommMessagePayload>) ois.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return message; } public SessionManager getSessionManager() { return this.sessionManager; } public void setSessionManager(SessionManager sessionManager) { this.sessionManager = sessionManager; } public void sendData(CommMessage<CommMessagePayload> message, Socket client) { try { OutputStream os = client.getOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeObject(message); oos.flush(); oos.close(); os.close(); } catch (IOException e) { logger.error("There was a problem while sending data to client " + client.getInetAddress()); } } @Override public void serveClient(Socket client) { } @Override public void addDataReceivedListener(DataReceivedListener listener) { dataReceivedListeners.add(listener); } }