You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2006/10/31 14:48:23 UTC

svn commit: r469480 - in /jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core: NodeImpl.java RepositoryImpl.java state/SharedItemStateManager.java

Author: mreutegg
Date: Tue Oct 31 05:48:22 2006
New Revision: 469480

URL: http://svn.apache.org/viewvc?view=rev&rev=469480
Log:
JCR-605: Error when registering node types on virgin repository
- centralized workspace initialization code in SharedItemStateManager. The jcr:system node is now created within the same method as the root node of the workspace: SharedItemStateManager.createRootNodeState()

Modified:
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?view=diff&rev=469480&r1=469479&r2=469480
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Tue Oct 31 05:48:22 2006
@@ -809,94 +809,6 @@
         return createChildNode(nodeName, def, nodeType, id);
     }
 
-    /**
-     * Adds a child node entry for a virtual node state to this node. E.g. the
-     * node <code>/jcr:system/jcr:versionStorage</code>.
-     *
-     * @param nodeName the name of the virtual child node.
-     * @param nodeType the node type of the virtual child node.
-     * @param id       the id of the virtual node state.
-     * @return the <code>NodeImpl</code> for the virtual node state with
-     *         <code>id</code>.
-     * @throws ItemExistsException          if there already exists a child node
-     *                                      entry with the given <code>nodeName</code>.
-     * @throws ConstraintViolationException if this node does not allow a child
-     *                                      node with the specified <code>nodeType</code>
-     *                                      and <code>nodeName</code>.
-     * @throws RepositoryException          if there is no virtual node state
-     *                                      with <code>id</code>.
-     */
-    protected NodeImpl internalAddVirtualChildNode(QName nodeName,
-                                                   NodeTypeImpl nodeType,
-                                                   NodeId id)
-            throws ItemExistsException, ConstraintViolationException, RepositoryException {
-        Path nodePath;
-        try {
-            nodePath = Path.create(getPrimaryPath(), nodeName, true);
-        } catch (MalformedPathException e) {
-            // should never happen
-            String msg = "internal error: invalid path " + safeGetJCRPath();
-            log.debug(msg);
-            throw new RepositoryException(msg, e);
-        }
-
-        NodeDefinitionImpl def;
-        try {
-            QName nodeTypeName = null;
-            if (nodeType != null) {
-                nodeTypeName = nodeType.getQName();
-            }
-            def = getApplicableChildNodeDefinition(nodeName, nodeTypeName);
-        } catch (RepositoryException re) {
-            String msg = "no definition found in parent node's node type for new node";
-            log.debug(msg);
-            throw new ConstraintViolationException(msg, re);
-        }
-
-        // check for name collisions
-        NodeState thisState = (NodeState) state;
-        if (thisState.hasPropertyName(nodeName)) {
-            // there's already a property with that name
-            throw new ItemExistsException(itemMgr.safeGetJCRPath(nodePath));
-        }
-        NodeState.ChildNodeEntry cne = thisState.getChildNodeEntry(nodeName, 1);
-        if (cne != null) {
-            // there's already a child node entry with that name;
-            // check same-name sibling setting of new node
-            if (!def.allowsSameNameSiblings()) {
-                throw new ItemExistsException(itemMgr.safeGetJCRPath(nodePath));
-            }
-            // check same-name sibling setting of existing node
-            NodeId newId = cne.getId();
-            if (!((NodeImpl) itemMgr.getItem(newId)).getDefinition().allowsSameNameSiblings()) {
-                throw new ItemExistsException(itemMgr.safeGetJCRPath(nodePath));
-            }
-        }
-
-        // get virtual node state
-        NodeState nodeState;
-        try {
-            nodeState = (NodeState) stateMgr.getItemState(id);
-        } catch (ItemStateException e) {
-            String msg = "failed to get virtual child node " + nodeName + " of "
-                    + safeGetJCRPath();
-            log.debug(msg);
-            throw new RepositoryException(msg, e);
-        }
-
-        // create Node instance wrapping virtual state
-        NodeImpl node = itemMgr.createNodeInstance(nodeState, def);
-
-        // touch the virtual node, otherwise save will complain that the
-        // virtual node needs to be saved as well.
-        node.getOrCreateTransientItemState();
-
-        // add new child node entry
-        thisState.addChildNodeEntry(nodeName, id);
-
-        return node;
-    }
-
     private void setMixinTypesProperty(Set mixinNames) throws RepositoryException {
         NodeState thisState = (NodeState) state;
         // get or create jcr:mixinTypes property

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java?view=diff&rev=469480&r1=469479&r2=469480
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java Tue Oct 31 05:48:22 2006
@@ -35,7 +35,6 @@
 import org.apache.jackrabbit.core.fs.FileSystemResource;
 import org.apache.jackrabbit.core.lock.LockManager;
 import org.apache.jackrabbit.core.lock.LockManagerImpl;
-import org.apache.jackrabbit.core.nodetype.NodeTypeImpl;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
 import org.apache.jackrabbit.core.nodetype.virtual.VirtualNodeTypeStateManager;
 import org.apache.jackrabbit.core.observation.DelegatingObservationDispatcher;
@@ -533,20 +532,9 @@
          * - all other workspaces should be dynamic workspaces based on
          *   this 'read-only' system workspace
          *
-         * for now, we just create a /jcr:system node in every workspace
+         * for now, the jcr:system node is created in
+         * {@link org.apache.jackrabbit.core.state.SharedItemStateManager#createRootNodeState}
          */
-        NodeImpl rootNode = (NodeImpl) sysSession.getRootNode();
-        if (!rootNode.hasNode(QName.JCR_SYSTEM)) {
-            NodeTypeImpl nt = sysSession.getNodeTypeManager().getNodeType(QName.REP_SYSTEM);
-            NodeImpl sysRoot = rootNode.internalAddChildNode(QName.JCR_SYSTEM, nt, SYSTEM_ROOT_NODE_ID);
-            // add version storage
-            nt = sysSession.getNodeTypeManager().getNodeType(QName.REP_VERSIONSTORAGE);
-            sysRoot.internalAddVirtualChildNode(QName.JCR_VERSIONSTORAGE, nt, VERSION_STORAGE_NODE_ID);
-            // add node types
-            nt = sysSession.getNodeTypeManager().getNodeType(QName.REP_NODETYPES);
-            sysRoot.internalAddVirtualChildNode(QName.JCR_NODETYPES, nt, NODETYPES_NODE_ID);
-            rootNode.save();
-        }
 
         // register the repository as event listener for keeping repository statistics
         wsp.getObservationManager().addEventListener(this,

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java?view=diff&rev=469480&r1=469479&r2=469480
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java Tue Oct 31 05:48:22 2006
@@ -21,6 +21,7 @@
 import org.apache.jackrabbit.core.ItemId;
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.PropertyId;
+import org.apache.jackrabbit.core.RepositoryImpl;
 import org.apache.jackrabbit.core.persistence.PersistenceManager;
 import org.apache.jackrabbit.core.version.XAVersionManager;
 import org.apache.jackrabbit.core.nodetype.EffectiveNodeType;
@@ -799,6 +800,7 @@
             throws ItemStateException {
 
         NodeState rootState = createInstance(rootNodeId, QName.REP_ROOT, null);
+        NodeState jcrSystemState = createInstance(RepositoryImpl.SYSTEM_ROOT_NODE_ID, QName.REP_SYSTEM, rootNodeId);
 
         // FIXME need to manually setup root node by creating mandatory jcr:primaryType property
         // @todo delegate setup of root node to NodeTypeInstanceHandler
@@ -807,11 +809,14 @@
         NodeDefId nodeDefId;
         // definition of jcr:primaryType property
         PropDef propDef;
+        // id of the jcr:system node's definition
+        NodeDefId jcrSystemDefId;
         try {
             nodeDefId = ntReg.getRootNodeDef().getId();
             EffectiveNodeType ent = ntReg.getEffectiveNodeType(QName.REP_ROOT);
             propDef = ent.getApplicablePropertyDef(QName.JCR_PRIMARYTYPE,
                     PropertyType.NAME, false);
+            jcrSystemDefId = ent.getApplicableChildNodeDef(QName.JCR_SYSTEM, QName.REP_SYSTEM, ntReg).getId();
         } catch (NoSuchNodeTypeException nsnte) {
             String msg = "internal error: failed to create root node";
             log.error(msg, nsnte);
@@ -822,8 +827,9 @@
             throw new ItemStateException(msg, cve);
         }
         rootState.setDefinitionId(nodeDefId);
+        jcrSystemState.setDefinitionId(jcrSystemDefId);
 
-        // create jcr:primaryType property
+        // create jcr:primaryType property on root node state
         rootState.addPropertyName(propDef.getName());
 
         PropertyState prop = createInstance(propDef.getName(), rootNodeId);
@@ -832,9 +838,30 @@
         prop.setMultiValued(propDef.isMultiple());
         prop.setDefinitionId(propDef.getId());
 
+        // create jcr:primaryType property on jcr:system node state
+        jcrSystemState.addPropertyName(propDef.getName());
+
+        PropertyState primaryTypeProp = createInstance(propDef.getName(), jcrSystemState.getNodeId());
+        primaryTypeProp.setValues(new InternalValue[]{InternalValue.create(QName.REP_SYSTEM)});
+        primaryTypeProp.setType(propDef.getRequiredType());
+        primaryTypeProp.setMultiValued(propDef.isMultiple());
+        primaryTypeProp.setDefinitionId(propDef.getId());
+
+        // add child node entry for jcr:system node
+        rootState.addChildNodeEntry(QName.JCR_SYSTEM, RepositoryImpl.SYSTEM_ROOT_NODE_ID);
+
+        // add child node entry for virtual jcr:versionStorage
+        jcrSystemState.addChildNodeEntry(QName.JCR_VERSIONSTORAGE, RepositoryImpl.VERSION_STORAGE_NODE_ID);
+
+        // add child node entry for virtual jcr:nodeTypes
+        jcrSystemState.addChildNodeEntry(QName.JCR_NODETYPES, RepositoryImpl.NODETYPES_NODE_ID);
+
+
         ChangeLog changeLog = new ChangeLog();
         changeLog.added(rootState);
         changeLog.added(prop);
+        changeLog.added(jcrSystemState);
+        changeLog.added(primaryTypeProp);
 
         persistMgr.store(changeLog);
         changeLog.persisted();