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 ; 12 import java.io.Writer ; 13 import java.util.Collection ; 14 import java.util.HashSet ; 15 import java.util.Set ; 16 17 public class SendUpdatedViews implements Server { 18 private static final Runnable Noop = new Runnable () { 19 public void run() { 20 } 21 }; 22 private static final ResponseHandler EmptyResponseHandler = new ResponseHandler() { 23 public void respond(Response response) throws Exception { 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 synchronouslyUpdatedViews, final ViewQueue allUpdatedViews) { 31 this.allUpdatedViews = allUpdatedViews; 32 this.allUpdatedViews.onPut(new Runnable () { 33 public void run() { 34 try { 35 allUpdatedViews.removeAll(synchronouslyUpdatedViews); 36 synchronouslyUpdatedViews.clear(); 37 Set viewIdentifiers = new HashSet (allUpdatedViews); 38 if (!viewIdentifiers.isEmpty()) { 39 Request request = (Request) pendingRequest.poll(); 40 if (request != null) { 41 request.respondWith(new UpdatedViewsHandler((String []) viewIdentifiers.toArray(new String [viewIdentifiers.size()]))); 42 } 43 } 44 } catch (Throwable e) { 45 e.printStackTrace(); 46 } 47 } 48 }); 49 } 50 51 public void service(final Request request) throws Exception { 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 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 [] viewIdentifiers; 74 75 public UpdatedViewsHandler(String [] viewIdentifiers) { 76 this.viewIdentifiers = viewIdentifiers; 77 } 78 79 public void writeTo(Writer writer) throws IOException { 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 |