annotate src/rep/channel/NetworkSimulator.java @ 205:540d7a8a9e33

add sessionmanager's file
author one
date Sat, 18 Dec 2010 17:35:25 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
205
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
1 package rep.channel;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
2
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
3 import java.net.InetSocketAddress;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
4 import java.net.SocketAddress;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
5 import java.util.HashMap;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
6 import java.util.LinkedList;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
7
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
8 public class NetworkSimulator {
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
9 // we don't use <P> because we need singleton.
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
10 public static NetworkSimulator ns = new NetworkSimulator();
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
11
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
12 public HashMap<SocketAddress,Integer>namedb = new HashMap<SocketAddress,Integer>();
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
13 public int ipcount = 1;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
14 public REPLogger logger;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
15
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
16 public static NetworkSimulator singleton() {
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
17 // singleton pattern may used here, but it has a little cost.
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
18 return ns;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
19 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
20
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
21 int logLevel=5;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
22 /** Listening Servers. */
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
23 private LinkedList<ServerData> serverList;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
24
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
25 /** Constructor. */
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
26 public NetworkSimulator(){
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
27 serverList = new LinkedList<ServerData>();
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
28 logger = REPLogger.singleton();
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
29 logger.writeLog("construct Networksimulator", 1);
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
30 // printAllState();
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
31 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
32
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
33 /* */
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
34 synchronized public void listen(InetSocketAddress ip, ServerChannelSimulator<?> scs) {
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
35 serverList.add(new ServerData(ip, scs));
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
36 logger.writeLog("listen", 1);
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
37 printAllState();
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
38 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
39
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
40 synchronized public boolean connect(InetSocketAddress ip, ChannelSimulator<?> CHclient) {
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
41 logger.writeLog("connecting..", 1);
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
42 for (ServerData sd0: serverList){
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
43 // ANY address (0.0.0.0/0.0.0.0) should be considered.
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
44 if (sd0.IP.getAddress().isAnyLocalAddress()) {
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
45 if (sd0.IP.getPort() != ip.getPort()) continue;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
46 // we have to check, ip is really reachable to sd0 server,
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
47 // but this simulator has no notion of host. To distinguish,
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
48 // use different port address.
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
49 } else if (!sd0.IP.equals(ip)) continue;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
50
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
51 //ChannelSimulator<?> CHserver = new ChannelSimulator<?>();
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
52 ChannelSimulator<?> CHserver = CHclient.newChannel();
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
53 CHserver.setOtherEnd1(CHclient);
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
54 CHclient.setOtherEnd1(CHserver);
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
55
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
56 sd0.connectedListS.add(CHserver);
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
57 sd0.connectedListC.add(CHclient);
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
58 sd0.scs.enQ(CHserver);
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
59 logger.writeLog("connected", 1);
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
60 //printAllState();
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
61 return true;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
62 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
63 return false;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
64 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
65
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
66 /** for DEBUG methods. */
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
67 void printAllState(){
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
68 String log = "NetworkSimulator State:";
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
69 for (ServerData sd: serverList){
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
70 log += "\tSessionManager(ip="+sd.IP.toString()+"): ";
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
71 log += channelList(sd.connectedListC);
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
72 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
73 logger.writeLog(log);
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
74 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
75
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
76 private String channelList(LinkedList<ChannelSimulator<?>> list){
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
77 String tmp = "";
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
78 for (ChannelSimulator<?> ch: list){
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
79 tmp += ch.toString()+" ";
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
80 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
81 return "\t"+tmp;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
82 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
83
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
84
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
85
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
86 public synchronized int nslookup(SocketAddress semaIP) {
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
87 Integer ip;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
88 if ((ip=namedb.get(semaIP))==null) {
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
89 namedb.put(semaIP, (ip=ipcount++));
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
90 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
91 return ip;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
92 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
93
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
94
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
95 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
96
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
97 class ServerData {
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
98 //int virtualIP;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
99 InetSocketAddress IP;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
100 //SelectorSimulator<P> selector;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
101 ServerChannelSimulator<?> scs;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
102 LinkedList<ChannelSimulator<?>> connectedListS;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
103 LinkedList<ChannelSimulator<?>> connectedListC;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
104
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
105 ServerData(InetSocketAddress ip, ServerChannelSimulator<?> _scs){
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
106 IP = ip;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
107 //selector = _selector;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
108 scs = _scs;
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
109 connectedListS = new LinkedList<ChannelSimulator<?>>();
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
110 connectedListC = new LinkedList<ChannelSimulator<?>>();
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
111 }
540d7a8a9e33 add sessionmanager's file
one
parents:
diff changeset
112 }