Mercurial > hg > RemoteEditor > REPSessionManager
comparison rep/Session.java @ 411:795ef563f2a0
add commnets
author | one |
---|---|
date | Wed, 26 Nov 2008 09:41:14 +0900 |
parents | 1d5b608f39da |
children | 7420dea70dd7 |
comparison
equal
deleted
inserted
replaced
410:2724cf17e9f3 | 411:795ef563f2a0 |
---|---|
8 import rep.handler.REPNode; | 8 import rep.handler.REPNode; |
9 import rep.handler.Forwarder; | 9 import rep.handler.Forwarder; |
10 | 10 |
11 public class Session extends HashMap<Integer,REPNode> { | 11 public class Session extends HashMap<Integer,REPNode> { |
12 /** | 12 /** |
13 * | 13 * Editor Session |
14 * contains interacting editors | |
15 * accessed by eid. There is one masterEditor which | |
16 * has a file name (is a sessionName). | |
17 * | |
18 * maintain connection among handlers (Dispatcher, | |
19 * Forwarder, Editor). | |
20 * first->editor->editor...->last | |
21 * first may equal to the last. When a session is | |
22 * created, first equals the last. | |
14 */ | 23 */ |
15 private static final long serialVersionUID = 1L; | 24 private static final long serialVersionUID = 1L; |
16 private REPNode masterEditor; | 25 private REPNode masterEditor; |
17 private int sessionID; | 26 private int sessionID; |
18 private String sessionName; | 27 private String sessionName; |
19 // isOnwer means this session has active channels(forwarders). | 28 // isOnwer means this session is owner of an active channels(forwarders). |
20 private boolean isOwner = false; | 29 private boolean isOwner = false; |
21 private REPNode first; | 30 private REPNode first; |
22 private REPNode last; | 31 private REPNode last; |
23 | 32 |
24 public Session(int sid, String name, REPNode editor) { | 33 public Session(int sid, String name, REPNode editor) { |
33 // we have a master | 42 // we have a master |
34 masterEditor = last = master; | 43 masterEditor = last = master; |
35 master.setSID(sid); | 44 master.setSID(sid); |
36 put(master.eid,master); | 45 put(master.eid,master); |
37 if(master.channel!=null) { | 46 if(master.channel!=null) { |
47 // master is a real connected editor | |
38 first = master; | 48 first = master; |
39 masterEditor.setNext(masterEditor); | 49 masterEditor.setNext(masterEditor); |
40 isOwner = true; | 50 isOwner = true; |
41 } | 51 } |
42 } | 52 } |
58 // printSessionDetail(); | 68 // printSessionDetail(); |
59 } | 69 } |
60 | 70 |
61 public void addEditor(Editor editor) { | 71 public void addEditor(Editor editor) { |
62 // add a not-connected editor in a sassion | 72 // add a not-connected editor in a sassion |
63 // the editor is outside of this manager | 73 // the editor is in the outside of this manager |
64 editor.setSID(sessionID); | 74 editor.setSID(sessionID); |
65 put(editor.eid,editor); | 75 put(editor.eid,editor); |
66 } | 76 } |
67 | 77 |
68 public Collection<REPNode> getEditorList() { | 78 public Collection<REPNode> getEditorList() { |
77 } | 87 } |
78 public String getName() { | 88 public String getName() { |
79 return sessionName; | 89 return sessionName; |
80 } | 90 } |
81 | 91 |
82 | 92 /* |
93 * Remove and disconnect a forwarder from the session | |
94 */ | |
83 public boolean deleteEditor(REPSocketChannel<REPCommand> channel) { | 95 public boolean deleteEditor(REPSocketChannel<REPCommand> channel) { |
96 // this is fanatic, one channel may have multiple sessions, but | |
97 // a session should have only one channel that is one editor. | |
98 // REPNode e = getEditor(channel); | |
99 // if (e!=null) { unconnect((Forwarder)e); remove(e); } is Ok. | |
84 LinkedList<REPNode> toBeRemoved = new LinkedList<REPNode>(); | 100 LinkedList<REPNode> toBeRemoved = new LinkedList<REPNode>(); |
85 for (REPNode e:values() ) { | 101 for (REPNode e:values() ) { |
86 if (e.getChannel()==channel) { | 102 if (e.getChannel()==channel) { |
87 unconnect((Forwarder)e); | 103 unconnect((Forwarder)e); |
104 // we cannot directly remove this because of the concurrent access | |
88 toBeRemoved.add(e); | 105 toBeRemoved.add(e); |
89 } | 106 } |
90 } | 107 } |
91 for(REPNode e:toBeRemoved) { | 108 for(REPNode e:toBeRemoved) { |
92 remove(e); | 109 remove(e); |
97 public boolean deleteForwarder(Forwarder editor) { | 114 public boolean deleteForwarder(Forwarder editor) { |
98 unconnect(editor); | 115 unconnect(editor); |
99 return remove(editor)!=null; | 116 return remove(editor)!=null; |
100 } | 117 } |
101 | 118 |
119 /* | |
120 * Clear connection of a forwarder. The rest of the forwarders in this | |
121 * session have to be connected properly. | |
122 */ | |
102 private void unconnect(Forwarder e) { | 123 private void unconnect(Forwarder e) { |
103 boolean hasOwner = false; | 124 boolean hasOwner = false; |
104 for(REPNode e1:values()) { | 125 for(REPNode e1:values()) { |
105 Forwarder f = (Forwarder)e1; | 126 Forwarder f = (Forwarder)e1; |
106 if(f.next==e) { | 127 if(f.next==e) { |
132 return null; | 153 return null; |
133 } | 154 } |
134 | 155 |
135 | 156 |
136 | 157 |
158 /** | |
159 * Start closing protocol | |
160 * not yet implemented. Use quit instead. | |
161 */ | |
137 public void closeSession() { | 162 public void closeSession() { |
138 REPNode f = first; | 163 REPNode f = first; |
139 if (f!=null) { | 164 if (f!=null) { |
140 REPCommand command = new REPCommand(REP.REPCMD_CLOSE, sessionID, REP.SM_EID.id, 0, 0, ""); | 165 REPCommand command = new REPCommand(REP.REPCMD_CLOSE, sessionID, REP.SM_EID.id, 0, 0, ""); |
141 f.send(command); | 166 f.send(command); |
148 ServerMainLoop.logger.writeLog("getFirstForwarder="+f.next+"=>"+f.next.channel); | 173 ServerMainLoop.logger.writeLog("getFirstForwarder="+f.next+"=>"+f.next.channel); |
149 return f.next; | 174 return f.next; |
150 } | 175 } |
151 | 176 |
152 | 177 |
178 /** | |
179 * @param manager | |
180 * | |
181 * remove all editors in this session from our manager. | |
182 */ | |
153 public void remove(SessionManager manager) { | 183 public void remove(SessionManager manager) { |
154 for(REPNode editor : values()){ | 184 for(REPNode editor : values()){ |
155 if(editor.getChannel() !=null) | 185 if(editor.getChannel() !=null) |
156 unconnect((Forwarder)editor); | 186 unconnect((Forwarder)editor); |
157 manager.editorList.remove(editor); | 187 manager.editorList.remove(editor); |
158 } | 188 } |
159 } | 189 } |
160 | 190 |
161 | 191 |
192 /** | |
193 * @param s | |
194 * | |
195 * Merge editors from UPDATED session. Only dummy editors | |
196 * outside of this manager to be add. | |
197 */ | |
162 public void merge(Session s) { | 198 public void merge(Session s) { |
163 for(REPNode editor : s.values()){ | 199 for(REPNode editor : s.values()){ |
164 REPNode mine = get(editor.eid); | 200 REPNode mine = get(editor.eid); |
165 if (mine==null) { | 201 if (mine==null) { |
166 put(editor.eid,editor); | 202 put(editor.eid,editor); |
167 } else { | 203 } else { |
204 // update editor status | |
168 mine.merge(editor); | 205 mine.merge(editor); |
169 } | 206 } |
170 } | 207 } |
171 } | 208 } |
172 | 209 |