1212import java .util .ArrayDeque ;
1313import java .util .Arrays ;
1414import java .util .Collection ;
15- import java .util .Collections ;
1615import java .util .Date ;
1716import java .util .HashMap ;
1817import java .util .Iterator ;
1918import java .util .Map ;
2019import java .util .Queue ;
20+ import java .util .concurrent .ConcurrentHashMap ;
2121
2222import javax .servlet .ServletException ;
2323import javax .servlet .http .HttpServletRequest ;
3939public class smalltalk extends AbstractApplication implements HttpSessionListener {
4040
4141 private static final long TIMEOUT = 1000 ;
42- private final Map <String , Map <String , Queue <Builder >>> groups = Collections . synchronizedMap ( new HashMap <String , Map <String , Queue <Builder >>>() );
42+ private final Map <String , Map <String , Queue <Builder >>> groups = new ConcurrentHashMap <String , Map <String , Queue <Builder >>>();
4343
4444 @ Override
4545 public void init () {
@@ -60,32 +60,32 @@ public void init() {
6060
6161 public smalltalk index () {
6262 final HttpServletRequest request = (HttpServletRequest ) this .context .getAttribute ("HTTP_REQUEST" );
63- Object meeting_code = request .getSession ().getAttribute ("meeting_code" );
63+ Object meetingCode = request .getSession ().getAttribute ("meeting_code" );
6464
65- if ( meeting_code == null ) {
66- meeting_code = java .util .UUID .randomUUID ().toString ();
67- request .getSession ().setAttribute ("meeting_code" , meeting_code );
65+ if ( meetingCode == null ) {
66+ meetingCode = java .util .UUID .randomUUID ().toString ();
67+ request .getSession ().setAttribute ("meeting_code" , meetingCode );
6868
69- System .out .println ("New meeting generated:" + meeting_code );
69+ System .out .println ("New meeting generated:" + meetingCode );
7070 }
7171
7272 Map <String , Queue <Builder >> sessions ;
7373 synchronized (this .groups ) {
74- if ((sessions = this .groups .get (meeting_code )) == null ) {
75- this .groups .put (meeting_code .toString (), sessions = new HashMap <String , Queue <Builder >>());
74+ if ((sessions = this .groups .get (meetingCode )) == null ) {
75+ this .groups .put (meetingCode .toString (), sessions = new HashMap <String , Queue <Builder >>());
7676 }
7777
7878 final String sessionId = request .getSession ().getId ();
7979 if (sessions .get (sessionId ) == null ) {
8080 sessions .put (sessionId , new ArrayDeque <Builder >());
8181 }
82-
82+
8383 this .groups .notifyAll ();
8484 }
8585
86- this .setVariable ("meeting_code" , meeting_code .toString ());
86+ this .setVariable ("meeting_code" , meetingCode .toString ());
8787 Variable <?> topic ;
88- if ((topic = this .getVariable (meeting_code .toString ())) != null ) {
88+ if ((topic = this .getVariable (meetingCode .toString ())) != null ) {
8989 this .setVariable ("topic" , topic .getValue ().toString ().replaceAll ("[\r \n ]" , "<br />" ), true );
9090 }
9191
@@ -103,13 +103,13 @@ public String matrix() throws ApplicationException {
103103 return "" ;
104104 }
105105
106- public String join (String meeting_code ) throws ApplicationException {
107- if (groups .containsKey (meeting_code )) {
106+ public String join (String meetingCode ) throws ApplicationException {
107+ if (groups .containsKey (meetingCode )) {
108108 final HttpServletRequest request = (HttpServletRequest ) this .context .getAttribute ("HTTP_REQUEST" );
109109 final HttpServletResponse response = (HttpServletResponse ) this .context .getAttribute ("HTTP_RESPONSE" );
110- request .getSession ().setAttribute ("meeting_code" , meeting_code );
110+ request .getSession ().setAttribute ("meeting_code" , meetingCode );
111111
112- this .setVariable ("meeting_code" , meeting_code );
112+ this .setVariable ("meeting_code" , meetingCode );
113113
114114 Reforward reforward = new Reforward (request , response );
115115 reforward .setDefault ("/?q=talk" );
@@ -126,54 +126,50 @@ public String start(String name) throws ApplicationException {
126126 final HttpServletRequest request = (HttpServletRequest ) this .context .getAttribute ("HTTP_REQUEST" );
127127 final HttpServletResponse response = (HttpServletResponse ) this .context .getAttribute ("HTTP_RESPONSE" );
128128
129- Object meeting_code = request .getSession ().getAttribute ("meeting_code" );
130- if (meeting_code == null ) {
129+ Object meetingCode = request .getSession ().getAttribute ("meeting_code" );
130+ if (meetingCode == null ) {
131131 Reforward reforward = new Reforward (request , response );
132132 reforward .setDefault ("/?q=talk" );
133133 reforward .forward ();
134134 } else {
135- this .setVariable ("meeting_code" , meeting_code .toString ());
135+ this .setVariable ("meeting_code" , meetingCode .toString ());
136136 }
137137 request .getSession ().setAttribute ("user" , name );
138138
139139 return name ;
140140 }
141141
142- public String update () throws ApplicationException , IOException {
142+ public String command () {
143143 final HttpServletRequest request = (HttpServletRequest ) this .context .getAttribute ("HTTP_REQUEST" );
144- final Object meeting_code = request .getSession ().getAttribute ("meeting_code" );
145- final String sessionId = request .getSession ().getId ();
146- if ( meeting_code != null ) {
147- return update (sessionId , meeting_code );
148- }
149- return "" ;
150- }
144+ final HttpServletResponse response = (HttpServletResponse ) this .context .getAttribute ("HTTP_RESPONSE" );
145+ response .setContentType ("application/json" );
151146
152- public String update ( final String sessionId , final Object meeting_code ) throws ApplicationException , IOException {
153- Builder message ;
147+ final Object meetingCode = request . getSession (). getAttribute ( " meeting_code" );
148+ final String sessionId = request . getSession (). getId () ;
154149
155- Map <String , Queue <Builder >> sessions ;
156- synchronized (this .groups ) {
157- sessions = this .groups .get (meeting_code );
150+ if ( meetingCode != null ) {
151+ if (request .getSession ().getAttribute ("user" ) == null ) {
152+ return "{ \" error\" : \" missing user\" }" ;
153+ }
158154
159- do {
160- try {
161- this .groups .wait (TIMEOUT );
162- } catch (InterruptedException e ) {
163- throw new ApplicationException (e .getMessage (), e );
164- }
165- } while (sessions == null || sessions .get (sessionId ) == null || (message = sessions .get (sessionId ).poll ()) == null );
155+ Builder builder = new Builder ();
156+ builder .put ("user" , request .getSession ().getAttribute ("user" ));
157+ builder .put ("cmd" , request .getParameter ("cmd" ));
166158
167- return message . toString ( );
159+ return this . save ( sessionId , meetingCode , builder );
168160 }
161+
162+ return "{ \" error\" : \" expired\" }" ;
169163 }
170164
171165 public String save () {
172166 final HttpServletRequest request = (HttpServletRequest ) this .context .getAttribute ("HTTP_REQUEST" );
173- final Object meeting_code = request . getSession (). getAttribute ("meeting_code " );
174- String message ;
167+ final HttpServletResponse response = ( HttpServletResponse ) this . context . getAttribute ("HTTP_RESPONSE " );
168+ response . setContentType ( "application/json" ) ;
175169
176- if ( meeting_code != null ) {
170+ final Object meetingCode = request .getSession ().getAttribute ("meeting_code" );
171+ if ( meetingCode != null ) {
172+ String message ;
177173 if ((message = request .getParameter ("text" )) != null && !message .isEmpty ()) {
178174 String [] agent = request .getHeader ("User-Agent" ).split (" " );
179175 this .setVariable ("browser" , agent [agent .length - 1 ]);
@@ -187,55 +183,65 @@ public String save() {
187183 builder .put ("message" , filter (message ));
188184 builder .put ("sessionId" , sessionId );
189185
190- return this .save (sessionId , meeting_code , builder );
186+ return this .save (sessionId , meetingCode , builder );
191187 }
192188 }
193189
194190 return "{}" ;
195191 }
196192
197- public String save (final String sessionId , final Object meeting_code , final Builder builder ) {
193+ public String update () throws ApplicationException , IOException {
194+ final HttpServletRequest request = (HttpServletRequest ) this .context .getAttribute ("HTTP_REQUEST" );
195+ final Object meetingCode = request .getSession ().getAttribute ("meeting_code" );
196+ final String sessionId = request .getSession ().getId ();
197+ if ( meetingCode != null ) {
198+ return update (sessionId , meetingCode );
199+ }
200+ return "" ;
201+ }
202+
203+ public String save (final String sessionId , final Object meetingCode , final Builder builder ) {
198204 Map <String , Queue <Builder >> sessions ;
199205 synchronized (this .groups ) {
200- if ((sessions = this .groups .get (meeting_code )) == null ) {
201- this .groups .put (meeting_code .toString (), sessions = new HashMap <String , Queue <Builder >>());
202- }
203-
204- if (sessions .get (sessionId ) == null ) {
205- sessions .put (sessionId , new ArrayDeque <Builder >());
206+ if ((sessions = this .groups .get (meetingCode )) == null ) {
207+ this .groups .put (meetingCode .toString (), sessions = new HashMap <String , Queue <Builder >>());
206208 }
207209
208210 final Collection <Queue <Builder >> set = sessions .values ();
209211 final Iterator <Queue <Builder >> iterator = set .iterator ();
210- while (iterator .hasNext ()) {
212+ while (true ) {
213+ if (!iterator .hasNext ()) break ;
211214 iterator .next ().add (builder );
212215 this .groups .notifyAll ();
213216 }
214217
218+ if (sessions .get (sessionId ) == null ) {
219+ sessions .put (sessionId , new ArrayDeque <Builder >());
220+ sessions .get (sessionId ).add (builder );
221+ this .groups .notifyAll ();
222+ }
223+
215224 return builder .toString ();
216225 }
217226 }
218227
219- public String command () {
220- final HttpServletRequest request = (HttpServletRequest ) this .context .getAttribute ("HTTP_REQUEST" );
221- final HttpServletResponse response = (HttpServletResponse ) this .context .getAttribute ("HTTP_RESPONSE" );
222- final Object meeting_code = request .getSession ().getAttribute ("meeting_code" );
223- final String sessionId = request .getSession ().getId ();
228+ public String update (final String sessionId , final Object meetingCode ) throws ApplicationException , IOException {
229+ Builder message ;
224230
225- if ( meeting_code != null ) {
226- response .setContentType ("application/json" );
227- if (request .getSession ().getAttribute ("user" ) == null ) {
228- return "{ \" error\" : \" missing user\" }" ;
229- }
231+ Map <String , Queue <Builder >> sessions ;
232+ synchronized (this .groups ) {
233+ sessions = this .groups .get (meetingCode );
230234
231- Builder builder = new Builder ();
232- builder .put ("user" , request .getSession ().getAttribute ("user" ));
233- builder .put ("cmd" , request .getParameter ("cmd" ));
235+ do {
236+ try {
237+ this .groups .wait (TIMEOUT );
238+ } catch (InterruptedException e ) {
239+ throw new ApplicationException (e .getMessage (), e );
240+ }
241+ } while (sessions == null || sessions .get (sessionId ) == null || (message = sessions .get (sessionId ).poll ()) == null );
234242
235- return this . save ( sessionId , meeting_code , builder );
243+ return message . toString ( );
236244 }
237-
238- return "{ \" error\" : \" expired\" }" ;
239245 }
240246
241247 public String upload () throws ApplicationException {
@@ -316,18 +322,18 @@ public String version() {
316322
317323 @ Override
318324 public void sessionCreated (HttpSessionEvent arg0 ) {
319- Object meeting_code = arg0 .getSession ().getAttribute ("meeting_code" );
320- if ( meeting_code == null ) {
321- meeting_code = java .util .UUID .randomUUID ().toString ();
322- arg0 .getSession ().setAttribute ("meeting_code" , meeting_code );
325+ Object meetingCode = arg0 .getSession ().getAttribute ("meeting_code" );
326+ if ( meetingCode == null ) {
327+ meetingCode = java .util .UUID .randomUUID ().toString ();
328+ arg0 .getSession ().setAttribute ("meeting_code" , meetingCode );
323329
324- System .out .println ("New meeting generated by HttpSessionListener:" + meeting_code );
330+ System .out .println ("New meeting generated by HttpSessionListener:" + meetingCode );
325331 }
326332
327333 Map <String , Queue <Builder >> sessions ;
328334 synchronized (groups ) {
329- if ((sessions = groups .get (meeting_code )) == null ) {
330- groups .put (meeting_code .toString (), sessions = new HashMap <String , Queue <Builder >>());
335+ if ((sessions = groups .get (meetingCode )) == null ) {
336+ groups .put (meetingCode .toString (), sessions = new HashMap <String , Queue <Builder >>());
331337 }
332338
333339 final String sessionId = arg0 .getSession ().getId ();
@@ -341,12 +347,12 @@ public void sessionCreated(HttpSessionEvent arg0) {
341347
342348 @ Override
343349 public void sessionDestroyed (HttpSessionEvent arg0 ) {
344- Object meeting_code = arg0 .getSession ().getAttribute ("meeting_code" );
350+ Object meetingCode = arg0 .getSession ().getAttribute ("meeting_code" );
345351 String sessionId = arg0 .getSession ().getId ();
346- if ( meeting_code != null ) {
352+ if ( meetingCode != null ) {
347353 Map <String , Queue <Builder >> sessions ;
348354 synchronized (groups ) {
349- if ((sessions = groups .get (meeting_code )) != null ) {
355+ if ((sessions = groups .get (meetingCode )) != null ) {
350356 sessions .remove (sessionId );
351357 groups .notifyAll ();
352358 }
0 commit comments