merge media InputStream changes from MIR_1_0 branch
[mir.git] / source / mircoders / entity / EntityImages.java
index 75da1ee..ced3e75 100755 (executable)
@@ -44,6 +44,7 @@ import java.sql.*;
 import org.postgresql.Connection;
 import org.postgresql.largeobject.LargeObject;
 import org.postgresql.largeobject.LargeObjectManager;
+import org.postgresql.largeobject.BlobInputStream;
 
 import mir.entity.*;
 import mir.misc.*;
@@ -52,13 +53,16 @@ import mir.storage.*;
 /**
  * Diese Klasse enthält die Daten eines MetaObjekts
  *
- * @author RK
- * @version 11.11.2000
+ * @author RK, mh
+ * @version $Id: EntityImages.java,v 1.8 2002/11/04 04:35:21 mh Exp $
  */
 
 
 public class EntityImages extends EntityUploadedMedia
 {
+
+  Random r = new Random();
+
        public EntityImages()
        {
                super();
@@ -73,109 +77,109 @@ public class EntityImages extends EntityUploadedMedia
        // methods
 
 
-
-       public byte[] getImage() throws StorageObjectException
+       public InputStream getImage() throws StorageObjectException
        {
                theLog.printDebugInfo("--getimage started");
                java.sql.Connection con=null;Statement stmt=null;
-               byte[] img_data=null;
+    BlobInputStream in; InputStream img_in = null;
 
                try {
                        con = theStorageObject.getPooledCon();
                        con.setAutoCommit(false);
                        LargeObjectManager lom;
-            java.sql.Connection jCon;
-            stmt = con.createStatement();
+      java.sql.Connection jCon;
+      stmt = con.createStatement();
                        ResultSet rs = theStorageObject.executeSql(stmt,
                             "select image_data from images where id="+getId());
-            jCon = ((com.codestudio.sql.PoolManConnectionHandle)con)
-                    .getNativeConnection();
-            lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI();
+      jCon = ((com.codestudio.sql.PoolManConnectionHandle)con)
+                .getNativeConnection();
+      lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI();
                        if(rs!=null) {
-              if (rs.next()) {
-                LargeObject lob = lom.open(rs.getInt(1));
-                img_data = lob.read(lob.size());
-                lob.close();
-                //img_data = rs.getBytes(1);
-              }
-            rs.close();
+        if (rs.next()) {
+          LargeObject lob = lom.open(rs.getInt(1));
+          in = (BlobInputStream)lob.getInputStream();
+          img_in = new ImageInputStream(in, con, stmt);
+        }
+        rs.close();
                        }
                } catch (Exception e) {
-          e.printStackTrace();
-          theLog.printError("EntityImages -- getImage failed"+e.toString()); 
-          throwStorageObjectException(e, "EntityImages -- getImage failed: ");
-        }
-        finally {
-          try {
-            con.setAutoCommit(true);
-          } catch (Exception e) {
-            e.printStackTrace();
-            theLog.printError(
-                    "EntityImages -- getImage reseting transaction mode failed"
-                    +e.toString()); 
-          }
-          theStorageObject.freeConnection(con,stmt);
-        }
-
-               return img_data;
+      e.printStackTrace();
+      theLog.printError("EntityImages -- getImage failed"+e.toString()); 
+      throwStorageObjectException(e, "EntityImages -- getImage failed: ");
+      try {
+        con.setAutoCommit(true);
+      } catch (Exception e2) {
+        e.printStackTrace();
+        theLog.printError(
+          "EntityImages -- getImage reseting transaction mode failed"
+            +e2.toString()); 
+      }
+      theStorageObject.freeConnection(con,stmt);
+    }
+    //}
+    return img_in;
        }
 
-       public void setImage(byte[] uploadData, String type)
+       public void setImage(InputStream in, String type)
            throws StorageObjectException {
 
-               if (uploadData!=null) {
+               if (in!=null) {
                        java.sql.Connection con=null;PreparedStatement pstmt=null;
+      File f = null;
                        try {
 
                                theLog.printDebugInfo("settimage :: making internal representation of image");
-                               WebdbImage webdbImage= new WebdbImage(uploadData, type);
+
+        String fName = MirConfig.getProp("TempDir")+File.separator+r.nextInt();
+        f = new File(fName);
+        FileUtil.write(f, in);
+                               WebdbImage webdbImage= new WebdbImage(f, type);
                                theLog.printDebugInfo("settimage :: made internal representation of image");
-                               byte[] imageData = webdbImage.getImage();
-                               theLog.printDebugInfo("settimage :: getImage");
-                               byte[] iconData = webdbImage.getIcon();
-                               theLog.printDebugInfo("settimage :: getIcon");
-
-
-                               if (iconData!=null && imageData!=null) {
-                                       con = theStorageObject.getPooledCon();
-                                       con.setAutoCommit(false);
-                                       theLog.printDebugInfo("settimage :: trying to insert image");
-
-                                       // setting values
-                    LargeObjectManager lom;
-                    java.sql.Connection jCon;
-                    jCon = ((com.codestudio.sql.PoolManConnectionHandle)con)
-                            .getNativeConnection();
-                    lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI();
-                    int oidImage = lom.create();
-                    int oidIcon = lom.create();
-                    LargeObject lobImage = lom.open(oidImage);
-                    LargeObject lobIcon = lom.open(oidIcon);
-                    lobImage.write(imageData);
-                    lobIcon.write(iconData);
-                    lobImage.close();
-                    lobIcon.close();
-                    String sql = "update images set img_height='"
-                        +webdbImage.getImageHeight() +
-                                               "',img_width='"   + webdbImage.getImageWidth() +
-                                               "',icon_height='" + webdbImage.getIconHeight() +
-                                               "',icon_width='"  + webdbImage.getIconWidth()
-                        +  "', image_data="+oidImage+", icon_data="+oidIcon
-                        +" where id="+getId();
-                                       theLog.printDebugInfo("settimage :: updating sizes: "+ sql);
-                                       pstmt = con.prepareStatement(sql);
-                                       //pstmt.setBytes(1, imageData);
-                                       //pstmt.setBytes(2, iconData);
-                                       pstmt.executeUpdate();
-                                       sql="update content set is_produced='0' where to_media="+getId();
-                                       pstmt = con.prepareStatement(sql);
-                                       pstmt.executeUpdate();
-                               }
+
+        con = theStorageObject.getPooledCon();
+        con.setAutoCommit(false);
+        theLog.printDebugInfo("settimage :: trying to insert image");
+
+        // setting values
+        LargeObjectManager lom;
+        java.sql.Connection jCon;
+        jCon = ((com.codestudio.sql.PoolManConnectionHandle)con)
+                          .getNativeConnection();
+        lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI();
+        int oidImage = lom.create();
+        int oidIcon = lom.create();
+        LargeObject lobImage = lom.open(oidImage);
+        LargeObject lobIcon = lom.open(oidIcon);
+        webdbImage.setImage(lobImage.getOutputStream());
+        webdbImage.setIcon(lobIcon.getOutputStream());
+        lobImage.close();
+        lobIcon.close();
+        String sql = "update images set img_height='"
+                      +webdbImage.getImageHeight() +
+                      "',img_width='"   + webdbImage.getImageWidth() +
+                      "',icon_height='" + webdbImage.getIconHeight() +
+                      "',icon_width='"  + webdbImage.getIconWidth()
+                      +  "', image_data="+oidImage+", icon_data="+oidIcon
+                      +" where id="+getId();
+        theLog.printDebugInfo("settimage :: updating sizes: "+ sql);
+        pstmt = con.prepareStatement(sql);
+        //pstmt.setBytes(1, imageData);
+        //pstmt.setBytes(2, iconData);
+        pstmt.executeUpdate();
+        sql="update content set is_produced='0' where to_media="+getId();
+        pstmt = con.prepareStatement(sql);
+        pstmt.executeUpdate();
                        }
                        catch (Exception e) {throwStorageObjectException(e, "settimage :: setImage gescheitert: ");}
                        finally {
-                               try { if (con!=null) con.setAutoCommit(true); } catch (Exception e) {;}
-                               theStorageObject.freeConnection(con,pstmt); }
+                               try {
+          if (con!=null)
+            con.setAutoCommit(true);
+          // get rid of the temp. file
+          f.delete();
+        } catch (Exception e) {;}
+                               theStorageObject.freeConnection(con,pstmt);
+      }
                }
        }
 
@@ -197,48 +201,88 @@ public class EntityImages extends EntityUploadedMedia
                super.setValues(theStringValues);
        }
 
