support for wildcard like base content-type mappings in media_type table.
[mir.git] / source / mircoders / servlet / ServletModuleOpenIndy.java
index db4e247..ba005bc 100755 (executable)
@@ -37,12 +37,14 @@ import mircoders.producer.*;
 public class ServletModuleOpenIndy extends ServletModule
 {
 
-  private String          commentFormTemplate, commentFormDoneTemplate, commentFormDupeTemplate;
-  private String          postingFormTemplate, postingFormDoneTemplate, postingFormDupeTemplate;
-  private ModuleContent   contentModule;
-  private ModuleImages    imageModule;
-  private ModuleTopics    themenModule;
-  private String          directOp ="yes";
+  private String        commentFormTemplate, commentFormDoneTemplate,
+                        commentFormDupeTemplate;
+  private String        postingFormTemplate, postingFormDoneTemplate,
+                        postingFormDupeTemplate;
+  private ModuleContent contentModule;
+  private ModuleImages  imageModule;
+  private ModuleTopics  themenModule;
+  private String        directOp ="yes";
 
   // Singelton / Kontruktor
   private static ServletModuleOpenIndy instance = new ServletModuleOpenIndy();
@@ -142,8 +144,8 @@ public class ServletModuleOpenIndy extends ServletModule
    *  Method for delivering the form-Page for open posting
    */
 
-  public void addposting(HttpServletRequest req, HttpServletResponse res) throws ServletModuleException
-  {
+  public void addposting(HttpServletRequest req, HttpServletResponse res)
+    throws ServletModuleException {
     SimpleHash mergeData = new SimpleHash();
     String numOfMedia = req.getParameter("medianum");
     if(numOfMedia==null||numOfMedia.equals("")){
@@ -162,12 +164,15 @@ public class ServletModuleOpenIndy extends ServletModule
     
     /** @todo popups missing */
     try{
-      mergeData.put("languagePopUpData",DatabaseLanguage.getInstance().getPopupData());
+      SimpleList popUpData = DatabaseLanguage.getInstance().getPopupData();
+      mergeData.put("languagePopUpData", popUpData );
       mergeData.put("themenPopupData", themenModule.getTopicsAsSimpleList());
     } catch (Exception e) {
-      theLog.printError("languagePopUpData or getTopicslist failed");
-      throw new ServletModuleException("smod -- openindy -- getting language or topics failed: "+e.toString());
-    }
+      theLog.printError("languagePopUpData or getTopicslist failed "
+                        +e.toString());
+      throw new ServletModuleException("OpenIndy -- failed getting language or topics: "+e.toString());
+    } 
+      
     deliver(req, res, mergeData, postingFormTemplate);
   }
 
@@ -242,8 +247,7 @@ public class ServletModuleOpenIndy extends ServletModule
                        if (to_topicsArr != null && to_topicsArr.length > 0) {
         try{
           DatabaseContentToTopics.getInstance().setTopics(cid,to_topicsArr);
-               setTopic = true;
-                                       theLog.printError("setting content_x_topic success");
+          setTopic = true;
         } catch (Exception e) {
           theLog.printError("setting content_x_topic failed");
           contentModule.deleteById(cid);
@@ -262,7 +266,7 @@ public class ServletModuleOpenIndy extends ServletModule
         //sends us. (the "Oreilly method")
         String contentType = mpReq.getContentType();
 
-        theLog.printError("FROM BROWSER: "+contentType);
+        theLog.printInfo("FROM BROWSER: "+contentType);
 
         //if the client browser sent us unknown (text/plain is default)
         //or if we got application/octet-stream, it's possible that
@@ -284,13 +288,12 @@ public class ServletModuleOpenIndy extends ServletModule
              * sure that it is in this file -mh
              */
             contentType = FileUtil.guessContentTypeFromName(fileName);
-            theLog.printError("tYPE: "+contentType);
             if (contentType==null)
                 contentType = "text/plain"; // rfc1867 says this is the default
         }
         HashMap mediaValues = new HashMap();
 
-        theLog.printError("CONTENT TYPE IS: "+contentType);
+        theLog.printInfo("CONTENT TYPE IS: "+contentType);
         
         if (contentType.equals("text/plain") ||
             contentType.equals("application/octet-stream")) {
@@ -314,46 +317,72 @@ public class ServletModuleOpenIndy extends ServletModule
         //from the content-type.
         //we use the media type entry to lookup the
         //media Handler/Storage classes
-        String wc = " mime_type='"+contentType+"'";
+        //String wc = " mime_type = '"+contentType+"'";
+
+        // @todo this should probably be moved to DatabaseMediaType -mh
+        String[] cTypeSplit = StringUtil.split(contentType, "/");
+        String wc = " mime_type LIKE '"+cTypeSplit[0]+"%'";
 
-        EntityList mediaTypesList = DatabaseMediaType.getInstance().selectByWhereClause(wc);
+        DatabaseMediaType mediaTypeStor = DatabaseMediaType.getInstance();
+        EntityList mediaTypesList = mediaTypeStor.selectByWhereClause(wc);
 
         String mediaTypeId = null;
-        String mediaStorageName = null;
-        String mediaHandlerName = null;
+        MirMedia mediaHandler;
+        Database mediaStorage;
  
         //if we found an entry matching the
         //content-type int the table.
         if (mediaTypesList.size() > 0) {
+          Entity mediaType = null;
+          
+          // find out if we an exact content-type match if so take it.
+          // otherwise just use the first one.
+          // @todo this should probably be moved to DatabaseMediaType -mh
+          for(int j=0;i<mediaTypesList.size();j++) {
+            if(contentType.equals(
+                            mediaTypesList.elementAt(j).getValue("mime_type")))
+              mediaType = mediaTypesList.elementAt(j);
+          }
+
+          if( mediaType == null )
+            mediaType = mediaTypesList.elementAt(0);
+                
           //get the class names from the media_type table.
-          mediaTypeId = mediaTypesList.elementAt(0).getId();
-          mediaStorageName = mediaTypesList.elementAt(0).getValue("tablename");
-          mediaHandlerName = mediaTypesList.elementAt(0).getValue("classname");
+          mediaTypeId = mediaType.getId();
+          try {
+            // ############### @todo: merge these and the getURL call into one
+            // getURL helper call that just takes the Entity as a parameter
+            // along with media_type
+            mediaHandler = MediaHelper.getHandler(mediaType);
+            mediaStorage = MediaHelper.getStorage(mediaType,
+                                                "mircoders.storage.Database");
+          } catch (MirMediaException e) {
+            theLog.printError("getting media handler failed: "+e.toString());
+            contentModule.deleteById(cid);
+            throw new ServletModuleException("getting media handler failed: "
+                                            +e.toString());
+          }
+
           mediaValues.put("to_media_type",mediaTypeId);
-         
+
           //load the classes via reflection
           String MediaId;
           Entity mediaEnt = null;
           try {
-            Class mediaStorageClass = Class.forName("mircoders.storage.Database"+mediaStorageName);
-            Method m = mediaStorageClass.getMethod("getInstance", null);
-            Database mediaStorage = (Database)m.invoke(null, null);
             mediaEnt = (Entity)mediaStorage.getEntityClass().newInstance();
             mediaEnt.setStorage(mediaStorage);
             mediaEnt.setValues(mediaValues);
             mediaId = mediaEnt.insert();
 
-            Class mediaHandlerClass = Class.forName("mir.media.MediaHandler"+mediaHandlerName);
-            MirMedia mediaHandler = (MirMedia)mediaHandlerClass.newInstance();
             //save and store the media data/metadata
-            mediaHandler.set(mpReq.getMedia(), mediaEnt,mediaTypesList.elementAt(0));
+            mediaHandler.set(mpReq.getMedia(), mediaEnt,
+                            mediaType);
 
             //were done with mpReq at this point, dereference it.
             //as it contains mucho mem. -mh 01.10.2001
             mpReq=null;
               
             //we got this far, associate the media to the article
-            theLog.printError("ID"+mediaId);
             mediaEnt.setValueForProperty("is_published","1");
             mediaEnt.update();
             new ProducerMedia().handle(null,null,false,false,mediaId);
@@ -377,6 +406,7 @@ public class ServletModuleOpenIndy extends ServletModule
       contentEnt.setValueForProperty("is_published","1");
       contentEnt.update();
 
+
       //dereference mp. -mh
       mp=null;
 
@@ -389,7 +419,7 @@ public class ServletModuleOpenIndy extends ServletModule
       
                        //produce the topicPages if set
                        //should be more intelligent
-                       if(setTopic==true) new ProducerTopics().handle(null,null);
+                       //if(setTopic==true) new ProducerTopics().handle(null,null);
                        
       // sync the server
       //should be configureable