KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > openedit > servlet > BaseOpenEditEngine


1 /*
2  * Created on Oct 19, 2004
3  */

4 package com.openedit.servlet;
5
6 import java.io.IOException JavaDoc;
7 import java.io.OutputStream JavaDoc;
8 import java.io.OutputStreamWriter JavaDoc;
9 import java.io.Writer JavaDoc;
10 import java.util.Iterator JavaDoc;
11
12 import javax.servlet.http.HttpServletRequest JavaDoc;
13 import javax.servlet.http.HttpServletResponse JavaDoc;
14 import javax.servlet.http.HttpSession JavaDoc;
15
16 import org.apache.commons.logging.Log;
17 import org.apache.commons.logging.LogFactory;
18
19 import com.openedit.BaseWebPageRequest;
20 import com.openedit.ModuleManager;
21 import com.openedit.OpenEditException;
22 import com.openedit.Shutdownable;
23 import com.openedit.WebPageRequest;
24 import com.openedit.error.ErrorHandler;
25 import com.openedit.generators.Output;
26 import com.openedit.page.Page;
27 import com.openedit.page.PageRequestKeys;
28 import com.openedit.page.PageStreamer;
29 import com.openedit.page.manage.PageManager;
30 import com.openedit.util.PathUtilities;
31 import com.openedit.util.SessionMap;
32 import com.openedit.util.SessionTool;
33 import com.openedit.util.URLUtilities;
34 import com.openedit.web.Browser;
35
36 public class BaseOpenEditEngine implements OpenEditEngine
37 {
38     private static final Log log = LogFactory.getLog(BaseOpenEditEngine.class);
39     protected PageManager fieldPageManager;
40     protected ModuleManager fieldModuleManager;
41     protected String JavaDoc fieldWelcomePath;
42     protected ErrorHandler fieldErrorHandler;
43     protected String JavaDoc fieldVersion;
44     protected boolean fieldHideFolders = true;
45     
46     public void render( HttpServletRequest JavaDoc inRequest, HttpServletResponse JavaDoc inResponse ) throws IOException JavaDoc, OpenEditException
47     {
48         checkEngineInit( inResponse );
49         URLUtilities util = new URLUtilities(inRequest, inResponse);
50
51         String JavaDoc requestedPath = util.getOriginalPath();
52         Page page = getPage( requestedPath );
53         if ( page.isFolder() )
54         {
55             String JavaDoc welcomePath = getWelcomePath();
56             if (!page.getPath().endsWith("/"))
57             {
58                 welcomePath = "/" + welcomePath;
59             }
60             page = getPage( page.getPath() + welcomePath );
61             if ( !requestedPath.endsWith("/") && page.exists() )
62             {
63                 String JavaDoc contextPath = inRequest.getContextPath();
64                 if( contextPath == null )
65                 {
66                     contextPath = "";
67                 }
68                 //we are being passed in a /acme directory
69
//need to do a full redirect
70
inResponse.sendRedirect(contextPath + page.getPath());
71                 return;
72             }
73         }
74         
75         if ( page.isHtml() )
76         {
77             inRequest.setCharacterEncoding( page.getCharacterEncoding() );
78             inResponse.setContentType( page.getMimeType() + "; charset=" + page.getCharacterEncoding() );
79             inResponse.setHeader("Cache-Control","proxy-revalidate"); //must revalidate does not work well with IE7
80
//Since they cannot hit the back button on a form submit
81
}
82         else
83         {
84             String JavaDoc mime = page.getMimeType();
85             inResponse.setContentType( mime );
86         }
87
88         WebPageRequest context = createWebPageRequest( page, inRequest, inResponse, util );
89         beginRender(context);
90
91     }
92     
93     /**
94      * @see com.openedit.servlet.OpenEditEngine#hideFolders()
95      */

96     public boolean hideFolders()
97     {
98         return fieldHideFolders;
99     }
100     
101     /**
102      * @see com.openedit.servlet.OpenEditEngine#setHideFolders(boolean)
103      */

104     public void setHideFolders( boolean inFlag )
105     {
106         fieldHideFolders = inFlag;
107     }
108
109     protected Page getPage( String JavaDoc inPath ) throws OpenEditException
110     {
111         return getPageManager().getPage( inPath );
112     }
113     /**
114      * @see com.openedit.servlet.OpenEditEngine#beginRender(com.openedit.WebPageRequest)
115      */

116     public void beginRender(WebPageRequest pageRequest) throws OpenEditException
117     {
118         Page page = pageRequest.getPage();
119         PageStreamer pageStreamer = null;
120         try
121         {
122             pageStreamer = createPageStreamer( page,pageRequest );
123             executePathActions(pageRequest);
124             if( !pageRequest.hasRedirected())
125             {
126                 getModuleManager().executePageActions( page,pageRequest );
127             }
128             if( !pageRequest.hasRedirected())
129             {
130                 pageStreamer.render();
131             }
132         }
133         catch( Exception JavaDoc e )
134         {
135             log.error(e);
136             e.printStackTrace();
137             getErrorHandler().handleError( e, pageRequest );
138
139         }
140
141     }
142
143     /**
144      * @see com.openedit.servlet.OpenEditEngine#render(com.openedit.WebPageRequest)
145      
146     public void render( WebPageRequest inPageRequest ) throws OpenEditException
147     {
148             
149             //if ( inPageRequest.isViewable() ) //this should be done with an EnforcePrivlegeAction
150             //{
151                 //This needs to skip the actions for the content page
152                 //since those actions have already been fired off
153                 if ( !inPageRequest.hasRedirected() &&
154                     inPageRequest.getContentPage() != inPageRequest.getPage())
155                 {
156                     executePageActions( inPageRequest );
157                 }
158                 inPageRequest.getPage().generate(inPageRequest);
159             //}
160
161
162     }
163     */

164     /**
165      * @see com.openedit.servlet.OpenEditEngine#createPageStreamer(com.openedit.page.Page, com.openedit.WebPageRequest)
166      */

167     public PageStreamer createPageStreamer( Page inPage, WebPageRequest inPageRequest ) throws OpenEditException
168     {
169         PageStreamer pageStreamer = new PageStreamer();
170         pageStreamer.setEngine( this );
171         
172         Output out = new Output();
173         out.setWriter((Writer JavaDoc)inPageRequest.getPageValue(PageRequestKeys.OUTPUT_WRITER));
174         out.setStream((OutputStream JavaDoc)inPageRequest.getPageValue(PageRequestKeys.OUTPUT_STREAM));
175         
176         pageStreamer.setOutput(out);
177         pageStreamer.setWebPageRequest( inPageRequest);
178         inPageRequest.putPageStreamer(pageStreamer );
179         return pageStreamer;
180     }
181
182
183     protected void checkEngineInit( HttpServletResponse JavaDoc inResponse ) throws IOException JavaDoc
184     {
185         if ( getPageManager() == null )
186         {
187             inResponse.getWriter().print(
188                 "<html>Server is not initialized, please check the logs for errors</html>");
189             return;
190         }
191     }
192     
193     protected WebPageRequest createWebPageRequest(
194             Page inPage,
195             HttpServletRequest JavaDoc inRequest,
196             HttpServletResponse JavaDoc inResponse, URLUtilities util) throws OpenEditException
197         {
198             HttpSession JavaDoc session = inRequest.getSession(true);
199             BaseWebPageRequest context = new BaseWebPageRequest();
200             context.putProtectedPageValue( PageRequestKeys.PAGE, inPage);
201             context.putProtectedPageValue(PageRequestKeys.CONTENT, inPage);
202             
203             // put standard servlet stuff into the context
204
context.putProtectedPageValue( PageRequestKeys.REQUEST, inRequest);
205             context.putProtectedPageValue( PageRequestKeys.RESPONSE, inResponse);
206             context.putProtectedPageValue( PageRequestKeys.SESSION, session);
207             context.setRequest(inRequest);
208             context.setResponse(inResponse);
209             context.setSession(session);
210
211             //Add item in session as page variables
212
context.putPageValues(new SessionMap(session));
213             try
214             {
215                 OutputStream JavaDoc os = inResponse.getOutputStream();
216                 context.putProtectedPageValue(PageRequestKeys.OUTPUT_STREAM, os);
217                 // Also make a writer
218
String JavaDoc encoding = inPage.getCharacterEncoding();
219                 if ( encoding != null)
220                 {
221                     //TODO: Benchmark using a new BufferedWriter(new OutputStreamWriter(os,encoding) ); I hate too many buffers
222
Writer JavaDoc writer = new OutputStreamWriter JavaDoc(os,encoding);
223                     context.putProtectedPageValue(PageRequestKeys.OUTPUT_WRITER, writer);
224                 }
225                 else
226                 {
227                     Writer JavaDoc writer = new OutputStreamWriter JavaDoc(os ); //uses the server default LANG env variable
228
context.putProtectedPageValue(PageRequestKeys.OUTPUT_WRITER, writer);
229                 }
230             }
231             catch (IOException JavaDoc ex)
232             {
233                 log.error( ex );
234                 throw new OpenEditException(ex);
235             }
236             // add the URLUtilities to the context
237
context.putProtectedPageValue(PageRequestKeys.URL_UTILITIES, util);
238             context.putProtectedPageValue( PageRequestKeys.WEB_SERVER_PATH, util.buildRoot() );
239
240             context.putProtectedPageValue(PageRequestKeys.HOME, util.relativeHomePrefix());
241
242             
243             if( inPage.isHtml() ) //TODO: Move all this to an action
244
{
245                 context.putProtectedPageValue( "version", getVersion());
246     
247                 // urlpath is the address the link came in on
248
String JavaDoc path = PathUtilities.extractDirectoryPath(inPage.getPath());
249                 context.putProtectedPageValue(PageRequestKeys.URL_PATH, util.relativeHomePrefix() + path);
250     
251                 // filepath is the address a page within the template might live on
252
context.putProtectedPageValue(PageRequestKeys.FILE_PATH, path);
253                 //add in browser info
254
Browser browser = new Browser(inRequest.getHeader("User-Agent"));
255                 browser.setLocale( inRequest.getLocale() );
256                 context.putProtectedPageValue(PageRequestKeys.BROWSER, browser);
257         
258                 // Add the ClassTool in so we can instantiate objects in Velocity
259
// Instantiate page and session values, if necessary, and add them to the Velocity context
260
SessionTool sessionTool = new SessionTool( context, getModuleManager() );
261                 context.putProtectedPageValue(PageRequestKeys.CLASSTOOL, sessionTool );
262             }
263
264             return context;
265         }
266
267     //TODO: move to Relect.onSession actions
268
/* public void reflectOnSessionObjects( WebPageRequest inContext ) throws OpenEditException
269     {
270         getReflector().reflectOnSessionObjects( inContext );
271     }
272 */

273     /**
274      * @see com.openedit.servlet.OpenEditEngine#executePageActions(com.openedit.WebPageRequest)
275      */

276     public void executePageActions( WebPageRequest inPageRequest ) throws OpenEditException
277     {
278         getModuleManager().executePageActions( inPageRequest.getPage(),inPageRequest );
279     }
280     /**
281      * @see com.openedit.servlet.OpenEditEngine#executePathActions(com.openedit.WebPageRequest)
282      */

283     public void executePathActions( WebPageRequest inPageRequest ) throws OpenEditException
284     {
285         getModuleManager().executePathActions( inPageRequest.getPage(), inPageRequest );
286     }
287     
288     /**
289      * @see com.openedit.servlet.OpenEditEngine#getModuleManager()
290      */

291     public ModuleManager getModuleManager()
292     {
293         return fieldModuleManager;
294     }
295     /**
296      * @see com.openedit.servlet.OpenEditEngine#setModuleManager(com.openedit.ModuleManager)
297      */

298     public void setModuleManager( ModuleManager moduleManager )
299     {
300         fieldModuleManager = moduleManager;
301     }
302     /**
303      * @see com.openedit.servlet.OpenEditEngine#getPageManager()
304      */

305     public PageManager getPageManager()
306     {
307         return fieldPageManager;
308     }
309     /**
310      * @see com.openedit.servlet.OpenEditEngine#setPageManager(com.openedit.page.manage.PageManager)
311      */

312     public void setPageManager( PageManager pageManager )
313     {
314         fieldPageManager = pageManager;
315     }
316     /*
317     public Reflector getReflector()
318     {
319         if ( fieldReflector == null )
320         {
321             fieldReflector = new Reflector();
322         }
323         return fieldReflector;
324     }
325     public void setReflector( Reflector reflector )
326     {
327         fieldReflector = reflector;
328     }
329     
330     public ServletContext getServletContext()
331     {
332         return fieldServletContext;
333     }
334     public void setServletContext( ServletContext servletContext )
335     {
336         fieldServletContext = servletContext;
337     }
338     */

339
340     /**
341      * @see com.openedit.servlet.OpenEditEngine#getWelcomePath()
342      */

343     public String JavaDoc getWelcomePath()
344     {
345         return fieldWelcomePath;
346     }
347     /**
348      * @see com.openedit.servlet.OpenEditEngine#setWelcomePath(java.lang.String)
349      */

350     public void setWelcomePath( String JavaDoc welcomePath )
351     {
352         fieldWelcomePath = welcomePath;
353     }
354     /**
355      * @see com.openedit.servlet.OpenEditEngine#getErrorHandler()
356      */

357     public ErrorHandler getErrorHandler()
358     {
359         return fieldErrorHandler;
360     }
361     /**
362      * @see com.openedit.servlet.OpenEditEngine#setErrorHandler(com.openedit.error.ErrorHandler)
363      */

364     public void setErrorHandler( ErrorHandler errorHandler )
365     {
366         fieldErrorHandler = errorHandler;
367     }
368     /**
369      * @see com.openedit.servlet.OpenEditEngine#getVersion()
370      */

371     /*
372     protected boolean requireVersion(int majorVersion, int minorVersion)
373     {
374         ServletContext servletContext = getServletContext();
375         return (
376             (servletContext.getMajorVersion() > majorVersion)
377                 || (servletContext.getMajorVersion() == majorVersion
378                     && servletContext.getMinorVersion() >= minorVersion));
379     }
380     */

381     public String JavaDoc getVersion()
382     {
383         if (fieldVersion == null)
384         {
385             Package JavaDoc thisPackage = getClass().getPackage();
386             if (thisPackage != null)
387             {
388                 fieldVersion = thisPackage.getImplementationVersion();
389             }
390             if (fieldVersion == null)
391             {
392                 fieldVersion = "dev";
393             }
394         }
395         return fieldVersion;
396     }
397
398     /**
399      * @see com.openedit.servlet.OpenEditEngine#shutdown()
400      */

401     public void shutdown()
402     {
403         for (Iterator JavaDoc iter = getModuleManager().getLoadedBeans().iterator(); iter.hasNext();)
404         {
405             Object JavaDoc module = (Object JavaDoc) iter.next();
406             if( module instanceof Shutdownable)
407             {
408                 ((Shutdownable)module).shutdown();
409             }
410         }
411     }
412     
413 }
414
Free Books   Free Magazines  
Popular Tags