/** * $Id: BuilderDomainViewNode.java,v 1.2 2007/07/27 15:42:50 civilis Exp $ * Created in 2007 by tryggvil * * Copyright (C) 2000-2007 Idega Software hf. All Rights Reserved. * * This software is the proprietary information of Idega hf. * Use is subject to license terms. */ package com.idega.builder.view; import java.io.IOException; import java.util.Iterator; import java.util.Map; import java.util.logging.Logger; import javax.faces.application.ViewHandler; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletResponse; import com.idega.builder.business.BuilderLogic; import com.idega.builder.business.CachedBuilderPage; import com.idega.builder.business.PageCacher; import com.idega.core.builder.business.BuilderPageException; import com.idega.core.builder.data.ICDomain; import com.idega.core.view.DefaultViewNode; import com.idega.core.view.ViewNode; import com.idega.core.view.ViewNodeBase; import com.idega.presentation.IWContext; import com.idega.util.CoreConstants; import com.idega.util.RequestUtil; import com.idega.util.StringHandler; import com.idega.util.StringUtil; /** * <p> * Root node for builder pages for each domain * </p> * Last modified: $Date: 2007/07/27 15:42:50 $ by $Author: civilis $ * * @author <a href="mailto:tryggvil@idega.com">tryggvil</a> * @version $Revision: 1.2 $ */ public class BuilderDomainViewNode extends DefaultViewNode { private ICDomain domain; /** * @param viewId * @param parent */ public BuilderDomainViewNode(BuilderRootViewNode parent,ICDomain domain) { super(domain.getPrimaryKey().toString(), parent); setDomain(domain); } @Override public void setViewHandler(ViewHandler viewHandler) { super.setViewHandler(viewHandler); } /* (non-Javadoc) * @see com.idega.core.view.DefaultViewNode#loadChild(java.lang.String) */ @Override protected ViewNode loadChild(String childId) throws BuilderPageException { ViewNode node = getPageCacher().getCachedBuilderPage(childId); if (node == null) { BuilderPageException be = new BuilderPageException("Page with ID=" + childId + " not found"); be.setCode(BuilderPageException.CODE_NOT_FOUND); be.setPageUri(childId); throw be; } return node; } protected BuilderLogic getBuilderLogic(){ return BuilderLogic.getInstance(); } protected PageCacher getPageCacher(){ return getBuilderLogic().getPageCacher(); } @Override protected Map<String, ViewNode> getChildrenMap(){ return getPageCacher().getPageCacheMap(); } private ViewNode getDefaultNode(FacesContext context) throws BuilderPageException { IWContext iwc = IWContext.getIWContext(context); String pageKey = getBuilderLogic().getCurrentIBPage(iwc); String uri = iwc.getRequestURI(); if (StringUtil.isEmpty(pageKey)) { pageKey = getBuilderLogic().getPageKeyByURICached(uri); } if (StringUtil.isEmpty(pageKey)) { String redirect = RequestUtil.getRedirectUriByApplicationProperty(iwc.getRequest(), HttpServletResponse.SC_NOT_FOUND); if (!StringUtil.isEmpty(redirect)) { try { Logger.getLogger(getClass().getName()).warning("Redirecting to " + redirect + " because page with URI " + uri + " can not be found"); iwc.getResponse().sendRedirect(redirect); } catch (IOException e) { e.printStackTrace(); } return null; } BuilderPageException be = new BuilderPageException("Page with URI " + uri + " not found"); be.setCode(BuilderPageException.CODE_NOT_FOUND); be.setPageUri(uri); throw be; } ViewNode defaultChild = getChild(pageKey); if (defaultChild.equals(this)) { throw new RuntimeException("Page with id="+pageKey+" does not exist"); } return defaultChild; } @Override public UIComponent createComponent(FacesContext context) { try { ViewNode defaultChild = getDefaultNode(context); return defaultChild.createComponent(context); } catch (BuilderPageException e) { e.printStackTrace(); } return null; } @SuppressWarnings("deprecation") @Override public boolean isComponentBased() { try { FacesContext context = FacesContext.getCurrentInstance(); ViewNode defaultChild = getDefaultNode(context); return defaultChild.isComponentBased(); } catch (BuilderPageException e) { e.printStackTrace(); } return false; } @Override public ViewNodeBase getViewNodeBase() { try { FacesContext context = FacesContext.getCurrentInstance(); ViewNode defaultChild = getDefaultNode(context); if (defaultChild != null) { return defaultChild.getViewNodeBase(); } } catch (BuilderPageException e) { e.printStackTrace(); } return null; } @Override public String getResourceURI(){ try { FacesContext context = FacesContext.getCurrentInstance(); ViewNode defaultChild = getDefaultNode(context); return defaultChild.getResourceURI(); } catch (BuilderPageException e) { e.printStackTrace(); } return null; } @Override public ViewNode getChild(String childViewId) { //parse the url: if (isPageId(childViewId)) { return super.getChild(childViewId); } else { String newUrl = getUrlParsedInstandardFormat(childViewId); ViewNode viewNode = getViewNodeCached(newUrl); if (viewNode == null) { viewNode = getViewNodeLoadedFromDB(newUrl); } return viewNode; } } /** * @param viewNode * @return */ private ViewNode getViewNodeLoadedFromDB(String pageUri) { String pagesPrefix = CoreConstants.PAGES_URI_PREFIX; String requestUri = pageUri; if (!pageUri.startsWith(pagesPrefix)) { requestUri=pagesPrefix+pageUri; } //We have to add a /pages prefix because the method getPageKeyByURI() expects it String pageKey = getBuilderLogic().getPageKeyByURI(requestUri,getDomain()); return super.getChild(pageKey); } /** * @param newUrl * @return */ private ViewNode getViewNodeCached(String newUrl) { //iterate over the viewnodes and check if the url exists: for (Iterator<ViewNode> valueIter = getPageCacher().getPageCacheMap().values().iterator(); valueIter.hasNext();) { ViewNode node = valueIter.next(); CachedBuilderPage page = (CachedBuilderPage)node; if (newUrl != null) { if (newUrl.equals(page.getPageUri())) { return node; } } } return null; } /** * @param childViewId * @return */ private boolean isPageId(String childViewId) { if (StringUtil.isEmpty(childViewId)) { return false; } try { if (childViewId.endsWith(StringHandler.SLASH)) { //remove the potential '/' character in the ending: childViewId = childViewId.substring(0,childViewId.length()-1); } Integer.parseInt(childViewId); return true; } catch(NumberFormatException nfe){ return false; } } /** * Parses the string and returns it in the standard format with always begins and ends with a '/' character. * e.g. the input 'mypage/mysubpage' is converted to '/mypage/mysubpage/' * @param childViewId * @return */ private String getUrlParsedInstandardFormat(String childViewId) { if (StringUtil.isEmpty(childViewId)) { return null; } if (childViewId.equals(StringHandler.SLASH)){ return childViewId; } else { String returnUrl = childViewId; if(returnUrl.startsWith(StringHandler.SLASH)){ //do nothing } else{ returnUrl = StringHandler.SLASH+returnUrl; } if(returnUrl.endsWith(StringHandler.SLASH)){ //do nothing } else{ returnUrl = returnUrl+StringHandler.SLASH; } return returnUrl; } } public ICDomain getDomain() { return domain; } public void setDomain(ICDomain domain) { this.domain = domain; } }