package org.jgroups.tests;
import org.jgroups.Address;
import org.jgroups.Message;
import org.jgroups.Version;
import org.jgroups.util.Util;
import java.io.*;
import java.util.LinkedList;
import java.util.List;
/**
* Parses messages out of a captured file and writes them to stdout
* @author Bela Ban
*/
public class ParseMessages {
InputStream input=null;
private static final byte LIST=1; // we have a list of messages rather than a single message when set
private static final byte MULTICAST=2; // message is a multicast (versus a unicast) message when set
public ParseMessages(String input) throws FileNotFoundException {
this.input=new FileInputStream(input);
}
public void parse() {
short version;
byte flags;
DataInputStream dis=null;
try {
dis=new DataInputStream(input);
for(;;) {
try {
version=dis.readShort();
}
catch(IOException io_ex) {
break;
}
// int ch1 = input.read();
// int ch2 = input.read();
// if ((ch1 | ch2) < 0)
// throw new EOFException();
// version=(short)((ch1 << 8) + (ch2 << 0));
System.out.println("version = " + version + " (" + Version.print(version) + ")");
flags=dis.readByte();
System.out.println("flags: " + Message.flagsToString(flags));
boolean is_message_list=(flags & LIST) == LIST;
boolean multicast=(flags & MULTICAST) == MULTICAST;
if(is_message_list) { // used if message bundling is enabled
List<Message> msgs=readMessageList(dis);
System.out.println(msgs.size() + " msgs: ");
int cnt=1;
for(Message msg: msgs) {
System.out.print("#" + cnt++ + ": ");
print(msg, multicast);
}
}
else {
Message msg=readMessage(dis);
print(msg, multicast);
}
}
}
catch(Throwable t) {
t.printStackTrace();
}
finally {
Util.close(dis);
}
}
private static void print(Message msg, boolean multicast) {
System.out.println(msg + ", hdrs: " + msg.printHeaders() + ", mcast: " + multicast);
}
private static List<Message> readMessageList(DataInputStream in) throws Exception {
List<Message> list=new LinkedList<Message>();
Address dest=Util.readAddress(in);
Address src=Util.readAddress(in);
while(in.readBoolean()) {
Message msg=new Message(false);
msg.readFrom(in);
msg.setDest(dest);
if(msg.getSrc() == null)
msg.setSrc(src);
list.add(msg);
}
return list;
}
protected static Message readMessage(DataInputStream instream) throws Exception {
Message msg=new Message(false); // don't create headers, readFrom() will do this
msg.readFrom(instream);
return msg;
}
public static void main(String[] args) throws FileNotFoundException {
String file=null;
for(int i=0; i < args.length; i++) {
if(args[i].equals("-file")) {
file=args[++i];
continue;
}
help();
return;
}
new ParseMessages(file).parse();
}
static private void help() {
System.out.println("ParseMessages [-file <filename>]");
}
}