-       public byte[] getIcon() throws StorageObjectException
+  /**
+   * Takes an OutputStream as an argument and reads in the data
+   * from the DB and writes it to the OutputStream.
+   *
+   * It will also take care of closing the OutputStream.
+   */
+       public InputStream getIcon() throws StorageObjectException
        {
                java.sql.Connection con=null;Statement stmt=null;
-               byte[] img_data=null;
+    BlobInputStream in=null;ImageInputStream img_in=null;
 
                try {
                        con = theStorageObject.getPooledCon();
                        con.setAutoCommit(false);
-            LargeObjectManager lom;
-            java.sql.Connection jCon;
+      LargeObjectManager lom;
+      java.sql.Connection jCon;
                        stmt = con.createStatement();
                        ResultSet rs = theStorageObject.executeSql(stmt,
                             "select icon_data from images where id="+getId());
-            jCon = ((com.codestudio.sql.PoolManConnectionHandle)con)
+      jCon = ((com.codestudio.sql.PoolManConnectionHandle)con)
                     .getNativeConnection();
-            lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI();
+      lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI();
                        if(rs!=null) {
                                if (rs.next()) {
-                  LargeObject lob = lom.open(rs.getInt(1));
-                  img_data = lob.read(lob.size());
-                  lob.close();
-                  //img_data = rs.getBytes(1);
+          LargeObject lob = lom.open(rs.getInt(1));
+          in = (BlobInputStream)lob.getInputStream();
+          img_in = new ImageInputStream( in, con ,stmt);
+          //img_data = rs.getBytes(1);
                                }
-                rs.close();
+        rs.close();
                        }
                } catch (Exception e) {
-          e.printStackTrace();
-          theLog.printError("EntityImages -- getIcon failed"+e.toString()); 
-          throwStorageObjectException(e, "EntityImages -- getIcon failed:");
-               } finally {
-          try {
-            con.setAutoCommit(true);
-          } catch (Exception e) {
-            e.printStackTrace();
-            theLog.printError(
-                    "EntityImages -- getIcon reseting transaction mode failed"
-                    +e.toString()); 
-          }
-          theStorageObject.freeConnection(con,stmt);
-       }
-
-       return img_data;
+      e.printStackTrace();
+      theLog.printError("EntityImages -- getIcon failed"+e.toString()); 
+      throwStorageObjectException(e, "EntityImages -- getIcon failed:");
+      try {
+        con.setAutoCommit(true);
+      } catch (Exception e2) {
+        e.printStackTrace();
+        theLog.printError(
+          "EntityImages -- getIcon reseting transaction mode failed"
+            +e2.toString()); 
+      }
+      theStorageObject.freeConnection(con,stmt);
+               }
+
+    return img_in;
        }
 
+  /**
+   * a small wrapper class that allows us to store the DB connection resources
+   * that the BlobInputStream is using and free them upon closing of the stream
+   */
+  private class ImageInputStream extends InputStream {
+
+    InputStream _in;
+    java.sql.Connection _con;
+    Statement _stmt;
+
+    public ImageInputStream(BlobInputStream in, java.sql.Connection con,
+                            Statement stmt )
+    {
+      _in = in;
+      _con = con;
+      _stmt = stmt;
+    }
+
+    public void close () throws IOException {
+      _in.close();
+
+      try {
+        _con.setAutoCommit(true);
+        theStorageObject.freeConnection(_con,_stmt);
+      } catch (Exception e) {
+        throw new IOException("close(): "+e.toString());
+      }
+    }
+
+    public int read() throws IOException {
+      return _in.read();
+    }
+
+  }
+
 }