You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2008/02/01 10:12:42 UTC

svn commit: r617383 - in /jackrabbit/branches/1.4/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/value/ test/java/org/apache/jackrabbit/core/data/

Author: thomasm
Date: Fri Feb  1 01:12:37 2008
New Revision: 617383

URL: http://svn.apache.org/viewvc?rev=617383&view=rev
Log:
1.4: Merged revision 616442 (JCR-1346, JCR-1351)

Added:
    jackrabbit/branches/1.4/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/CopyValueTest.java
      - copied unchanged from r616442, jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/CopyValueTest.java
Modified:
    jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java
    jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInDataStore.java
    jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInMemory.java
    jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInResource.java
    jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInTempFile.java
    jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBValue.java
    jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java
    jackrabbit/branches/1.4/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestAll.java

Modified: jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java?rev=617383&r1=617382&r2=617383&view=diff
==============================================================================
--- jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java (original)
+++ jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java Fri Feb  1 01:12:37 2008
@@ -69,6 +69,14 @@
     public abstract void delete(boolean pruneEmptyParentDirs);
 
     /**
+     * Checks if this object is immutable.
+     * Immutable objects can not change and can safely copied.
+     *
+     * @return true if the object is immutable
+     */
+    public abstract boolean isImmutable();
+
+    /**
      * {@inheritDoc}
      */
     public abstract boolean equals(Object obj);

