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 2007/08/28 08:52:31 UTC

svn commit: r570336 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ data/ persistence/bundle/util/ persistence/util/ persistence/xml/ query/lucene/ state/ value/

Author: thomasm
Date: Mon Aug 27 23:52:30 2007
New Revision: 570336

URL: http://svn.apache.org/viewvc?rev=570336&view=rev
Log:
JCR-926: BLOBFileValue and InternalValue refactoring, improved garbage collector for the global data store

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/BundleBinding.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ItemStateBinding.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/Serializer.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/TextFilterExtractor.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/InternalValue.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java?rev=570336&r1=570335&r2=570336&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java Mon Aug 27 23:52:30 2007
@@ -740,15 +740,13 @@
 
         InternalValue value;
         try {
+            value = InternalValue.createTemporary(stream);
             if (reqType != PropertyType.BINARY) {
                 // type conversion required
+                Value jcrValue = value.toJCRValue(session.getNamespaceResolver());
                 Value targetVal = ValueHelper.convert(
-                        new BLOBFileValue(stream), reqType,
-                        ValueFactoryImpl.getInstance());
-                value = InternalValue.create(targetVal, session.getNamespaceResolver());
-            } else {
-                // no type conversion required
-                value = InternalValue.create(stream);
+                        jcrValue, reqType, ValueFactoryImpl.getInstance());
+                value = InternalValue.create(targetVal, session.getNamespaceResolver(), rep.getDataStore());
             }
         } catch (IOException ioe) {
             String msg = "failed to spool stream to internal storage";

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java?rev=570336&r1=570335&r2=570336&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java Mon Aug 27 23:52:30 2007
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.core.data;
 
 import org.apache.jackrabbit.core.RepositoryImpl;
+import org.apache.jackrabbit.core.observation.SynchronousEventListener;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -35,7 +36,6 @@
 import javax.jcr.Workspace;
 import javax.jcr.observation.Event;
 import javax.jcr.observation.EventIterator;
-import javax.jcr.observation.EventListener;
 import javax.jcr.observation.ObservationManager;
 
 /**
@@ -50,11 +50,11 @@
  */
 public class GarbageCollector {
 
-    private static final int WAIT_FOR_EVENT_LISTENERS = 5000;
-
     private final ScanEventListener callback;
 
     private final int sleepBetweenNodes;
+    
+    private final int sleepBetweenEvents;
 
     private DataStore store;
 
@@ -64,12 +64,20 @@
 
     // TODO Observation: it is up to the implementation whether changes made to
     // the subtree below jcr:system trigger events.
-    // TODO How long do we have to wait for the observation listeners?
     // TODO It should be possible to stop and restart a garbage collection scan.
     // TODO It may be possible to delete files early, see rememberNode()
 
-    public GarbageCollector(int sleepBetweenNodes, ScanEventListener callback) {
+    /**
+     * Create a new garbage collector. 
+     * To display the progress, a callback object may be used.
+     * 
+     * @param callback if set, this is called while scanning
+     * @param sleepBetweenNodes the number of milliseconds to sleep in the main scan loop (0 if the scan should run at full speed)
+     * @param sleepBetweenEvents the number of milliseconds to sleep while processing events (0 to avoid delays in the application)
+     */
+    public GarbageCollector(ScanEventListener callback, int sleepBetweenNodes, int sleepBetweenEvents) {
         this.sleepBetweenNodes = sleepBetweenNodes;
+        this.sleepBetweenEvents = sleepBetweenEvents;
         this.callback = callback;
     }
 
@@ -89,16 +97,11 @@
 
         // adding a link to a BLOB updates the modified date
         // reading usually doesn't, but when scanning, it does
-        recurse(session.getRootNode());
+        recurse(session.getRootNode(), sleepBetweenNodes);
     }
 
     public void stopScan() throws RepositoryException {
         checkScanStarted();
-        try {
-            Thread.sleep(WAIT_FOR_EVENT_LISTENERS);
-        } catch (InterruptedException e) {
-            // ignore
-        }
         for (int i = 0; i < listeners.size(); i++) {
             Listener listener = (Listener) listeners.get(i);
             try {
@@ -132,11 +135,11 @@
         return store;
     }
 
-    private void recurse(final Node n) throws RepositoryException,
+    private void recurse(final Node n, int sleep) throws RepositoryException,
             IllegalStateException, IOException {
-        if (sleepBetweenNodes > 0) {
+        if (sleep > 0) {
             try {
-                Thread.sleep(sleepBetweenNodes);
+                Thread.sleep(sleep);
             } catch (InterruptedException e) {
                 // ignore
             }
@@ -166,7 +169,7 @@
             callback.afterScanning(n);
         }
         for (NodeIterator it = n.getNodes(); it.hasNext();) {
-            recurse(it.nextNode());
+            recurse(it.nextNode(), sleep);
         }
     }
 
@@ -204,8 +207,9 @@
 
     /**
      * Event listener to detect moved nodes.
+     * A SynchronousEventListener is used to make sure this method is called before the main iteration ends.
      */
-    class Listener implements EventListener {
+    class Listener implements SynchronousEventListener {
 
         private final Session session;
 
@@ -231,6 +235,13 @@
         }
 
         public void onEvent(EventIterator events) {
+            if(sleepBetweenEvents > 0) {
+                try {
+                    Thread.sleep(sleepBetweenEvents);
+                } catch (InterruptedException e) {
+                    // ignore
+                }
+            }
             while (events.hasNext()) {
                 Event event = events.nextEvent();
                 try {
@@ -239,7 +250,7 @@
                         Item item = session.getItem(path);
                         if (item.isNode()) {
                             Node n = (Node) item;
-                            recurse(n);
+                            recurse(n, sleepBetweenEvents);
                         }
                     } catch (PathNotFoundException e) {
                         // ignore

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/BundleBinding.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/BundleBinding.java?rev=570336&r1=570335&r2=570336&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/BundleBinding.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/BundleBinding.java Mon Aug 27 23:52:30 2007
@@ -326,7 +326,7 @@
                             if (blobStore instanceof ResourceBasedBLOBStore) {
                                 val = InternalValue.create(((ResourceBasedBLOBStore) blobStore).getResource(blobIds[i]));
                             } else {
-                                val = InternalValue.create(blobStore.get(blobIds[i]), false);
+                                val = InternalValue.create(blobStore.get(blobIds[i]));
                             }
                         } catch (IOException e) {
                             if (errorHandling.ignoreMissingBlobs()) {
@@ -586,7 +586,7 @@
                                 if (blobStore instanceof ResourceBasedBLOBStore) {
                                     values[i] = InternalValue.create(((ResourceBasedBLOBStore) blobStore).getResource(blobId));
                                 } else {
-                                    values[i] = InternalValue.create(blobStore.get(blobId), false);
+                                    values[i] = InternalValue.create(blobStore.get(blobId));
                                 }
                             } catch (Exception e) {
                                 log.error("Error while reloading blob. truncating. id=" + state.getId() +

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ItemStateBinding.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ItemStateBinding.java?rev=570336&r1=570335&r2=570336&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ItemStateBinding.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ItemStateBinding.java Mon Aug 27 23:52:30 2007
@@ -146,7 +146,7 @@
             throws IOException {
         NodeReferences state = new NodeReferences(id);
         int count = in.readInt();   // count & version
-        int version = (count >> 24) | 0x0ff;
+        // int version = (count >> 24) | 0x0ff;
         count &= 0x00ffffff;
         for (int i = 0; i < count; i++) {
             state.addReference(readPropertyId(in));    // propertyId
@@ -302,7 +302,7 @@
                                 val = InternalValue.create(
                                         ((ResourceBasedBLOBStore) blobStore).getResource(s));
                             } else {
-                                val = InternalValue.create(blobStore.get(s), false);
+                                val = InternalValue.create(blobStore.get(s));
                             }
                         } catch (IOException e) {
                             if (errorHandling.ignoreMissingBlobs()) {
@@ -399,7 +399,7 @@
                             if (blobStore instanceof ResourceBasedBLOBStore) {
                                 values[i] = InternalValue.create(((ResourceBasedBLOBStore) blobStore).getResource(blobId));
                             } else {
-                                values[i] = InternalValue.create(blobStore.get(blobId), false);
+                                values[i] = InternalValue.create(blobStore.get(blobId));
                             }
                             blobVal.discard();
                         } else {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/Serializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/Serializer.java?rev=570336&r1=570335&r2=570336&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/Serializer.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/Serializer.java Mon Aug 27 23:52:30 2007
@@ -219,7 +219,7 @@
                 } else {
                     in = blobStore.get(blobId);
                     try {
-                        values[i] = InternalValue.create(in, false);
+                        values[i] = InternalValue.create(in);
                     } finally {
                         try {
                             in.close();
@@ -292,7 +292,7 @@
                 } else {
                     InputStream is = blobStore.get(s);
                     try {
-                        val = InternalValue.create(is, false);
+                        val = InternalValue.create(is);
                     } finally {
                         try {
                             is.close();

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java?rev=570336&r1=570335&r2=570336&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java Mon Aug 27 23:52:30 2007
@@ -354,7 +354,7 @@
                             } else {
                                 InputStream in = blobStore.get(content);
                                 try {
-                                    values.add(InternalValue.create(in, false));
+                                    values.add(InternalValue.create(in));
                                 } finally {
                                     try {
                                         in.close();
@@ -693,7 +693,7 @@
                                 } else {
                                     in = blobStore.get(blobId);
                                     try {
-                                        values[i] = InternalValue.create(in, false);
+                                        values[i] = InternalValue.create(in);
                                     } finally {
                                         try {
                                             in.close();

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/TextFilterExtractor.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/TextFilterExtractor.java?rev=570336&r1=570335&r2=570336&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/TextFilterExtractor.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/TextFilterExtractor.java Mon Aug 27 23:52:30 2007
@@ -97,7 +97,7 @@
      */
     public Reader extractText(InputStream stream, String type, String encoding)
             throws IOException {
-        final InternalValue value = InternalValue.create(stream);
+        final InternalValue value = InternalValue.createTemporary(stream);
         try {
             PropertyState state = new PropertyState(
                     (PropertyId) null, ItemState.STATUS_EXISTING, true);

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java?rev=570336&r1=570335&r2=570336&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/PropertyState.java Mon Aug 27 23:52:30 2007
@@ -345,7 +345,7 @@
                         public void close() {
                             // nop
                         }
-                    }, false);
+                    });
                 } else {
                     values[i] = InternalValue.valueOf(in.readUTF(), type);
                 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java?rev=570336&r1=570335&r2=570336&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java Mon Aug 27 23:52:30 2007
@@ -18,17 +18,11 @@
 
 import org.apache.jackrabbit.core.fs.FileSystemException;
 import org.apache.jackrabbit.core.fs.FileSystemResource;
-import org.apache.jackrabbit.util.ISO8601;
 import org.apache.jackrabbit.util.TransientFileFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-import javax.jcr.Value;
-import javax.jcr.ValueFormatException;
 import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -36,9 +30,9 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
 import java.util.Arrays;
-import java.util.Calendar;
+
+import javax.jcr.RepositoryException;
 
 /**
  * <code>BLOBFileValue</code> represents a binary <code>Value</code> which is
@@ -50,7 +44,7 @@
  * This is class is for Jackrabbit-internal use only. Applications should
  * use <code>javax.jcr.ValueFactory</code> to create binary values.
  */
-public class BLOBFileValue implements Value {
+public class BLOBFileValue {
 
     /**
      * The default logger
@@ -58,16 +52,6 @@
     private static Logger log = LoggerFactory.getLogger(BLOBFileValue.class);
 
     /**
-     * the property type
-     */
-    public static final int TYPE = PropertyType.BINARY;
-
-    /**
-     * the default encoding
-     */
-    protected static final String DEFAULT_ENCODING = "UTF-8";
-
-    /**
      * empty array
      */
     private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
@@ -100,28 +84,6 @@
     private final FileSystemResource fsResource;
 
     /**
-     * converted text
-     */
-    private String text = null;
-
-    /**
-     * 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 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
@@ -139,7 +101,7 @@
      * @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 {
+    BLOBFileValue(InputStream in, boolean temp) throws IOException {
         byte[] spoolBuffer = new byte[0x2000];
         int read;
         int len = 0;
@@ -189,7 +151,7 @@
      * @param bytes byte array to be represented as a <code>BLOBFileValue</code>
      *              instance
      */
-    public BLOBFileValue(byte[] bytes) {
+    BLOBFileValue(byte[] bytes) {
         buffer = bytes;
         file = null;
         fsResource = null;
@@ -203,7 +165,7 @@
      * @param file file to be represented as a <code>BLOBFileValue</code> instance
      * @throws IOException if the file can not be read
      */
-    public BLOBFileValue(File file) throws IOException {
+    BLOBFileValue(File file) throws IOException {
         String path = file.getCanonicalPath();
         if (!file.isFile()) {
             throw new IOException(path + ": the specified file does not exist");
@@ -225,7 +187,7 @@
      * @param fsResource resource in virtual file system
      * @throws IOException if the resource can not be read
      */
-    public BLOBFileValue(FileSystemResource fsResource) throws IOException {
+    BLOBFileValue(FileSystemResource fsResource) throws IOException {
         try {
             if (!fsResource.exists()) {
                 throw new IOException(fsResource.getPath()
@@ -302,7 +264,7 @@
      *
      * @see #discard()
      */
-    public void delete() {
+    private void delete() {
         if (!temp) {
             delete(false);
         }
@@ -339,51 +301,6 @@
         }
     }
 
-    /**
-     * Spools the contents of this <code>BLOBFileValue</code> to the given
-     * output stream.
-     *
-     * @param out output stream
-     * @throws RepositoryException if the input stream for this
-     *                             <code>BLOBFileValue</code> could not be obtained
-     * @throws IOException         if an error occurs while while spooling
-     */
-    public void spool(OutputStream out) throws RepositoryException, IOException {
-        InputStream in;
-        if (file != null) {
-            // this instance is backed by a 'real' file
-            try {
-                in = new FileInputStream(file);
-            } catch (FileNotFoundException fnfe) {
-                throw new RepositoryException("file backing binary value not found",
-                        fnfe);
-            }
-        } else if (fsResource != null) {
-            // this instance is backed by a resource in the virtual file system
-            try {
-                in = fsResource.getInputStream();
-            } catch (FileSystemException fse) {
-                throw new RepositoryException(fsResource.getPath()
-                        + ": the specified resource does not exist", fse);
-            }
-        } else {
-            // this instance is backed by an in-memory buffer
-            in = new ByteArrayInputStream(buffer);
-        }
-        try {
-            byte[] buffer = new byte[0x2000];
-            int read;
-            while ((read = in.read(buffer)) > 0) {
-                out.write(buffer, 0, read);
-            }
-        } finally {
-            try {
-                in.close();
-            } catch (IOException ignore) {
-            }
-        }
-    }
-
     //-------------------------------------------< java.lang.Object overrides >
     /**
      * Returns a string representation of this <code>BLOBFileValue</code>
@@ -434,42 +351,6 @@
         return 0;
     }
 
-    //----------------------------------------------------------------< Value >
-    /**
-     * {@inheritDoc}
-     */
-    public int getType() {
-        return TYPE;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public String getString()
-            throws ValueFormatException, IllegalStateException,
-            RepositoryException {
-        if (text == null) {
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
-            try {
-                spool(out);
-                byte[] data = out.toByteArray();
-                text = new String(data, DEFAULT_ENCODING);
-            } catch (UnsupportedEncodingException e) {
-                throw new RepositoryException(DEFAULT_ENCODING
-                        + " not supported on this platform", e);
-            } catch (IOException e) {
-                throw new ValueFormatException("conversion from stream to string failed", e);
-            } finally {
-                try {
-                    out.close();
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-        }
-        return text;
-    }
-
     /**
      * {@inheritDoc}
      */
@@ -497,52 +378,4 @@
         }
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    public double getDouble()
-            throws ValueFormatException, IllegalStateException,
-            RepositoryException {
-        try {
-            return Double.parseDouble(getString());
-        } catch (NumberFormatException e) {
-            throw new ValueFormatException("conversion to double failed", e);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public Calendar getDate()
-            throws ValueFormatException, IllegalStateException,
-            RepositoryException {
-        Calendar cal = ISO8601.parse(getString());
-        if (cal != null) {
-            return cal;
-        } else {
-            throw new ValueFormatException("not a valid date format");
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public long getLong()
-            throws ValueFormatException, IllegalStateException,
-            RepositoryException {
-        try {
-            return Long.parseLong(getString());
-        } catch (NumberFormatException e) {
-            throw new ValueFormatException("conversion to long failed", e);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean getBoolean()
-            throws ValueFormatException, IllegalStateException,
-            RepositoryException {
-        return Boolean.valueOf(getString()).booleanValue();
-    }
 }

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=570336&r1=570335&r2=570336&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 Mon Aug 27 23:52:30 2007
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.core.value;
 
+import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.fs.FileSystemResource;
 import org.apache.jackrabbit.name.MalformedPathException;
 import org.apache.jackrabbit.name.NameException;
@@ -69,9 +70,14 @@
 
     public static final InternalValue[] EMPTY_ARRAY = new InternalValue[0];
 
-    public static final InternalValue BOOLEAN_TRUE = create(true);
+    private static final InternalValue BOOLEAN_TRUE = new InternalValue(true);
 
-    public static final InternalValue BOOLEAN_FALSE = create(false);
+    private static final InternalValue BOOLEAN_FALSE = new InternalValue(false);
+    
+    /**
+     * If set to 'true', the new global data store will be used, otherwise the old blob store implementation
+     */
+    public static final boolean USE_DATA_STORE = Boolean.valueOf(System.getProperty("org.jackrabbit.useDataStore", "false")).booleanValue();
 
     private final Object val;
     private final int type;
@@ -84,6 +90,18 @@
      * @throws ValueFormatException
      * @throws RepositoryException
      */
+    public static InternalValue create(Value value, NamespaceResolver nsResolver, DataStore store)
+            throws ValueFormatException, RepositoryException {
+        return create(value, nsResolver);
+    }
+
+    /**
+     * @param value
+     * @param nsResolver
+     * @return
+     * @throws ValueFormatException
+     * @throws RepositoryException
+     */
     public static InternalValue create(Value value, NamespaceResolver nsResolver)
             throws ValueFormatException, RepositoryException {
         if (value == null) {
@@ -98,7 +116,7 @@
                     } else {
                         InputStream stream = value.getStream();
                         try {
-                            return new InternalValue(new BLOBFileValue(stream));
+                            return createTemporary(stream);
                         } finally {
                             try {
                                 stream.close();
@@ -177,7 +195,7 @@
      * @return the created value
      */
     public static InternalValue create(boolean value) {
-        return new InternalValue(value);
+        return value ? BOOLEAN_TRUE : BOOLEAN_FALSE;
     }
 
     /**
@@ -193,9 +211,9 @@
      * @return
      * @throws IOException
      */
-    public static InternalValue create(InputStream value) throws IOException {
-        return new InternalValue(new BLOBFileValue(value));
-    }
+    public static InternalValue createTemporary(InputStream value) throws IOException {
+        return new InternalValue(new BLOBFileValue(value, true));
+    }    
 
     /**
      * @param value
@@ -203,8 +221,8 @@
      * @return
      * @throws IOException
      */
-    public static InternalValue create(InputStream value, boolean temp) throws IOException {
-        return new InternalValue(new BLOBFileValue(value, temp));
+    public static InternalValue create(InputStream value) throws IOException {
+        return new InternalValue(new BLOBFileValue(value, false));
     }
 
     /**
@@ -247,30 +265,6 @@
     }
 
     /**
-     * @param values
-     * @return the created value
-     */
-    public static InternalValue[] create(String[] values) {
-        InternalValue[] ret = new InternalValue[values.length];
-        for (int i = 0; i < values.length; i++) {
-            ret[i] = new InternalValue(values[i]);
-        }
-        return ret;
-    }
-
-    /**
-     * @param values
-     * @return the created value
-     */
-    public static InternalValue[] create(Calendar[] values) {
-        InternalValue[] ret = new InternalValue[values.length];
-        for (int i = 0; i < values.length; i++) {
-            ret[i] = new InternalValue(values[i]);
-        }
-        return ret;
-    }
-
-    /**
      * @param value
      * @return the created value
      */
@@ -393,7 +387,7 @@
             try {
                 InputStream stream = ((BLOBFileValue) val).getStream();
                 try {
-                    return new InternalValue(new BLOBFileValue(stream));
+                    return createTemporary(stream);
                 } finally {
                     try {
                         stream.close();
@@ -428,7 +422,7 @@
     public static InternalValue valueOf(String s, int type) {
         switch (type) {
             case PropertyType.BOOLEAN:
-                return new InternalValue(Boolean.valueOf(s).booleanValue());
+                return create(Boolean.valueOf(s).booleanValue());
             case PropertyType.DATE:
                 return new InternalValue(ISO8601.parse(s));
             case PropertyType.DOUBLE:
@@ -448,7 +442,7 @@
                 throw new IllegalArgumentException(
                         "this method does not support the type PropertyType.BINARY");
             default:
-                throw new IllegalArgumentException("illegal type");
+                throw new IllegalArgumentException("illegal type: " + type);
         }
     }