/* * Created on Oct 19, 2004 */ package com.openedit.servlet; import java.io.IOException; import java.io.OutputStream; import java.io.Writer; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openedit.event.WebEventHandler; import com.openedit.ModuleManager; import com.openedit.OpenEditException; import com.openedit.Shutdownable; import com.openedit.WebPageRequest; import com.openedit.error.ErrorHandler; import com.openedit.generators.Output; import com.openedit.page.Page; import com.openedit.page.PageRequestKeys; import com.openedit.page.PageStreamer; import com.openedit.page.manage.PageManager; import com.openedit.users.User; import com.openedit.util.RequestUtils; import com.openedit.util.URLUtilities; public class BaseOpenEditEngine implements OpenEditEngine { private static final Log log = LogFactory.getLog(BaseOpenEditEngine.class); protected PageManager fieldPageManager; protected ModuleManager fieldModuleManager; protected List fieldWelcomeFiles; protected ErrorHandler fieldErrorHandler; protected String fieldVersion; protected boolean fieldHideFolders = true; protected WebEventHandler fieldPageEventHandler; protected RequestUtils fieldRequestUtils; public void render( HttpServletRequest inRequest, HttpServletResponse inResponse ) throws IOException, OpenEditException { checkEngineInit( inResponse ); //inRequest.setCharacterEncoding( "UTF-8" ); //This needs to be the first thing we do. Dont call getParameter URLUtilities util = new URLUtilities(inRequest, inResponse); String requestedPath = util.getOriginalPath(); boolean checkdates = false; HttpSession session = inRequest.getSession(false); if ( session != null) { String mode = (String)session.getAttribute("oe.edit.mode"); if( "debug".equals(mode) || "editing".equals(mode)) { checkdates = true; } } if( !checkdates ) { checkdates = Boolean.parseBoolean( inRequest.getParameter("reload") ); } Page page = getPageManager().getPage( requestedPath,checkdates); //If link does not exists. Then put a real welcome page on there so that fallback will work boolean wasfolder = page.isFolder(); if ( wasfolder ) { page = findWelcomePage(page, checkdates); if( !util.requestPath().endsWith("/")) { String contextPath = inRequest.getContextPath(); if( contextPath == null ) { contextPath = ""; //No Webapp } inResponse.sendRedirect(contextPath + page.getPath() ); return; } } if( page.getPageType() == null || wasfolder) { boolean found = false; String alternative_page = page.get("alternative_page"); if(alternative_page != null) { page = getPageManager().getPage( alternative_page,false); } else { String alternative = page.get("alternative_extension"); if(alternative != null) { page = getPageManager().getPage( requestedPath + "." + alternative,false); } } } if ( page.isDynamic() ) { inRequest.setCharacterEncoding( page.getCharacterEncoding() ); inResponse.setContentType( page.getMimeType() + "; charset=" + page.getCharacterEncoding() ); inResponse.setHeader("Cache-Control","proxy-revalidate"); //must revalidate does not work well with IE7 //Since they cannot hit the back button on a form submit } else { String mime = page.getMimeType(); inResponse.setContentType( mime ); } WebPageRequest context = createWebPageRequest( page, inRequest, inResponse, util ); context.putPageValue("reloadpages", checkdates); Page transpage = getPageManager().getPage(page,context); if(! transpage.getPath().equals(page.getPath())){ context.setPage(transpage); } beginRender(context); } /** * @see com.openedit.servlet.OpenEditEngine#hideFolders() */ public boolean hideFolders() { return fieldHideFolders; } /** * @see com.openedit.servlet.OpenEditEngine#setHideFolders(boolean) */ public void setHideFolders( boolean inFlag ) { fieldHideFolders = inFlag; } /** * @see com.openedit.servlet.OpenEditEngine#beginRender(com.openedit.WebPageRequest) */ public void beginRender(WebPageRequest pageRequest) throws OpenEditException { try { //log.debug("Running: " + pageRequest.getPathUrl()); Page page = pageRequest.getPage(); PageStreamer pageStreamer = null; pageStreamer = createPageStreamer( page,pageRequest ); executePathActions(pageRequest); if( !pageRequest.hasRedirected()) { getModuleManager().executePageActions( page,pageRequest ); } if( !pageRequest.hasRedirected()) { pageStreamer.render(); } } catch( Throwable e ) { log.error(e); //e.printStackTrace(); boolean ok = getErrorHandler().handleError( e, pageRequest ); if(!ok ) { if( e instanceof OpenEditException ) { throw (OpenEditException )e; } else { throw new OpenEditException(e); } } } } public PageStreamer createPageStreamer( Page inPage, WebPageRequest inPageRequest ) throws OpenEditException { PageStreamer pageStreamer = new PageStreamer(); pageStreamer.setEngine( this ); Output out = new Output(); out.setWriter((Writer)inPageRequest.getPageValue(PageRequestKeys.OUTPUT_WRITER)); out.setStream((OutputStream)inPageRequest.getPageValue(PageRequestKeys.OUTPUT_STREAM)); pageStreamer.setOutput(out); pageStreamer.setWebPageRequest( inPageRequest); inPageRequest.putPageStreamer(pageStreamer ); return pageStreamer; } protected void checkEngineInit( HttpServletResponse inResponse ) throws IOException { if ( getPageManager() == null ) { inResponse.getWriter().print( "<html>Server is not initialized, please check the logs for errors</html>"); return; } } protected WebPageRequest createWebPageRequest( Page inPage, HttpServletRequest inRequest, HttpServletResponse inResponse, URLUtilities util) throws OpenEditException { WebPageRequest context = getRequestUtils().createPageRequest(inPage, inRequest, inResponse,null, util); //context.putProtectedPageValue( "version", getVersion()); return context; } /** * @see com.openedit.servlet.OpenEditEngine#executePageActions(com.openedit.WebPageRequest) */ public void executePageActions( WebPageRequest inPageRequest ) throws OpenEditException { getModuleManager().executePageActions( inPageRequest.getPage(),inPageRequest ); } /** * @see com.openedit.servlet.OpenEditEngine#executePathActions(com.openedit.WebPageRequest) */ public void executePathActions( WebPageRequest inPageRequest ) throws OpenEditException { getModuleManager().executePathActions( inPageRequest.getPage(), inPageRequest ); } /** * @see com.openedit.servlet.OpenEditEngine#getModuleManager() */ public ModuleManager getModuleManager() { return fieldModuleManager; } /** * @see com.openedit.servlet.OpenEditEngine#setModuleManager(com.openedit.ModuleManager) */ public void setModuleManager( ModuleManager moduleManager ) { fieldModuleManager = moduleManager; } /** * @see com.openedit.servlet.OpenEditEngine#getPageManager() */ public PageManager getPageManager() { return fieldPageManager; } /** * @see com.openedit.servlet.OpenEditEngine#setPageManager(com.openedit.page.manage.PageManager) */ public void setPageManager( PageManager pageManager ) { fieldPageManager = pageManager; } /** * @see com.openedit.servlet.OpenEditEngine#getWelcomePath() */ public List getWelcomeFiles() { return fieldWelcomeFiles; } /** * @see com.openedit.servlet.OpenEditEngine#setWelcomePath(java.lang.String) */ public void setWelcomeFiles( List welcomePath ) { fieldWelcomeFiles = welcomePath; } /** * @see com.openedit.servlet.OpenEditEngine#getErrorHandler() */ public ErrorHandler getErrorHandler() { return fieldErrorHandler; } /** * @see com.openedit.servlet.OpenEditEngine#setErrorHandler(com.openedit.error.ErrorHandler) */ public void setErrorHandler( ErrorHandler errorHandler ) { fieldErrorHandler = errorHandler; } /** * @see com.openedit.servlet.OpenEditEngine#getVersion() */ /* protected boolean requireVersion(int majorVersion, int minorVersion) { ServletContext servletContext = getServletContext(); return ( (servletContext.getMajorVersion() > majorVersion) || (servletContext.getMajorVersion() == majorVersion && servletContext.getMinorVersion() >= minorVersion)); } */ public String getVersion() { if (fieldVersion == null) { Package thisPackage = getClass().getPackage(); if (thisPackage != null) { fieldVersion = thisPackage.getImplementationVersion(); } if (fieldVersion == null) { fieldVersion = "dev"; } } return fieldVersion; } /** * @see com.openedit.servlet.OpenEditEngine#shutdown() */ public void shutdown() { System.out.println("OpenEditEngine shutdown start"); Object[] beans = getModuleManager().getLoadedBeans().toArray(); for (int i = 0; i < beans.length; i++) { Object module = (Object) beans[i]; if( module instanceof Shutdownable) { ((Shutdownable)module).shutdown(); } } System.out.println("OpenEditEngine shutdown complete"); } public void setPageEventHandler(WebEventHandler inWebEventHandler) { fieldPageEventHandler = inWebEventHandler; } public RequestUtils getRequestUtils() { return fieldRequestUtils; } public void setRequestUtils(RequestUtils inRequestUtils) { fieldRequestUtils = inRequestUtils; } protected Page findWelcomePage(Page inDirectory, boolean indates) throws OpenEditException { String dir = inDirectory.getPath(); if (!dir.endsWith("/")) { dir = dir + "/"; } for (Iterator iterator = getWelcomeFiles().iterator(); iterator.hasNext();) { String index = (String) iterator.next(); if( getPageManager().getRepository().doesExist( dir + index)) { return getPageManager().getPage(dir + index,indates); } } return getPageManager().getPage( dir + "index.html",indates); } }