/**
* http://www.germane-software.com/software/Java/Gozirra/
*/
package org.chililog.client.stomp;
import java.io.*;
import java.util.HashMap;
import org.chililog.server.common.Log4JLogger;
/**
* (c)2005 Sean Russell
*/
@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
public class Receiver extends Thread {
private static Log4JLogger _logger = Log4JLogger.getLogger(Receiver.class);
private MessageReceiver _receiver;
private BufferedReader _input;
private InputStream _stream;
protected Receiver() {
super();
}
public Receiver(MessageReceiver m, InputStream input) {
super();
setup(m, input);
}
protected void setup(MessageReceiver m, InputStream input) {
_receiver = m;
try {
_stream = input;
_input = new BufferedReader(new InputStreamReader(input, Command.ENCODING));
} catch (UnsupportedEncodingException e) {
// No, no, no. Stupid Java.
}
}
public void run() {
// Loop reading from stream, calling receive()
try {
while (!isInterrupted()) {
// Get command
if (_input.ready()) {
String command = _input.readLine();
if (command.length() > 0) {
try {
Command c = Command.valueOf(command);
_logger.info("STOMP Receive command: %s", command);
// Get headers
HashMap headers = new HashMap();
String header;
while ((header = _input.readLine()).length() > 0) {
_logger.info("STOMP Receive header: %s", header);
int ind = header.indexOf(':');
String k = header.substring(0, ind);
String v = header.substring(ind + 1, header.length());
headers.put(k.trim(), v.trim());
}
// Read body
StringBuffer body = new StringBuffer();
int b;
while ((b = _input.read()) != 0) {
body.append((char) b);
}
_logger.info("STOMP Receive body: %s", body.toString());
try {
_receiver.receive(c, headers, body.toString());
} catch (Exception e) {
// We ignore these errors; we don't want client code
// crashing our listener.
}
} catch (Error e) {
try {
while (_input.read() != 0)
;
} catch (Exception ex) {
}
try {
_receiver.receive(Command.ERROR, null, e.getMessage() + "\n");
} catch (Exception ex) {
// We ignore these errors; we don't want client code
// crashing our listener.
}
}
}
} else {
if (_receiver.isClosed()) {
_receiver.disconnect();
return;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
interrupt();
}
}
}
} catch (IOException e) {
// What do we do with IO Exceptions? Report it to the receiver, and
// exit the thread.
System.err.println("Stomp exiting because of exception");
e.printStackTrace(System.err);
_receiver.receive(Command.ERROR, null, e.getMessage());
} catch (Exception e) {
System.err.println("Stomp exiting because of exception");
e.printStackTrace(System.err);
_receiver.receive(Command.ERROR, null, e.getMessage());
}
}
}