package com.external.stomp;
import java.io.*;
import java.util.HashMap;
/**
* (c)2005 Sean Russell
*/
public class Receiver extends Thread {
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 );
// Get headers
HashMap headers = new HashMap();
String header;
while ((header = _input.readLine()).length() > 0) {
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 );
}
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() );
}
}
}