You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2006/05/22 14:32:39 UTC

svn commit: r408647 - in /jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core: ./ state/ state/util/ state/xml/ value/

Author: stefan
Date: Mon May 22 05:32:39 2006
New Revision: 408647

URL: http://svn.apache.org/viewvc?rev=408647&view=rev
Log:
JCR-428 BLOBFileValues might be discarded to early

Modified:
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/ItemState.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/util/Serializer.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java?rev=408647&r1=408646&r2=408647&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java Mon May 22 05:32:39 2006
@@ -293,7 +293,8 @@
             for (int i = 0; i < oldValues.length; i++) {
                 InternalValue old = oldValues[i];
                 if (old != null && old.getType() == PropertyType.BINARY) {
-                    // discard eventual temporary data before overriding
+                    // make sure temporarily allocated data is discarded
+                    // before overwriting it
                     ((BLOBFileValue) old.internalValue()).discard();
                 }
             }

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/ItemState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/ItemState.java?rev=408647&r1=408646&r2=408647&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/ItemState.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/ItemState.java Mon May 22 05:32:39 2006
@@ -150,7 +150,7 @@
     /**
      * Pull state information from overlayed state.
      */
-    protected void pull() {
+    void pull() {
         if (overlayedState != null) {
             copy(overlayedState);
             // sync modification count

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java?rev=408647&r1=408646&r2=408647&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java Mon May 22 05:32:39 2006
@@ -108,30 +108,6 @@
         }
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    protected void pull() {
-        super.pull();
-        if (overlayedState != null && type == PropertyType.BINARY) {
-            // special treatment for blobfile values. un-temp them
-            for (int i=0; i<values.length; i++) {
-                if (values[i].internalValue() instanceof BLOBFileValue) {
-                    BLOBFileValue old = (BLOBFileValue) values[i].internalValue();
-                    BLOBFileValue val = old.copy();
-                    if (old != val) {
-                        // only override if 'copy' returned a new instance
-                        try {
-                            values[i] = InternalValue.create(val, null);
-                        } catch (RepositoryException e) {
-                            // ignore
-                        }
-                    }
-                }
-           }
-        }
-    }
-
     //-------------------------------------------------------< public methods >
     /**
      * Determines if this item state represents a node.
@@ -348,7 +324,7 @@
                         public void close() {
                             // nop
                         }
-                    });
+                    }, false);
                 } else {
                     values[i] = InternalValue.valueOf(in.readUTF(), type);
                 }

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/util/Serializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/util/Serializer.java?rev=408647&r1=408646&r2=408647&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/util/Serializer.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/util/Serializer.java Mon May 22 05:32:39 2006
@@ -218,7 +218,7 @@
                 } else {
                     in = blobStore.get(blobId);
                     try {
-                        values[i] = InternalValue.create(in);
+                        values[i] = InternalValue.create(in, false);
                     } finally {
                         try {
                             in.close();
@@ -291,7 +291,7 @@
                 } else {
                     InputStream is = blobStore.get(s);
                     try {
-                        val = InternalValue.create(is);
+                        val = InternalValue.create(is, false);
                     } finally {
                         try {
                             is.close();

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java?rev=408647&r1=408646&r2=408647&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java Mon May 22 05:32:39 2006
@@ -321,7 +321,7 @@
                             } else {
                                 InputStream in = blobStore.get(content);
                                 try {
-                                    values.add(InternalValue.create(in));
+                                    values.add(InternalValue.create(in, false));
                                 } finally {
                                     try {
                                         in.close();
@@ -660,7 +660,7 @@
                                 } else {
                                     in = blobStore.get(blobId);
                                     try {
-                                        values[i] = InternalValue.create(in);
+                                        values[i] = InternalValue.create(in, false);
                                     } finally {
                                         try {
                                             in.close();

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java?rev=408647&r1=408646&r2=408647&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java Mon May 22 05:32:39 2006
@@ -82,7 +82,9 @@
     private final File file;
 
     /**
-     * flag indicating if this instance is backed by a temporarily allocated resource/buffer
+     * flag indicating if this instance represents a <i>temporary</i> value
+     * whose dynamically allocated resources can be explicitly freed on
+     * {@link #discard()}.
      */
     private final boolean temp;
 
@@ -97,11 +99,6 @@
     private final FileSystemResource fsResource;
 
     /**
-     * underlying blob file value
-     */
-    private final BLOBFileValue blob;
-
-    /**
      * converted text
      */
     private String text = null;
@@ -111,12 +108,37 @@
      * <code>InputStream</code>. The contents of the stream is spooled
      * to a temporary file or to a byte buffer if its size is smaller than
      * {@link #MAX_BUFFER_SIZE}.
+     * <p/>
+     * The new instance represents a <i>temporary</i> value whose dynamically
+     * allocated resources will be freed explicitly on {@link #discard()}.
      *
      * @param in stream to be represented as a <code>BLOBFileValue</code> instance
      * @throws IOException if an error occurs while reading from the stream or
      *                     writing to the temporary file
      */
     public BLOBFileValue(InputStream in) throws IOException {
+        this(in, true);
+    }
+
+    /**
+     * Creates a new <code>BLOBFileValue</code> instance from an
+     * <code>InputStream</code>. The contents of the stream is spooled
+     * to a temporary file or to a byte buffer if its size is smaller than
+     * {@link #MAX_BUFFER_SIZE}.
+     * <p/>
+     * The <code>temp</code> parameter governs whether dynamically allocated
+     * resources will be freed explicitly on {@link #discard()}. Note that any
+     * dynamically allocated resources (temp file/buffer) will be freed
+     * implicitly once this instance has been gc'ed.
+     *
+     * @param in stream to be represented as a <code>BLOBFileValue</code> instance
+     * @param temp flag indicating whether this instance represents a
+     *             <i>temporary</i> value whose resources can be explicitly freed
+     *             on {@link #discard()}.
+     * @throws IOException if an error occurs while reading from the stream or
+     *                     writing to the temporary file
+     */
+    public BLOBFileValue(InputStream in, boolean temp) throws IOException {
         byte[] spoolBuffer = new byte[0x2000];
         int read;
         int len = 0;
@@ -156,9 +178,7 @@
         // init vars
         file = spoolFile;
         fsResource = null;
-        blob = null;
-        // this instance is backed by a temporarily allocated resource/buffer
-        temp = true;
+        this.temp = temp;
     }
 
     /**
@@ -172,7 +192,6 @@
         buffer = bytes;
         file = null;
         fsResource = null;
-        blob = null;
         // this instance is not backed by a temporarily allocated buffer
         temp = false;
     }
@@ -194,7 +213,6 @@
         this.file = file;
         // this instance is backed by a 'real' file; set virtual fs resource to null
         fsResource = null;
-        blob = null;
         // this instance is not backed by temporarily allocated resource/buffer
         temp = false;
     }
@@ -220,28 +238,11 @@
         this.fsResource = fsResource;
         // set 'real' file to null
         file = null;
-        blob = null;
         // this instance is not backed by temporarily allocated resource/buffer
         temp = false;
     }
 
     /**
-     * Creates a new <code>BLOBFileValue</code> instance from a existing blob.
-     *
-     * @param blob the existing blob
-     */
-    public BLOBFileValue(BLOBFileValue blob) {
-        // this instance is backed by a blob
-        this.blob = blob;
-        // set 'real' file to null
-        file = null;
-        fsResource = null;
-        // this instance is not backed by temporarily allocated resource/buffer
-        temp = false;
-    }
-
-
-    /**
      * Returns the length of this <code>BLOBFileValue</code>.
      *
      * @return The length, in bytes, of this <code>BLOBFileValue</code>,
@@ -262,8 +263,6 @@
             } catch (FileSystemException fse) {
                 return -1;
             }
-        } else if (blob != null) {
-            return blob.getLength();
         } else {
             // this instance is backed by an in-memory buffer
             return buffer.length;
@@ -287,8 +286,6 @@
         if (file != null) {
             // this instance is backed by a temp file
             file.delete();
-        } else if (blob != null) {
-            blob.discard();
         } else if (buffer != null) {
             // this instance is backed by an in-memory buffer
             buffer = EMPTY_BYTE_ARRAY;
@@ -335,8 +332,6 @@
                 // ignore
                 log.warn("Error while deleting BLOBFileValue: " + fse.getMessage());
             }
-        } else if (blob != null) {
-            blob.delete(pruneEmptyParentDirs);
         } else {
             // this instance is backed by an in-memory buffer
             buffer = EMPTY_BYTE_ARRAY;
@@ -353,11 +348,6 @@
      * @throws IOException         if an error occurs while while spooling
      */
     public void spool(OutputStream out) throws RepositoryException, IOException {
-        if (blob != null) {
-            blob.spool(out);
-            return;
-        }
-
         InputStream in;
         if (file != null) {
             // this instance is backed by a 'real' file
@@ -389,7 +379,6 @@
             try {
                 in.close();
             } catch (IOException ignore) {
-                // ignore
             }
         }
     }
@@ -411,8 +400,6 @@
         } else if (fsResource != null) {
             // this instance is backed by a resource in the virtual file system
             return fsResource.toString();
-        } else if (blob != null) {
-            return blob.toString();
         } else {
             // this instance is backed by an in-memory buffer
             return buffer.toString();
@@ -430,7 +417,6 @@
             BLOBFileValue other = (BLOBFileValue) obj;
             return ((file == null ? other.file == null : file.equals(other.file))
                     && (fsResource == null ? other.fsResource == null : fsResource.equals(other.fsResource))
-                    && (blob == null ? other.blob == null : blob.equals(other.blob))
                     && Arrays.equals(buffer, other.buffer));
         }
         return false;
@@ -497,8 +483,6 @@
                 throw new RepositoryException("file backing binary value not found",
                         fnfe);
             }
-        } else if (blob != null) {
-            return blob.getStream();
         } else if (fsResource != null) {
             // this instance is backed by a resource in the virtual file system
             try {
@@ -560,14 +544,4 @@
             RepositoryException {
         return Boolean.valueOf(getString()).booleanValue();
     }
-
-    /**
-     * Creates a copy of this blob file value that has the 'temporary' field
-     * cleared. if the 'temp' flag is not set, <code>this</code> is returned.
-     *
-     * @return a new value based on this one.
-     */
-    public BLOBFileValue copy() {
-        return temp ? new BLOBFileValue(this) : this;
-    }
-}
\ No newline at end of file
+}

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java?rev=408647&r1=408646&r2=408647&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java Mon May 22 05:32:39 2006
@@ -234,6 +234,16 @@
 
     /**
      * @param value
+     * @param temp
+     * @return
+     * @throws IOException
+     */
+    public static InternalValue create(InputStream value, boolean temp) throws IOException {
+        return new InternalValue(new BLOBFileValue(value, temp));
+    }
+
+    /**
+     * @param value
      * @return
      * @throws IOException
      */