KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > slide > projector > engine > ProcessServlet


1 package org.apache.slide.projector.engine;
2
3 import java.io.FileInputStream JavaDoc;
4 import java.io.FileNotFoundException JavaDoc;
5 import java.io.IOException JavaDoc;
6 import java.util.HashMap JavaDoc;
7 import java.util.Map JavaDoc;
8 import java.util.Random JavaDoc;
9 import java.util.logging.Level JavaDoc;
10 import java.util.logging.Logger JavaDoc;
11
12 import javax.servlet.ServletConfig JavaDoc;
13 import javax.servlet.ServletException JavaDoc;
14 import javax.servlet.http.HttpServlet JavaDoc;
15 import javax.servlet.http.HttpServletRequest JavaDoc;
16 import javax.servlet.http.HttpServletResponse JavaDoc;
17
18 import org.apache.slide.projector.ConfigurationException;
19 import org.apache.slide.projector.Constants;
20 import org.apache.slide.projector.Context;
21 import org.apache.slide.projector.HttpContext;
22 import org.apache.slide.projector.Processor;
23 import org.apache.slide.projector.Projector;
24 import org.apache.slide.projector.Result;
25 import org.apache.slide.projector.URI;
26 import org.apache.slide.projector.application.ApplicationManager;
27 import org.apache.slide.projector.descriptor.ParameterDescriptor;
28 import org.apache.slide.projector.processor.SimpleProcessor;
29 import org.apache.slide.projector.processor.core.ExceptionRenderer;
30 import org.apache.slide.projector.util.StreamHelper;
31 import org.apache.slide.projector.value.ObjectValue;
32 import org.apache.slide.projector.value.StreamableValue;
33 import org.apache.slide.projector.value.URIValue;
34 import org.apache.slide.projector.value.Value;
35
36 public class ProcessServlet extends HttpServlet JavaDoc {
37     private static Logger JavaDoc logger = Logger.getLogger(ProcessServlet.class.getName());
38     public final static URIValue DEFAULT_EXCEPTION_PROCESSOR = new URIValue("exception.html");
39     private final static Random JavaDoc random = new Random JavaDoc(System.currentTimeMillis());
40     private final static String JavaDoc allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
41     
42     public void service(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) throws ServletException JavaDoc, IOException JavaDoc {
43         ApplicationManager.getInstance();
44         boolean sessionCreated = request.getSession(false) == null;
45         Context context = new HttpContext(request, response);
46         logger.log(Level.FINE, "Request uri=" + request.getRequestURI());
47         logger.log(Level.FINE, "Context path=" + request.getContextPath());
48         logger.log(Level.FINE, "Servlet path=" + request.getServletPath());
49         URI uri = new URIValue(request.getRequestURI().substring(request.getContextPath().length()+request.getServletPath().length()+1));
50         try {
51             Result result;
52             Processor processor;
53             try {
54                 logger.log(Level.FINE, "Processing started with URI=" + uri);
55                 Map JavaDoc requestParameters = request.getParameterMap();
56                 if ( requestParameters.containsKey(Constants.PROCESS_ID_PARAMETER) ) {
57                     context.setProcessId(requestParameters.get(Constants.PROCESS_ID_PARAMETER).toString());
58                 } else {
59                     StringBuffer JavaDoc processIdBuffer = new StringBuffer JavaDoc(Constants.PROCESS_ID_LENGTH);
60                     for ( int i = 0; i < Constants.PROCESS_ID_LENGTH; i++) {
61                         processIdBuffer.append(allowedChars.charAt(random.nextInt(allowedChars.length())));
62                     }
63                     context.setProcessId(processIdBuffer.toString());
64                 }
65                 processor = ProcessorManager.getInstance().getProcessor(uri);
66                 Scheduler.getInstance();
67                 Scheduler.setContext(context);
68                 if ( sessionCreated ) {
69                     // new session
70
Scheduler.getInstance().launchSessionJobs(context);
71                 }
72                 Scheduler.getInstance().launchRequestJobs(context);
73                 if ( ProcessorManager.getInstance().getProcessorDescriptor(uri).isBookmark() ) {
74                     context.setBookmark(uri);
75                 }
76                 ParameterDescriptor[] parameterDescriptors = processor.getParameterDescriptors();
77                 result = ProcessorManager.process(processor, new HashMap JavaDoc(requestParameters), context);
78             } catch ( Exception JavaDoc exception ) {
79                 logger.log(Level.SEVERE, "Exception while processing processor with URI="+uri+"", exception);
80                 processor = ProcessorManager.getInstance().getProcessor(DEFAULT_EXCEPTION_PROCESSOR);
81                 Map JavaDoc exceptionParameters = new HashMap JavaDoc();
82                 exceptionParameters.put(ExceptionRenderer.EXCEPTION, new ObjectValue(exception));
83                 result = ProcessorManager.process(processor, exceptionParameters, context);
84             }
85             Value presentableResource = ((HttpContext)context).getPresentableResource();
86             if (presentableResource == null) {
87                 // check for 'output' resource in processor result
88
presentableResource = (Value)result.getResultEntries().get(SimpleProcessor.OUTPUT);
89             }
90             if ( presentableResource != null ) {
91                 if ( presentableResource instanceof StreamableValue ) {
92                     response.setContentType(((StreamableValue)presentableResource).getContentType()+"; charset=UTF-8");
93                     response.setContentLength(((StreamableValue)presentableResource).getContentLength());
94                     StreamHelper.copy(((StreamableValue)presentableResource).getInputStream(), response.getOutputStream());
95                     if (!((StreamableValue)presentableResource).isDocument()) {
96                         logger.log(Level.FINE, "You received a fragment on top level, no complete document!");
97                     }
98                 }
99             } else {
100                 logger.log(Level.SEVERE, "No renderable resource composed!");
101             }
102         } catch (Exception JavaDoc e) {
103             logger.log(Level.SEVERE, "Exception while processing request", e);
104         } finally {
105             Scheduler.setContext(null);
106         }
107     }
108     
109     public void init(ServletConfig JavaDoc config) {
110         String JavaDoc filename = config.getInitParameter("configuration");
111         try {
112             Projector.configure(new FileInputStream JavaDoc(filename));
113         } catch (ConfigurationException e) {
114             logger.log(Level.SEVERE, "Invalid projector configuration. Projector not started!", e);
115         } catch (FileNotFoundException JavaDoc e) {
116             logger.log(Level.SEVERE, "Projector configuration file projector.xml not found. Projector not started!", e);
117         }
118     }
119 }
Popular Tags