KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > icesoft > faces > webapp > http > core > SendUpdatedViews


1 package com.icesoft.faces.webapp.http.core;
2
3 import com.icesoft.faces.webapp.http.common.Request;
4 import com.icesoft.faces.webapp.http.common.Response;
5 import com.icesoft.faces.webapp.http.common.ResponseHandler;
6 import com.icesoft.faces.webapp.http.common.Server;
7 import com.icesoft.faces.webapp.http.common.standard.FixedXMLContentHandler;
8 import edu.emory.mathcs.backport.java.util.concurrent.BlockingQueue;
9 import edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQueue;
10
11 import java.io.IOException JavaDoc;
12 import java.io.Writer JavaDoc;
13 import java.util.Collection JavaDoc;
14 import java.util.HashSet JavaDoc;
15 import java.util.Set JavaDoc;
16
17 public class SendUpdatedViews implements Server {
18     private static final Runnable JavaDoc Noop = new Runnable JavaDoc() {
19         public void run() {
20         }
21     };
22     private static final ResponseHandler EmptyResponseHandler = new ResponseHandler() {
23         public void respond(Response response) throws Exception JavaDoc {
24             response.setHeader("Content-Length", 0);
25         }
26     };
27     private BlockingQueue pendingRequest = new LinkedBlockingQueue(1);
28     private ViewQueue allUpdatedViews;
29
30     public SendUpdatedViews(final Collection JavaDoc synchronouslyUpdatedViews, final ViewQueue allUpdatedViews) {
31         this.allUpdatedViews = allUpdatedViews;
32         this.allUpdatedViews.onPut(new Runnable JavaDoc() {
33             public void run() {
34                 try {
35                     allUpdatedViews.removeAll(synchronouslyUpdatedViews);
36                     synchronouslyUpdatedViews.clear();
37                     Set JavaDoc viewIdentifiers = new HashSet JavaDoc(allUpdatedViews);
38                     if (!viewIdentifiers.isEmpty()) {
39                         Request request = (Request) pendingRequest.poll();
40                         if (request != null) {
41                             request.respondWith(new UpdatedViewsHandler((String JavaDoc[]) viewIdentifiers.toArray(new String JavaDoc[viewIdentifiers.size()])));
42                         }
43                     }
44                 } catch (Throwable JavaDoc e) {
45                     e.printStackTrace();
46                 }
47             }
48         });
49     }
50
51     public void service(final Request request) throws Exception JavaDoc {
52         respondToPreviousRequest();
53         pendingRequest.put(request);
54     }
55
56     private void respondToPreviousRequest() {
57         Request previousRequest = (Request) pendingRequest.poll();
58         if (previousRequest != null) {
59             try {
60                 previousRequest.respondWith(EmptyResponseHandler);
61             } catch (Exception JavaDoc e) {
62                 e.printStackTrace();
63             }
64         }
65     }
66
67     public void shutdown() {
68         allUpdatedViews.onPut(Noop);
69         respondToPreviousRequest();
70     }
71
72     private class UpdatedViewsHandler extends FixedXMLContentHandler {
73         private String JavaDoc[] viewIdentifiers;
74
75         public UpdatedViewsHandler(String JavaDoc[] viewIdentifiers) {
76             this.viewIdentifiers = viewIdentifiers;
77         }
78
79         public void writeTo(Writer JavaDoc writer) throws IOException JavaDoc {
80             writer.write("<updated-views>");
81             for (int i = 0; i < viewIdentifiers.length; i++) {
82                 writer.write(viewIdentifiers[i]);
83                 writer.write(' ');
84             }
85             writer.write("</updated-views>");
86         }
87     }
88 }
89
Popular Tags