Modified: jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInDataStore.java?rev=617383&r1=617382&r2=617383&view=diff
==============================================================================
--- jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInDataStore.java (original)
+++ jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInDataStore.java Fri Feb  1 01:12:37 2008
@@ -61,6 +61,13 @@
         // do nothing
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isImmutable() {
+        return true;
+    }
+
     public boolean equals(Object obj) {
         if (!(obj instanceof BLOBInDataStore) || obj == null) {
             return false;

Modified: jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInMemory.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInMemory.java?rev=617383&r1=617382&r2=617383&view=diff
==============================================================================
--- jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInMemory.java (original)
+++ jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInMemory.java Fri Feb  1 01:12:37 2008
@@ -119,16 +119,25 @@
      * {@inheritDoc}
      */
     public void delete(boolean pruneEmptyParentDirs) {
-        // TODO avoid: this makes the value mutable
-        data = EMPTY_BYTE_ARRAY;
+        // do nothing
+        // this object could still be referenced
+        // the data will be garbage collected
     }
 
     /**
      * {@inheritDoc}
      */
     public void discard() {
-        // TODO avoid: this makes the value mutable
-        data = EMPTY_BYTE_ARRAY;
+        // do nothing
+        // this object could still be referenced
+        // the data will be garbage collected
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isImmutable() {
+        return true;
     }
 
     /**

Modified: jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInResource.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInResource.java?rev=617383&r1=617382&r2=617383&view=diff
==============================================================================
--- jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInResource.java (original)
+++ jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInResource.java Fri Feb  1 01:12:37 2008
@@ -103,6 +103,14 @@
     /**
      * {@inheritDoc}
      */
+    public boolean isImmutable() {
+        // delete will modify the state.
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     public long getLength() {
         return length;
     }

Modified: jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInTempFile.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInTempFile.java?rev=617383&r1=617382&r2=617383&view=diff
==============================================================================
--- jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInTempFile.java (original)
+++ jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBInTempFile.java Fri Feb  1 01:12:37 2008
@@ -133,6 +133,14 @@
     /**
      * {@inheritDoc}
      */
+    public boolean isImmutable() {
+        // discard and delete can modify the state.
+        return false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     public long getLength() {
         return length;
     }

Modified: jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBValue.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBValue.java?rev=617383&r1=617382&r2=617383&view=diff
==============================================================================
--- jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBValue.java (original)
+++ jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBValue.java Fri Feb  1 01:12:37 2008
@@ -237,7 +237,7 @@
      * @see #delete(boolean)
      */
     public void discard() {
-        if (!temp) {
+        if (!temp){
             // do nothing if this instance is not backed by temporarily
             // allocated resource/buffer
             return;
@@ -280,6 +280,14 @@
             // this instance is backed by an in-memory buffer
             buffer = EMPTY_BYTE_ARRAY;
         }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isImmutable() {
+        // delete will modify the state
+        return false;
     }
 
     //-------------------------------------------< java.lang.Object overrides >

Modified: jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java?rev=617383&r1=617382&r2=617383&view=diff
==============================================================================
--- jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java (original)
+++ jackrabbit/branches/1.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java Fri Feb  1 01:12:37 2008
@@ -120,7 +120,7 @@
         switch (value.getType()) {
             case PropertyType.BINARY:
                 if (USE_DATA_STORE) {
-                    return new InternalValue(getBLOBFileValue(store, value.getStream()));
+                    return new InternalValue(getBLOBFileValue(store, value.getStream(), true));
                 }
                 if (value instanceof BLOBFileValue) {
                     return new InternalValue((BLOBFileValue) value);
@@ -225,7 +225,7 @@
      */
     public static InternalValue createTemporary(InputStream value) throws RepositoryException {
         if (USE_DATA_STORE) {        
-            return new InternalValue(getBLOBFileValue(null, value));
+            return new InternalValue(getBLOBFileValue(null, value, true));
         }
         try {
             return new InternalValue(new BLOBValue(value, true));
@@ -245,7 +245,7 @@
      */
     public static InternalValue createTemporary(InputStream value, DataStore store) throws RepositoryException {
         if (USE_DATA_STORE) {
-            return new InternalValue(getBLOBFileValue(store, value));
+            return new InternalValue(getBLOBFileValue(store, value, true));
         }
         try {
             return new InternalValue(new BLOBValue(value, true));
@@ -262,7 +262,7 @@
      */
     public static InternalValue create(InputStream value) throws RepositoryException {
         if (USE_DATA_STORE) {
-            return new InternalValue(getBLOBFileValue(null, value));
+            return new InternalValue(getBLOBFileValue(null, value, false));
         }
         try {
             return new InternalValue(new BLOBValue(value, false));
@@ -439,6 +439,8 @@
     }    
 
     /**
+     * Get the type of this value.
+     *
      * @return the type
      */
     public int getType() {
@@ -446,29 +448,34 @@
     }
 
     /**
-     * @return
+     * Create a copy of this object. Immutable values will return itself,
+     * while mutable values will return a copy.
+     *
+     * @return itself or a copy
      * @throws RepositoryException
      */
     public InternalValue createCopy() throws RepositoryException {
-        if (USE_DATA_STORE) {
+        if (type != PropertyType.BINARY) {
+            // for all types except BINARY it's safe to return 'this' because the
+            // wrapped value is immutable (and therefore this instance as well)
             return this;
         }
-        if (type == PropertyType.BINARY) {
-            // return a copy since the wrapped BLOBFileValue instance is mutable
-            InputStream stream = ((BLOBFileValue) val).getStream();
+        BLOBFileValue v = (BLOBFileValue) val;
+        if (USE_DATA_STORE) {
+            if (v.isImmutable()) {
+                return this;
+            }
+        }
+        // return a copy since the wrapped BLOBFileValue instance is mutable
+        InputStream stream = v.getStream();
+        try {
+            return createTemporary(stream);
+        } finally {
             try {
-                return createTemporary(stream);
-            } finally {
-                try {
-                    stream.close();
-                } catch (IOException e) {
-                    // ignore
-                }
+                stream.close();
+            } catch (IOException e) {
+                // ignore
             }
-        } else {
-            // for all other types it's safe to return 'this' because the
-            // wrapped value is immutable (and therefore this instance as well)
-            return this;
         }
     }
 
@@ -594,7 +601,16 @@
         type = PropertyType.REFERENCE;
     }
     
-    private static BLOBFileValue getBLOBFileValue(DataStore store, InputStream in) throws RepositoryException {
+    /**
+     * Create a BLOB value from in input stream. Small objects will create an in-memory object,
+     * while large objects are stored in the data store or in a temp file (if the store parameter is not set).
+     *
+     * @param store the data store (optional)
+     * @param in the input stream
+     * @param temporary if the file should be deleted when discard is called (ignored if a data store is used)
+     * @return the value
+     */
+    private static BLOBFileValue getBLOBFileValue(DataStore store, InputStream in, boolean temporary) throws RepositoryException {
         int maxMemorySize;
         if (store != null) {
             maxMemorySize = store.getMinRecordLength() - 1;
@@ -627,7 +643,7 @@
             if (store != null) {
                 return BLOBInDataStore.getInstance(store, in);
             } else {
-                return BLOBInTempFile.getInstance(in, true);
+                return BLOBInTempFile.getInstance(in, temporary);
             }
         }
     }
@@ -642,6 +658,13 @@
         }
     }
 
+    /**
+     * Store a value in the data store. This will store temporary files or in-memory objects
+     * in the data store.
+     *
+     * @param dataStore the data store
+     * @throws RepositoryException
+     */
     public void store(DataStore dataStore) throws RepositoryException, IOException {
         assert USE_DATA_STORE;
         assert dataStore != null;
@@ -657,7 +680,7 @@
             }
         }
         // store the temp file to the data store, or (theoretically) load it in memory
-        val = getBLOBFileValue(dataStore, v.getStream());
+        val = getBLOBFileValue(dataStore, v.getStream(), false);
     }
 
 }

Modified: jackrabbit/branches/1.4/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestAll.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.4/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestAll.java?rev=617383&r1=617382&r2=617383&view=diff
==============================================================================
--- jackrabbit/branches/1.4/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestAll.java (original)
+++ jackrabbit/branches/1.4/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestAll.java Fri Feb  1 01:12:37 2008
@@ -36,6 +36,7 @@
         suite.addTestSuite(ExportImportTest.class);
         suite.addTestSuite(GarbageCollectorTest.class);
         suite.addTestSuite(PersistenceManagerIteratorTest.class);
+        suite.addTestSuite(CopyValueTest.class);
         return suite;
     }