All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fitnesse.slim.SlimStreamReader Maven / Gradle / Ivy

The newest version!
package fitnesse.slim;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import util.FileUtil;
import util.StreamReader;

public class SlimStreamReader extends StreamReader {

  public SlimStreamReader(InputStream input) {
    super(input);
  }

  public static void sendSlimMessage(OutputStream writer, String message) throws IOException {
    byte[] msgChars = message.getBytes(FileUtil.CHARENCODING);
    byte[] msgLength = String.format(SlimVersion.LENGTH_FORMAT, msgChars.length).getBytes(FileUtil.CHARENCODING);
    writer.write(msgLength, 0, msgLength.length);
    writer.write(msgChars, 0, msgChars.length);
    writer.flush();
  }

  public static void sendSlimHeader(OutputStream writer, String header) throws IOException {
    // The Header has no length information as prefix
    byte[] msgChars = header.getBytes(FileUtil.CHARENCODING);
    writer.write(msgChars, 0, msgChars.length);
    writer.flush();
  }

  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);
    }
  }

  public String getSlimMessage() throws IOException {
    int resultLength = getLengthToRead();
    return read(resultLength);
  }

  public static SlimStreamReader getReader(Socket socket) throws IOException {
    return new SlimStreamReader(new BufferedInputStream(socket.getInputStream()));
  }

  public static OutputStream getByteWriter(Socket socket) throws IOException {
    return new BufferedOutputStream(socket.getOutputStream());
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy