Initial revision
[mir.git] / source / mir / servlet / ServletModuleDispatch.java
diff --git a/source/mir/servlet/ServletModuleDispatch.java b/source/mir/servlet/ServletModuleDispatch.java
new file mode 100755 (executable)
index 0000000..5263fed
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Dispatcher
+ */
+
+package  mir.servlet;
+
+import  java.lang.reflect.*;
+import  javax.servlet.http.*;
+import  mir.servlet.ServletModuleException;
+import  mir.misc.*;
+
+
+/**
+ * Dispatcher, der in einer ServletModule-Klasse, die Methode, die per Http-Post oder Get
+ * Parameter "do" angegeben wurde, ausruft.
+ */
+public final class ServletModuleDispatch {
+
+       static Logfile theLog;
+
+       static {
+               theLog = Logfile.getInstance("/tmp/smod.dispatch");
+       }
+
+       /**
+        * privater Konstruktor, um versehentliche Instantiierung zu verhindern
+        */
+       private ServletModuleDispatch () {
+       }
+
+       /**
+        *  Die Dispatch-Routine ruft das von dem Hauptservlet kommende ServletModule
+        *  mit dem per HttpServletRequest angegebenen Paramter <code>do</code> auf.
+        *  Ist kein Parameter angegeben, so wird versucht, in die <code>defaultAction</code>
+        *  des ServletModules zu springen.
+        *
+        * @param req Http-Request, das vom Dispatcher an die Methode des
+        *    ServletModules durchgereicht wird
+        * @param res Http-Response, die vom Dispatcher an die Methode des
+        *    ServletModules durchgereicht wird
+        * @param sMod ServletModule, an das dispatched wird.
+        * @param mod Name des Modules als String (für Logfile)
+        */
+
+       public static void dispatch(ServletModule sMod, HttpServletRequest req,
+               HttpServletResponse res) throws ServletModuleException
+       {
+                       //sMod.predeliver(req,res);
+
+                       String doParam = req.getParameter("do");
+                       //theLog.printInfo("SerletModuleDispatch: " + sMod.toString() + " with method " + doParam);
+                       if (doParam == null) {
+                               if (sMod.defaultAction() != null) doParam = sMod.defaultAction();
+                               else throw new ServletModuleException("Parameter do nicht angegeben!");
+                       }
+
+                       Class[] params= { HttpServletRequest.class, HttpServletResponse.class};
+
+                       try {
+                               Method method = sMod.getClass().getMethod(doParam,params);
+                               if (method != null) {
+                                       method.invoke(sMod,new Object[] {req,res} );
+                                       return;
+                               }
+                               else theLog.printDebugInfo("method lookup unsuccesful");
+                       }
+                       catch ( NoSuchMethodException e) { throw new ServletModuleException("no such method!" + e.toString());}
+                       catch ( SecurityException e) { throw new ServletModuleException("method not allowed!" + e.toString());}
+                       catch ( InvocationTargetException e) {throw new ServletModuleException("target method exception!" + e.getTargetException().toString());}
+                       catch ( IllegalAccessException e) { throw new ServletModuleException("illegal method not allowed!" + e.toString());}
+//                     catch ( Exception e ) { throw new ServletModuleException(e.toString()); }
+
+                       throw new ServletModuleException("delivery failed! -- ");
+       }
+}
\ No newline at end of file