Merge branch 'subtree'
[nikiroo-utils.git] / src / be / nikiroo / utils / Image.java
index 64f7b5a18f583ca2df5ebb055f3ac081f36ea9eb..9b28835e0fd61585023edf83db5ba19dea0030db 100644 (file)
@@ -26,7 +26,9 @@ public class Image implements Closeable, Serializable {
        static private long count = 0;
        static private Object lock = new Object();
 
+       private Object instanceLock = new Object();
        private File data;
+       private long size;
 
        /**
         * Do not use -- for serialisation purposes only.
@@ -45,7 +47,7 @@ public class Image implements Closeable, Serializable {
                ByteArrayInputStream in = new ByteArrayInputStream(data);
                try {
                        this.data = getTemporaryFile();
-                       IOUtils.write(in, this.data);
+                       size = IOUtils.write(in, this.data);
                } catch (IOException e) {
                        throw new RuntimeException(e);
                } finally {
@@ -60,8 +62,9 @@ public class Image implements Closeable, Serializable {
        /**
         * Create an image from Base64 encoded data.
         * 
-        * @deprecated Please use {@link Image#Image(InputStream)} instead, with a
-        *             {@link Base64InputStream}
+        * <p>
+        * Please use {@link Image#Image(InputStream)} when possible instead, with a
+        * {@link Base64InputStream}; it can be much more efficient.
         * 
         * @param base64EncodedData
         *            the Base64 encoded data as a String
@@ -69,7 +72,6 @@ public class Image implements Closeable, Serializable {
         * @throws IOException
         *             in case of I/O error or badly formated Base64
         */
-       @Deprecated
        public Image(String base64EncodedData) throws IOException {
                this(new Base64InputStream(new ByteArrayInputStream(
                                StringUtils.getBytes(base64EncodedData)), false));
@@ -86,7 +88,16 @@ public class Image implements Closeable, Serializable {
         */
        public Image(InputStream in) throws IOException {
                data = getTemporaryFile();
-               IOUtils.write(in, data);
+               size = IOUtils.write(in, data);
+       }
+
+       /**
+        * The size of the enclosed image in bytes.
+        * 
+        * @return the size
+        */
+       public long getSize() {
+               return size;
        }
 
        /**
@@ -105,7 +116,13 @@ public class Image implements Closeable, Serializable {
         *             in case of I/O error
         */
        public InputStream newInputStream() throws IOException {
-               return new MarkableFileInputStream(data);
+               synchronized (instanceLock) {
+                       if (data == null) {
+                               throw new IOException("Image was close()d");
+                       }
+                       
+                       return new MarkableFileInputStream(data);       
+               }
        }
 
        /**
@@ -163,13 +180,21 @@ public class Image implements Closeable, Serializable {
         */
        @Override
        public void close() throws IOException {
-               data.delete();
-               synchronized (lock) {
-                       count--;
-                       if (count <= 0) {
-                               count = 0;
-                               tmpRepository.close();
-                               tmpRepository = null;
+               synchronized (instanceLock) {
+                       new Exception().printStackTrace();
+                       if (size >= 0) {
+                               size = -1;
+                               data.delete();
+                               data = null;
+
+                               synchronized (lock) {
+                                       count--;
+                                       if (count <= 0) {
+                                               count = 0;
+                                               tmpRepository.close();
+                                               tmpRepository = null;
+                                       }
+                               }
                        }
                }
        }
@@ -235,6 +260,7 @@ public class Image implements Closeable, Serializable {
         * @throws ClassNotFoundException
         *             will not be thrown by this method
         */
+       @SuppressWarnings("unused")
        private void readObject(ObjectInputStream in) throws IOException,
                        ClassNotFoundException {
                data = getTemporaryFile();