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 2004/11/03 10:19:48 UTC

svn commit: rev 56480 - in incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core: . state state/obj state/tx state/xml

Author: stefan
Date: Wed Nov  3 01:19:47 2004
New Revision: 56480

Modified:
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistenceManager.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistentItemStateManager.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/DefaultTransactionalStore.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/TransactionalItemStateManager.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/TransactionalStore.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java
Log:
misc. small changes for better performance

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java	Wed Nov  3 01:19:47 2004
@@ -768,15 +768,17 @@
      * Initializes the version history of all new nodes of node type
      * <code>mix:versionable</code>.
      * <p/>
-     * Called by {@link #validateTransientItems(Iterator)}.
+     * Called by {@link #save()}.
      *
      * @param iter
+     * @return true if this call generated new transient state; otherwise false
      * @throws RepositoryException
      */
-    private void initVersionHistories(Iterator iter) throws RepositoryException {
+    private boolean initVersionHistories(Iterator iter) throws RepositoryException {
         // todo consolidate version history creation code (currently in NodeImpl.addMixin & ItemImpl.initVersionHistories
         // walk through list of transient items and
         // search for new versionable nodes
+        boolean createdTransientState = false;
         while (iter.hasNext()) {
             ItemState itemState = (ItemState) iter.next();
             if (itemState.isNode() && itemState.getStatus() == ItemState.STATUS_NEW) {
@@ -787,9 +789,11 @@
                     node.internalSetProperty(VersionManager.PROPNAME_BASE_VERSION, InternalValue.create(new UUID(hist.getRootVersion().getUUID())));
                     node.internalSetProperty(VersionManager.PROPNAME_IS_CHECKED_OUT, InternalValue.create(true));
                     node.internalSetProperty(VersionManager.PROPNAME_PREDECESSORS, new InternalValue[]{InternalValue.create(new UUID(hist.getRootVersion().getUUID()))});
+                    createdTransientState = true;
                 }
             }
         }
+        return createdTransientState;
     }
 
     /**
@@ -1026,7 +1030,7 @@
         try {
             /**
              * turn on temporary path caching for better performance
-             * (assuming that the paths won't change during the save() call)
+             * (assuming that the paths won't change during this save() call)
              */
             itemStateMgr.enablePathCaching(true);
 
@@ -1135,11 +1139,14 @@
                     itemStateMgr.disposeTransientItemStateInAttic(transientState);
                 }
 
-                // initialize version histories for new nodes (might create new transient state)
-                initVersionHistories(dirty.iterator());
-
-                // re-build the list of transient states (might have changed by now)
-                dirty = getTransientStates();
+                // initialize version histories for new nodes (might generate new transient state)
+                if (initVersionHistories(dirty.iterator())) {
+                    /**
+                     * re-build the list of transient states because the previous call
+                     * generated new transient state
+                     */
+                    dirty = getTransientStates();
+                }
 
                 // persist 'new' or 'modified' transient states
                 persistTransientItems(dirty.iterator());

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistenceManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistenceManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistenceManager.java	Wed Nov  3 01:19:47 2004
@@ -15,6 +15,8 @@
  */
 package org.apache.jackrabbit.core.state;
 
+import org.apache.jackrabbit.core.ItemId;
+import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.config.WorkspaceConfig;
 
 /**
@@ -92,4 +94,27 @@
      * @throws ItemStateException
      */
     public void destroy(NodeReferences refs) throws ItemStateException;
+
+    /**
+     * Determines if there's <code>PersistentItemState</code> data for
+     * the given item.
+     *
+     * @param id
+     * @return
+     * @throws ItemStateException
+     * @see #load(PersistentNodeState)
+     * @see #load(PersistentPropertyState)
+     */
+    public boolean exists(ItemId id) throws ItemStateException;
+
+    /**
+     * Determines if there's <code>NodeReferences</code> data for
+     * the given target id.
+     *
+     * @param targetId
+     * @return
+     * @throws ItemStateException
+     * @see #load(NodeReferences)
+     */
+    public boolean referencesExist(NodeId targetId) throws ItemStateException;
 }

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistentItemStateManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistentItemStateManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistentItemStateManager.java	Wed Nov  3 01:19:47 2004
@@ -232,9 +232,12 @@
      * @see ItemStateProvider#hasItemState(ItemId)
      */
     public boolean hasItemState(ItemId id) {
-        try {
-            getItemState(id);
+        if (isCached(id)) {
             return true;
+        }
+        
+        try {
+            return persistMgr.exists(id);
         } catch (ItemStateException ise) {
             return false;
         }

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java	Wed Nov  3 01:19:47 2004
@@ -15,10 +15,7 @@
  */
 package org.apache.jackrabbit.core.state.obj;
 
-import org.apache.jackrabbit.core.BLOBFileValue;
-import org.apache.jackrabbit.core.InternalValue;
-import org.apache.jackrabbit.core.PropertyId;
-import org.apache.jackrabbit.core.QName;
+import org.apache.jackrabbit.core.*;
 import org.apache.jackrabbit.core.config.WorkspaceConfig;
 import org.apache.jackrabbit.core.fs.*;
 import org.apache.jackrabbit.core.fs.FileSystem;
@@ -720,6 +717,53 @@
             }
         } catch (FileSystemException fse) {
             String msg = "failed to delete references: " + uuid;
+            log.error(msg, fse);
+            throw new ItemStateException(msg, fse);
+        }
+    }
+
+    /**
+     * @see PersistenceManager#exists(org.apache.jackrabbit.core.ItemId id)
+     */
+    public boolean exists(ItemId id) throws ItemStateException {
+        if (!initialized) {
+            throw new IllegalStateException("not initialized");
+        }
+
+        try {
+            if (id.denotesNode()) {
+                NodeId nodeId = (NodeId) id;
+                String nodeFilePath = buildNodeFilePath(nodeId.getUUID());
+                FileSystemResource nodeFile = new FileSystemResource(itemStateFS, nodeFilePath);
+                return nodeFile.exists();
+            } else {
+                PropertyId propId = (PropertyId) id;
+                String propFilePath = buildPropFilePath(propId.getParentUUID(), propId.getName());
+                FileSystemResource propFile = new FileSystemResource(itemStateFS, propFilePath);
+                return propFile.exists();
+            }
+        } catch (FileSystemException fse) {
+            String msg = "failed to check existence of item state: " + id;
+            log.error(msg, fse);
+            throw new ItemStateException(msg, fse);
+        }
+    }
+
+    /**
+     * @see PersistenceManager#referencesExist(NodeId targetId)
+     */
+    public boolean referencesExist(NodeId targetId) throws ItemStateException {
+        if (!initialized) {
+            throw new IllegalStateException("not initialized");
+        }
+
+        try {
+            String uuid = targetId.getUUID();
+            String refsFilePath = buildNodeReferencesFilePath(uuid);
+            FileSystemResource refsFile = new FileSystemResource(itemStateFS, refsFilePath);
+            return refsFile.exists();
+        } catch (FileSystemException fse) {
+            String msg = "failed to check existence of references: " + targetId;
             log.error(msg, fse);
             throw new ItemStateException(msg, fse);
         }

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/DefaultTransactionalStore.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/DefaultTransactionalStore.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/DefaultTransactionalStore.java	Wed Nov  3 01:19:47 2004
@@ -51,6 +51,14 @@
     }
 
     /**
+     * @see TransactionalStore#exists
+     */
+    public boolean exists(ItemId id) {
+
+        return provider.hasItemState(id);
+    }
+
+    /**
      * @see TransactionalStore#beginUpdate
      */
     public TransactionalStore.Update beginUpdate() {

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/TransactionalItemStateManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/TransactionalItemStateManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/TransactionalItemStateManager.java	Wed Nov  3 01:19:47 2004
@@ -130,15 +130,10 @@
      * @see PersistentItemStateProvider#hasItemState
      */
     public boolean hasItemState(ItemId id) {
-        // try shortcut first
         if (isCached(id)) {
             return true;
-        }
-        try {
-            getItemState(id);
-            return true;
-        } catch (ItemStateException e) {
-            return false;
+        } else {
+            return store.exists(id);
         }
     }
 

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/TransactionalStore.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/TransactionalStore.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/TransactionalStore.java	Wed Nov  3 01:19:47 2004
@@ -33,6 +33,13 @@
             throws NoSuchItemStateException, ItemStateException;
 
     /**
+     * Determines if an item with the specified id exists in this store.
+     * @param id item id
+     * @return true if an item exists; false otherwise
+     */
+    public boolean exists(ItemId id);
+
+    /**
      * Begin an update operation. Subsequent save operations are passed to
      * the update object returned.
      *

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java	Wed Nov  3 01:19:47 2004
@@ -15,10 +15,7 @@
  */
 package org.apache.jackrabbit.core.state.xml;
 
-import org.apache.jackrabbit.core.BLOBFileValue;
-import org.apache.jackrabbit.core.InternalValue;
-import org.apache.jackrabbit.core.PropertyId;
-import org.apache.jackrabbit.core.QName;
+import org.apache.jackrabbit.core.*;
 import org.apache.jackrabbit.core.config.WorkspaceConfig;
 import org.apache.jackrabbit.core.fs.*;
 import org.apache.jackrabbit.core.fs.FileSystem;
@@ -867,6 +864,53 @@
             }
         } catch (FileSystemException fse) {
             String msg = "failed to delete references: " + uuid;
+            log.error(msg, fse);
+            throw new ItemStateException(msg, fse);
+        }
+    }
+
+    /**
+     * @see PersistenceManager#exists(org.apache.jackrabbit.core.ItemId id)
+     */
+    public boolean exists(ItemId id) throws ItemStateException {
+        if (!initialized) {
+            throw new IllegalStateException("not initialized");
+        }
+
+        try {
+            if (id.denotesNode()) {
+                NodeId nodeId = (NodeId) id;
+                String nodeFilePath = buildNodeFilePath(nodeId.getUUID());
+                FileSystemResource nodeFile = new FileSystemResource(itemStateStore, nodeFilePath);
+                return nodeFile.exists();
+            } else {
+                PropertyId propId = (PropertyId) id;
+                String propFilePath = buildPropFilePath(propId.getParentUUID(), propId.getName());
+                FileSystemResource propFile = new FileSystemResource(itemStateStore, propFilePath);
+                return propFile.exists();
+            }
+        } catch (FileSystemException fse) {
+            String msg = "failed to check existence of item state: " + id;
+            log.error(msg, fse);
+            throw new ItemStateException(msg, fse);
+        }
+    }
+
+    /**
+     * @see PersistenceManager#referencesExist(NodeId targetId)
+     */
+    public boolean referencesExist(NodeId targetId) throws ItemStateException {
+        if (!initialized) {
+            throw new IllegalStateException("not initialized");
+        }
+
+        try {
+            String uuid = targetId.getUUID();
+            String refsFilePath = buildNodeReferencesFilePath(uuid);
+            FileSystemResource refsFile = new FileSystemResource(itemStateStore, refsFilePath);
+            return refsFile.exists();
+        } catch (FileSystemException fse) {
+            String msg = "failed to check existence of references: " + targetId;
             log.error(msg, fse);
             throw new ItemStateException(msg, fse);
         }