X-Git-Url: http://git.nikiroo.be/?p=nikiroo-utils.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2FImage.java;h=9b28835e0fd61585023edf83db5ba19dea0030db;hp=64f7b5a18f583ca2df5ebb055f3ac081f36ea9eb;hb=68232a49b2f63e195dfaf1d907bd20c48cf2b394;hpb=5221cf7f72655a6e27af81167a4a3f237750c7ca diff --git a/src/be/nikiroo/utils/Image.java b/src/be/nikiroo/utils/Image.java index 64f7b5a..9b28835 100644 --- a/src/be/nikiroo/utils/Image.java +++ b/src/be/nikiroo/utils/Image.java @@ -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} + *

+ * 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();