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 2009/06/10 09:40:35 UTC

svn commit: r783243 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/ main/java/org/apache/jackrabbit/core/value/ test/java/org/apache/jackrabbit/core/data/

Author: thomasm
Date: Wed Jun 10 07:40:32 2009
New Revision: 783243

URL: http://svn.apache.org/viewvc?rev=783243&view=rev
Log:
JCR-2134 Data Store: avoid creating temporary files

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BinaryValueImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValueFactory.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/ValueFactoryImpl.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/CopyValueTest.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestTwoGetStreams.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java?rev=783243&r1=783242&r2=783243&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java Wed Jun 10 07:40:32 2009
@@ -1223,7 +1223,7 @@
     public ValueFactory getValueFactory()
             throws UnsupportedRepositoryOperationException, RepositoryException {
         if (valueFactory == null) {
-            valueFactory = new ValueFactoryImpl(this);
+            valueFactory = new ValueFactoryImpl(this, rep.getDataStore());
         }
         return valueFactory;
     }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BinaryValueImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BinaryValueImpl.java?rev=783243&r1=783242&r2=783243&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BinaryValueImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BinaryValueImpl.java Wed Jun 10 07:40:32 2009
@@ -34,7 +34,7 @@
      * @param blob the blob
      */
     BinaryValueImpl(BLOBFileValue blob) throws RepositoryException {
-        super(blob.getStream());
+        super(blob);
         this.blob = blob;
     }
 
@@ -47,15 +47,6 @@
     }
 
     /**
-     * Get the wrapped blob file value
-     * 
-     * @return the blob file value
-     */
-    BLOBFileValue getBlob() {
-        return blob;
-    }
-    
-    /**
      * Get the data identifier if one is available.
      * 
      * @return the data identifier or null

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java?rev=783243&r1=783242&r2=783243&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java Wed Jun 10 07:40:32 2009
@@ -19,6 +19,7 @@
 import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.core.data.DataIdentifier;
 import org.apache.jackrabbit.core.data.DataStore;
+import org.apache.jackrabbit.core.data.DataStoreException;
 import org.apache.jackrabbit.core.fs.FileSystemResource;
 import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException;
 import org.apache.jackrabbit.spi.commons.conversion.NameException;
@@ -123,6 +124,15 @@
                 InternalValue result;
                 if (USE_DATA_STORE) {
                     BLOBFileValue blob = null;
+                    if (value instanceof QValueValue) {
+                        QValueValue qvv = (QValueValue) value;
+                        QValue qv = qvv.getQValue();
+                        if (qv instanceof InternalValue) {
+                            InternalValue iv = (InternalValue) qv;
+                            
+                            iv.getBLOBFileValue();
+                        }
+                    }
                     if (value instanceof BinaryValueImpl) {
                         BinaryValueImpl bin = (BinaryValueImpl) value;
                         DataIdentifier identifier = bin.getDataIdentifier();
@@ -207,6 +217,18 @@
                 throw new IllegalArgumentException("illegal value");
         }
     }
+    
+    static InternalValue getInternalValue(DataIdentifier identifier, DataStore store) throws DataStoreException {
+        // access the record to ensure it is not garbage collected
+        if (store.getRecordIfStored(identifier) != null) {
+            // it exists - so we don't need to stream it again
+            // but we need to create a new object because the original
+            // one might be in a different data store (repository)
+            BLOBFileValue blob = BLOBInDataStore.getInstance(store, identifier);
+            return new InternalValue(blob);
+        }
+        return null;
+    }
 
     /**
      * @param value
@@ -313,6 +335,23 @@
     }
 
     /**
+     * Create an internal value that is stored in the data store (if enabled).
+     * 
+     * @param value the input stream
+     * @return the internal value
+     */
+    public static InternalValue create(InputStream value, DataStore store) throws RepositoryException {
+        if (USE_DATA_STORE) {
+            return new InternalValue(getBLOBFileValue(store, value, false));
+        }
+        try {
+            return new InternalValue(new BLOBValue(value, false));
+        } catch (IOException e) {
+            throw new RepositoryException("Error creating file", e);
+        }
+    }
+
+    /**
      * @param value
      * @return
      * @throws IOException
@@ -432,7 +471,7 @@
         if (resolver instanceof Session) {
             vf = ((Session) resolver).getValueFactory();
         } else {
-            vf = new ValueFactoryImpl(resolver);
+            vf = new ValueFactoryImpl(resolver, null);
         }
 
         if (vf instanceof ValueFactoryQImpl) {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValueFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValueFactory.java?rev=783243&r1=783242&r2=783243&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValueFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValueFactory.java Wed Jun 10 07:40:32 2009
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.core.value;
 
+import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.spi.QValue;
@@ -50,11 +51,14 @@
      */
     private static final Logger log = LoggerFactory.getLogger(InternalValueFactory.class);
 
-    private static final QValueFactory INSTANCE = new InternalValueFactory();
+    private static final QValueFactory INSTANCE = new InternalValueFactory(null);
 
