1 package org.testng.remote.strprotocol; 2 3 import org.testng.remote.RemoteTestNG; 4 5 import java.io.BufferedReader; 6 import java.io.BufferedWriter; 7 import java.io.IOException; 8 import java.io.InputStreamReader; 9 import java.io.OutputStreamWriter; 10 import java.io.PrintWriter; 11 import java.io.UnsupportedEncodingException; 12 import java.net.SocketException; 13 14 public class StringMessageSender extends BaseMessageSender { 15 16 private PrintWriter writer; 17 18 public StringMessageSender(String host, int port) { 19 super(host, port, false /* no ack */); 20 } 21 22 public StringMessageSender(String host, int port, boolean ack) { 23 super(host, port, ack); 24 } 25 26 @Override 27 public void sendMessage(IMessage message) { 28 if (m_outStream == null) { 29 throw new IllegalStateException("Trying to send a message on a shutdown sender"); 30 } 31 if (writer == null) { 32 try { 33 writer = new PrintWriter(new BufferedWriter( 34 new OutputStreamWriter(m_outStream, "UTF-8")), //$NON-NLS-1$ 35 false /* autoflush */); 36 } catch (UnsupportedEncodingException e1) { 37 writer = new PrintWriter(new BufferedWriter( 38 new OutputStreamWriter(m_outStream)), 39 false /* autoflush */); 40 } 41 } 42 43 String msg = ((IStringMessage) message).getMessageAsString(); 44 if (RemoteTestNG.isVerbose()) { 45 p("Sending message:" + message); 46 p(" String version:" + msg); 47 48 StringBuffer buf = new StringBuffer(); 49 for(int i = 0; i < msg.length(); i++) { 50 if('\u0001' == msg.charAt(i)) { 51 p(" word:[" + buf.toString() + "]"); 52 buf.delete(0, buf.length()); 53 } 54 else { 55 buf.append(msg.charAt(i)); 56 } 57 } 58 p(" word:[" + buf.toString() + "]"); 59 } 60 61 synchronized(m_ackLock) { 62 writer.println(msg); 63 writer.flush(); 64 waitForAck(); 65 } 66 } 67 68 private static void p(String msg) { 69 if (RemoteTestNG.isVerbose()) { 70 System.out.println("[StringMessageSender] " + msg); //$NON-NLS-1$ 71 } 72 } 73 74 @Override 75 public IMessage receiveMessage() { 76 IMessage result = null; 77 78 if (m_inReader == null) { 79 try { 80 m_inReader = new BufferedReader(new InputStreamReader(m_inStream, "UTF-8")); 81 } catch (UnsupportedEncodingException e) { 82 m_inReader = new BufferedReader(new InputStreamReader(m_inStream)); 83 } 84 } 85 try { 86 // try { 87 // m_outputWriter = new PrintWriter(new OutputStreamWriter(fSocket.getOutputStream(), "UTF-8"), 88 // true); 89 // } 90 // catch(UnsupportedEncodingException e1) { 91 // m_outputWriter = new PrintWriter(new OutputStreamWriter(fSocket.getOutputStream()), true); 92 // } 93 result = receiveMessage(m_inReader.readLine()); 94 } catch(IOException e) { 95 handleThrowable(e); 96 } 97 98 return result; 99 // finally { 100 // shutDown(); 101 // return null; 102 // } 103 } 104 105 protected void handleThrowable(Throwable cause) { 106 if (RemoteTestNG.isVerbose()) { 107 cause.printStackTrace(); 108 } 109 } 110 111 // private String readMessage(BufferedReader in) throws IOException { 112 // return in.readLine(); 113 // } 114 115 private IMessage receiveMessage(String message) { 116 if (message == null) return null; 117 IMessage result = null; 118 119 int messageType = MessageHelper.getMessageType(message); 120 121 // try { 122 if(messageType < MessageHelper.SUITE) { 123 // Generic message 124 result = MessageHelper.unmarshallGenericMessage(message); 125 } 126 else if(messageType < MessageHelper.TEST) { 127 // Suite message 128 result = MessageHelper.createSuiteMessage(message); 129 } 130 else if(messageType < MessageHelper.TEST_RESULT) { 131 // Test message 132 result = MessageHelper.createTestMessage(message); 133 } 134 else { 135 // TestResult message 136 result = MessageHelper.unmarshallTestResultMessage(message); 137 } 138 // } 139 // finally { 140 // if(isRunning() && (null != m_outputWriter)) { 141 // m_outputWriter.println(MessageHelper.ACK_MSG); 142 // m_outputWriter.flush(); 143 // } 144 // } 145 146 p("receiveMessage() received:" + result); 147 return result; 148 } 149 } 150