View Javadoc

1   package br.com.ibnetwork.guara;
2   
3   import java.io.IOException;
4   import java.util.Map;
5   
6   import javax.servlet.ServletConfig;
7   import javax.servlet.ServletContext;
8   import javax.servlet.ServletException;
9   import javax.servlet.http.HttpServlet;
10  import javax.servlet.http.HttpServletRequest;
11  import javax.servlet.http.HttpServletResponse;
12  
13  import org.apache.commons.lang.exception.ExceptionUtils;
14  import org.apache.commons.logging.Log;
15  import org.apache.commons.logging.LogFactory;
16  
17  
18  import br.com.ibnetwork.guara.pipeline.Pipeline;
19  import br.com.ibnetwork.guara.pipeline.PipelineException;
20  
21  import br.com.ibnetwork.guara.pipeline.PipelineManager;
22  import br.com.ibnetwork.guara.rundata.RunData;
23  import br.com.ibnetwork.guara.rundata.RunDataPool;
24  import br.com.ibnetwork.guara.view.Context;
25  import br.com.ibnetwork.guara.view.TemplateEngine;
26  import br.com.ibnetwork.guara.view.TemplateUtils;
27  import br.com.ibnetwork.xingu.container.Container;
28  import br.com.ibnetwork.xingu.container.ContainerUtils;
29  
30  /***
31   * @author <a href="mailto:leandro@ibnetwork.com.br">leandro</a>
32   */
33  public class Guara 
34  	extends HttpServlet
35  {
36      private static final String CONTEXT_KEY = "guara.servlet";
37  
38      private Log logger = LogFactory.getLog(Guara.class);
39      
40      private static ServletContext context;
41      
42      private Pipeline defaultPipeline;
43  
44      private Map pipelineMap;
45      
46      private Container container;
47  
48      private RunDataPool runDataPool;
49      
50      private TemplateEngine engine;
51      
52      private String onErrorTemplate;
53  
54      public void doPost(HttpServletRequest request, HttpServletResponse response)
55      	throws ServletException, IOException
56      {
57          doGet(request,response);
58      }
59      
60      public void doGet(HttpServletRequest request, HttpServletResponse response)
61      	throws ServletException, IOException
62      {
63          //1. create runData
64          RunData runData = runDataPool.create(request,response,getServletConfig());
65          
66          //2. select pipeline by name 
67          Pipeline pipeline = getPipelineFromRequest(runData);
68          
69          //3. execute pipeline
70          try
71          {
72              pipeline.execute(runData);    
73          }
74          catch(PipelineException pex)
75          {
76          	Context ctx = runData.getContext();
77          	ctx.put("throwable",pex);
78          	ctx.put("stackTrace",ExceptionUtils.getStackTrace(pex));
79          	TemplateUtils.renderOutput(engine,runData,onErrorTemplate);
80          	logger.error("error executing guara pipeline",pex);
81          }
82          
83          //3. we are done !
84          runDataPool.returnRunData(runData);
85      }
86  
87  
88      private Pipeline getPipelineFromRequest(RunData runData)
89      {
90          Pipeline pipeline = runData.getPipeline();
91          return pipeline != null ? pipeline : defaultPipeline;
92      }
93  
94      public void init(ServletConfig config) 
95      	throws ServletException
96      {
97          super.init(config);
98          context = config.getServletContext();
99          String fileName = config.getInitParameter("pulgaConfiguration");
100         if(fileName == null)
101         {
102             fileName = "pulga.xml";
103         }
104         fileName = getRealPath(fileName);
105         logger.info("Initializing pulga using file: " + fileName);
106         try
107         {
108             container = ContainerUtils.createContainer(fileName);
109             engine = (TemplateEngine) container.lookup(TemplateEngine.ROLE);
110             onErrorTemplate = engine.getOnErrorTemplate();
111             PipelineManager pipelineManager = (PipelineManager) container.lookup(PipelineManager.ROLE);
112             pipelineMap = pipelineManager.getPipelineMap();
113             defaultPipeline = (Pipeline) pipelineMap.get(Pipeline.DEFAULT_PIPELINE_NAME);
114             runDataPool = (RunDataPool) container.lookup(RunDataPool.ROLE);
115             context.setAttribute(CONTEXT_KEY,this);
116         }
117         catch (Exception e)
118         {
119             logger.error("Error creating container. System is unusable",e);
120             e.printStackTrace();
121             throw new ServletException("Error creating container. System is unusable",e);
122         }
123     }
124 
125     public void destroy()
126     {
127         logger.info("Stopping guara");
128         super.destroy();
129         container.stop();
130     }
131     
132     public static String getRealPath(String resourceName)
133     {
134         if(resourceName == null)
135         {
136             return null;
137         }
138         String path = context.getRealPath(resourceName); 
139         return path;
140     }
141 }