Mercurial > hg > RemoteEditor > REPSessionManager
diff rep/channel/NetworkSimulator.java @ 123:5b1a0574b406 add-simulator
*** empty log message ***
author | pin |
---|---|
date | Wed, 27 Aug 2008 17:21:25 +0900 |
parents | |
children | 785a3e8ea858 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rep/channel/NetworkSimulator.java Wed Aug 27 17:21:25 2008 +0900 @@ -0,0 +1,126 @@ +package rep.channel; + +import java.util.LinkedList; + + +public class NetworkSimulator<P> { + public static NetworkSimulator<?> ns; + synchronized public static <T> NetworkSimulator<T> singleton(){ + if (ns==null) + ns = new NetworkSimulator<T>(); + return (NetworkSimulator<T>) ns; + // NetworkSimulator<Obj> ns = NetworkSimulator.singleton(new NetworkSimulator<Obj>()); + } + + int logLevel=5; + /** Listening Servers. */ + private LinkedList<ServerData<P>> serverList; + + /** Constructor. */ + public NetworkSimulator(){ + serverList = new LinkedList<ServerData<P>>(); + writeLog("construct Networksimulator", 1); + printAllState(); + } + + + + /* */ + synchronized public void listen(int ip, SelectorSimulator<P> selector) { + serverList.add(new ServerData<P>(ip, selector)); + writeLog(Thread.currentThread(), "listen", 1); + printAllState(); + } + + synchronized public ChannelSimulator<P> accept(int ip) { + for (ServerData<P> sd: serverList){ + if (sd.virtualIP!=ip) continue; + writeLog(Thread.currentThread(), "accepting..", 1); + + ChannelSimulator<P> serverCH = sd.acceptWaitingList.remove(); + sd.establishedList.add(serverCH); + + writeLog(Thread.currentThread(), "accepted", 1); + printAllState(); + return serverCH; + } + return null; + } + synchronized public boolean canAccept(int ip){ + for (ServerData<P> sd: serverList){ + if (sd.virtualIP!=ip) continue; + return !sd.acceptWaitingList.isEmpty(); + } + return false; + } + + public boolean connect(int ip, ChannelSimulator<P> clientCH) { + ServerData<P> sd = null; + writeLog(Thread.currentThread(), "connecting..", 1); + synchronized (this){ + for (ServerData<P> sd0: serverList){ + if (sd0.virtualIP!=ip) continue; + + sd = sd0; + } + if (sd==null) return false; + + //ChannelSimulator<P> channel = new ChannelSimulator<P>(sd.selector); + clientCH.createReadQ(); + clientCH.createWriteQ(); + clientCH.setWriteSelector(sd.selector); + + ChannelSimulator<P> serverCH = clientCH.createConjugatedChannel(); + sd.acceptWaitingList.add(serverCH); + } + + synchronized (sd.selector) { + sd.selector.notifyAll(); + } + writeLog(Thread.currentThread(), "connected", 1); + printAllState(); + return true; + } + + /** for DEBUG methods. */ + synchronized void printAllState(){ + writeLog("NetworkSimulator State:"); + for (ServerData<P> sd: serverList){ + writeLog("\tSessionManager(ip="+sd.virtualIP+"): "); + writeLog("\tacceptWaitingList="+sd.acceptWaitingList.size()); + writeLog("\testablishedList="+sd.establishedList.size()); + } + } + + /** simulation log command */ + synchronized public void writeLog(String log, int level){ + if ( level<=logLevel ) + System.out.println(log); + System.out.flush(); + } + public void writeLog(String log){ + writeLog(log, 0); + } + public void writeLog(Thread thr, String log, int level){ + writeLog(thr.getName()+": "+log, level); + } + public void setLogLevel(int logLevel) { + this.logLevel = logLevel; + } + + +} + +class ServerData<P> { + int virtualIP; + SelectorSimulator<P> selector; + LinkedList<ChannelSimulator<P>> acceptWaitingList; + LinkedList<ChannelSimulator<P>> establishedList; + + ServerData(int ip, SelectorSimulator<P> _selector){ + virtualIP = ip; + selector = _selector; + acceptWaitingList = new LinkedList<ChannelSimulator<P>>(); + establishedList = new LinkedList<ChannelSimulator<P>>(); + } +} \ No newline at end of file