public static SlimStreamReader getReader(Socket socket) throws IOException { return new SlimStreamReader(new BufferedInputStream(socket.getInputStream())); }
public String getSlimMessage() throws IOException { int resultLength = getLengthToRead(); return read(resultLength); }
private boolean processOneSetOfInstructions(SlimStreamReader reader, OutputStream writer, ListExecutor executor) throws IOException { String instructions = reader.getSlimMessage(); // Not sure why this is need but we keep it. if (instructions == null) return true; // We are done Bye Bye message received if (instructions.equalsIgnoreCase(SlimVersion.BYEMESSAGE)) { return false; } // Do some real work String resultString = executeInstructions(executor, instructions); SlimStreamReader.sendSlimMessage(writer, resultString); return true; }
private int getLengthToRead() throws IOException { String length = read(SlimVersion.MINIMUM_NUMBER_LENGTH); //Continue to read up to the ":" String next; while (!":".equals(next = read(1)) && !isEof() && !isTimeout()) length = length + next; if (isEof()) throw new IOException("Stream Read Failure. Can't read length of message, EOF reached. Possibly test aborted. Last things read: " + length); if (isTimeout()) throw new IOException("Stream Read Failure. Can't read length of message, Timeout reached. Possibly test aborted. Last things read: " + length); try { Integer resultLength = Integer.parseInt(length); return resultLength; } catch (NumberFormatException e) { throw new IOException("Stream Read Failure. Can't read length of message, not a number. Possibly test aborted. Last things read: " + length); } }
@Override public void serve(Socket s) throws IOException { SlimStreamReader reader = null; OutputStream writer = null; try { reader = SlimStreamReader.getReader(s); writer = SlimStreamReader.getByteWriter(s); tryProcessInstructions(reader, writer); } finally { slimFactory.stop(); FileUtil.close(reader); FileUtil.close(writer); } }
@Override public void connect() throws IOException, SlimVersionMismatch { String slimServerVersionMessage = reader.readLine(); if (!isConnected(slimServerVersionMessage)) { throw new SlimVersionMismatch("Got invalid slim header from client. Read the following: " + slimServerVersionMessage); } slimServerVersion = Double.parseDouble(slimServerVersionMessage.replace(SlimVersion.SLIM_HEADER, "")); if (slimServerVersion == SlimCommandRunningClient.NO_SLIM_SERVER_CONNECTION_FLAG) { throw new SlimVersionMismatch("Slim Protocol Version Error: Server did not respond with a valid version number."); } else if (slimServerVersion < SlimCommandRunningClient.MINIMUM_REQUIRED_SLIM_VERSION) { throw new SlimVersionMismatch(String.format("Slim Protocol Version Error: Expected V%s but was V%s", SlimCommandRunningClient.MINIMUM_REQUIRED_SLIM_VERSION, slimServerVersion)); } }
private void tryProcessInstructions(SlimStreamReader reader, OutputStream writer) throws IOException { ListExecutor executor = slimFactory.getListExecutor(); String header = SlimVersion.SLIM_HEADER + SlimVersion.VERSION + "\n"; SlimStreamReader.sendSlimHeader(writer, header); boolean more = true; while (more) more = processOneSetOfInstructions(reader, writer, executor); }
private int getLengthToRead() throws IOException { String length = read(SlimVersion.MINIMUM_NUMBER_LENGTH); //Continue to read up to the ":" String next; while (!":".equals(next = read(1)) && !isEof() && !isTimeout()) length = length + next; if (isEof()) throw new IOException("Stream Read Failure. Can't read length of message, EOF reached. Possibly test aborted. Last things read: " + length); if (isTimeout()) throw new IOException("Stream Read Failure. Can't read length of message, Timeout reached. Possibly test aborted. Last things read: " + length); try { Integer resultLength = Integer.parseInt(length); return resultLength; } catch (NumberFormatException e) { throw new IOException("Stream Read Failure. Can't read length of message, not a number. Possibly test aborted. Last things read: " + length); } }
@Override public void serve(Socket s) throws IOException { SlimStreamReader reader = null; OutputStream writer = null; try { reader = SlimStreamReader.getReader(s); writer = SlimStreamReader.getByteWriter(s); tryProcessInstructions(reader, writer); } finally { slimFactory.stop(); FileUtil.close(reader); FileUtil.close(writer); } }
@Override public void connect() throws IOException, SlimVersionMismatch { String slimServerVersionMessage = reader.readLine(); if (!isConnected(slimServerVersionMessage)) { throw new SlimVersionMismatch("Got invalid slim header from client. Read the following: " + slimServerVersionMessage); } slimServerVersion = Double.parseDouble(slimServerVersionMessage.replace(SlimVersion.SLIM_HEADER, "")); if (slimServerVersion == SlimCommandRunningClient.NO_SLIM_SERVER_CONNECTION_FLAG) { throw new SlimVersionMismatch("Slim Protocol Version Error: Server did not respond with a valid version number."); } else if (slimServerVersion < SlimCommandRunningClient.MINIMUM_REQUIRED_SLIM_VERSION) { throw new SlimVersionMismatch(String.format("Slim Protocol Version Error: Expected V%s but was V%s", SlimCommandRunningClient.MINIMUM_REQUIRED_SLIM_VERSION, slimServerVersion)); } }
private void tryProcessInstructions(SlimStreamReader reader, OutputStream writer) throws IOException { ListExecutor executor = slimFactory.getListExecutor(); String header = SlimVersion.SLIM_HEADER + SlimVersion.VERSION + "\n"; SlimStreamReader.sendSlimHeader(writer, header); boolean more = true; while (more) more = processOneSetOfInstructions(reader, writer, executor); }
private boolean processOneSetOfInstructions(SlimStreamReader reader, OutputStream writer, ListExecutor executor) throws IOException { String instructions = reader.getSlimMessage(); // Not sure why this is need but we keep it. if (instructions == null) return true; // We are done Bye Bye message received if (instructions.equalsIgnoreCase(SlimVersion.BYEMESSAGE)) { return false; } // Do some real work String resultString = executeInstructions(executor, instructions); SlimStreamReader.sendSlimMessage(writer, resultString); return true; }
reader = SlimStreamReader.getReader(client); writer = SlimStreamReader.getByteWriter(client);
public String getSlimMessage() throws IOException { int resultLength = getLengthToRead(); return read(resultLength); }
protected void validateConnection() throws IOException { long timeOut = Clock.currentTimeInMillis() + connectionTimeout * 1000; LOG.finest("Trying to get SlimHeader: " + " timeout setting: " + connectionTimeout); while (!isConnected()) { if (slimRunner != null && slimRunner.isDead()) { final String slimErrorMessage = "Error SLiM server died before Header Message could be read. " + slimRunner.getCommandErrorMessage(); throw new SlimError(slimErrorMessage); } if (Clock.currentTimeInMillis() > timeOut) { throw new SlimError( "Timeout while reading slim header from client. Check that you are connecting to the right port and that the slim client is running. You can increase the timeout limit by setting 'slim.timeout' in the fitnesse properties file."); } try { slimServerVersionMessage = reader.readLine(); } catch (SocketTimeoutException e) { throw new SlimError( "Timeout while reading slim header from client. Check that you are connecting to the right port and that the slim client is running. You can increase the timeout limit by setting 'slim.timeout' in the fitnesse properties file."); } LOG.finest("Read Slim Header: >" + slimServerVersionMessage + "<"); } try { slimServerVersion = Double.parseDouble(slimServerVersionMessage.replace(SlimVersion.SLIM_HEADER, "")); } catch (Exception e) { slimServerVersion = NO_SLIM_SERVER_CONNECTION_FLAG; throw new SlimError("Got invalid slim version from Client. Read the following: " + slimServerVersionMessage); } LOG.fine("Got Slim Header: " + slimServerVersionMessage + ", and Version " + slimServerVersion); }
public static SlimStreamReader getReader(Socket socket) throws IOException { return new SlimStreamReader(new BufferedInputStream(socket.getInputStream())); }
@Override public Map<String, Object> invokeAndGetResponse(List<Instruction> statements) throws SlimCommunicationException { if (statements.isEmpty()) return Collections.emptyMap(); String instructions = SlimSerializer.serialize(new SlimListBuilder(slimServerVersion).toList(statements)); String results; try { SlimStreamReader.sendSlimMessage(clientOutput, instructions); results = reader.getSlimMessage(); } catch (IOException e) { throw new SlimCommunicationException("Could not send/receive data with SUT", e); } List<Object> resultList = SlimDeserializer.deserialize(results); return resultToMap(resultList); }
reader = SlimStreamReader.getReader(client); writer = SlimStreamReader.getByteWriter(client);
protected void validateConnection() throws IOException { long timeOut = Clock.currentTimeInMillis() + connectionTimeout * 1000; LOG.finest("Trying to get SlimHeader: " + " timeout setting: " + connectionTimeout); while (!isConnected()) { if (slimRunner != null && slimRunner.isDead()) { final String slimErrorMessage = "Error SLiM server died before Header Message could be read. " + slimRunner.getCommandErrorMessage(); throw new SlimError(slimErrorMessage); } if (Clock.currentTimeInMillis() > timeOut) { throw new SlimError( "Timeout while reading slim header from client. Check that you are connecting to the right port and that the slim client is running. You can increase the timeout limit by setting 'slim.timeout' in the fitnesse properties file."); } try { slimServerVersionMessage = reader.readLine(); } catch (SocketTimeoutException e) { throw new SlimError( "Timeout while reading slim header from client. Check that you are connecting to the right port and that the slim client is running. You can increase the timeout limit by setting 'slim.timeout' in the fitnesse properties file."); } LOG.finest("Read Slim Header: >" + slimServerVersionMessage + "<"); } try { slimServerVersion = Double.parseDouble(slimServerVersionMessage.replace(SlimVersion.SLIM_HEADER, "")); } catch (Exception e) { slimServerVersion = NO_SLIM_SERVER_CONNECTION_FLAG; throw new SlimError("Got invalid slim version from Client. Read the following: " + slimServerVersionMessage); } LOG.fine("Got Slim Header: " + slimServerVersionMessage + ", and Version " + slimServerVersion); }
@Override public void start() throws IOException, SlimVersionMismatch { commandStarted(); PipedInputStream socketInput = new PipedInputStream(); clientOutput = new PipedOutputStream(socketInput); PipedInputStream clientInput = new PipedInputStream(); PipedOutputStream socketOutput = new PipedOutputStream(clientInput); reader = new SlimStreamReader(clientInput); socket = new MockSocket(socketInput, socketOutput); // Start SlimServer in a separate thread slimServerThread = new Thread(new Runnable() { @Override public void run() { try { slimServer.serve(socket); executionLogListener.exitCode(0); } catch (Throwable t) { // NOSONAR // This point is not reached since no errors bubble up this far executionLogListener.exceptionOccurred(t); } } }); slimServerThread.setContextClassLoader(classLoader); slimServerThread.start(); connect(); }