-    private InternalValueFactory() {
-    }
+    private final DataStore store;
 
+    InternalValueFactory(DataStore store) {
+        this.store = store;
+    }
+    
     public static QValueFactory getInstance() {
         return INSTANCE;
     }
@@ -146,7 +150,7 @@
     }
 
     public QValue create(InputStream value) throws RepositoryException, IOException {
-        return InternalValue.create(value);
+        return InternalValue.create(value, store);
     }
 
     public QValue create(File value) throws RepositoryException, IOException {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/ValueFactoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/ValueFactoryImpl.java?rev=783243&r1=783242&r2=783243&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/ValueFactoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/ValueFactoryImpl.java Wed Jun 10 07:40:32 2009
@@ -16,12 +16,15 @@
  */
 package org.apache.jackrabbit.core.value;
 
+import org.apache.jackrabbit.core.data.DataIdentifier;
+import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
 import org.apache.jackrabbit.spi.commons.value.ValueFactoryQImpl;
 import org.apache.jackrabbit.spi.QValue;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.jcr.Binary;
 import javax.jcr.Value;
 import javax.jcr.PropertyType;
 import javax.jcr.ValueFormatException;
@@ -38,6 +41,8 @@
      * logger instance
      */
     private static final Logger log = LoggerFactory.getLogger(ValueFactoryImpl.class);
+    
+    private final DataStore store;
 
     /**
      * Constructs a new <code>ValueFactoryQImpl</code> based
@@ -46,8 +51,9 @@
      *
      * @param resolver wrapped <code>NamePathResolver</code>
      */
-    public ValueFactoryImpl(NamePathResolver resolver) {
-        super(InternalValueFactory.getInstance(), resolver);
+    public ValueFactoryImpl(NamePathResolver resolver, DataStore store) {
+        super(new InternalValueFactory(store), resolver);
+        this.store = store;
     }
 
     public Value createValue(QValue qvalue) {
@@ -56,11 +62,29 @@
                 return new BinaryValueImpl(((InternalValue) qvalue).getBLOBFileValue());
             } catch (RepositoryException e) {
                 // should not get here
-                log.error(e.getMessage());
+                log.error(e.getMessage(), e);
             }
         }
         return super.createValue(qvalue);
     }
+    
+    public Value createValue(Binary binary) {
+        try {
+            if (binary instanceof BLOBInDataStore) {
+                DataIdentifier identifier = ((BLOBInDataStore) binary).getDataIdentifier();
+                InternalValue value = InternalValue.getInternalValue(identifier, store);
+                if (value != null) {
+                    // if the value is already in this data store
+                    return new BinaryValueImpl(value.getBLOBFileValue());
+                }
+            }
+            return createValue(binary.getStream());
+        } catch (RepositoryException e) {
+            log.error(e.getMessage(), e);
+            // ignore - the super method may be smarter
+        }
+        return super.createValue(binary);
+    }    
 
     public Value createValue(InputStream value) {
         try {

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/CopyValueTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/CopyValueTest.java?rev=783243&r1=783242&r2=783243&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/CopyValueTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/CopyValueTest.java Wed Jun 10 07:40:32 2009
@@ -50,7 +50,7 @@
 
     private void doTestCopy(int length) throws Exception {
         Node root = superuser.getRootNode();
-        if(root.hasNode("testCopy")) {
+        if (root.hasNode("testCopy")) {
             root.getNode("testCopy").remove();
             superuser.save();
         }
@@ -80,7 +80,7 @@
     public void testRandomOperations() throws Exception {
         Random random = new Random(1);
         Node root = superuser.getRootNode();
-        if(root.hasNode("testRandom")) {
+        if (root.hasNode("testRandom")) {
             root.getNode("testRandom").remove();
             superuser.save();
         }
@@ -150,7 +150,7 @@
             }
         }
         superuser.save();
-        for(int i=0; i<opCounts.length; i++) {
+        for (int i = 0; i < opCounts.length; i++) {
             log(i + ": " + opCounts[i]);
         }
         testRoot.remove();

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestTwoGetStreams.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestTwoGetStreams.java?rev=783243&r1=783242&r2=783243&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestTwoGetStreams.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/TestTwoGetStreams.java Wed Jun 10 07:40:32 2009
@@ -22,6 +22,7 @@
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
+import javax.jcr.ValueFactory;
 
 import org.apache.jackrabbit.api.JackrabbitValue;
 import org.apache.jackrabbit.core.RepositoryImpl;
@@ -53,8 +54,9 @@
         }
         
         Node root = superuser.getRootNode();
-        root.setProperty("p1", new RandomInputStream(1, STREAM_LENGTH));
-        root.setProperty("p2", new RandomInputStream(1, STREAM_LENGTH));
+        ValueFactory vf = superuser.getValueFactory();
+        root.setProperty("p1", vf.createBinary(new RandomInputStream(1, STREAM_LENGTH)));
+        root.setProperty("p2", vf.createBinary(new RandomInputStream(1, STREAM_LENGTH)));
         superuser.save();
 
         Value v1 = root.getProperty("p1").getValue();