/* * $Id: IWViewHandlerImpl.java,v 1.15 2007/09/08 13:16:20 civilis Exp $ * Created on 12.3.2004 by tryggvil in project smile * * Copyright (C) 2004 Idega Software hf. All Rights Reserved. * * This software is the proprietary information of Idega hf. * Use is subject to license terms. */ package com.idega.faces; import java.io.IOException; import java.util.Iterator; import java.util.Locale; import java.util.logging.Logger; import javax.faces.FacesException; import javax.faces.application.ViewHandler; import javax.faces.component.UIComponent; import javax.faces.component.UIViewRoot; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.servlet.http.HttpServletResponse; import com.idega.core.view.DefaultViewNode; import com.idega.core.view.ViewManager; import com.idega.core.view.ViewNode; import com.idega.core.view.ViewNodeBase; import com.idega.idegaweb.IWMainApplication; import com.idega.presentation.IWContext; import com.idega.util.FacesUtil; /** * This is the main JSF ViewHandler implementation for idegaWeb.<br> * The instance of this class handles the idegaWeb specific urls if it detects one * and uses the ViewNode structure to handle that.<br> * If there is not an incoming idegaWeb request coming in it delegates the * calls to the underlying system ViewHandler.<br> * * Copyright (C) idega software 2004<br> * * Last modified: $Date: 2007/09/08 13:16:20 $ by $Author: civilis $ * * @author <a href="mailto:tryggvil@idega.com">tryggvil</a> * @version $Revision: 1.15 $ */ public class IWViewHandlerImpl extends ViewHandler { private static Logger log = Logger.getLogger(IWViewHandlerImpl.class.getName()); private ViewHandler parentViewHandler; private ViewManager viewManager; private ViewHandler jspViewHandler; private ViewHandler faceletsViewHandler; public IWViewHandlerImpl(){ log.info("Loading IWViewHandlerImpl"); } public IWViewHandlerImpl(ViewHandler parentViewHandler,IWMainApplication iwma){ log.info("Loading IWViewHandlerImpl with constructor IWViewHandlerImpl(ViewHandler parentViewHandler)"); this.setParentViewHandler(parentViewHandler); /*ViewHandler builderPageViewHandler = new BuilderPageViewHandler(this); ViewHandler windowViewHandler = new WindowViewHandler(this); ViewHandler workspaceViewHandler = new WorkspaceViewHandler(this); ViewHandler loginViewHandler = new LoginViewHandler(this); addChildViewHandler("/pages",builderPageViewHandler); addChildViewHandler("/idegaweb/pages",builderPageViewHandler); addChildViewHandler("/window",windowViewHandler); addChildViewHandler("/idegaweb/window",windowViewHandler); addChildViewHandler("/login",loginViewHandler); addChildViewHandler("/idegaweb/login",loginViewHandler); addChildViewHandler("/workspace",workspaceViewHandler); addChildViewHandler("/idegaweb/workspace",workspaceViewHandler); */ updateViewManagerViewHandler(iwma); } protected void updateViewManagerViewHandler(IWMainApplication iwma){ //This updates the viewhandler Instance that the root viewnode has. // the ViewHandler before this is just the system ViewHandler this.viewManager = ViewManager.getInstance(iwma); ViewNode root = this.viewManager.getApplicationRoot(); DefaultViewNode dRoot = (DefaultViewNode)root; dRoot.setViewHandler(new RootNodeViewHandler(this.getParentViewHandler())); } /* (non-Javadoc) * @see javax.faces.application.ViewHandler#calculateLocale(javax.faces.context.FacesContext) */ @Override public Locale calculateLocale(FacesContext ctx) { IWContext iwc = IWContext.getIWContext(ctx); Locale locale = iwc.getCurrentLocale(); return locale; } /* (non-Javadoc) * @see javax.faces.application.ViewHandler#calculateRenderKitId(javax.faces.context.FacesContext) */ @Override public String calculateRenderKitId(FacesContext ctx) { ViewHandler realHandler = getViewHandlerForContext(ctx); if (realHandler != null) { return realHandler.calculateRenderKitId(ctx); } else{ throw new RuntimeException("No ViewHandler Found to calculate RenderKitId"); } } /* (non-Javadoc) * @see javax.faces.application.ViewHandler#createView(javax.faces.context.FacesContext, java.lang.String) */ @Override public UIViewRoot createView(FacesContext ctx, String viewId) { FacesUtil.registerRequestBegin(ctx); ViewHandler realHandler = getViewHandlerForContext(ctx); if(realHandler!=null){ UIViewRoot root = realHandler.createView(ctx,viewId); root.setLocale(calculateLocale(ctx)); return root; } else{ throw new RuntimeException ("No ViewHandler Found to create View"); } } private ViewHandler getViewHandlerForContext(FacesContext ctx) { ViewNode node = getViewManager().getViewNodeForContext(ctx); if (node != null) { ViewNodeBase viewBase = node.getViewNodeBase(); if (viewBase == null) { return null; } switch (viewBase) { case JSP: { return jspViewHandler; } case FACELET : { return faceletsViewHandler; } default: { return node.getViewHandler(); } } } if (getParentViewHandler() != null) { return getParentViewHandler(); } throw new RuntimeException("No parent ViewHandler"); } /** * @param url * @return */ /*private ViewHandler getViewHandlerForUrl(String url,FacesContext ctx) { ViewNode node = getViewManager().getViewNodeForUrl(url); if(node!=null){ if(node.isJSP()){ //try { //HttpServletRequest request = (HttpServletRequest)ctx.getExternalContext().getRequest(); //HttpServletResponse response = (HttpServletResponse)ctx.getExternalContext().getResponse(); //try { // request.setParameter("isForwarding","true"); // request.getRequestDispatcher(node.getJSPURI()).include(request,response); //} //catch (ServletException e1) { // e1.printStackTrace(); //} //String uri = node.getJSPURI(); //ctx.getViewRoot().setViewId(node.getJSPURI()); //ctx.getExternalContext().dispatch(uri); return this.jspViewHandler; //ctx.responseComplete(); //} //catch (IOException e) { // e.printStackTrace(); //} } return node.getViewHandler(); } return null; }*/ /* (non-Javadoc) * @see javax.faces.application.ViewHandler#getActionURL(javax.faces.context.FacesContext, java.lang.String) */ @Override public String getActionURL(FacesContext ctx, String viewId) { ViewHandler realHandler = getViewHandlerForContext(ctx); if(realHandler!=null){ return realHandler.getActionURL(ctx,viewId); } else{ throw new RuntimeException ("No ViewHandler Found for getActionURL"); } } /* (non-Javadoc) * @see javax.faces.application.ViewHandler#getResourceURL(javax.faces.context.FacesContext, java.lang.String) */ @Override public String getResourceURL(FacesContext ctx, String path) { ViewHandler realHandler = getViewHandlerForContext(ctx); if(realHandler!=null){ /* String pathFromHandler = realHandler.getResourceURL(ctx,path); if (!(ctx instanceof BridgeFacesContext)) { if (path.startsWith(StringHandler.SLASH) && !pathFromHandler.startsWith(StringHandler.SLASH)) { pathFromHandler = new StringBuffer(StringHandler.SLASH).append(pathFromHandler).toString(); } } return pathFromHandler; */ return realHandler.getResourceURL(ctx,path); } else{ throw new RuntimeException ("No ViewHandler Found for getResourceURL"); } } /* public StateManager getStateManager() { if(defaultViewHandler!=null){ return defaultViewHandler.getStateManager(); } else{ return super.getStateManager(); } } public String getViewIdPath(FacesContext ctx, String viewId) { if(defaultViewHandler!=null){ return defaultViewHandler.getViewIdPath(ctx,viewId); } else{ return super.getViewIdPath(ctx,viewId); } } */ /* (non-Javadoc) * @see javax.faces.application.ViewHandler#renderView(javax.faces.context.FacesContext, javax.faces.component.UIViewRoot) */ @Override public void renderView(FacesContext ctx, UIViewRoot viewId) throws IOException, FacesException { FacesUtil.registerRequestBegin(ctx); ViewHandler realHandler = getViewHandlerForContext(ctx); if(realHandler!=null){ realHandler.renderView(ctx,viewId); } else{ throw new RuntimeException ("No ViewHandler Found for getResourceURL"); } //System.out.println("Rendering took: "+l+" ms."); /*String url = getRequestUrl(ctx); ViewHandler childHandler = getViewHandlerForUrl(url); if(childHandler!=null){ childHandler.renderView(ctx,viewId); } else{ if(getParentViewHandler()!=null){ getParentViewHandler().renderView(ctx,viewId); } else{ //return createView(ctx,vewId); throw new RuntimeException ("No parent ViewHandler"); } }*/ /* if(getParentViewHandler()!=null){ getParentViewHandler().renderView(ctx,viewRoot); } else{ //return super.renderView(ctx,viewRoot); throw new RuntimeException ("No parent ViewHandler"); }*/ } /** * @see javax.faces.application.ViewHandler#renderView(javax.faces.context.FacesContext, javax.faces.component.UIViewRoot) */ protected void cbpRenderView(FacesContext ctx, UIViewRoot viewRoot) throws IOException, FacesException { // Apparently not all versions of tomcat have the same // default content-type. // So we'll set it explicitly. HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse(); response.setContentType("text/html"); // make sure to set the responsewriter //initializeResponseWriter(ctx); if(viewRoot == null) { throw new RuntimeException("No component tree is available !"); } String renderkitId = viewRoot.getRenderKitId(); if (renderkitId == null) { renderkitId = calculateRenderKitId(ctx); } viewRoot.setRenderKitId(renderkitId); ResponseWriter out = ctx.getResponseWriter(); try { out.startDocument(); renderComponent(ctx.getViewRoot(),ctx); out.endDocument(); ctx.getResponseWriter().flush(); } catch (RuntimeException e) { throw new RuntimeException(e.getMessage(),e); } } /** * Recursive operation to render a specific component in the view tree. * * @param component * @param context */ private void renderComponent(UIComponent component, FacesContext ctx) { try { component.encodeBegin(ctx); if(component.getRendersChildren()) { component.encodeChildren(ctx); } else { UIComponent currentChild; for(Iterator<UIComponent> it = component.getChildren().iterator(); it.hasNext();) { currentChild = it.next(); renderComponent(currentChild,ctx); } } component.encodeEnd(ctx); } catch(IOException e) { log.severe("Component <" + component.getId() + "> could not render ! Continuing rendering of view <" + ctx.getViewRoot().getViewId() + ">..."); } } /* (non-Javadoc) * @see javax.faces.application.ViewHandler#restoreView(javax.faces.context.FacesContext, java.lang.String) */ @Override public UIViewRoot restoreView(FacesContext ctx, String viewId) { FacesUtil.registerRequestBegin(ctx); ViewHandler realHandler = getViewHandlerForContext(ctx); if(realHandler!=null){ UIViewRoot root = realHandler.restoreView(ctx,viewId); if(root != null){ root.setLocale(calculateLocale(ctx)); } return root; } else{ throw new RuntimeException ("No ViewHandler Found for restoreView"); } } /* (non-Javadoc) * @see javax.faces.application.ViewHandler#writeState(javax.faces.context.FacesContext) */ @Override public void writeState(FacesContext ctx) throws IOException { ViewHandler realHandler = getViewHandlerForContext(ctx); if(realHandler!=null){ realHandler.writeState(ctx); } else{ throw new RuntimeException ("No ViewHandler Found for writeState"); } } /** * @return Returns the defaultViewHandler. */ public ViewHandler getParentViewHandler() { return this.parentViewHandler; } /** * @param defaultViewHandler The defaultViewHandler to set. */ public void setParentViewHandler(ViewHandler parentViewHandler) { jspViewHandler = new IWJspViewHandler(parentViewHandler); faceletsViewHandler = new IWFaceletsViewHandler(parentViewHandler); // iceFacesViewHandler = parentViewHandler; this.parentViewHandler = parentViewHandler; } /** * @return Returns the viewManager. */ protected ViewManager getViewManager() { return this.viewManager; } }