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/02 16:06:44 UTC

svn commit: rev 56379 - in incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core: . state state/tx virtual

Author: stefan
Date: Tue Nov  2 07:06:44 2004
New Revision: 56379

Added:
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/CachingHierarchyManager.java   (contents, props changed)
Modified:
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/TransientItemStateManager.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/TransactionalItemStateManager.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/DefaultItemStateProvider.java
Log:
misc. small changes for better performance

Added: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/CachingHierarchyManager.java
==============================================================================
--- (empty file)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/CachingHierarchyManager.java	Tue Nov  2 07:06:44 2004
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core;
+
+import org.apache.commons.collections.ReferenceMap;
+import org.apache.log4j.Logger;
+
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import java.util.Map;
+
+/**
+ * <code>CachingHierarchyManager</code> is a simple wrapper for a
+ * <code>HierarchyManager</code> that caches the <code>ItemId</code> to <code>Path</code>
+ * mappings returned by the underlying <code>HierarchyManager</code> for better
+ * performance.
+ * <p/>
+ * Please keep in mind that this cache of <code>Path</code>s is not automatically
+ * updated when the underlying hierarchy is changing. Therefore it should only be
+ * used with caution and in special situations (usually only locally within a
+ * narrow scope) where the underlying hierarchy is not expected to change.
+ */
+public class CachingHierarchyManager implements HierarchyManager {
+
+    private static Logger log = Logger.getLogger(CachingHierarchyManager.class);
+
+    private final HierarchyManager delegatee;
+
+    // map of item id to list of paths
+    private Map pathCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.HARD);
+    private Map zombiePathCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.HARD);
+
+    // map of path to item id
+    private Map idCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.HARD);
+
+    /**
+     * @param hierMgr
+     */
+    public CachingHierarchyManager(HierarchyManager hierMgr) {
+        delegatee = hierMgr;
+    }
+
+    /**
+     * Returns the wrapped <code>HierarchyManager</code> instance
+     *
+     * @return the wrapped <code>HierarchyManager</code> instance
+     */
+    public HierarchyManager unwrap() {
+        return delegatee;
+    }
+
+    /**
+     * Clears the cache.
+     */
+    public synchronized void clearCache() {
+        pathCache.clear();
+        zombiePathCache.clear();
+        idCache.clear();
+    }
+
+    //-----------------------------------------------------< HierarchyManager >
+    /**
+     * @see HierarchyManager#listParents(ItemId)
+     */
+    public NodeId[] listParents(ItemId id) throws ItemNotFoundException, RepositoryException {
+        return delegatee.listParents(id);
+    }
+
+    /**
+     * @see HierarchyManager#listChildren(NodeId)
+     */
+    public ItemId[] listChildren(NodeId id) throws ItemNotFoundException, RepositoryException {
+        return delegatee.listChildren(id);
+    }
+
+    /**
+     * @see HierarchyManager#listZombieChildren(NodeId)
+     */
+    public ItemId[] listZombieChildren(NodeId id)
+            throws ItemNotFoundException, RepositoryException {
+        return delegatee.listZombieChildren(id);
+    }
+
+    /**
+     * @see HierarchyManager#resolvePath(Path)
+     */
+    public synchronized ItemId resolvePath(Path path)
+            throws PathNotFoundException, RepositoryException {
+        // check cache first
+        ItemId id = (ItemId) idCache.get(path);
+        if (id != null) {
+            return id;
+        }
+        id = delegatee.resolvePath(path);
+        idCache.put(path, id);
+        return id;
+    }
+
+    /**
+     * @see HierarchyManager#getPath(ItemId)
+     */
+    public synchronized Path getPath(ItemId id) throws ItemNotFoundException, RepositoryException {
+        return getAllPaths(id, false)[0];
+    }
+
+    /**
+     * @see HierarchyManager#getName(ItemId)
+     */
+    public QName getName(ItemId itemId) throws ItemNotFoundException, RepositoryException {
+        if (itemId.denotesNode()) {
+            return getPath(itemId).getNameElement().getName();
+        } else {
+            PropertyId propId = (PropertyId) itemId;
+            return propId.getName();
+        }
+    }
+
+    /**
+     * @see HierarchyManager#getAllPaths(ItemId)
+     */
+    public synchronized Path[] getAllPaths(ItemId id) throws ItemNotFoundException, RepositoryException {
+        return getAllPaths(id, false);
+    }
+
+    /**
+     * @see HierarchyManager#getAllPaths(ItemId, boolean)
+     */
+    public synchronized Path[] getAllPaths(ItemId id, boolean includeZombies)
+            throws ItemNotFoundException, RepositoryException {
+        // check cache first
+        Path[] paths;
+        if (includeZombies) {
+            paths = (Path[]) zombiePathCache.get(id);
+            if (paths != null) {
+                return paths;
+            }
+            paths = delegatee.getAllPaths(id, includeZombies);
+            zombiePathCache.put(id, paths);
+        } else {
+            paths = (Path[]) pathCache.get(id);
+            if (paths != null) {
+                return paths;
+            }
+            paths = delegatee.getAllPaths(id, includeZombies);
+            pathCache.put(id, paths);
+        }
+        return paths;
+    }
+}
+

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	Tue Nov  2 07:06:44 2004
@@ -1023,133 +1023,144 @@
         // check state of this instance
         checkItemState();
 
