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