1ed626ea7464c25db7ea754177f36b344195da158Cédric Beustpackage org.testng.remote.strprotocol;
2ed626ea7464c25db7ea754177f36b344195da158Cédric Beust
3ed626ea7464c25db7ea754177f36b344195da158Cédric Beustimport org.testng.remote.RemoteTestNG;
4ed626ea7464c25db7ea754177f36b344195da158Cédric Beust
515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beustimport java.io.BufferedReader;
6754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beustimport java.io.BufferedWriter;
715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beustimport java.io.IOException;
815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beustimport java.io.InputStreamReader;
9754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beustimport java.io.OutputStreamWriter;
10ed626ea7464c25db7ea754177f36b344195da158Cédric Beustimport java.io.PrintWriter;
11754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beustimport java.io.UnsupportedEncodingException;
1215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beustimport java.net.SocketException;
13ed626ea7464c25db7ea754177f36b344195da158Cédric Beust
14754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beustpublic class StringMessageSender extends BaseMessageSender {
15754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust
1615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust  private PrintWriter writer;
1715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust
18754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust  public StringMessageSender(String host, int port) {
195c2da9a4d95f922a413b8502f4ddc3ab0f13c9d3Cédric Beust    super(host, port, false /* no ack */);
205c2da9a4d95f922a413b8502f4ddc3ab0f13c9d3Cédric Beust  }
215c2da9a4d95f922a413b8502f4ddc3ab0f13c9d3Cédric Beust
225c2da9a4d95f922a413b8502f4ddc3ab0f13c9d3Cédric Beust  public StringMessageSender(String host, int port, boolean ack) {
235c2da9a4d95f922a413b8502f4ddc3ab0f13c9d3Cédric Beust    super(host, port, ack);
24754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust  }
25ed626ea7464c25db7ea754177f36b344195da158Cédric Beust
26ed626ea7464c25db7ea754177f36b344195da158Cédric Beust  @Override
27754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust  public void sendMessage(IMessage message) {
28ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust    if (m_outStream == null) {
29ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust      throw new IllegalStateException("Trying to send a message on a shutdown sender");
30ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust    }
31ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust    if (writer == null) {
32ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust      try {
33ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust        writer = new PrintWriter(new BufferedWriter(
34ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust            new OutputStreamWriter(m_outStream, "UTF-8")), //$NON-NLS-1$
35ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust            false /* autoflush */);
36ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust      } catch (UnsupportedEncodingException e1) {
37ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust        writer = new PrintWriter(new BufferedWriter(
38ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust            new OutputStreamWriter(m_outStream)),
39ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust            false /* autoflush */);
40ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust      }
41754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust    }
42754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust
43ed626ea7464c25db7ea754177f36b344195da158Cédric Beust    String msg = ((IStringMessage) message).getMessageAsString();
44ed626ea7464c25db7ea754177f36b344195da158Cédric Beust    if (RemoteTestNG.isVerbose()) {
45e13375131c0502f2553a694109d79cbf00732dfaCédric Beust      p("Sending message:" + message);
46e13375131c0502f2553a694109d79cbf00732dfaCédric Beust      p("  String version:" + msg);
47ed626ea7464c25db7ea754177f36b344195da158Cédric Beust
48ed626ea7464c25db7ea754177f36b344195da158Cédric Beust      StringBuffer buf = new StringBuffer();
49ed626ea7464c25db7ea754177f36b344195da158Cédric Beust      for(int i = 0; i < msg.length(); i++) {
50ed626ea7464c25db7ea754177f36b344195da158Cédric Beust        if('\u0001' == msg.charAt(i)) {
51e13375131c0502f2553a694109d79cbf00732dfaCédric Beust          p("  word:[" + buf.toString() + "]");
52ed626ea7464c25db7ea754177f36b344195da158Cédric Beust          buf.delete(0, buf.length());
53ed626ea7464c25db7ea754177f36b344195da158Cédric Beust        }
54ed626ea7464c25db7ea754177f36b344195da158Cédric Beust        else {
55ed626ea7464c25db7ea754177f36b344195da158Cédric Beust          buf.append(msg.charAt(i));
56ed626ea7464c25db7ea754177f36b344195da158Cédric Beust        }
57ed626ea7464c25db7ea754177f36b344195da158Cédric Beust      }
58e13375131c0502f2553a694109d79cbf00732dfaCédric Beust      p("  word:[" + buf.toString() + "]");
59ed626ea7464c25db7ea754177f36b344195da158Cédric Beust    }
60ed626ea7464c25db7ea754177f36b344195da158Cédric Beust
613eb34813b24377dd042c9e85b8a7854af34e3b81Cédric Beust    synchronized(m_ackLock) {
62754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust      writer.println(msg);
63754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust      writer.flush();
640482f188546780be2e9fbb4607765fcaaecb898bCédric Beust      waitForAck();
65ed626ea7464c25db7ea754177f36b344195da158Cédric Beust    }
66ed626ea7464c25db7ea754177f36b344195da158Cédric Beust  }
67ed626ea7464c25db7ea754177f36b344195da158Cédric Beust
68ed626ea7464c25db7ea754177f36b344195da158Cédric Beust  private static void p(String msg) {
69ed626ea7464c25db7ea754177f36b344195da158Cédric Beust    if (RemoteTestNG.isVerbose()) {
70ed626ea7464c25db7ea754177f36b344195da158Cédric Beust      System.out.println("[StringMessageSender] " + msg); //$NON-NLS-1$
71ed626ea7464c25db7ea754177f36b344195da158Cédric Beust    }
72ed626ea7464c25db7ea754177f36b344195da158Cédric Beust  }
73ed626ea7464c25db7ea754177f36b344195da158Cédric Beust
7415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust  @Override
7515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust  public IMessage receiveMessage() {
7615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust    IMessage result = null;
7715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust
7815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust    if (m_inReader == null) {
7915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      try {
8054c45175326b6cda1d4da7780f906871632de1d5Cédric Beust        m_inReader = new BufferedReader(new InputStreamReader(m_inStream, "UTF-8"));
8115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      } catch (UnsupportedEncodingException e) {
8254c45175326b6cda1d4da7780f906871632de1d5Cédric Beust        m_inReader = new BufferedReader(new InputStreamReader(m_inStream));
8315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      }
8415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust    }
8515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust    try {
8615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//      try {
8715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//        m_outputWriter = new PrintWriter(new OutputStreamWriter(fSocket.getOutputStream(), "UTF-8"),
8815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//                                  true);
8915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//      }
9015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//      catch(UnsupportedEncodingException e1) {
9115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//        m_outputWriter = new PrintWriter(new OutputStreamWriter(fSocket.getOutputStream()), true);
9215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//      }
9315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      result = receiveMessage(m_inReader.readLine());
94a3f78c5debcd03e7755f5ff2956a6f325e41d0b7Ryan Schmitt    } catch(IOException e) {
9515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      handleThrowable(e);
9615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust    }
9715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust
9815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust    return result;
9915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//    finally {
10015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//      shutDown();
10115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//      return null;
10215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//    }
10315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust  }
10415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust
10515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust  protected void handleThrowable(Throwable cause) {
1063eb34813b24377dd042c9e85b8a7854af34e3b81Cédric Beust    if (RemoteTestNG.isVerbose()) {
1073eb34813b24377dd042c9e85b8a7854af34e3b81Cédric Beust      cause.printStackTrace();
1083eb34813b24377dd042c9e85b8a7854af34e3b81Cédric Beust    }
10915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust  }
11015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust
11115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//  private String readMessage(BufferedReader in) throws IOException {
11215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//    return in.readLine();
11315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//  }
11415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust
11515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust  private IMessage receiveMessage(String message) {
116e13375131c0502f2553a694109d79cbf00732dfaCédric Beust    if (message == null) return null;
11715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust    IMessage result = null;
11815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust
11915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust    int messageType = MessageHelper.getMessageType(message);
12015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust
12115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//    try {
12215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      if(messageType < MessageHelper.SUITE) {
12315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust        // Generic message
12415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust        result = MessageHelper.unmarshallGenericMessage(message);
12515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      }
12615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      else if(messageType < MessageHelper.TEST) {
12715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust        // Suite message
12815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust        result = MessageHelper.createSuiteMessage(message);
12915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      }
13015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      else if(messageType < MessageHelper.TEST_RESULT) {
13115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust        // Test message
13215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust        result = MessageHelper.createTestMessage(message);
13315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      }
13415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      else {
13515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust        // TestResult message
13615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust        result = MessageHelper.unmarshallTestResultMessage(message);
13715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust      }
13815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//    }
13915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//    finally {
14015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//      if(isRunning() && (null != m_outputWriter)) {
14115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//        m_outputWriter.println(MessageHelper.ACK_MSG);
14215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//        m_outputWriter.flush();
14315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//      }
14415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust//    }
14515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust
14615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust    p("receiveMessage() received:" + result);
14715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust    return result;
14815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust  }
149ed626ea7464c25db7ea754177f36b344195da158Cédric Beust}
150