X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Fentity%2FEntityImages.java;h=019ee22cf2f1c3e1d885493b0f89e2889a0d32c5;hb=d74a52d5f65389e5cf89d3fcf14d07afbb78a9f9;hp=2417e20f7f8cc9511b960712d27b2d73f2840d61;hpb=0d512e810fc3838b6787c2a866864481d79c93ca;p=mir.git diff --git a/source/mircoders/entity/EntityImages.java b/source/mircoders/entity/EntityImages.java index 2417e20f..019ee22c 100755 --- a/source/mircoders/entity/EntityImages.java +++ b/source/mircoders/entity/EntityImages.java @@ -30,33 +30,14 @@ package mircoders.entity; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; - -import mir.config.MirPropertiesConfiguration; import mir.log.LoggerWrapper; -import mir.misc.FileUtil; -import mir.storage.StorageObject; -import mir.storage.StorageObjectFailure; -import mircoders.media.ImageProcessor; - -import org.postgresql.largeobject.BlobInputStream; -import org.postgresql.largeobject.LargeObject; -import org.postgresql.largeobject.LargeObjectManager; - -/** - * Diese Klasse enth?lt die Daten eines MetaObjekts - * - * @author RK, mh, mir-coders - * @version $Id: EntityImages.java,v 1.21.2.1 2003/10/23 14:55:28 rk Exp $ - */ +import mir.media.image.ImageMagickImageProcessor; +import mir.media.image.ImageProcessor; +import mir.storage.DatabaseFailure; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.sql.SQLException; public class EntityImages extends EntityUploadedMedia { @@ -69,127 +50,49 @@ public class EntityImages extends EntityUploadedMedia public EntityImages() { super(); - - logger = new LoggerWrapper("Entity.UploadedMedia.Images"); - } - - public EntityImages(StorageObject theStorage) { - this(); - setStorage(theStorage); } - // - // methods - - - public InputStream getImage() throws StorageObjectFailure { - logger.debug("EntityImages.getimage started"); - java.sql.Connection con=null; - Statement stmt=null; - BlobInputStream in; - InputStream img_in = null; + /** + * Retrieves the image data + */ + public byte[] getImage() throws DatabaseFailure { try { - con = theStorageObject.getPooledCon(); - con.setAutoCommit(false); - LargeObjectManager lom; - 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(); - if(rs!=null) { - if (rs.next()) { - LargeObject lob = lom.open(rs.getInt(1)); - in = (BlobInputStream)lob.getInputStream(); - img_in = new ImageInputStream(in, con, stmt); - } - rs.close(); - } + return database.getBinaryField("select image_data from images where id="+getId()); } - catch (Throwable t) { - logger.error("EntityImages.getImage failed: " + t.toString()); - t.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE)); - - try { - con.setAutoCommit(true); - } - catch (Throwable e) { - logger.error("EntityImages.getImage resetting transaction mode failed: " + e.toString()); - e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE)); - } - - try { - theStorageObject.freeConnection(con, stmt); - } - catch (Throwable e) { - logger.error("EntityImages.getImage freeing connection failed: " +e.toString()); - } - - throwStorageObjectFailure(t, "EntityImages -- getImage failed: "); + catch (SQLException e) { + throw new DatabaseFailure(e); } - return img_in; } - public void setImage(InputStream in, String type) throws StorageObjectFailure { - - if (in != null) { - - Connection con = null; - PreparedStatement pstmt = null; - File f = null; + /** + * Processes and saves image data + */ + public void setImage(InputStream anInputStream, String type) throws DatabaseFailure { + if (anInputStream != null) { try { - logger.debug("EntityImages.settimage :: making internal representation of image"); + ImageProcessor processor = new ImageMagickImageProcessor(anInputStream); - f = File.createTempFile("mir", ".tmp", - new File(MirPropertiesConfiguration.instance().getString("TempDir"))); - FileUtil.write(f, in); - ImageProcessor processor = new ImageProcessor(f); - - con = theStorageObject.getPooledCon(); - con.setAutoCommit(false); - LargeObjectManager lom; - java.sql.Connection connection; - connection = ((com.codestudio.sql.PoolManConnectionHandle)con).getNativeConnection(); + processor.descaleImage(maxImageSize, minDescaleRatio, minDescaleReduction); - lom = ((org.postgresql.Connection) connection).getLargeObjectAPI(); + ByteArrayOutputStream imageData = new ByteArrayOutputStream(); + processor.writeScaledData(imageData, type); + database.setBinaryField("image_data", getId(), imageData.toByteArray()); - int oidImage = lom.create(); - LargeObject lobImage = lom.open(oidImage); - processor.descaleImage(maxImageSize, minDescaleRatio, minDescaleReduction); - processor.writeScaledData(lobImage.getOutputStream(), type); - lobImage.close(); - setValueForProperty("img_height", new Integer(processor.getScaledHeight()).toString()); - setValueForProperty("img_width", new Integer(processor.getScaledWidth()).toString()); + setFieldValue("img_height", Integer.toString(processor.getScaledHeight())); + setFieldValue("img_width", Integer.toString(processor.getScaledWidth())); - int oidIcon = lom.create(); - LargeObject lobIcon = lom.open(oidIcon); + imageData.reset(); processor.descaleImage(maxIconSize, minDescaleRatio, minDescaleReduction); - processor.writeScaledData(lobIcon.getOutputStream(), type); - lobIcon.close(); - - setValueForProperty("icon_height", new Integer(processor.getScaledHeight()).toString()); - setValueForProperty("icon_width", new Integer(processor.getScaledWidth()).toString()); + processor.writeScaledData(imageData, type); + database.setBinaryField("icon_data", getId(), imageData.toByteArray()); - setValueForProperty("image_data", new Integer(oidImage).toString()); - setValueForProperty("icon_data", new Integer(oidIcon).toString()); + setFieldValue("icon_height", Integer.toString(processor.getScaledHeight())); + setFieldValue("icon_width", Integer.toString(processor.getScaledWidth())); + processor.cleanup(); update(); } catch (Exception e) { - throwStorageObjectFailure(e, "settimage :: setImage gescheitert: "); - } - finally { - try { - if (con!=null) - con.setAutoCommit(true); - // get rid of the temp. file - f.delete(); - } catch (SQLException e) { - throwStorageObjectFailure(e,"Resetting transaction-mode failed"); - } - if (con!=null) - theStorageObject.freeConnection(con,pstmt); + throw new DatabaseFailure(e); } } } @@ -200,85 +103,12 @@ public class EntityImages extends EntityUploadedMedia * * It will also take care of closing the OutputStream. */ - public InputStream getIcon() throws StorageObjectFailure { - Connection con=null; - Statement stmt=null; - BlobInputStream in=null; - ImageInputStream img_in=null; - + public byte[] getIcon() throws DatabaseFailure { try { - con = theStorageObject.getPooledCon(); - con.setAutoCommit(false); - 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) - .getNativeConnection(); - lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI(); - if(rs!=null) { - if (rs.next()) { - 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(); - } + return database.getBinaryField("select icon_data from images where id="+getId()); } - catch (Throwable t) { - logger.error("EntityImages.getIcon failed: "+t.toString()); - t.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE)); - - try { - con.setAutoCommit(true); - } - catch (SQLException e) { - logger.error("EntityImages.getIcon resetting transaction mode failed: " + e.toString()); - e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE)); - } - try { - theStorageObject.freeConnection(con, stmt); - } - catch (Throwable e) { - logger.error("EntityImages -- freeing connection failed: " + e.getMessage()); - } - - throwStorageObjectFailure(t, "EntityImages -- getIcon failed:"); - } - - 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; - Connection _con; - Statement _stmt; - - public ImageInputStream(BlobInputStream in, 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(); + catch (SQLException e) { + throw new DatabaseFailure(e); } } }