Skip to content

Commit 2ba03be

Browse files
committed
Update smalltalk.java
1 parent 8d3203a commit 2ba03be

1 file changed

Lines changed: 84 additions & 78 deletions

File tree

src/tinystruct/examples/smalltalk.java

Lines changed: 84 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
import java.util.ArrayDeque;
1313
import java.util.Arrays;
1414
import java.util.Collection;
15-
import java.util.Collections;
1615
import java.util.Date;
1716
import java.util.HashMap;
1817
import java.util.Iterator;
1918
import java.util.Map;
2019
import java.util.Queue;
20+
import java.util.concurrent.ConcurrentHashMap;
2121

2222
import javax.servlet.ServletException;
2323
import javax.servlet.http.HttpServletRequest;
@@ -39,7 +39,7 @@
3939
public 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

Comments
 (0)