org.jgroups.util.MyReceiver Maven / Gradle / Ivy
package org.jgroups.util;
import org.jgroups.Message;
import org.jgroups.Receiver;
import org.jgroups.View;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* Generic receiver for a JChannel
* @author Bela Ban
* @since 3.3
*/
public class MyReceiver implements Receiver, Closeable {
protected final List list=new CopyOnWriteArrayList<>();
protected String name;
protected boolean verbose;
protected boolean raw_msgs;
protected final Map state=new HashMap<>();
@Override public void receive(Message msg) {
T obj=raw_msgs? (T)msg : (T)msg.getObject();
list.add(obj);
if(verbose)
System.out.println((name() != null? name() + ":" : "") + " received message from " + msg.getSrc() + ": " + obj);
}
@Override public void viewAccepted(View new_view) {
if(verbose)
System.out.printf("-- %s: view is %s\n", name, new_view);
}
@Override
public void getState(OutputStream out) throws Exception {
DataOutputStream o=new DataOutputStream(out);
synchronized(state) {
o.writeInt(state.size());
if(!state.isEmpty()) {
for(Map.Entry e: state.entrySet()) {
o.writeUTF(e.getKey());
o.writeUTF(e.getValue());
}
}
}
}
@Override
public void setState(InputStream input) throws Exception {
DataInputStream in=new DataInputStream(input);
Map m=new HashMap<>();
int size=in.readInt();
for(int i=0; i < size; i++)
m.put(in.readUTF(), in.readUTF());
synchronized(state) {
state.clear();
state.putAll(m);
}
}
public MyReceiver rawMsgs(boolean flag) {this.raw_msgs=flag; return this;}
public List list() {return list;}
public List list(Function f) {return list.stream().map(f).collect(Collectors.toList());}
public Map state() {return state;}
public MyReceiver verbose(boolean flag) {verbose=flag; return this;}
public String name() {return name;}
public MyReceiver name(String name) {this.name=name; return this;}
public MyReceiver reset() {list.clear(); return this;}
public int size() {return list.size();}
public void close() throws IOException {reset();}
@Override
public String toString() {
return String.format("%d elements", list.size());
}
}