1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package com.fatwire.gst.foundation.controller;
17  
18  import static COM.FutureTense.Interfaces.Utilities.goodString;
19  
20  import java.io.PrintWriter;
21  import java.io.StringWriter;
22  
23  import javax.servlet.http.HttpServletResponse;
24  
25  import org.apache.commons.logging.Log;
26  import org.apache.commons.logging.LogFactory;
27  
28  import COM.FutureTense.Interfaces.FTVAL;
29  import COM.FutureTense.Interfaces.FTValList;
30  import COM.FutureTense.Interfaces.ICS;
31  import COM.FutureTense.Interfaces.IPS;
32  import COM.FutureTense.Util.ftErrors;
33  import COM.FutureTense.XML.Template.Seed2;
34  
35  import com.fatwire.gst.foundation.CSRuntimeException;
36  import com.fatwire.gst.foundation.DebugHelper;
37  import com.fatwire.gst.foundation.facade.runtag.render.Unknowndeps;
38  
39  
40  
41  
42  
43  
44  
45  public abstract class AbstractController implements Seed2 {
46      protected static final Log LOG = LogFactory.getLog("com.fatwire.gst.foundation.controller");
47  
48      public static final String STATUS_HEADER = "X-Fatwire-Status";
49  
50      protected ICS ics;
51      private FTValList vIn;
52  
53      
54  
55  
56  
57  
58  
59  
60  
61      public void SetAppLogic(final IPS ips) {
62          ics = ips.GetICSObject();
63  
64      }
65  
66      
67  
68  
69  
70  
71  
72  
73  
74      public final String Execute(final FTValList vIn, final FTValList vOut) {
75          this.vIn = vIn;
76          try {
77              doExecute();
78          } catch (final Exception e) {
79              handleException(e);
80          }
81  
82          return "";
83      }
84  
85      protected final FTVAL getInputArgument(String name) {
86          return vIn == null ? null : vIn.getVal(name);
87      }
88  
89      protected final String getInputArgumentAsString(String name) {
90          return vIn == null ? null : vIn.getValString(name);
91      }
92  
93      
94  
95  
96  
97  
98  
99  
100 
101     protected final String sendError(final int code, final Exception e) {
102         LOG.debug(code + " status code sent due to exception " + e.toString(), e);
103         if (LOG.isTraceEnabled()) {
104             DebugHelper.dumpVars(ics, LOG);
105         }
106         switch (code) { 
107         
108             case HttpServletResponse.SC_ACCEPTED:
109             case HttpServletResponse.SC_BAD_GATEWAY:
110             case HttpServletResponse.SC_BAD_REQUEST:
111             case HttpServletResponse.SC_CONFLICT:
112             case HttpServletResponse.SC_CONTINUE:
113             case HttpServletResponse.SC_CREATED:
114             case HttpServletResponse.SC_EXPECTATION_FAILED:
115             case HttpServletResponse.SC_FORBIDDEN:
116             case HttpServletResponse.SC_FOUND:
117             case HttpServletResponse.SC_GATEWAY_TIMEOUT:
118             case HttpServletResponse.SC_GONE:
119             case HttpServletResponse.SC_HTTP_VERSION_NOT_SUPPORTED:
120             case HttpServletResponse.SC_INTERNAL_SERVER_ERROR:
121             case HttpServletResponse.SC_LENGTH_REQUIRED:
122             case HttpServletResponse.SC_METHOD_NOT_ALLOWED:
123             case HttpServletResponse.SC_MOVED_PERMANENTLY:
124                 
125                 
126             case HttpServletResponse.SC_MULTIPLE_CHOICES:
127             case HttpServletResponse.SC_NO_CONTENT:
128             case HttpServletResponse.SC_NON_AUTHORITATIVE_INFORMATION:
129             case HttpServletResponse.SC_NOT_ACCEPTABLE:
130             case HttpServletResponse.SC_NOT_FOUND:
131             case HttpServletResponse.SC_NOT_IMPLEMENTED:
132             case HttpServletResponse.SC_NOT_MODIFIED:
133             case HttpServletResponse.SC_OK:
134             case HttpServletResponse.SC_PARTIAL_CONTENT:
135             case HttpServletResponse.SC_PAYMENT_REQUIRED:
136             case HttpServletResponse.SC_PRECONDITION_FAILED:
137             case HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED:
138             case HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE:
139             case HttpServletResponse.SC_REQUEST_TIMEOUT:
140             case HttpServletResponse.SC_REQUEST_URI_TOO_LONG:
141             case HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE:
142             case HttpServletResponse.SC_RESET_CONTENT:
143             case HttpServletResponse.SC_SEE_OTHER:
144             case HttpServletResponse.SC_SERVICE_UNAVAILABLE:
145             case HttpServletResponse.SC_SWITCHING_PROTOCOLS:
146             case HttpServletResponse.SC_TEMPORARY_REDIRECT:
147             case HttpServletResponse.SC_UNAUTHORIZED:
148             case HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE:
149             case HttpServletResponse.SC_USE_PROXY:
150                 ics.StreamHeader(STATUS_HEADER, Integer.toString(code));
151                 break;
152             default:
153                 ics.StreamHeader(STATUS_HEADER, "500");
154                 break;
155         }
156         Unknowndeps.unknonwDeps(ics);
157         
158         String element = null;
159 
160         if (goodString(ics.GetVar("site")) && ics.IsElement(ics.GetVar("site") + "/ErrorHandler/" + code)) {
161             element = ics.GetVar("site") + "/ErrorHandler/" + code;
162         } else if (ics.IsElement("GST/ErrorHandler/" + code)) {
163             element = "GST/ErrorHandler/" + code;
164         } else if (ics.IsElement("GST/ErrorHandler")) {
165             element = "GST/ErrorHandler";
166         }
167         if (element != null) {
168             ics.SetObj("com.fatwire.gst.foundation.exception", e);
169             ics.CallElement(element, null);
170             ics.SetObj("com.fatwire.gst.foundation.exception", null);
171         } else {
172             StringWriter sw = new StringWriter();
173             PrintWriter pw = new PrintWriter(sw);
174             e.printStackTrace(pw);
175             pw.flush();
176 
177             ics.StreamText("<h1>ERROR "+ code +"</h1><p>An error has been raised. <br/>Please add an element at GST/ErrorHandler to handle the display of this message differently.<br/></br><pre>"
178                     + sw.toString()
179                     + "</pre></p>");
180         }
181         ics.SetErrno(ftErrors.exceptionerr);
182 
183         return null;
184 
185     }
186 
187     
188 
189 
190 
191 
192 
193     abstract protected void doExecute();
194 
195     
196 
197 
198 
199 
200     abstract protected void handleException(Exception e);
201 }