import java.util.*; import java.io.*;import java.net.Socket;
import java.rmi.*; import java.rmi.server.*;
//public class Process extends UnicastRemoteObject implements MsgHandler {
public class Process implements MsgHandler {
public int myId;
public int n; // number of neighbors including myself
public Properties prop;
MsgHandler app = null;// upper layer
MsgHandler comm = null;// lower layer
public LinkedList<Integer> neighbors = new LinkedList<Integer>();
// public Process(MsgHandler initComm) throws RemoteException {
public Process(MsgHandler initComm) {
comm = initComm;
if (comm!=null) {
myId = comm.getMyId();
neighbors = comm.getNeighbors();
prop = comm.getProp();
n = neighbors.size() + 1;
}
}
public void init(MsgHandler app){
this.app = app;
comm.init(this);
}
public synchronized void handleMsg(Msg m, int src, String tag) {
// System.out.println(m.toString());
}
public synchronized void executeMsg(Msg m) {
handleMsg(m, m.src, m.tag);
notifyAll();
if (app != null)
app.executeMsg(m);
}
public void sendMsg(int destId, Object ... objects) {
comm.sendMsg(destId, objects);
}
/*
public void broadcastMsg(Object... objects) {
for (int i = 0; i < n; i++)
if (i != myId)
sendMsg(i, objects);
}
*/
public void sendMsg(LinkedList<Integer> destIds, Object... objects) {
for (int i : destIds)
if (i != myId)
sendMsg(i, objects);
}
public Msg receiveMsg(int fromId) {
try {
return comm.receiveMsg(fromId);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public synchronized void myWait() {
try {wait();
} catch (InterruptedException e) {
System.err.println(e);
}
}
public int getMyId() { return myId; }
public Properties getProp() { return prop;}
public int getNumProc() { return n; }
public LinkedList<Integer> getNeighbors() { return neighbors; }
public static void println(String s) {
System.out.println(s);
}
public void close() { comm.close(); }
public void turnPassive() { comm.turnPassive(); }
}