Initial revision
[mir.git] / source / mir / servlet / ServletModule.java
diff --git a/source/mir/servlet/ServletModule.java b/source/mir/servlet/ServletModule.java
new file mode 100755 (executable)
index 0000000..a81d304
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+ * put your module comment here
+ *
+ */
+
+
+package  mir.servlet;
+
+import  java.io.*;
+import  java.lang.*;
+import  java.util.*;
+import  javax.servlet.http.*;
+import  freemarker.template.*;
+import  mir.storage.*;
+import  mir.servlet.ServletModuleException;
+import  mir.misc.*;
+import  mir.entity.*;
+import  mir.module.*;
+import  mir.misc.*;
+
+
+/**
+ *  Abstrakte Klasse ServletModule stellt die Basisfunktionalitaet der
+ *  abgeleiteten ServletModule zur Verfügung.
+ *
+ * @version 28.6.1999
+ * @author RK
+ */
+
+public abstract class ServletModule {
+
+       public String                 defaultAction;
+       protected Logfile             theLog;
+       protected AbstractModule      mainModule;
+       protected String              templateListString;
+       protected String              templateObjektString;
+       protected String              templateConfirmString;
+
+       /**
+        * Singelton - Methode muss in den abgeleiteten Klassen ueberschrieben werden.
+        * @return ServletModule
+        */
+       public static ServletModule getInstance() { return null; }
+
+  /**
+   * get the session binded language
+   */
+  public String getLanguage(HttpServletRequest req){
+    HttpSession session = req.getSession();
+    String language = (String)session.getAttribute("Language");
+               if(language==null){
+                       language=Configuration.getProperty("StandardLanguage");
+               }
+    return language;
+  }
+
+       // ACHTUNG DEPRECATED::::
+       public void process(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException {}
+
+
+
+       /**
+        *  list(req,res) - generische Listmethode. Wennn die Funktionalitaet
+        *  nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
+        *  ueberschreiben werden.
+        *
+        * @param req Http-Request, das vom Dispatcher durchgereicht wird
+        * @param res Http-Response, die vom Dispatcher durchgereicht wird
+        */
+       public void list(HttpServletRequest req, HttpServletResponse res)
+               throws ServletModuleException {
+               try {
+                       EntityList   theList;
+                       String       offsetParam = req.getParameter("offset");
+                       int          offset =0;
+                       PrintWriter out = res.getWriter();
+
+                       // hier offsetcode bearbeiten
+                       if (offsetParam != null) offset = Integer.parseInt(offsetParam);
+                       if (req.getParameter("next") != null)
+                                       offset=Integer.parseInt(req.getParameter("nextoffset"));
+                       else
+                                       if (req.getParameter("prev") != null)
+                                               offset = Integer.parseInt(req.getParameter("prevoffset"));
+                       theList = mainModule.getByWhereClause(null, offset);
+                       //theList = mainModule.getByWhereClause((String)null, offset);
+                       if (theList == null || theList.getCount() == 0 || theList.getCount()>1)
+                               HTMLTemplateProcessor.process(getLanguage(req)+"/"+templateListString, theList, out);
+                       else
+                               deliver(req, res, theList.elementAt(0), templateObjektString);
+               }       catch (Exception e) {
+                       throw new ServletModuleException(e.toString());
+               }
+       }
+
+       /**
+        *  add(req,res) - generische Addmethode. Wennn die Funktionalitaet
+        *  nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
+        *  ueberschreiben werden.
+        * @param req Http-Request, das vom Dispatcher durchgereicht wird
+        * @param res Http-Response, die vom Dispatcher durchgereicht wird
+        */
+       public void add(HttpServletRequest req, HttpServletResponse res)
+       throws ServletModuleException {
+
+               try {
+      SimpleHash mergeData = new SimpleHash();
+      mergeData.put("new", "1");
+      deliver(req, res, mergeData, templateObjektString);
+               } catch (Exception e) {
+      throw new ServletModuleException(e.toString());
+    }
+       }
+
+       /**
+        *  insert(req,res) - generische Insertmethode, folgt auf add.
+        *  Wennn die Funktionalitaet
+        *  nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
+        *  ueberschreiben werden.
+        *
+        * @param req Http-Request, das vom Dispatcher durchgereicht wird
+        * @param res Http-Response, die vom Dispatcher durchgereicht wird
+        */
+       public void insert(HttpServletRequest req, HttpServletResponse res)
+       throws ServletModuleException {
+       try {
+                       HashMap withValues = getIntersectingValues(req, mainModule.getStorageObject());
+                       String id = mainModule.add(withValues);
+                       // theLog.printDebugInfo("--trying to deliver..."+id);
+                       deliver(req, res, mainModule.getById(id), templateObjektString);
+               }
+               catch (Exception e) { throw new ServletModuleException(e.toString());}
+       }
+
+/**
+        *  delete(req,res) - generische Deletemethode. Wennn die Funktionalitaet
+        *  nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
+        *  ueberschreiben werden.
+        *
+        * @param req Http-Request, das vom Dispatcher durchgereicht wird
+        * @param res Http-Response, die vom Dispatcher durchgereicht wird
+        */
+
+       public void delete(HttpServletRequest req, HttpServletResponse res)
+       throws ServletModuleException
+       {
+               try {
+                       String idParam = req.getParameter("id");
+                       if (idParam == null) throw new ServletModuleException("Falscher Aufruf: (id) nicht angegeben");
+                       // Hier code zum Loeschen
+                       String confirmParam = req.getParameter("confirm");
+                       String cancelParam = req.getParameter("cancel");
+                       if (confirmParam == null && cancelParam == null) {
+                               // HTML Ausgabe zum Confirmen!
+                               SimpleHash mergeData = new SimpleHash();
+                               String moduleClassName = mainModule.getClass().getName();
+                               int i = moduleClassName.indexOf(".Module");
+                               String moduleName = moduleClassName.substring(i+7);
+                               mergeData.put("module", moduleName);
+                               mergeData.put("infoString", moduleName + ": " + idParam);
+                               mergeData.put("id", idParam);
+                               mergeData.put("where", req.getParameter("where"));
+                               mergeData.put("order", req.getParameter("order"));
+                               mergeData.put("offset", req.getParameter("offset"));
+                               deliver(req, res, mergeData,templateConfirmString);
+                       } else {
+                               if (confirmParam!= null && !confirmParam.equals("")) {
+                                       //theLog.printInfo("delete confirmed!");
+                                       mainModule.deleteById(idParam);
+                                       list(req,res); // back to list
+                               } else {
+                                       if (req.getParameter("where") != null)
+                                                       list(req,res);
+                                       else
+                                               edit(req,res);
+                               }
+                       }
+               } catch (Exception e) {
+      throw new ServletModuleException(e.toString());
+    }
+       }
+
+       /**
+        *  edit(req,res) - generische Editmethode. Wennn die Funktionalitaet
+        *  nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
+        *  ueberschreiben werden.
+        *
+        * @param req Http-Request, das vom Dispatcher durchgereicht wird
+        * @param res Http-Response, die vom Dispatcher durchgereicht wird
+        */
+  public void edit(HttpServletRequest req, HttpServletResponse res)
+         throws ServletModuleException {
+    try {
+           String idParam = req.getParameter("id");
+                       deliver(req, res, mainModule.getById(idParam), templateObjektString);
+    } catch(ModuleException e) {
+      throw new ServletModuleException(e.toString());
+    }
+  }
+
+/**
+        *  update(req,res) - generische Updatemethode. Wennn die Funktionalitaet
+        *  nicht reicht, muss sie in der abgeleiteten ServletModule-Klasse
+        *  ueberschreiben werden.
+        *
+        * @param req Http-Request, das vom Dispatcher durchgereicht wird
+        * @param res Http-Response, die vom Dispatcher durchgereicht wird
+        */
+
+       public void update(HttpServletRequest req, HttpServletResponse res)
+         throws ServletModuleException {
+               try {
+       String idParam = req.getParameter("id");
+      HashMap withValues = getIntersectingValues(req, mainModule.getStorageObject());
+      String id = mainModule.set(withValues);
+      //theLog.printInfo("Showing Entity with id: " + id);
+      //edit(req,res);
+      String whereParam = req.getParameter("where");
+      String orderParam = req.getParameter("order");
+      if ((whereParam!=null && !whereParam.equals("")) || (orderParam!=null && !orderParam.equals(""))){
+                 //theLog.printDebugInfo("update to list");
+               list(req,res);
+      } else {
+               edit(req, res);
+      }
+      //list(req,res);
+               } catch (Exception e) {
+      throw new ServletModuleException(e.toString());
+    }
+       }
+
+       // Hilfsprozeduren
+  /**
+       public void predeliver(HttpServletResponse res, TemplateModelRoot rtm, String tmpl)
+               throws ServletModuleException   {
+    try {
+      PrintWriter out = new LineFilterWriter(res.getWriter());
+      StringWriter a = new StringWriter();
+      deliver(new PrintWriter(a),rtm,tmpl);
+      out.write(a.toString());
+      out.flush();
+    }  catch (Exception e) {
+      e.printStackTrace();System.err.println(e.toString());
+    }
+       }
+  */
+
+       /**
+        * deliver liefert das Template mit dem Filenamen templateFilename
+        * an den HttpServletResponse res aus, nachdem es mit den Daten aus
+        * TemplateModelRoot rtm gemischt wurde
+        *
+        * @param res Http-Response, die vom Dispatcher durchgereicht wird
+        * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den
+        *   Daten, die ins Template gemerged werden sollen.
+        * @param tmpl Name des Templates
+        * @exception ServletModuleException
+        */
+       public void deliver(HttpServletRequest req, HttpServletResponse res, TemplateModelRoot rtm, String templateFilename)
+               throws ServletModuleException   {
+               if (rtm == null) rtm = new SimpleHash();
+               try {
+                       //PrintWriter out =  new LineFilterWriter(res.getWriter());
+                       PrintWriter out =  res.getWriter();
+                       HTMLTemplateProcessor.process(getLanguage(req)+"/"+templateFilename, rtm , out);
+                       out.close();
+               }       catch (HTMLParseException e) {
+                       throw new ServletModuleException(e.toString());
+               } catch (IOException e) {
+                       throw new ServletModuleException(e.toString());
+               }
+       }
+       /**
+        * deliver liefert das Template mit dem Filenamen templateFilename
+        * an den HttpServletResponse res aus, nachdem es mit den Daten aus
+        * TemplateModelRoot rtm gemischt wurde
+        *
+        * @param res Http-Response, die vom Dispatcher durchgereicht wird
+        * @param entity Entity, aus der die Daten, die ins Template gemerged werden sollen.
+        * @param tmpl Name des Templates
+        * @exception ServletModuleException
+        */
+       public void deliver(HttpServletRequest req, HttpServletResponse res, Entity ent, String templateFilename)
+               throws ServletModuleException   {
+               deliver(req, res,HTMLTemplateProcessor.makeSimpleHash(ent), templateFilename);
+       }
+       /**
+        * deliver liefert das Template mit dem Filenamen templateFilename
+        * an den HttpServletResponse res aus, nachdem es mit den Daten aus
+        * TemplateModelRoot rtm gemischt wurde
+        *
+        * @param out ist der OutputStream, in den die gergten Daten geschickt werden sollen.
+        * @param rtm beinahalten das freemarker.template.TempalteModelRoot mit den
+        *   Daten, die ins Template gemerged werden sollen.
+        * @param tmpl Name des Templates
+        * @exception ServletModuleException
+        */
+       private void deliver(HttpServletRequest req, PrintWriter out, TemplateModelRoot rtm, String templateFilename)
+    throws HTMLParseException {
+               HTMLTemplateProcessor.process(getLanguage(req)+"/"+templateFilename, rtm , out);
+       }
+
+       /**
+        *  Wenn die abgeleitete Klasse diese Methode ueberschreibt und einen String mit einem
+        *  Methodennamen zurueckliefert, dann wird diese Methode bei fehlender Angabe des
+        *  doParameters ausgefuehrt.
+        *
+        * @return Name der Default-Action
+        */
+       public String defaultAction() { return defaultAction; }
+
+               /**
+        *  Hier kann vor der Datenaufbereitung schon mal ein response geschickt
+        *  werden (um das subjektive Antwortverhalten bei langsamen Verbindungen
+        *  zu verbessern).
+        */
+       public void predeliver(HttpServletRequest req, HttpServletResponse res) { ; }
+
+       /**
+        * Holt die Felder aus der Metadatenfelderliste des StorageObjects, die
+        * im HttpRequest vorkommen und liefert sie als HashMap zurueck
+        *
+        * @return HashMap mit den Werten
+        */
+       public HashMap getIntersectingValues(HttpServletRequest req, StorageObject theStorage)
+               throws ServletModuleException   {
+               ArrayList theFieldList;
+               try {
+        theFieldList = theStorage.getFields();
+    } catch (StorageObjectException e) {
+                       throw new ServletModuleException("ServletModule.getIntersectingValues: " + e.toString());
+    }
+
+               HashMap withValues = new HashMap();
+               String aField, aValue;
+
+    for(int i=0; i<theFieldList.size();i++) {
+                       aField = (String)theFieldList.get(i);
+                       aValue = req.getParameter(aField);
+                       if (aValue!=null)       withValues.put(aField,aValue);
+               }
+               return withValues;
+       }
+
+}
\ No newline at end of file