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
64 RunData runData = runDataPool.create(request,response,getServletConfig());
65
66
67 Pipeline pipeline = getPipelineFromRequest(runData);
68
69
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
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 }