package org.icefaces.push; import org.icefaces.application.WindowScopeManager; import org.icefaces.util.EnvUtils; import javax.faces.FacesException; import javax.faces.application.Application; import javax.faces.application.ViewHandler; import javax.faces.application.ViewHandlerWrapper; import javax.faces.component.UIOutput; import javax.faces.component.UIViewRoot; import javax.faces.context.FacesContext; import java.io.IOException; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; public class BridgeSetup extends ViewHandlerWrapper { private static Logger log = Logger.getLogger("org.icefaces.util.DOMUtil"); private static final String Marker = BridgeSetup.class.getName(); private ViewHandler handler; public BridgeSetup() { super(); } public BridgeSetup(ViewHandler handler) { this.handler = handler; } public ViewHandler getWrapped() { return handler; } public UIViewRoot createView(FacesContext context, String viewId) { try { WindowScopeManager.lookup(context).determineWindowID(context); } catch (Exception e) { log.log(Level.WARNING, "Unable to set up WindowScope ", e); } return handler.createView(context, viewId); } public void renderView(FacesContext context, UIViewRoot root) throws IOException, FacesException { if (EnvUtils.isICEfacesView(context)) { Map rootAttributes = root.getAttributes(); //modify UIViewRoot only once if (!rootAttributes.containsKey(Marker)) { rootAttributes.put(Marker, BridgeSetup.class); UIOutput output; output = new UIOutput(); output.setRendererType("javax.faces.resource.Script"); output.getAttributes().put("name", "jsf.js"); output.getAttributes().put("library", "javax.faces"); root.addComponentResource(context, output, "head"); Application application = context.getApplication(); String invalidateHTTPCache = "?a" + hashCode(); //replace with icepush.js resource in icepush.jar // output = new UIOutput(); // output.getAttributes().put("escape", "false"); // output.setValue(""); // root.addComponentResource(context, output, "head"); String path = application.getResourceHandler().createResource("bridge.js").getRequestPath(); output = new UIOutput(); output.getAttributes().put("escape", "false"); output.setValue(""); root.addComponentResource(context, output, "head"); try { String id = WindowScopeManager.lookup(context).lookupWindowScope().getId(); output = new UIOutput(); output.getAttributes().put("escape", "false"); output.setValue(""); root.addComponentResource(context, output, "body"); if (EnvUtils.isICEpushPresent()) { output = new UIOutput(); output.getAttributes().put("escape", "false"); output.setValue(""); root.addComponentResource(context, output, "body"); } } catch (Exception e) { //could re-throw as a FacesException, but WindowScope failure should //not be fatal to the application e.printStackTrace(); } } } handler.renderView(context, root); } }