-        // build list of transient states that should be persisted
-        Collection dirty = getTransientStates();
-        if (dirty.size() == 0) {
-            // no transient items, nothing to do here
-            return;
-        }
+        try {
+            /**
+             * turn on temporary path caching for better performance
+             * (assuming that the paths won't change during the save() call)
+             */
+            itemStateMgr.enablePathCaching(true);
 
-        ItemState transientState;
+            // build list of transient states that should be persisted
+            Collection dirty = getTransientStates();
+            if (dirty.size() == 0) {
+                // no transient items, nothing to do here
+                return;
+            }
 
-        /**
-         * check that parent node is also included in the dirty items list
-         * if dirty node was removed or added (adding/removing a parent/child
-         * link requires that both parent and child are saved)
-         */
-        Iterator iter = dirty.iterator();
-        while (iter.hasNext()) {
-            transientState = (ItemState) iter.next();
-            if (transientState.isNode()) {
-                NodeState nodeState = (NodeState) transientState;
-                ArrayList dirtyParents = new ArrayList();
-                // removed parents
-                dirtyParents.addAll(nodeState.getRemovedParentUUIDs());
-                // added parents
-                dirtyParents.addAll(nodeState.getAddedParentUUIDs());
-                Iterator parentsIter = dirtyParents.iterator();
-                while (parentsIter.hasNext()) {
-                    NodeId id = new NodeId((String) parentsIter.next());
-                    NodeState parentState = null;
-                    try {
-                        parentState = (NodeState) itemStateMgr.getTransientItemState(id);
-                    } catch (ItemStateException ise) {
-                        // should never get here...
-                        String msg = "inconsistency: failed to retrieve transient state for " + itemMgr.safeGetJCRPath(id);
-                        log.error(msg);
-                        throw new RepositoryException(msg);
-                    }
-                    // check if parent is also going to be saved
-                    if (!dirty.contains(parentState)) {
-                        // need to save the parent too
-                        String msg = itemMgr.safeGetJCRPath(id) + " needs to be saved also.";
-                        log.error(msg);
-                        throw new RepositoryException(msg);
+            ItemState transientState;
+
+            /**
+             * check that parent node is also included in the dirty items list
+             * if dirty node was removed or added (adding/removing a parent/child
+             * link requires that both parent and child are saved)
+             */
+            Iterator iter = dirty.iterator();
+            while (iter.hasNext()) {
+                transientState = (ItemState) iter.next();
+                if (transientState.isNode()) {
+                    NodeState nodeState = (NodeState) transientState;
+                    ArrayList dirtyParents = new ArrayList();
+                    // removed parents
+                    dirtyParents.addAll(nodeState.getRemovedParentUUIDs());
+                    // added parents
+                    dirtyParents.addAll(nodeState.getAddedParentUUIDs());
+                    Iterator parentsIter = dirtyParents.iterator();
+                    while (parentsIter.hasNext()) {
+                        NodeId id = new NodeId((String) parentsIter.next());
+                        NodeState parentState = null;
+                        try {
+                            parentState = (NodeState) itemStateMgr.getTransientItemState(id);
+                        } catch (ItemStateException ise) {
+                            // should never get here...
+                            String msg = "inconsistency: failed to retrieve transient state for " + itemMgr.safeGetJCRPath(id);
+                            log.error(msg);
+                            throw new RepositoryException(msg);
+                        }
+                        // check if parent is also going to be saved
+                        if (!dirty.contains(parentState)) {
+                            // need to save the parent too
+                            String msg = itemMgr.safeGetJCRPath(id) + " needs to be saved also.";
+                            log.error(msg);
+                            throw new RepositoryException(msg);
+                        }
                     }
                 }
             }
-        }
 
-        /**
-         * validate access and node type constraints
-         * (this will also validate child removals)
-         */
-        validateTransientItems(dirty.iterator());
-
-        WorkspaceImpl wsp = (WorkspaceImpl) session.getWorkspace();
-
-        // list of events that are generated by saved changes
-        ObservationManagerFactory obsFactory = rep.getObservationManagerFactory(wsp.getName());
-        EventStateCollection events = obsFactory.createEventStateCollection(session,
-                session.getItemStateManager(), session.getHierarchyManager());
-
-        /**
-         * we need to make sure that we are not interrupted while
-         * verifying/persisting node references
-         */
-        ReferenceManager refMgr = wsp.getReferenceManager();
-        synchronized (refMgr) {
             /**
-             * build list of transient descendents in the attic
-             * (i.e. those marked as 'removed')
+             * validate access and node type constraints
+             * (this will also validate child removals)
              */
-            Collection removed = getRemovedStates();
+            validateTransientItems(dirty.iterator());
 
-            /**
-             * referential integrity checks:
-             * make sure that a referenced node cannot be removed and
-             * that all references are updated and persisted
-             */
-            checkReferences(dirty.iterator(), removed.iterator(), refMgr);
+            WorkspaceImpl wsp = (WorkspaceImpl) session.getWorkspace();
+
+            // list of events that are generated by saved changes
+            ObservationManagerFactory obsFactory = rep.getObservationManagerFactory(wsp.getName());
+            EventStateCollection events = obsFactory.createEventStateCollection(session,
+                    session.getItemStateManager(), session.getHierarchyManager());
 
             /**
-             * create event states for the affected item states and
-             * prepare them for event dispatch (this step is necessary in order
-             * to check access rights on items that will be removed)
-             *
-             * todo consolidate event generating and dispatching code (ideally one method call after save has succeeded)
+             * we need to make sure that we are not interrupted while
+             * verifying/persisting node references
              */
-            events.createEventStates(dirty);
-            events.createEventStates(removed);
-            events.prepare();
+            ReferenceManager refMgr = wsp.getReferenceManager();
+            synchronized (refMgr) {
+                /**
+                 * build list of transient descendents in the attic
+                 * (i.e. those marked as 'removed')
+                 */
+                Collection removed = getRemovedStates();
 
-            // definitively remove transient items marked as 'removed'
-            removeTransientItems(removed.iterator());
+                /**
+                 * referential integrity checks:
+                 * make sure that a referenced node cannot be removed and
+                 * that all references are updated and persisted
+                 */
+                checkReferences(dirty.iterator(), removed.iterator(), refMgr);
 
-            // dispose the transient states marked 'removed'
-            iter = removed.iterator();
-            while (iter.hasNext()) {
-                transientState = (ItemState) iter.next();
                 /**
-                 * dispose the transient state, it is no longer used
-                 * this will indirectly (through stateDiscarded listener method)
-                 * permanently invalidate the wrapping Item instance
+                 * create event states for the affected item states and
+                 * prepare them for event dispatch (this step is necessary in order
+                 * to check access rights on items that will be removed)
+                 *
+                 * todo consolidate event generating and dispatching code (ideally one method call after save has succeeded)
                  */
-                itemStateMgr.disposeTransientItemStateInAttic(transientState);
-            }
+                events.createEventStates(dirty);
+                events.createEventStates(removed);
+                events.prepare();
+
+                // definitively remove transient items marked as 'removed'
+                removeTransientItems(removed.iterator());
+
+                // dispose the transient states marked 'removed'
+                iter = removed.iterator();
+                while (iter.hasNext()) {
+                    transientState = (ItemState) iter.next();
+                    /**
+                     * dispose the transient state, it is no longer used
+                     * this will indirectly (through stateDiscarded listener method)
+                     * permanently invalidate the wrapping Item instance
+                     */
+                    itemStateMgr.disposeTransientItemStateInAttic(transientState);
+                }
 
-            // initialize version histories for new nodes (might create new transient state)
-            initVersionHistories(dirty.iterator());
+                // 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();
+                // re-build the list of transient states (might have changed by now)
+                dirty = getTransientStates();
 
-            // persist 'new' or 'modified' transient states
-            persistTransientItems(dirty.iterator());
-        } // synchronized(refMgr)
-
-        // now it is safe to dispose the transient states
-        iter = dirty.iterator();
-        while (iter.hasNext()) {
-            transientState = (ItemState) iter.next();
-            // dispose the transient state, it is no longer used
-            itemStateMgr.disposeTransientItemState(transientState);
-        }
+                // persist 'new' or 'modified' transient states
+                persistTransientItems(dirty.iterator());
+            } // synchronized(refMgr)
 
-        // all changes are persisted, now dispatch events
-        // forward this to the session to let it decide on the right time for those
-        // events to be dispatched in case of transactional support
-        session.dispatch(events);
+            // now it is safe to dispose the transient states
+            iter = dirty.iterator();
+            while (iter.hasNext()) {
+                transientState = (ItemState) iter.next();
+                // dispose the transient state, it is no longer used
+                itemStateMgr.disposeTransientItemState(transientState);
+            }
+
+            // all changes are persisted, now dispatch events
+            // forward this to the session to let it decide on the right time for those
+            // events to be dispatched in case of transactional support
+            session.dispatch(events);
+        } finally {
+            // turn off temporary path caching
+            itemStateMgr.enablePathCaching(false);
+        }
     }
 
     /**

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java	Tue Nov  2 07:06:44 2004
@@ -33,7 +33,7 @@
     private final PersistentItemStateProvider persistentStateMgr;
     private VirtualItemStateProvider[] virtualProviders = new VirtualItemStateProvider[0];
     private final TransientItemStateManager transientStateMgr;
-    private final HierarchyManager hierMgr;
+    private HierarchyManager hierMgr;
 
     /**
      * Creates a new <code>SessionItemStateManager</code> instance.
@@ -51,11 +51,37 @@
     }
 
     /**
+     * En-/Disable chaching of path values.
+     * <p/>
+     * Please keep in mind that the cache of <code>Path</code>s is not automatically
+     * updated when the underlying hierarchy is changing. Therefore it should only be
+     * turned on with caution and in special situations (usually only locally
+     * within a narrow scope) where the underlying hierarchy is not expected to
+     * change.
+     *
+     * @param enable
+     */
+    public void enablePathCaching(boolean enable) {
+        if (enable) {
+            if (!(hierMgr instanceof CachingHierarchyManager)) {
+                hierMgr = new CachingHierarchyManager(hierMgr);
+            }
+        } else {
+            if (hierMgr instanceof CachingHierarchyManager) {
+                CachingHierarchyManager chm = (CachingHierarchyManager) hierMgr;
+                chm.clearCache();
+                hierMgr = chm.unwrap();
+            }
+        }
+    }
+
+    /**
      * Adds a new virtual item state provider
+     *
      * @param prov
      */
     public synchronized void addVirtualItemStateProvider(VirtualItemStateProvider prov) {
-        VirtualItemStateProvider[] provs = new VirtualItemStateProvider[virtualProviders.length+1];
+        VirtualItemStateProvider[] provs = new VirtualItemStateProvider[virtualProviders.length + 1];
         System.arraycopy(virtualProviders, 0, provs, 0, virtualProviders.length);
         provs[virtualProviders.length] = prov;
         virtualProviders = provs;
@@ -186,7 +212,7 @@
     public ItemState getItemState(ItemId id)
             throws NoSuchItemStateException, ItemStateException {
         // check if there is a virtual state for the specified item
-        for (int i=0; i<virtualProviders.length; i++) {
+        for (int i = 0; i < virtualProviders.length; i++) {
             if (virtualProviders[i].hasItemState(id)) {
                 return virtualProviders[i].getItemState(id);
             }
@@ -229,11 +255,12 @@
 
     /**
      * Checks if there is a virtual item state
+     *
      * @param id
      * @return
      */
     private boolean hasVirtualItemState(ItemId id) {
-        for (int i=0; i<virtualProviders.length; i++) {
+        for (int i = 0; i < virtualProviders.length; i++) {
             if (virtualProviders[i].hasItemState(id)) {
                 return true;
             }

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/TransientItemStateManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/TransientItemStateManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/TransientItemStateManager.java	Tue Nov  2 07:06:44 2004
@@ -118,12 +118,7 @@
      * @see ItemStateProvider#hasItemState(ItemId)
      */
     public boolean hasItemState(ItemId id) {
-        try {
-            getItemState(id);
-            return true;
-        } catch (ItemStateException ise) {
-            return false;
-        }
+        return isCached(id);
     }
 
     /**
@@ -143,12 +138,7 @@
      * @see ItemStateProvider#hasItemStateInAttic(ItemId)
      */
     public boolean hasItemStateInAttic(ItemId id) {
-        try {
-            getItemStateInAttic(id);
-            return true;
-        } catch (ItemStateException ise) {
-            return false;
-        }
+        return attic.isCached(id);
     }
 
     //------------------< methods for listing & querying state of cache/attic >

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	Tue Nov  2 07:06:44 2004
@@ -110,7 +110,6 @@
      */
     public synchronized ItemState getItemState(ItemId id)
             throws NoSuchItemStateException, ItemStateException {
-
         if (isCached(id)) {
             return retrieve(id);
         }
@@ -131,6 +130,10 @@
      * @see PersistentItemStateProvider#hasItemState
      */
     public boolean hasItemState(ItemId id) {
+        // try shortcut first
+        if (isCached(id)) {
+            return true;
+        }
         try {
             getItemState(id);
             return true;

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/DefaultItemStateProvider.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/DefaultItemStateProvider.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/DefaultItemStateProvider.java	Tue Nov  2 07:06:44 2004
@@ -15,17 +15,17 @@
  */
 package org.apache.jackrabbit.core.virtual;
 
-import org.apache.jackrabbit.core.state.*;
 import org.apache.jackrabbit.core.*;
 import org.apache.jackrabbit.core.nodetype.*;
+import org.apache.jackrabbit.core.state.*;
 import org.apache.jackrabbit.core.util.uuid.UUID;
 import org.apache.log4j.Logger;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.ConstraintViolationException;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Arrays;
 
 /**
  * This Class implements a virtual item state provider.
@@ -57,7 +57,8 @@
 
     /**
      * Creates a new item state provider.
-     * @param ntMgr the nodetype manager
+     *
+     * @param ntMgr         the nodetype manager
      * @param overlayedRoot the node state that is overlayed
      */
     public DefaultItemStateProvider(NodeTypeManagerImpl ntMgr, NodeState overlayedRoot) {
@@ -68,6 +69,7 @@
 
     /**
      * Returns the nodestate of the relative root of this provider
+     *
      * @return
      */
     public VirtualNodeState getRootState() {
@@ -79,7 +81,7 @@
      */
     public ItemState getItemState(ItemId id) throws NoSuchItemStateException {
         ItemState state = (ItemState) items.get(id);
-        if (state==null) {
+        if (state == null) {
             throw new NoSuchItemStateException(id.toString());
         }
         return state;
@@ -94,6 +96,7 @@
 
     /**
      * virtual item state provider do not have attics.
+     *
      * @throws NoSuchItemStateException always
      */
     public ItemState getItemStateInAttic(ItemId id) throws NoSuchItemStateException {
@@ -103,6 +106,7 @@
 
     /**
      * virtual item state provider do not have attics.
+     *
      * @return <code>false</code>
      */
     public boolean hasItemStateInAttic(ItemId id) {
@@ -112,6 +116,7 @@
 
     /**
      * Adds a node state
+     *
      * @param parentId
      * @param name
      * @param id
@@ -131,6 +136,7 @@
 
     /**
      * Adds a node state
+     *
      * @param parent
      * @param name
      * @param id
@@ -142,7 +148,7 @@
      */
     public VirtualNodeState addNode(VirtualNodeState parent, QName name, String id, QName nodeTypeName, QName[] mixins)
             throws ItemStateException, RepositoryException {
-        NodeTypeImpl nodeType = nodeTypeName==null ? null : ntMgr.getNodeType(nodeTypeName);
+        NodeTypeImpl nodeType = nodeTypeName == null ? null : ntMgr.getNodeType(nodeTypeName);
         NodeDefImpl def;
         try {
             def = getApplicableChildNodeDef(parent, name, nodeType == null ? null : nodeType.getQName());
@@ -158,7 +164,7 @@
         // default properties
         VirtualNodeState ns = createChildNode(parent, name, def, nodeType, id);
         setPropertyValue(ns, ItemImpl.PROPNAME_PRIMARYTYPE, InternalValue.create(nodeType.getQName()));
-        if (mixins!=null) {
+        if (mixins != null) {
             ns.setMixinTypeNames(new HashSet(Arrays.asList(mixins)));
         }
         if (getEffectiveNodeType(ns).includesNodeType(NodeTypeRegistry.MIX_REFERENCEABLE)) {
@@ -170,6 +176,7 @@
 
     /**
      * returns the child node of the given parent
+     *
      * @param parent
      * @param name
      * @param index
@@ -178,7 +185,7 @@
      */
     public VirtualNodeState getNode(VirtualNodeState parent, QName name, int index) throws NoSuchItemStateException {
         NodeState.ChildNodeEntry entry = parent.getChildNodeEntry(name, index);
-        if (entry==null) {
+        if (entry == null) {
             throw new NoSuchItemStateException(name.toString());
         }
         return (VirtualNodeState) getItemState(new NodeId(entry.getUUID()));
@@ -286,6 +293,7 @@
 
     /**
      * Creates a property state
+     *
      * @param parentUUID
      * @param propName
      * @return
@@ -305,6 +313,7 @@
         return propState;
 
     }
+
     /**
      * retrieves the property definition for the given contraints
      *