package org.testng.remote.adapter; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Properties; import org.testng.ISuite; import org.testng.internal.Utils; import org.testng.remote.ConnectionInfo; import org.testng.xml.XmlSuite; /** * Default Slave adapter, provides an adapter based on static port. * * * @author Guy Korland * @date April 20, 2007 */ public class DefaultWorkerAdapter implements IWorkerAdapter { public static final String SLAVE_PORT = "slave.port"; private ConnectionInfo m_connectionInfo; private int m_clientPort; public void init( Properties prop) throws Exception { m_clientPort = Integer.parseInt( prop.getProperty(SLAVE_PORT, "0")); m_connectionInfo = resetSocket( m_clientPort, null); } /* * @see org.testng.remote.adapter.IWorkerApadter#getSuite(long) */ public XmlSuite getSuite(long timeout) throws InterruptedException, IOException { try { return (XmlSuite) m_connectionInfo.getOis().readObject(); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); throw new RuntimeException( e); } catch(IOException ex) { log("Connection closed " + ex.getMessage()); m_connectionInfo = resetSocket(m_clientPort, m_connectionInfo); throw ex; } } /* * @see org.testng.remote.adapter.IWorkerApadter#returnResult(org.testng.ISuite) */ public void returnResult(ISuite result) throws IOException { try { m_connectionInfo.getOos().writeObject(result); } catch(IOException ex) { log("Connection closed " + ex.getMessage()); m_connectionInfo = resetSocket(m_clientPort, m_connectionInfo); throw ex; } } private static ConnectionInfo resetSocket(int clientPort, ConnectionInfo oldCi) throws IOException { ConnectionInfo result = new ConnectionInfo(); ServerSocket serverSocket = new ServerSocket(clientPort); serverSocket.setReuseAddress(true); log("Waiting for connections on port " + clientPort); Socket socket = serverSocket.accept(); result.setSocket(socket); return result; } private static void log(String string) { Utils.log("", 2, string); } }