annotate rep/channel/NetworkSimulator.java @ 382:4b87f89b3afd

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