1.1 restoration
[mir.git] / source / mircoders / media / MediaUploadProcessor.java
index f423ddf..8825e89 100755 (executable)
  */
 package mircoders.media;
 
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.Map;
-
 import mir.entity.Entity;
-import mir.media.MediaExc;
+import mir.log.LoggerWrapper;
 import mir.media.MediaFailure;
-import mircoders.media.MediaHelper;
 import mir.media.MediaHandler;
 import mir.misc.StringUtil;
 import mir.session.UploadedFile;
 import mir.storage.Database;
+import mir.util.FileFunctions;
 import mircoders.module.ModuleMediaType;
 
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.Map;
+
 public class MediaUploadProcessor {
-  public static Entity processMediaUpload(UploadedFile aFile, Map aValues) throws MediaExc, MediaFailure {
-    String mediaId;
+  private static LoggerWrapper logger = new LoggerWrapper("Media.UploadProcessor");
+  private static ModuleMediaType mediaTypeModule = new ModuleMediaType();
+
+  /**
+   * Processes an uploaded media file.
+   * Will create the media entity and so on. 
+   */
+  public static Entity processMediaUpload(UploadedFile aFile, Map aValues) throws UnsupportedMediaTypeExc, MediaFailure {
     MediaHandler mediaHandler;
-    Entity mediaType;
-    ModuleMediaType mediaTypeModule;
+    Entity mediaType = null;
     Database mediaStorage;
     Map values = new HashMap();
-    String MediaId;
     Entity mediaEntity;
 
+    String contentType = aFile.getContentType();
+    logger.debug("processing media upload of " + aFile.getFileName() + " (content type = " + contentType + ")");
 
-    try {
-      String contentType = aFile.getContentType();
-
-      if (contentType.equals("text/plain") ||
-          contentType.equals("application/octet-stream") ||
-          contentType == null) {
-        throw new MediaExc("Invalid content-type: " + contentType);
-      }
-
-      values.putAll(aValues);
-      values.put("date", StringUtil.date2webdbDate(new GregorianCalendar()));
-      values.put("is_produced", "0");
-
-      mediaTypeModule = new ModuleMediaType();
+    if (contentType!=null) {
       mediaType = mediaTypeModule.findMediaTypeForMimeType(contentType);
+    }
 
-      try {
-        mediaHandler = MediaHelper.getHandler(mediaType);
-        mediaStorage = MediaHelper.getStorage(mediaType, mediaType.getFieldValue("tablename"));
-      }
-      catch (Throwable e) {
-        throw new MediaFailure(e);
-      }
+    if (mediaType==null) {
+      String extension = FileFunctions.getExtension(aFile.getFileName());
+      mediaType = mediaTypeModule.findMediaTypeForExtension(extension);
+    }
+
+    if (mediaType==null) {
+      throw new UnsupportedMediaTypeExc("Media " + aFile.getFileName() + " " +
+          (aFile!=null?"("+aFile.getContentType()+") ":"") + " not supported", aFile.getContentType());
+    }
 
-      values.put("to_media_type", mediaType.getId());
+    values.putAll(aValues);
+    values.put("date", StringUtil.date2webdbDate(new GregorianCalendar()));
+    values.put("is_produced", "0");
 
-      try {
-        mediaEntity = (Entity) mediaStorage.getEntityClass().newInstance();
-        mediaEntity.setStorage(mediaStorage);
-      }
-      catch (Throwable e) {
-        throw new MediaFailure(e);
-      }
+    try {
+      mediaHandler = MediaHelper.getHandler(mediaType);
+      mediaStorage = MediaHelper.getStorage(mediaType, mediaType.getFieldValue("tablename"));
+    }
+    catch (Throwable e) {
+      throw new MediaFailure(e);
+    }
 
-      mediaEntity.setFieldValues(values);
-      mediaId = mediaEntity.insert();
+    values.put("to_media_type", mediaType.getId());
 
-      try {
-        mediaHandler.store(aFile.getInputStream(), mediaEntity, mediaType);
-      }
-      catch (Throwable e) {
-        throw new MediaFailure(e);
-      }
+    try {
+      mediaEntity = (Entity) mediaStorage.getEntityClass().newInstance();
+      mediaEntity.setStorage(mediaStorage);
+    }
+    catch (Throwable e) {
+      throw new MediaFailure(e);
+    }
 
-      return mediaEntity;
+    mediaEntity.setFieldValues(values);
+    try {
+      mediaEntity.insert();
+      mediaHandler.store(aFile, mediaEntity, mediaType);
     }
     catch (Throwable e) {
       throw new MediaFailure(e);
     }
 
+    return mediaEntity;
   }
 }
\ No newline at end of file