15f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/* 25f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more 35f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * contributor license agreements. See the NOTICE file distributed with 45f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * this work for additional information regarding copyright ownership. 55f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 65f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * (the "License"); you may not use this file except in compliance with 75f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * the License. You may obtain a copy of the License at 85f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 95f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Unless required by applicable law or agreed to in writing, software 125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * See the License for the specific language governing permissions and 165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * limitations under the License. 175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @author Vitaly A. Provodin 215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Created on 29.01.2005 255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.share; 275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.io.DataInputStream; 295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.io.DataOutputStream; 305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.io.EOFException; 315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.io.IOException; 32f071b0daf89102f441718079a50562a970846a59Nicolas Geoffrayimport java.net.InetAddress; 33ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffrayimport java.net.InetSocketAddress; 345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.net.Socket; 355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.net.ServerSocket; 365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.DebuggeeSynchronizer; 385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.LogWriter; 395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.TestErrorException; 405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.TestOptions; 415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * This class implements <code>DebuggeeSynchronizer</code> interface using 445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * TCP/IP sockets. All operations can be timed out according to default timeout. 455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class JPDADebuggeeSynchronizer implements DebuggeeSynchronizer { 475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public final static String SGNL_READY = "ready"; 495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public final static String SGNL_CONTINUE = "continue"; 515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected Socket clientSocket = null; 535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected ServerSocket serverSocket = null; 555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected DataOutputStream out; 575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected DataInputStream in; 595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected TestOptions settings; 615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected LogWriter logWriter; 635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * A constructor that initializes an instance of the class with specified 665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <code>LogWriter</code> and <code>TestOptions</code>. 675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @param logWriter 695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * The instance of implementation of LogWriter. 705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @param settings 715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Instance of test options. 725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public JPDADebuggeeSynchronizer(LogWriter logWriter, TestOptions settings) { 745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes super(); 755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes this.logWriter = logWriter; 765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes this.settings = settings; 775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Sends specified message to synchronization channel. 815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @param message 835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * a message to be sent. 845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized void sendMessage(String message) { 865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes out.writeUTF(message); 885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes out.flush(); 895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Message sent: " + message); 905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes throw new TestErrorException(e); 925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Receives message from synchronization channel and compares it with the 975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * expected <code>message</code>. 985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @param message 1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * expected message. 1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @return <code>true</code> if received string is equals to 1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <code>message</code> otherwise - <code>false</code>. 1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized boolean receiveMessage(String message) { 1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String msg; 1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Waiting for message: " + message); 1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes msg = in.readUTF(); 1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Received message: " + msg); 1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (EOFException e) { 1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return false; 1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.printError(e); 1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return false; 1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return message.equalsIgnoreCase(msg); 1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Receives message from synchronization channel. 1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @return received string or null if connection was closed. 1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized String receiveMessage() { 1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String msg; 1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Waiting for any messsage"); 1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes msg = in.readUTF(); 1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Received message: " + msg); 1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (EOFException e) { 1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return null; 1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes throw new TestErrorException(e); 1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return msg; 1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Receives message from synchronization channel without Exception. 1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @return received string 1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized String receiveMessageWithoutException(String invoker) { 1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String msg; 1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Waiting for any message"); 1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes msg = in.readUTF(); 1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Received message: " + msg); 1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (Throwable thrown) { 1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (invoker != null) { 1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("#### receiveMessageWithoutException: Exception occurred:"); 1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("#### " + thrown); 1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("#### Invoker = " + invoker); 1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes msg = "" + thrown; 1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return msg; 1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 162ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray * Returns socket address for connecting to the server. 1635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 164ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray * @return socket address 1655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 166ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray public InetSocketAddress getSyncServerAddress() { 167ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray // Use the LOOPBACK directly instead of doing a DNS lookup. 168ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray int port = settings.getSyncPortNumber(); 169f071b0daf89102f441718079a50562a970846a59Nicolas Geoffray return new InetSocketAddress(InetAddress.getLoopbackAddress(), port); 1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 1735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Binds server to listen socket port. 1745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 1755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @return port number 1765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 1775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized int bindServer() { 178ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray InetSocketAddress serverAddress = getSyncServerAddress(); 1795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 180ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray logWriter.println("[SYNC] Binding socket on: " + serverAddress); 181ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray serverSocket = new ServerSocket(serverAddress.getPort(), 0, serverAddress.getAddress()); 182ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray logWriter.println("[SYNC] Bound socket on: " + serverAddress); 183ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray return serverAddress.getPort(); 1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes throw new TestErrorException( 1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "[SYNC] Exception in binding for socket sync connection", e); 1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 1915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Accepts sync connection form server side. 1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized void startServer() { 1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes long timeout = settings.getTimeout(); 1955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes serverSocket.setSoTimeout((int) timeout); 1975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Accepting socket connection"); 1985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes clientSocket = serverSocket.accept(); 1995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Accepted socket connection"); 2005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 2015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes clientSocket.setSoTimeout((int) timeout); 2025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes out = new DataOutputStream(clientSocket.getOutputStream()); 2035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes in = new DataInputStream(clientSocket.getInputStream()); 2045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 2055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes throw new TestErrorException( 2065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "[SYNC] Exception in accepting socket sync connection", e); 2075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 2105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 2115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Attaches for sync connection from client side.. 2125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 2135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized void startClient() { 2145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes long timeout = settings.getTimeout(); 215ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray InetSocketAddress serverAddress = getSyncServerAddress(); 2165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 217ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray logWriter.println("[SYNC] Attaching socket to: " + serverAddress); 218ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray clientSocket = new Socket(serverAddress.getAddress(), serverAddress.getPort()); 2195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Attached socket"); 2205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 2215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes clientSocket.setSoTimeout((int) timeout); 2225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes out = new DataOutputStream(clientSocket.getOutputStream()); 2235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes in = new DataInputStream(clientSocket.getInputStream()); 2245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 2255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes throw new TestErrorException( 2265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "[SYNC] Exception in attaching for socket sync connection", e); 2275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 2305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 2315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Stops synchronization work. It ignores <code>IOException</code> but 2325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * prints a message. 2335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 2345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public void stop() { 2355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 2365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (out != null) 2375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes out.close(); 2385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (in != null) 2395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes in.close(); 2405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (clientSocket != null) 2415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes clientSocket.close(); 2425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (serverSocket != null) 2435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes serverSocket.close(); 2445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 2455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println 2465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ("[SYNC] Ignoring exception in closing socket sync connection: " + e); 2475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Closed socket"); 2495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes} 251