6 import javax.servlet.http.*;
7 import freemarker.template.*;
9 import mir.servlet.ServletModuleException;
17 * Abstrakte Klasse ServletModule stellt die Basisfunktionalitaet der
18 * abgeleiteten ServletModule zur Verfügung.
24 public abstract class ServletModule {
26 public String defaultAction;
27 protected Logfile theLog;
28 protected AbstractModule mainModule;
29 protected String templateListString;
30 protected String templateObjektString;
31 protected String templateConfirmString;
34 * Singelton - Methode muss in den abgeleiteten Klassen ueberschrieben werden.
35 * @return ServletModule
37 public static ServletModule getInstance() { return null; }
40 * get the session binded language
42 public String getLanguage(HttpServletRequest req){
43 HttpSession session = req.getSession(false);
44 String language = (String)session.getAttribute("Language");
46 language=MirConfig.getProp("StandardLanguage");
51 // ACHTUNG DEPRECATED::::
52 public void process(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException {}
57 * list(req,res) - generische Listmethode. Wennn die Funktionalitaet
58 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
59 * ueberschreiben werden.
61 * @param req Http-Request, das vom Dispatcher durchgereicht wird
62 * @param res Http-Response, die vom Dispatcher durchgereicht wird
64 public void list(HttpServletRequest req, HttpServletResponse res)
65 throws ServletModuleException {
68 String offsetParam = req.getParameter("offset");
70 PrintWriter out = res.getWriter();
72 // hier offsetcode bearbeiten
73 if (offsetParam != null && !offsetParam.equals("")){
74 offset = Integer.parseInt(offsetParam);
76 if (req.getParameter("next") != null){
77 offset=Integer.parseInt(req.getParameter("nextoffset"));
79 if (req.getParameter("prev") != null){
80 offset = Integer.parseInt(req.getParameter("prevoffset"));
83 theList = mainModule.getByWhereClause(null, offset);
84 //theList = mainModule.getByWhereClause((String)null, offset);
85 if (theList == null || theList.getCount() == 0 || theList.getCount()>1){
86 HTMLTemplateProcessor.process(res,getLanguage(req)+"/"+templateListString, theList, out);
88 deliver(req, res, theList.elementAt(0), templateObjektString);
90 } catch (Exception e) {
91 throw new ServletModuleException(e.toString());
96 * add(req,res) - generische Addmethode. Wennn die Funktionalitaet
97 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
98 * ueberschreiben werden.
99 * @param req Http-Request, das vom Dispatcher durchgereicht wird
100 * @param res Http-Response, die vom Dispatcher durchgereicht wird
102 public void add(HttpServletRequest req, HttpServletResponse res)
103 throws ServletModuleException {
106 SimpleHash mergeData = new SimpleHash();
107 mergeData.put("new", "1");
108 deliver(req, res, mergeData, templateObjektString);
109 } catch (Exception e) {
110 throw new ServletModuleException(e.toString());
115 * insert(req,res) - generische Insertmethode, folgt auf add.
116 * Wennn die Funktionalitaet
117 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
118 * ueberschreiben werden.
120 * @param req Http-Request, das vom Dispatcher durchgereicht wird
121 * @param res Http-Response, die vom Dispatcher durchgereicht wird
123 public void insert(HttpServletRequest req, HttpServletResponse res)
124 throws ServletModuleException {
126 HashMap withValues = getIntersectingValues(req, mainModule.getStorageObject());
127 String id = mainModule.add(withValues);
128 // theLog.printDebugInfo("--trying to deliver..."+id);
130 //deliver(req, res, mainModule.getById(id), templateObjektString);
132 catch (Exception e) { throw new ServletModuleException(e.toString());}
136 * delete(req,res) - generische Deletemethode. Wennn die Funktionalitaet
137 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
138 * ueberschreiben werden.
140 * @param req Http-Request, das vom Dispatcher durchgereicht wird
141 * @param res Http-Response, die vom Dispatcher durchgereicht wird
144 public void delete(HttpServletRequest req, HttpServletResponse res)
145 throws ServletModuleException
148 String idParam = req.getParameter("id");
149 if (idParam == null) throw new ServletModuleException("Falscher Aufruf: (id) nicht angegeben");
150 // Hier code zum Loeschen
151 String confirmParam = req.getParameter("confirm");
152 String cancelParam = req.getParameter("cancel");
153 if (confirmParam == null && cancelParam == null) {
154 // HTML Ausgabe zum Confirmen!
155 SimpleHash mergeData = new SimpleHash();
156 String moduleClassName = mainModule.getClass().getName();
157 int i = moduleClassName.indexOf(".Module");
158 String moduleName = moduleClassName.substring(i+7);
159 mergeData.put("module", moduleName);
160 mergeData.put("infoString", moduleName + ": " + idParam);
161 mergeData.put("id", idParam);
162 mergeData.put("where", req.getParameter("where"));
163 mergeData.put("order", req.getParameter("order"));
164 mergeData.put("offset", req.getParameter("offset"));
165 deliver(req, res, mergeData,templateConfirmString);
167 if (confirmParam!= null && !confirmParam.equals("")) {
168 //theLog.printInfo("delete confirmed!");
169 mainModule.deleteById(idParam);
170 list(req,res); // back to list
172 if (req.getParameter("where") != null)
178 } catch (Exception e) {
179 throw new ServletModuleException(e.toString());
184 * edit(req,res) - generische Editmethode. Wennn die Funktionalitaet
185 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
186 * ueberschreiben werden.
188 * @param req Http-Request, das vom Dispatcher durchgereicht wird
189 * @param res Http-Response, die vom Dispatcher durchgereicht wird
191 public void edit(HttpServletRequest req, HttpServletResponse res)
192 throws ServletModuleException {
194 String idParam = req.getParameter("id");
195 deliver(req, res, mainModule.getById(idParam), templateObjektString);
196 } catch(ModuleException e) {
197 throw new ServletModuleException(e.toString());
202 * update(req,res) - generische Updatemethode. Wennn die Funktionalitaet
203 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
204 * ueberschreiben werden.
206 * @param req Http-Request, das vom Dispatcher durchgereicht wird
207 * @param res Http-Response, die vom Dispatcher durchgereicht wird
210 public void update(HttpServletRequest req, HttpServletResponse res)
211 throws ServletModuleException {
213 String idParam = req.getParameter("id");
214 HashMap withValues = getIntersectingValues(req, mainModule.getStorageObject());
215 String id = mainModule.set(withValues);
216 //theLog.printInfo("Showing Entity with id: " + id);
218 String whereParam = req.getParameter("where");
219 String orderParam = req.getParameter("order");
220 if ((whereParam!=null && !whereParam.equals("")) || (orderParam!=null && !orderParam.equals(""))){
221 //theLog.printDebugInfo("update to list");
227 } catch (Exception e) {
228 throw new ServletModuleException(e.toString());
234 public void predeliver(HttpServletResponse res, TemplateModelRoot rtm, String tmpl)
235 throws ServletModuleException {
237 PrintWriter out = new LineFilterWriter(res.getWriter());
238 StringWriter a = new StringWriter();
239 deliver(new PrintWriter(a),rtm,tmpl);
240 out.write(a.toString());
242 } catch (Exception e) {
243 e.printStackTrace();System.err.println(e.toString());
249 * deliver liefert das Template mit dem Filenamen templateFilename
250 * an den HttpServletResponse res aus, nachdem es mit den Daten aus
251 * TemplateModelRoot rtm gemischt wurde
253 * @param res Http-Response, die vom Dispatcher durchgereicht wird
254 * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den
255 * Daten, die ins Template gemerged werden sollen.
256 * @param tmpl Name des Templates
257 * @exception ServletModuleException
259 public void deliver(HttpServletRequest req, HttpServletResponse res, TemplateModelRoot rtm, String templateFilename)
260 throws ServletModuleException {
261 if (rtm == null) rtm = new SimpleHash();
263 //PrintWriter out = new LineFilterWriter(res.getWriter());
264 PrintWriter out = res.getWriter();
265 HTMLTemplateProcessor.process(res,getLanguage(req)+"/"+templateFilename, rtm , out);
267 } catch (HTMLParseException e) {
268 throw new ServletModuleException(e.toString());
269 } catch (IOException e) {
270 throw new ServletModuleException(e.toString());
274 * deliver liefert das Template mit dem Filenamen templateFilename
275 * an den HttpServletResponse res aus, nachdem es mit den Daten aus
276 * TemplateModelRoot rtm gemischt wurde
278 * @param res Http-Response, die vom Dispatcher durchgereicht wird
279 * @param entity Entity, aus der die Daten, die ins Template gemerged werden sollen.
280 * @param tmpl Name des Templates
281 * @exception ServletModuleException
283 public void deliver(HttpServletRequest req, HttpServletResponse res, Entity ent, String templateFilename)
284 throws ServletModuleException {
285 deliver(req, res,HTMLTemplateProcessor.makeSimpleHash(ent), templateFilename);
289 * deliver liefert das Template mit dem Filenamen templateFilename
290 * an den HttpServletResponse res aus, nachdem es mit den Daten aus
291 * TemplateModelRoot rtm gemischt wurde
293 * @param out ist der OutputStream, in den die gergten Daten geschickt werden sollen.
294 * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den
295 * Daten, die ins Template gemerged werden sollen.
296 * @param tmpl Name des Templates
297 * @exception ServletModuleException
299 private void deliver(HttpServletResponse res,HttpServletRequest req, PrintWriter out, TemplateModelRoot rtm, String templateFilename)
300 throws HTMLParseException {
301 HTMLTemplateProcessor.process(res,getLanguage(req)+"/"+templateFilename, rtm , out);
305 * Wenn die abgeleitete Klasse diese Methode ueberschreibt und einen String mit einem
306 * Methodennamen zurueckliefert, dann wird diese Methode bei fehlender Angabe des
307 * doParameters ausgefuehrt.
309 * @return Name der Default-Action
311 public String defaultAction() { return defaultAction; }
314 * Hier kann vor der Datenaufbereitung schon mal ein response geschickt
315 * werden (um das subjektive Antwortverhalten bei langsamen Verbindungen
318 public void predeliver(HttpServletRequest req, HttpServletResponse res) { ; }
321 * Holt die Felder aus der Metadatenfelderliste des StorageObjects, die
322 * im HttpRequest vorkommen und liefert sie als HashMap zurueck
324 * @return HashMap mit den Werten
326 public HashMap getIntersectingValues(HttpServletRequest req, StorageObject theStorage)
327 throws ServletModuleException {
328 ArrayList theFieldList;
330 theFieldList = theStorage.getFields();
331 } catch (StorageObjectException e) {
332 throw new ServletModuleException("ServletModule.getIntersectingValues: " + e.toString());
335 HashMap withValues = new HashMap();
336 String aField, aValue;
338 for(int i=0; i<theFieldList.size();i++) {
339 aField = (String)theFieldList.get(i);
340 aValue = req.getParameter(aField);
341 if (aValue!=null) withValues.put(aField,aValue);