2 * put your module comment here
12 import javax.servlet.http.*;
13 import freemarker.template.*;
15 import mir.servlet.ServletModuleException;
23 * Abstrakte Klasse ServletModule stellt die Basisfunktionalitaet der
24 * abgeleiteten ServletModule zur Verfügung.
30 public abstract class ServletModule {
32 public String defaultAction;
33 protected Logfile theLog;
34 protected AbstractModule mainModule;
35 protected String templateListString;
36 protected String templateObjektString;
37 protected String templateConfirmString;
40 * Singelton - Methode muss in den abgeleiteten Klassen ueberschrieben werden.
41 * @return ServletModule
43 public static ServletModule getInstance() { return null; }
46 * get the session binded language
48 public String getLanguage(HttpServletRequest req){
49 HttpSession session = req.getSession(true);
50 String language = (String)session.getAttribute("Language");
52 language=Configuration.getProperty("StandardLanguage");
57 // ACHTUNG DEPRECATED::::
58 public void process(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException {}
63 * list(req,res) - generische Listmethode. Wennn die Funktionalitaet
64 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
65 * ueberschreiben werden.
67 * @param req Http-Request, das vom Dispatcher durchgereicht wird
68 * @param res Http-Response, die vom Dispatcher durchgereicht wird
70 public void list(HttpServletRequest req, HttpServletResponse res)
71 throws ServletModuleException {
74 String offsetParam = req.getParameter("offset");
76 PrintWriter out = res.getWriter();
78 // hier offsetcode bearbeiten
79 if (offsetParam != null && !offsetParam.equals("")){
80 offset = Integer.parseInt(offsetParam);
82 if (req.getParameter("next") != null){
83 offset=Integer.parseInt(req.getParameter("nextoffset"));
85 if (req.getParameter("prev") != null){
86 offset = Integer.parseInt(req.getParameter("prevoffset"));
89 theList = mainModule.getByWhereClause(null, offset);
90 //theList = mainModule.getByWhereClause((String)null, offset);
91 if (theList == null || theList.getCount() == 0 || theList.getCount()>1){
92 HTMLTemplateProcessor.process(res,getLanguage(req)+"/"+templateListString, theList, out);
94 deliver(req, res, theList.elementAt(0), templateObjektString);
96 } catch (Exception e) {
97 throw new ServletModuleException(e.toString());
102 * add(req,res) - generische Addmethode. Wennn die Funktionalitaet
103 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
104 * ueberschreiben werden.
105 * @param req Http-Request, das vom Dispatcher durchgereicht wird
106 * @param res Http-Response, die vom Dispatcher durchgereicht wird
108 public void add(HttpServletRequest req, HttpServletResponse res)
109 throws ServletModuleException {
112 SimpleHash mergeData = new SimpleHash();
113 mergeData.put("new", "1");
114 deliver(req, res, mergeData, templateObjektString);
115 } catch (Exception e) {
116 throw new ServletModuleException(e.toString());
121 * insert(req,res) - generische Insertmethode, folgt auf add.
122 * Wennn die Funktionalitaet
123 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
124 * ueberschreiben werden.
126 * @param req Http-Request, das vom Dispatcher durchgereicht wird
127 * @param res Http-Response, die vom Dispatcher durchgereicht wird
129 public void insert(HttpServletRequest req, HttpServletResponse res)
130 throws ServletModuleException {
132 HashMap withValues = getIntersectingValues(req, mainModule.getStorageObject());
133 String id = mainModule.add(withValues);
134 // theLog.printDebugInfo("--trying to deliver..."+id);
136 //deliver(req, res, mainModule.getById(id), templateObjektString);
138 catch (Exception e) { throw new ServletModuleException(e.toString());}
142 * delete(req,res) - generische Deletemethode. Wennn die Funktionalitaet
143 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
144 * ueberschreiben werden.
146 * @param req Http-Request, das vom Dispatcher durchgereicht wird
147 * @param res Http-Response, die vom Dispatcher durchgereicht wird
150 public void delete(HttpServletRequest req, HttpServletResponse res)
151 throws ServletModuleException
154 String idParam = req.getParameter("id");
155 if (idParam == null) throw new ServletModuleException("Falscher Aufruf: (id) nicht angegeben");
156 // Hier code zum Loeschen
157 String confirmParam = req.getParameter("confirm");
158 String cancelParam = req.getParameter("cancel");
159 if (confirmParam == null && cancelParam == null) {
160 // HTML Ausgabe zum Confirmen!
161 SimpleHash mergeData = new SimpleHash();
162 String moduleClassName = mainModule.getClass().getName();
163 int i = moduleClassName.indexOf(".Module");
164 String moduleName = moduleClassName.substring(i+7);
165 mergeData.put("module", moduleName);
166 mergeData.put("infoString", moduleName + ": " + idParam);
167 mergeData.put("id", idParam);
168 mergeData.put("where", req.getParameter("where"));
169 mergeData.put("order", req.getParameter("order"));
170 mergeData.put("offset", req.getParameter("offset"));
171 deliver(req, res, mergeData,templateConfirmString);
173 if (confirmParam!= null && !confirmParam.equals("")) {
174 //theLog.printInfo("delete confirmed!");
175 mainModule.deleteById(idParam);
176 list(req,res); // back to list
178 if (req.getParameter("where") != null)
184 } catch (Exception e) {
185 throw new ServletModuleException(e.toString());
190 * edit(req,res) - generische Editmethode. Wennn die Funktionalitaet
191 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
192 * ueberschreiben werden.
194 * @param req Http-Request, das vom Dispatcher durchgereicht wird
195 * @param res Http-Response, die vom Dispatcher durchgereicht wird
197 public void edit(HttpServletRequest req, HttpServletResponse res)
198 throws ServletModuleException {
200 String idParam = req.getParameter("id");
201 deliver(req, res, mainModule.getById(idParam), templateObjektString);
202 } catch(ModuleException e) {
203 throw new ServletModuleException(e.toString());
208 * update(req,res) - generische Updatemethode. Wennn die Funktionalitaet
209 * nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
210 * ueberschreiben werden.
212 * @param req Http-Request, das vom Dispatcher durchgereicht wird
213 * @param res Http-Response, die vom Dispatcher durchgereicht wird
216 public void update(HttpServletRequest req, HttpServletResponse res)
217 throws ServletModuleException {
219 String idParam = req.getParameter("id");
220 HashMap withValues = getIntersectingValues(req, mainModule.getStorageObject());
221 String id = mainModule.set(withValues);
222 //theLog.printInfo("Showing Entity with id: " + id);
224 String whereParam = req.getParameter("where");
225 String orderParam = req.getParameter("order");
226 if ((whereParam!=null && !whereParam.equals("")) || (orderParam!=null && !orderParam.equals(""))){
227 //theLog.printDebugInfo("update to list");
233 } catch (Exception e) {
234 throw new ServletModuleException(e.toString());
240 public void predeliver(HttpServletResponse res, TemplateModelRoot rtm, String tmpl)
241 throws ServletModuleException {
243 PrintWriter out = new LineFilterWriter(res.getWriter());
244 StringWriter a = new StringWriter();
245 deliver(new PrintWriter(a),rtm,tmpl);
246 out.write(a.toString());
248 } catch (Exception e) {
249 e.printStackTrace();System.err.println(e.toString());
255 * deliver liefert das Template mit dem Filenamen templateFilename
256 * an den HttpServletResponse res aus, nachdem es mit den Daten aus
257 * TemplateModelRoot rtm gemischt wurde
259 * @param res Http-Response, die vom Dispatcher durchgereicht wird
260 * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den
261 * Daten, die ins Template gemerged werden sollen.
262 * @param tmpl Name des Templates
263 * @exception ServletModuleException
265 public void deliver(HttpServletRequest req, HttpServletResponse res, TemplateModelRoot rtm, String templateFilename)
266 throws ServletModuleException {
267 if (rtm == null) rtm = new SimpleHash();
269 //PrintWriter out = new LineFilterWriter(res.getWriter());
270 PrintWriter out = res.getWriter();
271 HTMLTemplateProcessor.process(res,getLanguage(req)+"/"+templateFilename, rtm , out);
273 } catch (HTMLParseException e) {
274 throw new ServletModuleException(e.toString());
275 } catch (IOException e) {
276 throw new ServletModuleException(e.toString());
280 * deliver liefert das Template mit dem Filenamen templateFilename
281 * an den HttpServletResponse res aus, nachdem es mit den Daten aus
282 * TemplateModelRoot rtm gemischt wurde
284 * @param res Http-Response, die vom Dispatcher durchgereicht wird
285 * @param entity Entity, aus der die Daten, die ins Template gemerged werden sollen.
286 * @param tmpl Name des Templates
287 * @exception ServletModuleException
289 public void deliver(HttpServletRequest req, HttpServletResponse res, Entity ent, String templateFilename)
290 throws ServletModuleException {
291 deliver(req, res,HTMLTemplateProcessor.makeSimpleHash(ent), templateFilename);
294 * deliver liefert das Template mit dem Filenamen templateFilename
295 * an den HttpServletResponse res aus, nachdem es mit den Daten aus
296 * TemplateModelRoot rtm gemischt wurde
298 * @param out ist der OutputStream, in den die gergten Daten geschickt werden sollen.
299 * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den
300 * Daten, die ins Template gemerged werden sollen.
301 * @param tmpl Name des Templates
302 * @exception ServletModuleException
304 private void deliver(HttpServletResponse res,HttpServletRequest req, PrintWriter out, TemplateModelRoot rtm, String templateFilename)
305 throws HTMLParseException {
306 HTMLTemplateProcessor.process(res,getLanguage(req)+"/"+templateFilename, rtm , out);
310 * Wenn die abgeleitete Klasse diese Methode ueberschreibt und einen String mit einem
311 * Methodennamen zurueckliefert, dann wird diese Methode bei fehlender Angabe des
312 * doParameters ausgefuehrt.
314 * @return Name der Default-Action
316 public String defaultAction() { return defaultAction; }
319 * Hier kann vor der Datenaufbereitung schon mal ein response geschickt
320 * werden (um das subjektive Antwortverhalten bei langsamen Verbindungen
323 public void predeliver(HttpServletRequest req, HttpServletResponse res) { ; }
326 * Holt die Felder aus der Metadatenfelderliste des StorageObjects, die
327 * im HttpRequest vorkommen und liefert sie als HashMap zurueck
329 * @return HashMap mit den Werten
331 public HashMap getIntersectingValues(HttpServletRequest req, StorageObject theStorage)
332 throws ServletModuleException {
333 ArrayList theFieldList;
335 theFieldList = theStorage.getFields();
336 } catch (StorageObjectException e) {
337 throw new ServletModuleException("ServletModule.getIntersectingValues: " + e.toString());
340 HashMap withValues = new HashMap();
341 String aField, aValue;
343 for(int i=0; i<theFieldList.size();i++) {
344 aField = (String)theFieldList.get(i);
345 aValue = req.getParameter(aField);
346 if (aValue!=null) withValues.put(aField,aValue);