3 import freemarker.template.SimpleHash;
4 import freemarker.template.TemplateModelRoot;
5 import mir.entity.EntityList;
7 import mir.module.AbstractModule;
8 import mir.module.ModuleException;
9 import mir.storage.StorageObject;
10 import mir.storage.StorageObjectException;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 import javax.servlet.http.HttpSession;
15 import java.io.IOException;
16 import java.io.PrintWriter;
17 import java.util.ArrayList;
18 import java.util.HashMap;
19 import java.util.Locale;
23 * Abstract class ServletModule provides the base functionality for servlets.
24 * Deriving a class from ServletModule enables class to insert/edit/update/delete
25 * and list Entity from a Database via mainModule.
28 * Abstrakte Klasse ServletModule stellt die Basisfunktionalitaet der
29 * abgeleiteten ServletModule zur Verfügung.
35 public abstract class ServletModule {
37 public String defaultAction;
38 protected Logfile theLog;
39 protected AbstractModule mainModule;
40 protected String templateListString;
41 protected String templateObjektString;
42 protected String templateConfirmString;
45 * Singelton - Methode muss in den abgeleiteten Klassen ueberschrieben werden.
46 * @return ServletModule
48 public static ServletModule getInstance() {
53 * get the session binded language
55 public String getLanguage(HttpServletRequest req) {
56 HttpSession session = req.getSession(false);
57 String language = (String) session.getAttribute("Language");
58 if (language == null) {
59 language = MirConfig.getProp("StandardLanguage");
65 * get the locale either from the session or the accept-language header ot the request
66 * this supersedes getLanguage for the new i18n
68 public Locale getLocale(HttpServletRequest req) {
70 HttpSession session = req.getSession(false);
71 if (session != null) {
72 // session can be null in case of logout
73 loc = (Locale) session.getAttribute("Locale");
75 // if there is nothing in the session get it fron the accept-language
77 loc = req.getLocale();
82 // ACHTUNG DEPRECATED::::
83 public void process(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException {
88 * list(req,res) - generische Listmethode. Wennn die Funktionalitaet
89 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
90 * ueberschreiben werden.
92 * @param req Http-Request, das vom Dispatcher durchgereicht wird
93 * @param res Http-Response, die vom Dispatcher durchgereicht wird
95 public void list(HttpServletRequest req, HttpServletResponse res)
96 throws ServletModuleException {
99 String offsetParam = req.getParameter("offset");
101 PrintWriter out = res.getWriter();
103 // hier offsetcode bearbeiten
104 if (offsetParam != null && !offsetParam.equals("")) {
105 offset = Integer.parseInt(offsetParam);
107 if (req.getParameter("next") != null) {
108 offset = Integer.parseInt(req.getParameter("nextoffset"));
111 if (req.getParameter("prev") != null) {
112 offset = Integer.parseInt(req.getParameter("prevoffset"));
115 theList = mainModule.getByWhereClause(null, offset);
116 //theList = mainModule.getByWhereClause((String)null, offset);
117 if (theList == null || theList.getCount() == 0 || theList.getCount() > 1) {
118 HTMLTemplateProcessor.process(res, templateListString, theList, out, getLocale(req));
121 deliver(req, res, theList.elementAt(0), templateObjektString);
124 catch (Exception e) {
125 throw new ServletModuleException(e.toString());
130 * add(req,res) - generische Addmethode. Wennn die Funktionalitaet
131 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
132 * ueberschreiben werden.
133 * @param req Http-Request, das vom Dispatcher durchgereicht wird
134 * @param res Http-Response, die vom Dispatcher durchgereicht wird
136 public void add(HttpServletRequest req, HttpServletResponse res)
137 throws ServletModuleException {
140 SimpleHash mergeData = new SimpleHash();
141 mergeData.put("new", "1");
142 deliver(req, res, mergeData, templateObjektString);
144 catch (Exception e) {
145 throw new ServletModuleException(e.toString());
150 * insert(req,res) - generische Insertmethode, folgt auf add.
151 * Wennn die Funktionalitaet
152 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
153 * ueberschreiben werden.
155 * @param req Http-Request, das vom Dispatcher durchgereicht wird
156 * @param res Http-Response, die vom Dispatcher durchgereicht wird
158 public void insert(HttpServletRequest req, HttpServletResponse res)
159 throws ServletModuleException, ServletModuleUserException {
161 HashMap withValues = getIntersectingValues(req, mainModule.getStorageObject());
162 theLog.printDebugInfo("--trying to add...");
163 String id = mainModule.add(withValues);
164 theLog.printDebugInfo("--trying to deliver..." + id);
167 catch (Exception e) {
168 throw new ServletModuleException(e.toString());
173 * delete(req,res) - generische Deletemethode. Wennn die Funktionalitaet
174 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
175 * ueberschreiben werden.
177 * @param req Http-Request, das vom Dispatcher durchgereicht wird
178 * @param res Http-Response, die vom Dispatcher durchgereicht wird
181 public void delete(HttpServletRequest req, HttpServletResponse res)
182 throws ServletModuleException {
184 String idParam = req.getParameter("id");
185 if (idParam == null) throw new ServletModuleException("Falscher Aufruf: (id) nicht angegeben");
186 // Hier code zum Loeschen
187 String confirmParam = req.getParameter("confirm");
188 String cancelParam = req.getParameter("cancel");
189 if (confirmParam == null && cancelParam == null) {
190 // HTML Ausgabe zum Confirmen!
191 SimpleHash mergeData = new SimpleHash();
192 String moduleClassName = mainModule.getClass().getName();
193 int i = moduleClassName.indexOf(".Module");
194 String moduleName = moduleClassName.substring(i + 7);
195 mergeData.put("module", moduleName);
196 mergeData.put("infoString", moduleName + ": " + idParam);
197 mergeData.put("id", idParam);
198 mergeData.put("where", req.getParameter("where"));
199 mergeData.put("order", req.getParameter("order"));
200 mergeData.put("offset", req.getParameter("offset"));
201 deliver(req, res, mergeData, templateConfirmString);
204 if (confirmParam != null && !confirmParam.equals("")) {
205 //theLog.printInfo("delete confirmed!");
206 mainModule.deleteById(idParam);
207 list(req, res); // back to list
210 if (req.getParameter("where") != null)
217 catch (Exception e) {
218 throw new ServletModuleException(e.toString());
223 * edit(req,res) - generische Editmethode. Wennn die Funktionalitaet
224 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
225 * ueberschreiben werden.
227 * @param req Http-Request, das vom Dispatcher durchgereicht wird
228 * @param res Http-Response, die vom Dispatcher durchgereicht wird
230 public void edit(HttpServletRequest req, HttpServletResponse res)
231 throws ServletModuleException {
233 String idParam = req.getParameter("id");
234 deliver(req, res, mainModule.getById(idParam), templateObjektString);
236 catch (ModuleException e) {
237 throw new ServletModuleException(e.toString());
242 * update(req,res) - generische Updatemethode. Wennn die Funktionalitaet
243 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
244 * ueberschreiben werden.
246 * @param req Http-Request, das vom Dispatcher durchgereicht wird
247 * @param res Http-Response, die vom Dispatcher durchgereicht wird
250 public void update(HttpServletRequest req, HttpServletResponse res)
251 throws ServletModuleException {
253 String idParam = req.getParameter("id");
254 HashMap withValues = getIntersectingValues(req, mainModule.getStorageObject());
255 String id = mainModule.set(withValues);
256 //theLog.printInfo("Showing Entity with id: " + id);
258 String whereParam = req.getParameter("where");
259 String orderParam = req.getParameter("order");
260 if ((whereParam != null && !whereParam.equals("")) || (orderParam != null && !orderParam.equals(""))) {
261 //theLog.printDebugInfo("update to list");
269 catch (Exception e) {
270 throw new ServletModuleException(e.toString());
276 public void predeliver(HttpServletResponse res, TemplateModelRoot rtm, String tmpl)
277 throws ServletModuleException {
279 PrintWriter out = new LineFilterWriter(res.getWriter());
280 StringWriter a = new StringWriter();
281 deliver(new PrintWriter(a),rtm,tmpl);
282 out.write(a.toString());
284 } catch (Exception e) {
285 e.printStackTrace();System.err.println(e.toString());
291 * deliver liefert das Template mit dem Filenamen templateFilename
292 * an den HttpServletResponse res aus, nachdem es mit den Daten aus
293 * TemplateModelRoot rtm gemischt wurde
295 * @param res Http-Response, die vom Dispatcher durchgereicht wird
296 * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den
297 * Daten, die ins Template gemerged werden sollen.
298 * @param tmpl Name des Templates
299 * @exception ServletModuleException
301 public void deliver(HttpServletRequest req, HttpServletResponse res, TemplateModelRoot rtm, String templateFilename)
302 throws ServletModuleException {
303 if (rtm == null) rtm = new SimpleHash();
305 //PrintWriter out = new LineFilterWriter(res.getWriter());
306 PrintWriter out = res.getWriter();
307 HTMLTemplateProcessor.process(res, templateFilename, rtm, out, getLocale(req));
310 catch (HTMLParseException e) {
311 throw new ServletModuleException(e.toString());
313 catch (IOException e) {
314 throw new ServletModuleException(e.toString());
319 * deliver liefert das Template mit dem Filenamen templateFilename
320 * an den HttpServletResponse res aus, nachdem es mit den Daten aus
321 * TemplateModelRoot rtm gemischt wurde
323 * @param res Http-Response, die vom Dispatcher durchgereicht wird
324 * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den
325 * Daten, die ins Template gemerged werden sollen.
326 * @param tmpl Name des Templates
327 * @exception ServletModuleException
329 public void deliver_compressed(HttpServletRequest req, HttpServletResponse res, TemplateModelRoot rtm, String templateFilename)
330 throws ServletModuleException {
331 if (rtm == null) rtm = new SimpleHash();
333 PrintWriter out = new LineFilterWriter(res.getWriter());
334 //PrintWriter out = res.getWriter();
335 HTMLTemplateProcessor.process(res, templateFilename, rtm, out, getLocale(req));
338 catch (HTMLParseException e) {
339 throw new ServletModuleException(e.toString());
341 catch (IOException e) {
342 throw new ServletModuleException(e.toString());
347 * deliver liefert das Template mit dem Filenamen templateFilename
348 * an den HttpServletResponse res aus, nachdem es mit den Daten aus
349 * TemplateModelRoot rtm gemischt wurde
351 * @param out ist der OutputStream, in den die gergten Daten geschickt werden sollen.
352 * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den
353 * Daten, die ins Template gemerged werden sollen.
354 * @param tmpl Name des Templates
355 * @exception ServletModuleException
357 private void deliver(HttpServletResponse res, HttpServletRequest req, PrintWriter out, TemplateModelRoot rtm, String templateFilename)
358 throws HTMLParseException {
359 HTMLTemplateProcessor.process(res, templateFilename, rtm, out, getLocale(req));
363 * Wenn die abgeleitete Klasse diese Methode ueberschreibt und einen String mit einem
364 * Methodennamen zurueckliefert, dann wird diese Methode bei fehlender Angabe des
365 * doParameters ausgefuehrt.
367 * @return Name der Default-Action
369 public String defaultAction() {
370 return defaultAction;
374 * Hier kann vor der Datenaufbereitung schon mal ein response geschickt
375 * werden (um das subjektive Antwortverhalten bei langsamen Verbindungen
378 public void predeliver(HttpServletRequest req, HttpServletResponse res) {
383 * Holt die Felder aus der Metadatenfelderliste des StorageObjects, die
384 * im HttpRequest vorkommen und liefert sie als HashMap zurueck
386 * @return HashMap mit den Werten
388 public HashMap getIntersectingValues(HttpServletRequest req, StorageObject theStorage)
389 throws ServletModuleException {
390 ArrayList theFieldList;
392 theFieldList = theStorage.getFields();
394 catch (StorageObjectException e) {
395 throw new ServletModuleException("ServletModule.getIntersectingValues: " + e.toString());
398 HashMap withValues = new HashMap();
399 String aField, aValue;
401 for (int i = 0; i < theFieldList.size(); i++) {
402 aField = (String) theFieldList.get(i);
403 aValue = req.getParameter(aField);
404 if (aValue != null) withValues.put(aField, aValue);