1 package org.apache.slide.projector.engine; 2 3 import java.io.FileInputStream ; 4 import java.io.FileNotFoundException ; 5 import java.io.IOException ; 6 import java.util.HashMap ; 7 import java.util.Map ; 8 import java.util.Random ; 9 import java.util.logging.Level ; 10 import java.util.logging.Logger ; 11 12 import javax.servlet.ServletConfig ; 13 import javax.servlet.ServletException ; 14 import javax.servlet.http.HttpServlet ; 15 import javax.servlet.http.HttpServletRequest ; 16 import javax.servlet.http.HttpServletResponse ; 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 { 37 private static Logger logger = Logger.getLogger(ProcessServlet.class.getName()); 38 public final static URIValue DEFAULT_EXCEPTION_PROCESSOR = new URIValue("exception.html"); 39 private final static Random random = new Random (System.currentTimeMillis()); 40 private final static String allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 41 42 public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException , IOException { 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 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 processIdBuffer = new StringBuffer (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 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 (requestParameters), context); 78 } catch ( Exception exception ) { 79 logger.log(Level.SEVERE, "Exception while processing processor with URI="+uri+"", exception); 80 processor = ProcessorManager.getInstance().getProcessor(DEFAULT_EXCEPTION_PROCESSOR); 81 Map exceptionParameters = new HashMap (); 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 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 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 config) { 110 String filename = config.getInitParameter("configuration"); 111 try { 112 Projector.configure(new FileInputStream (filename)); 113 } catch (ConfigurationException e) { 114 logger.log(Level.SEVERE, "Invalid projector configuration. Projector not started!", e); 115 } catch (FileNotFoundException e) { 116 logger.log(Level.SEVERE, "Projector configuration file projector.xml not found. Projector not started!", e); 117 } 118 } 119 } | Popular Tags |