193
|
1 package test.sematest;
|
|
2
|
|
3 import java.io.IOException;
|
|
4 import java.net.InetSocketAddress;
|
285
|
5 import java.nio.channels.SelectionKey;
|
|
6 import java.util.LinkedList;
|
193
|
7
|
|
8 import rep.REP;
|
|
9 import rep.REPCommand;
|
|
10 import rep.REPCommandPacker;
|
|
11 import rep.channel.REPLogger;
|
285
|
12 import rep.channel.REPSelector;
|
193
|
13 import rep.channel.REPSocketChannel;
|
284
|
14 import test.Text;
|
193
|
15
|
|
16
|
|
17 public class TestEditor extends Thread{
|
284
|
18 private InetSocketAddress semaIP;
|
193
|
19 private REPLogger ns;
|
284
|
20 private boolean master;
|
|
21 private int myid ;
|
|
22 private int seq = 0;
|
|
23 public static int editorNo = 0;
|
|
24 public Text text;
|
285
|
25 public LinkedList<REPCommand> cmds;
|
286
|
26 private int eid = 0;
|
|
27 private int sid = 0;
|
285
|
28 REPSocketChannel<REPCommand> channel;
|
|
29 boolean running = true;
|
|
30 long timeout = 1;
|
284
|
31
|
|
32 static private String[] text1d = {
|
|
33 "aaa", "bbb", "ccc", "ddd", "eee",
|
|
34 };
|
193
|
35
|
284
|
36 public TestEditor(String name, String _host,int _port, boolean master){
|
193
|
37 super(name);
|
|
38 semaIP = new InetSocketAddress(_host, _port);
|
|
39 ns = REPLogger.singleton();
|
284
|
40 this.master = master;
|
|
41 myid = editorNo++;
|
286
|
42 cmds = new LinkedList<REPCommand>();
|
285
|
43 if (master) {
|
284
|
44 text = new Text(text1d);
|
285
|
45 cmds.add(new REPCommand(REP.REPCMD_INSERT,0,0,0,0,"m0"));
|
|
46 cmds.add(new REPCommand(REP.REPCMD_DELETE,0,0,0,0,"m0"));
|
|
47 cmds.add(new REPCommand(REP.SMCMD_QUIT,0,0,0,0,""));
|
|
48 } else {
|
284
|
49 text = new Text(new String[0]);
|
285
|
50 cmds.add(new REPCommand(REP.REPCMD_INSERT,0,0,0,0,"c0"));
|
|
51 cmds.add(new REPCommand(REP.REPCMD_DELETE,0,0,0,0,"c0"));
|
|
52 cmds.add(new REPCommand(REP.SMCMD_QUIT,0,0,0,0,""));
|
|
53 }
|
193
|
54 }
|
|
55
|
|
56 public void run(){
|
|
57 try {
|
|
58 channel = REPSocketChannel.<REPCommand>create(new REPCommandPacker());
|
285
|
59 } catch (IOException e) { return; }
|
193
|
60
|
285
|
61 ns.writeLog("try to connect to SessionManager whose ip is "+semaIP+" editor-"+myid, 1);
|
|
62 try {
|
193
|
63 while (!channel.connect(semaIP)){
|
|
64 ns.writeLog("SeMa not listen to socket yet, wait", 1);
|
|
65 }
|
285
|
66 } catch (IOException e) { return; }
|
|
67 ns.writeLog("successes to connect editor-"+myid, 1);
|
|
68 REPCommand command;
|
|
69 /*
|
|
70 * public REPCommand(REP cmd,int sid,int eid, int seq, int lineno, String string)
|
|
71 */
|
|
72 if (master)
|
|
73 command = new REPCommand(REP.SMCMD_PUT,0,0,seq++,0,"master-file");
|
|
74 else
|
|
75 command = new REPCommand(REP.SMCMD_JOIN,0,0,seq++,0,"editor-"+myid);
|
|
76 channel.write(command);
|
193
|
77
|
285
|
78 try {
|
|
79 mainloop();
|
193
|
80 } catch (IOException e) {
|
|
81 }
|
|
82 }
|
284
|
83
|
285
|
84 private void mainloop() throws IOException {
|
|
85
|
|
86 channel.configureBlocking(false);
|
|
87 REPSelector<REPCommand> selector = REPSelector.create();
|
|
88 channel.register(selector, SelectionKey.OP_READ);
|
|
89 while(running) {
|
|
90 if (selector.select(timeout)<=0) {
|
|
91 REPCommand cmd = cmds.poll();
|
|
92 if (cmd!=null) {
|
|
93 text.edit(cmd);
|
|
94 sendCommand(cmd);
|
|
95 } else {
|
|
96 // no more command to send
|
|
97 timeout = 0;
|
|
98 }
|
|
99 } else {
|
|
100 handle(channel.read());
|
|
101 }
|
|
102 }
|
|
103 }
|
284
|
104
|
285
|
105
|
|
106 private void sendCommand(REPCommand cmd) {
|
|
107 cmd.setSEQID(seq++);
|
|
108 cmd.setEID(eid);
|
|
109 cmd.setSID(sid);
|
|
110 ns.writeLog("editor-"+myid+" send "+cmd);
|
|
111 channel.write(cmd);
|
|
112 }
|
|
113
|
|
114 private void handle(REPCommand cmd) {
|
|
115 ns.writeLog("editor-"+myid+" read "+cmd);
|
|
116 switch(cmd.cmd) {
|
286
|
117 case REPCMD_INSERT :
|
|
118 break;
|
|
119 case REPCMD_INSERT_ACK :
|
|
120 break;
|
|
121 case REPCMD_DELETE :
|
|
122 break;
|
|
123 case REPCMD_DELETE_ACK :
|
|
124 break;
|
|
125 case REPCMD_CLOSE :
|
|
126 case REPCMD_CLOSE_2 :
|
|
127 break;
|
|
128 case REPCMD_NOP :
|
|
129 break;
|
|
130 case SMCMD_JOIN_ACK :
|
|
131 sid = cmd.sid;
|
|
132 eid = cmd.eid;
|
|
133 break;
|
|
134 case SMCMD_PUT_ACK :
|
|
135 sid = cmd.sid;
|
|
136 eid = cmd.eid;
|
|
137 break;
|
|
138 case SMCMD_QUIT :
|
|
139 case SMCMD_QUIT_ACK :
|
|
140 break;
|
|
141 case SMCMD_START_MERGE :
|
|
142 case SMCMD_START_MERGE_ACK :
|
|
143 break;
|
|
144 case SMCMD_END_MERGE :
|
|
145 break;
|
|
146 case SMCMD_QUIT_2 :
|
|
147 running = false;
|
|
148 break;
|
|
149 default:
|
|
150 assert(false);
|
|
151 break;
|
285
|
152 }
|
284
|
153 }
|
193
|
154 }
|