From jackrabbit-commits-return-671-apmail-incubator-jackrabbit-commits-archive=www.apache.org@incubator.apache.org Fri Apr 01 09:23:28 2005 Return-Path: Delivered-To: apmail-incubator-jackrabbit-commits-archive@www.apache.org Received: (qmail 27801 invoked from network); 1 Apr 2005 09:23:28 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 1 Apr 2005 09:23:28 -0000 Received: (qmail 18977 invoked by uid 500); 1 Apr 2005 09:23:28 -0000 Mailing-List: contact jackrabbit-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: jackrabbit-dev@incubator.apache.org Delivered-To: mailing list jackrabbit-commits@incubator.apache.org Received: (qmail 18963 invoked by uid 500); 1 Apr 2005 09:23:28 -0000 Delivered-To: apmail-incubator-jackrabbit-cvs@incubator.apache.org Received: (qmail 18959 invoked by uid 99); 1 Apr 2005 09:23:27 -0000 X-ASF-Spam-Status: No, hits=-9.8 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from minotaur.apache.org (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Fri, 01 Apr 2005 01:23:26 -0800 Received: (qmail 27783 invoked by uid 65534); 1 Apr 2005 09:23:25 -0000 Message-ID: <20050401092325.27781.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Mailer: svnmailer-1.0.0-dev Date: Fri, 01 Apr 2005 09:23:24 -0000 Subject: svn commit: r159669 - in incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core: ./ nodetype/ nodetype/virtual/ search/lucene/ state/ version/ version/persistence/ virtual/ To: jackrabbit-cvs@incubator.apache.org From: tripod@apache.org X-Virus-Checked: Checked X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: tripod Date: Fri Apr 1 01:23:19 2005 New Revision: 159669 URL: http://svn.apache.org/viewcvs?view=3Drev&rev=3D159669 Log: - adding indexing of nodetype=20 - fixing indexing of versioning Added: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype= /virtual/VirtualNodeTypeStateManager.java (with props) incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= InternalVersionLabels.java (with props) incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/InternalVersionLabelsImpl.java (with props) Removed: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= InternalVersionItemListener.java Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/Reposito= ryImpl.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionI= mpl.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype= /builtin_nodetypes.xml incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype= /virtual/VirtualNodeTypeStateProvider.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/search/l= ucene/SearchIndex.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/It= emState.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= InternalVersionHistory.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= InternalVersionItem.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionHistoryImpl.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionHistoryNodeState.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionItemStateProvider.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionManager.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionManagerImpl.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/InternalVersionHistoryImpl.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/InternalVersionItemImpl.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/NativePVM.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/= AbstractVISProvider.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/= VirtualItemStateProvider.java incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/= VirtualNodeState.java Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/Re= positoryImpl.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/RepositoryImpl.java?view=3Ddiff&r1=3D159668&r2=3D159= 669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/Reposito= ryImpl.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/Reposito= ryImpl.java Fri Apr 1 01:23:19 2005 @@ -30,7 +30,7 @@ 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.VirtualNodeTypeStatePro= vider; +import org.apache.jackrabbit.core.nodetype.virtual.VirtualNodeTypeStateMan= ager; import org.apache.jackrabbit.core.observation.ObservationManagerFactory; import org.apache.jackrabbit.core.observation.DelegatingObservationDispatc= her; import org.apache.jackrabbit.core.security.CredentialsCallbackHandler; @@ -107,6 +107,7 @@ private final NodeTypeRegistry ntReg; private final PersistentVersionManager pvMgr; private final VersionManager vMgr; + private final VirtualNodeTypeStateManager virtNTMgr; =20 // configuration of the repository private final RepositoryConfig repConfig; @@ -277,7 +278,12 @@ nsReg, ntReg); pvMgr =3D new NativePVM(pm, getNodeTypeRegistry()); - vMgr =3D new VersionManagerImpl(pvMgr, ntReg, delegatingDispatcher= , VERSION_STORAGE_NODE_UUID, SYSTEM_ROOT_NODE_UUID); + vMgr =3D new VersionManagerImpl(pvMgr, ntReg, delegatingDispatcher, + VERSION_STORAGE_NODE_UUID, SYSTEM_ROOT_NODE_UUID); + + // init virtual nodetype manager + virtNTMgr =3D new VirtualNodeTypeStateManager(getNodeTypeRegistry(= ), + delegatingDispatcher, NODETYPES_NODE_UUID, SYSTEM_ROOT_NOD= E_UUID); =20 // initialize workspaces iter =3D wspInfos.keySet().iterator(); @@ -286,6 +292,10 @@ initWorkspace(wspName); } =20 + // after the workspaces are initialized, we setup a system session= for + // the virtual nodetype manager + virtNTMgr.setSession(getSystemSession(repConfig.getDefaultWorkspac= eName())); + // finally register shutdown hook Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { @@ -1017,9 +1027,7 @@ itemStateMgr =3D new SharedItemStateManager(getPersist= enceManager(config.getPersistenceManagerConfig()), rootNodeUUID, ntReg); try { itemStateMgr.addVirtualItemStateProvider(vMgr.getV= irtualItemStateProvider(itemStateMgr)); - itemStateMgr.addVirtualItemStateProvider( - new VirtualNodeTypeStateProvider(ntReg, NO= DETYPES_NODE_UUID, SYSTEM_ROOT_NODE_UUID) - ); + itemStateMgr.addVirtualItemStateProvider(virtNTMgr= .getVirtualItemStateProvider()); } catch (Exception e) { log.error("Unable to add vmgr: " + e.toString(), e= ); } Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/Se= ssionImpl.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/SessionImpl.java?view=3Ddiff&r1=3D159668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionI= mpl.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionI= mpl.java Fri Apr 1 01:23:19 2005 @@ -382,7 +382,7 @@ * * @return the VersionManager associated with this session */ - protected VersionManager getVersionManager() { + public VersionManager getVersionManager() { return versionMgr; } =20 Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/no= detype/builtin_nodetypes.xml URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/nodetype/builtin_nodetypes.xml?view=3Ddiff&r1=3D1596= 68&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype= /builtin_nodetypes.xml (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype= /builtin_nodetypes.xml Fri Apr 1 01:23:19 2005 @@ -346,8 +346,14 @@ + + + nt:unstructured + + + nt:unstructured Added: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodet= ype/virtual/VirtualNodeTypeStateManager.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java?vi= ew=3Dauto&rev=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype= /virtual/VirtualNodeTypeStateManager.java (added) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype= /virtual/VirtualNodeTypeStateManager.java Fri Apr 1 01:23:19 2005 @@ -0,0 +1,225 @@ +/* + * Copyright 2004-2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * 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.nodetype.virtual; + +import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; +import org.apache.jackrabbit.core.nodetype.NodeTypeRegistryListener; +import org.apache.jackrabbit.core.nodetype.NodeTypeImpl; +import org.apache.jackrabbit.core.QName; +import org.apache.jackrabbit.core.NodeImpl; +import org.apache.jackrabbit.core.PropertyImpl; +import org.apache.jackrabbit.core.SessionImpl; +import org.apache.jackrabbit.core.NodeId; +import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider; +import org.apache.jackrabbit.core.observation.DelegatingObservationDispatc= her; +import org.apache.jackrabbit.core.observation.EventState; +import org.apache.log4j.Logger; + +import javax.jcr.RepositoryException; +import javax.jcr.PropertyIterator; +import javax.jcr.NodeIterator; +import java.util.List; +import java.util.ArrayList; + +/** + * This Class implements a workaround helper for populating observation + * events for the virtual node states of the jcr:nodeTypes upon nodetype + * registry changes. + */ +public class VirtualNodeTypeStateManager implements NodeTypeRegistryListen= er { + + /** + * the default logger + */ + private static Logger log =3D Logger.getLogger(VirtualNodeTypeStateMan= ager.class); + + + /** + * an item state provider for the virtual nodetype states + */ + private VirtualNodeTypeStateProvider virtProvider; + + /** + * the node type registry + */ + private final NodeTypeRegistry ntReg; + + /** + * the root node id (usually the id of /jcr:system/jcr:nodeTypes) + */ + private final String rootNodeId; + + /** + * the id of the roots parent (usually id of /jcr:system) + */ + private final String parentId; + + /** + * the system session to generate the observation events + */ + private SessionImpl systemSession; + + /** + * the delegtating observation manager, that dispatches the events to + * all underlaying ones. + */ + private DelegatingObservationDispatcher obsDispatcher; + + /** + * Creates a new virtual node type state manager + * + * @param ntReg + * @param obs + * @param rootNodeId + * @param parentId + */ + public VirtualNodeTypeStateManager(NodeTypeRegistry ntReg, DelegatingO= bservationDispatcher obs, String rootNodeId, String parentId) { + this.ntReg =3D ntReg; + this.obsDispatcher =3D obs; + this.rootNodeId =3D rootNodeId; + this.parentId =3D parentId; + ntReg.addListener(this); + } + + /** + * returns the virtual node state provider for the node type states. + * @return + */ + public synchronized VirtualItemStateProvider getVirtualItemStateProvid= er() { + if (virtProvider =3D=3D null) { + virtProvider =3D new VirtualNodeTypeStateProvider(ntReg, rootN= odeId, parentId); + } + return virtProvider; + } + + /** + * Sets the system session. This is needed, since the session should be + * set, after the workspaces are initialzed. + * + * @param systemSession + */ + public void setSession(SessionImpl systemSession) { + this.systemSession =3D systemSession; + } + + /** + * {@inheritDoc} + */ + public void nodeTypeRegistered(QName ntName) { + try { + // allow provider to update + virtProvider.onNodeTypeAdded(ntName); + + NodeImpl root =3D (NodeImpl) systemSession.getItemManager().ge= tItem(new NodeId(rootNodeId)); + NodeImpl child =3D root.getNode(ntName); + List events =3D new ArrayList(); + recursiveAdd(events, root, child); + obsDispatcher.dispatch(events, systemSession); + } catch (RepositoryException e) { + log.error("Unable to index new nodetype: " + e.toString()); + } + } + + /** + * {@inheritDoc} + */ + public void nodeTypeReRegistered(QName ntName) { + // lazy implementation + nodeTypeUnregistered(ntName); + nodeTypeRegistered(ntName); + } + + /** + * {@inheritDoc} + */ + public void nodeTypeUnregistered(QName ntName) { + try { + NodeImpl root =3D (NodeImpl) systemSession.getItemManager().ge= tItem(new NodeId(rootNodeId)); + NodeImpl child =3D root.getNode(ntName); + List events =3D new ArrayList(); + recursiveRemove(events, root, child); + obsDispatcher.dispatch(events, systemSession); + virtProvider.onNodeTypeRemoved(ntName); + } catch (RepositoryException e) { + log.error("Unable to index removed nodetype: " + e.toString()); + } + } + + /** + * Adds a subtree of itemstates as 'added' to a list of events + * + * @param events + * @param parent + * @param node + * @throws RepositoryException + */ + private void recursiveAdd(List events, NodeImpl parent, NodeImpl node) + throws RepositoryException { + + events.add(EventState.childNodeAdded( + parent.internalGetUUID(), + parent.getPrimaryPath(), + node.internalGetUUID(), + node.getPrimaryPath().getNameElement(), + (NodeTypeImpl) parent.getPrimaryNodeType(), + node.getSession() + )); + + PropertyIterator iter =3D node.getProperties(); + while (iter.hasNext()) { + PropertyImpl prop =3D (PropertyImpl) iter.nextProperty(); + events.add(EventState.propertyAdded( + node.internalGetUUID(), + node.getPrimaryPath(), + prop.getPrimaryPath().getNameElement(), + (NodeTypeImpl) node.getPrimaryNodeType(), + node.getSession() + )); + } + NodeIterator niter =3D node.getNodes(); + while (niter.hasNext()) { + NodeImpl n =3D (NodeImpl) niter.nextNode(); + recursiveAdd(events, node, n); + } + } + + /** + * Adds a subtree of itemstates as 'removed' to a list of events + * + * @param events + * @param parent + * @param node + * @throws RepositoryException + */ + private void recursiveRemove(List events, NodeImpl parent, NodeImpl no= de) + throws RepositoryException { + + events.add(EventState.childNodeRemoved( + parent.internalGetUUID(), + parent.getPrimaryPath(), + node.internalGetUUID(), + node.getPrimaryPath().getNameElement(), + (NodeTypeImpl) parent.getPrimaryNodeType(), + node.getSession() + )); + NodeIterator niter =3D node.getNodes(); + while (niter.hasNext()) { + NodeImpl n =3D (NodeImpl) niter.nextNode(); + recursiveRemove(events, node, n); + } + } +} Propchange: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/= nodetype/virtual/VirtualNodeTypeStateManager.java ---------------------------------------------------------------------------= --- svn =3D=20 Propchange: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/= nodetype/virtual/VirtualNodeTypeStateManager.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/no= detype/virtual/VirtualNodeTypeStateProvider.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateProvider.java?v= iew=3Ddiff&r1=3D159668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype= /virtual/VirtualNodeTypeStateProvider.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype= /virtual/VirtualNodeTypeStateProvider.java Fri Apr 1 01:23:19 2005 @@ -21,24 +21,27 @@ import org.apache.jackrabbit.core.NodeId; import org.apache.jackrabbit.core.QName; import org.apache.jackrabbit.core.InternalValue; +import org.apache.jackrabbit.core.util.uuid.UUID; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; import org.apache.jackrabbit.core.nodetype.NodeTypeDef; import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.core.nodetype.ChildNodeDef; import org.apache.jackrabbit.core.nodetype.ValueConstraint; -import org.apache.jackrabbit.core.nodetype.NodeTypeRegistryListener; import org.apache.jackrabbit.core.state.ItemStateException; import org.apache.jackrabbit.core.state.NoSuchItemStateException; =20 import javax.jcr.RepositoryException; import javax.jcr.PropertyType; import javax.jcr.version.OnParentVersionAction; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.io.UnsupportedEncodingException; =20 /** * This Class implements a virtual item state provider that exposes the * registered nodetypes. */ -public class VirtualNodeTypeStateProvider extends AbstractVISProvider impl= ements NodeTypeRegistryListener { +public class VirtualNodeTypeStateProvider extends AbstractVISProvider { =20 /** * the parent id @@ -54,7 +57,6 @@ public VirtualNodeTypeStateProvider(NodeTypeRegistry ntReg, String roo= tNodeId, String parentId) { super(ntReg, new NodeId(rootNodeId)); this.parentId =3D parentId; - ntReg.addListener(this); } =20 /** @@ -92,36 +94,42 @@ /** * {@inheritDoc} */ - public void nodeTypeRegistered(QName ntName) { - // todo: do more efficient reloading + public void onNodeTypeAdded(QName ntName) throws RepositoryException { try { - getRootState().discard(); + VirtualNodeState root =3D (VirtualNodeState) getRootState(); + NodeTypeDef ntDef =3D ntReg.getNodeTypeDef(ntName); + VirtualNodeState ntState =3D createNodeTypeState(root, ntDef); + root.addChildNodeEntry(ntName, ntState.getUUID()); + + // add as hard reference + root.addStateReference(ntState); + root.notifyStateUpdated(); } catch (ItemStateException e) { - // ignore + throw new RepositoryException(e); } } =20 /** * {@inheritDoc} */ - public void nodeTypeReRegistered(QName ntName) { + public void onNodeTypeModified(QName ntName) throws RepositoryExceptio= n { // todo: do more efficient reloading try { getRootState().discard(); } catch (ItemStateException e) { - // ignore + throw new RepositoryException(e); } } =20 /** * {@inheritDoc} */ - public void nodeTypeUnregistered(QName ntName) { + public void onNodeTypeRemoved(QName ntName) throws RepositoryException= { // todo: do more efficient reloading try { getRootState().discard(); } catch (ItemStateException e) { - // ignore + throw new RepositoryException(e); } } =20 @@ -133,7 +141,8 @@ * @throws RepositoryException */ private VirtualNodeState createNodeTypeState(VirtualNodeState parent, = NodeTypeDef ntDef) throws RepositoryException { - VirtualNodeState ntState =3D createNodeState(parent, ntDef.getName= (), null, NT_NODETYPE); + String uuid =3D calculateStableUUID(ntDef.getName().toString()); + VirtualNodeState ntState =3D createNodeState(parent, ntDef.getName= (), uuid, NT_NODETYPE); =20 // add properties ntState.setPropertyValue(JCR_NODETYPENAME, InternalValue.create(nt= Def.getName())); @@ -147,7 +156,7 @@ // add property defs PropDef[] propDefs =3D ntDef.getPropertyDefs(); for (int i=3D0; imove is set to true. in this case,= the - * label is removed from the previously assigned version and added to = the - * specified one. + * Sets the version label to the given version. + * If the label is already assigned to another version, a VersionExcep= tion is + * thrown unless move is true. If vers= ion + * is null, the label is removed from the respective vers= ion. + * In either case, the version the label was previously assigned to is= returned, + * or null of the label was not moved. * - * @param name the name of the version + * @param version the name of the version * @param label the label to assgign * @param move flag what to do by collisions * @return the version that was previously assigned by this label or <= code>null. * @throws VersionException */ - public InternalVersion addVersionLabel(QName name, QName label, boolea= n move) + public InternalVersion setVersionLabel(QName version, QName label, boo= lean move) throws VersionException; =20 /** - * Removes the label from the respective version. - * - * @param label the label to be removed - * @return the version that had the label assigned - * @throws VersionException if the label does not exist - */ - public InternalVersion removeVersionLabel(QName label) throws VersionE= xception; - - /** * Returns an iterator over all versions (not ordered yet), including = the * root version. * @@ -147,7 +140,7 @@ =20 /** * Returns the UUID of the version labels node - *=20 + * * @return */ public String getVersionLabelsUUID(); Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ve= rsion/InternalVersionItem.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/version/InternalVersionItem.java?view=3Ddiff&r1=3D15= 9668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= InternalVersionItem.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= InternalVersionItem.java Fri Apr 1 01:23:19 2005 @@ -38,10 +38,4 @@ */ public InternalVersionItem getParent(); =20 - /** - * Adds a vesion item state listener to this item - * - * @param listener - */ - public void addListener(InternalVersionItemListener listener); } Added: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/versi= on/InternalVersionLabels.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/version/InternalVersionLabels.java?view=3Dauto&rev= =3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= InternalVersionLabels.java (added) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= InternalVersionLabels.java Fri Apr 1 01:23:19 2005 @@ -0,0 +1,26 @@ +/* + * Copyright 2004-2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * 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.version; + +/** + * This Interface defines... + * + * @author tripod + * @version $Revision:$, $Date:$ + */ +public interface InternalVersionLabels extends InternalVersionItem { +} Propchange: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/= version/InternalVersionLabels.java ---------------------------------------------------------------------------= --- svn =3D=20 Propchange: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/= version/InternalVersionLabels.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ve= rsion/VersionHistoryImpl.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/version/VersionHistoryImpl.java?view=3Ddiff&r1=3D159= 668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionHistoryImpl.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionHistoryImpl.java Fri Apr 1 01:23:19 2005 @@ -22,11 +22,9 @@ import org.apache.jackrabbit.core.NoPrefixDeclaredException; import org.apache.jackrabbit.core.NodeId; import org.apache.jackrabbit.core.NodeImpl; -import org.apache.jackrabbit.core.PropertyImpl; import org.apache.jackrabbit.core.QName; import org.apache.jackrabbit.core.SessionImpl; import org.apache.jackrabbit.core.UnknownPrefixException; -import org.apache.jackrabbit.core.RepositoryImpl; import org.apache.jackrabbit.core.state.NodeState; =20 import javax.jcr.Item; @@ -123,12 +121,15 @@ /** * @see VersionHistory#addVersionLabel(String, String, boolean) */ - public void addVersionLabel(String version, String label, boolean move) + public void addVersionLabel(String versionName, String label, boolean = move) throws VersionException, RepositoryException { try { - QName name =3D QName.fromJCRName(version, session.getNamespace= Resolver()); - QName qLabel =3D QName.fromJCRName(label, session.getNamespace= Resolver()); - history.addVersionLabel(name, qLabel, move); + session.getVersionManager().setVersionLabel( + this, + QName.fromJCRName(versionName, session.getNamespaceRes= olver()), + QName.fromJCRName(label, session.getNamespaceResolver(= )), + move + ); } catch (IllegalNameException e) { throw new RepositoryException(e); } catch (UnknownPrefixException e) { @@ -141,8 +142,12 @@ */ public void removeVersionLabel(String label) throws RepositoryExceptio= n { try { - QName qLabel =3D QName.fromJCRName(label, session.getNamespace= Resolver()); - history.removeVersionLabel(qLabel); + session.getVersionManager().setVersionLabel( + this, + null, + QName.fromJCRName(label, session.getNamespaceResolver(= )), + true + ); } catch (IllegalNameException e) { throw new RepositoryException(e); } catch (UnknownPrefixException e) { @@ -222,8 +227,10 @@ throws UnsupportedRepositoryOperationException, VersionExcepti= on, RepositoryException { try { - QName name =3D QName.fromJCRName(versionName, session.getNames= paceResolver()); - history.removeVersion(name); + session.getVersionManager().removeVersion( + this, + QName.fromJCRName(versionName, session.getNamespaceRes= olver()) + ); } catch (IllegalNameException e) { throw new RepositoryException(e); } catch (UnknownPrefixException e) { @@ -282,5 +289,14 @@ */ public PropertyIterator getReferences() throws RepositoryException { return getReferences(true); + } + + + /** + * Returns the internal version history + * @return + */ + public InternalVersionHistory getInternalVersionHistory() { + return history; } } Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ve= rsion/VersionHistoryNodeState.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/version/VersionHistoryNodeState.java?view=3Ddiff&r1= =3D159668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionHistoryNodeState.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionHistoryNodeState.java Fri Apr 1 01:23:19 2005 @@ -19,6 +19,7 @@ import org.apache.jackrabbit.core.Constants; import org.apache.jackrabbit.core.InternalValue; import org.apache.jackrabbit.core.QName; +import org.apache.jackrabbit.core.util.uuid.UUID; import org.apache.jackrabbit.core.virtual.VirtualNodeState; =20 import javax.jcr.RepositoryException; @@ -52,6 +53,9 @@ =20 // version history is referenceable setPropertyValue(JCR_UUID, InternalValue.create(vh.getId())); + + // enable for spec 0.16.3 + // setPropertyValue(JCR_VERSIONABLEUUID, InternalValue.create(vh.g= etVersionableUUID())); =20 this.vh =3D vh; } Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ve= rsion/VersionItemStateProvider.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/version/VersionItemStateProvider.java?view=3Ddiff&r1= =3D159668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionItemStateProvider.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionItemStateProvider.java Fri Apr 1 01:23:19 2005 @@ -182,6 +182,12 @@ state.addStateReference(vlns); cache(vlns); =20 + } else if (vi instanceof InternalVersionLabels) { + // load parent, that must be a version history + getItemState(new NodeId(vi.getParent().getId())); + // this is a bit dangerous + state =3D (VirtualNodeState) getItemState(id); + } else if (vi instanceof InternalVersion) { InternalVersion v =3D (InternalVersion) vi; state =3D new VersionNodeState(this, v, vi.getParent().get= Id()); Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ve= rsion/VersionManager.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/version/VersionManager.java?view=3Ddiff&r1=3D159668&= r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionManager.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionManager.java Fri Apr 1 01:23:19 2005 @@ -17,6 +17,7 @@ package org.apache.jackrabbit.core.version; =20 import org.apache.jackrabbit.core.NodeImpl; +import org.apache.jackrabbit.core.QName; import org.apache.jackrabbit.core.state.ItemStateManager; import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider; =20 @@ -60,6 +61,33 @@ * @throws RepositoryException */ public Version checkin(NodeImpl node) throws RepositoryException; + + /** + * Removes the specified version from the given version history. + * @param history + * @param versionName + * @throws RepositoryException + */ + public void removeVersion(VersionHistory history, QName versionName) + throws RepositoryException; + + /** + * Sets the version label to the given version. + * If the label is already assigned to another version, a VersionExcep= tion is + * thrown unless move is true. If vers= ion + * is null, the label is removed from the respective vers= ion. + * In either case, the version the label was previously assigned is re= turned, + * or null of the label was not moved. + *=20 + * @param history + * @param version + * @param label + * @param move + * @return + * @throws RepositoryException + */ + public Version setVersionLabel(VersionHistory history, QName version, = QName label, boolean move) + throws RepositoryException; =20 //-----------------------------------------------------< internal stuf= f >--- =20 Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ve= rsion/VersionManagerImpl.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/version/VersionManagerImpl.java?view=3Ddiff&r1=3D159= 668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionManagerImpl.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= VersionManagerImpl.java Fri Apr 1 01:23:19 2005 @@ -16,17 +16,18 @@ */ package org.apache.jackrabbit.core.version; =20 -import org.apache.jackrabbit.core.NodeId; import org.apache.jackrabbit.core.NodeImpl; import org.apache.jackrabbit.core.Constants; import org.apache.jackrabbit.core.PropertyId; import org.apache.jackrabbit.core.SessionImpl; import org.apache.jackrabbit.core.PropertyImpl; +import org.apache.jackrabbit.core.QName; +import org.apache.jackrabbit.core.Path; +import org.apache.jackrabbit.core.NodeId; import org.apache.jackrabbit.core.observation.DelegatingObservationDispatc= her; import org.apache.jackrabbit.core.observation.EventState; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; import org.apache.jackrabbit.core.nodetype.NodeTypeImpl; -import org.apache.jackrabbit.core.state.ItemStateException; import org.apache.jackrabbit.core.state.ItemStateManager; import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider; import org.apache.log4j.Logger; @@ -34,6 +35,7 @@ import javax.jcr.RepositoryException; import javax.jcr.PropertyIterator; import javax.jcr.NodeIterator; +import javax.jcr.Session; import javax.jcr.version.Version; import javax.jcr.version.VersionHistory; import java.util.Iterator; @@ -46,7 +48,7 @@ * version storage ({@link VersionItemStateProvider}) and the persistent * version manager. */ -public class VersionManagerImpl implements VersionManager, Constants, Inte= rnalVersionItemListener { +public class VersionManagerImpl implements VersionManager, Constants { =20 /** * the default logger @@ -140,11 +142,10 @@ */ public VersionHistory createVersionHistory(NodeImpl node) throws Repos= itoryException { InternalVersionHistory history =3D vMgr.createVersionHistory(node); - history.addListener(this); - onVersionStorageChanged(); + virtProvider.invalidateItem(new NodeId(VERSION_STORAGE_NODE_UUID)); VersionHistoryImpl vh =3D (VersionHistoryImpl) node.getSession().g= etNodeByUUID(history.getId()); =20 - // now generate observation events + // generate observation events List events =3D new ArrayList(); recursiveAdd(events, (NodeImpl) vh.getParent(), vh); obsMgr.dispatch(events, (SessionImpl) node.getSession()); @@ -170,11 +171,7 @@ * @throws RepositoryException */ public InternalVersionHistory getVersionHistory(String id) throws Repo= sitoryException { - InternalVersionHistory hist =3D vMgr.getVersionHistory(id); - if (hist !=3D null) { - hist.addListener(this); - } - return hist; + return vMgr.getVersionHistory(id); } =20 /** @@ -215,11 +212,7 @@ * @throws RepositoryException */ public InternalVersion getVersion(String id) throws RepositoryExceptio= n { - InternalVersion vers =3D vMgr.getVersion(id); - if (vers !=3D null) { - vers.addListener(this); - } - return vers; + return vMgr.getVersion(id); } =20 /** @@ -240,11 +233,7 @@ * @throws RepositoryException */ public InternalVersionItem getItem(String id) throws RepositoryExcepti= on { - InternalVersionItem item =3D vMgr.getItem(id); - if (item !=3D null) { - item.addListener(this); - } - return item; + return vMgr.getItem(id); } =20 /** @@ -258,10 +247,10 @@ public Version checkin(NodeImpl node) throws RepositoryException { SessionImpl session =3D (SessionImpl) node.getSession(); InternalVersion version =3D vMgr.checkin(node); - version.addListener(this); + virtProvider.invalidateItem(new NodeId(version.getVersionHistory()= .getId())); VersionImpl v =3D (VersionImpl) session.getNodeByUUID(version.getI= d()); =20 - // now generate observation events + // generate observation events List events =3D new ArrayList(); recursiveAdd(events, (NodeImpl) v.getParent(), v); obsMgr.dispatch(events, session); @@ -270,6 +259,72 @@ } =20 /** + * Removes the specified version from the history + * @param history + * @param name + */ + public void removeVersion(VersionHistory history, QName name) + throws RepositoryException { + // generate observation events + VersionImpl version =3D (VersionImpl) ((VersionHistoryImpl) histor= y).getNode(name); + List events =3D new ArrayList(); + recursiveRemove(events, (NodeImpl) history, version); + + InternalVersionHistory vh =3D ((VersionHistoryImpl) history).getIn= ternalVersionHistory(); + vh.removeVersion(name); + + virtProvider.invalidateItem(new NodeId(vh.getId())); + obsMgr.dispatch(events, (SessionImpl) history.getSession()); + } + + /** + * {@inheritDoc} + */ + public Version setVersionLabel(VersionHistory history, QName version, + QName label, boolean move) + throws RepositoryException { + Session session =3D history.getSession(); + + InternalVersionHistory vh =3D ((VersionHistoryImpl) history).getIn= ternalVersionHistory(); + NodeImpl labelNode =3D ((VersionHistoryImpl) history).getNode(JCR_= VERSIONLABELS); + InternalVersion v =3D vh.setVersionLabel(version, label, move); + + // collect observation events + List events =3D new ArrayList(); + if (version =3D=3D null && v !=3D null) { + // label removed + events.add(EventState.propertyRemoved( + labelNode.internalGetUUID(), + labelNode.getPrimaryPath(), + Path.PathElement.fromString(label.toString()), + (NodeTypeImpl) labelNode.getPrimaryNodeType(), + labelNode.getSession() + )); + } else if (v =3D=3D null) { + // label added + events.add(EventState.propertyAdded( + labelNode.internalGetUUID(), + labelNode.getPrimaryPath(), + Path.PathElement.fromString(label.toString()), + (NodeTypeImpl) labelNode.getPrimaryNodeType(), + labelNode.getSession() + )); + } else { + // label modified + events.add(EventState.propertyChanged( + labelNode.internalGetUUID(), + labelNode.getPrimaryPath(), + Path.PathElement.fromString(label.toString()), + (NodeTypeImpl) labelNode.getPrimaryNodeType(), + labelNode.getSession() + )); + } + virtProvider.invalidateItem(new NodeId(vh.getId())); + obsMgr.dispatch(events, (SessionImpl) history.getSession()); + return v =3D=3D null ? null : (VersionImpl) session.getNodeByUUID(= v=2EgetId()); + } + + /** * Adds a subtree of itemstates as 'added' to a list of events * * @param events @@ -308,6 +363,32 @@ } =20 /** + * Adds a subtree of itemstates as 'removed' to a list of events + * + * @param events + * @param parent + * @param node + * @throws RepositoryException + */ + private void recursiveRemove(List events, NodeImpl parent, NodeImpl no= de) + throws RepositoryException { + + events.add(EventState.childNodeRemoved( + parent.internalGetUUID(), + parent.getPrimaryPath(), + node.internalGetUUID(), + node.getPrimaryPath().getNameElement(), + (NodeTypeImpl) parent.getPrimaryNodeType(), + node.getSession() + )); + NodeIterator niter =3D node.getNodes(); + while (niter.hasNext()) { + NodeImpl n =3D (NodeImpl) niter.nextNode(); + recursiveRemove(events, node, n); + } + } + + /** * {@inheritDoc} */ public List getItemReferences(InternalVersionItem item) { @@ -328,33 +409,5 @@ } } vMgr.setItemReferences(item, refs); - } - - /** - * {@inheritDoc} - */ - public void itemModifed(InternalVersionItem item) { - try { - NodeId id =3D new NodeId(item.getId()); - if (virtProvider.hasItemState(id)) { - virtProvider.getItemState(id).discard(); - } - } catch (ItemStateException e) { - log.error("Error while refreshing virtual item.", e); - } - } - - /** - * Flushes the virtual node state information of the version storage - */ - public void onVersionStorageChanged() { - try { - NodeId id =3D new NodeId(VERSION_STORAGE_NODE_UUID); - if (virtProvider.hasItemState(id)) { - virtProvider.getItemState(id).discard(); - } - } catch (ItemStateException e) { - log.error("Error while refreshing virtual version storage.", e= ); - } } } Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ve= rsion/persistence/InternalVersionHistoryImpl.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/version/persistence/InternalVersionHistoryImpl.java?= view=3Ddiff&r1=3D159668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/InternalVersionHistoryImpl.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/InternalVersionHistoryImpl.java Fri Apr 1 01:23:19 2005 @@ -32,6 +32,7 @@ import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Value; +import javax.jcr.ReferentialIntegrityException; import javax.jcr.version.VersionException; import java.util.Calendar; import java.util.HashMap; @@ -235,7 +236,7 @@ * @param versionName * @throws VersionException */ - public void removeVersion(QName versionName) throws VersionException { + public void removeVersion(QName versionName) throws RepositoryExceptio= n { =20 InternalVersionImpl v =3D (InternalVersionImpl) getVersion(version= Name); if (v.equals(rootVersion)) { @@ -246,7 +247,7 @@ // check if any references (from outside the version storage) exis= t on this version List refs =3D getVersionManager().getItemReferences(v); if (!refs.isEmpty()) { - throw new VersionException("Unable to remove version. At least= once referenced."); + throw new ReferentialIntegrityException("Unable to remove vers= ion. At least once referenced."); } =20 try { @@ -275,7 +276,6 @@ =20 stateMgr.update(); succeeded =3D true; - notifyModifed(); } finally { if (!succeeded) { // update operation failed, cancel all modifications @@ -292,83 +292,60 @@ /** * {@inheritDoc} */ - public InternalVersion addVersionLabel(QName versionName, QName label,= boolean move) + public InternalVersion setVersionLabel(QName versionName, QName label,= boolean move) throws VersionException { =20 - InternalVersion version =3D getVersion(versionName); - if (version =3D=3D null) { + InternalVersion version =3D versionName =3D=3D null ? null : getVe= rsion(versionName); + if (versionName !=3Dnull && version =3D=3D null) { throw new VersionException("Version " + versionName + " does n= ot exist in this version history."); } - InternalVersionImpl prev =3D (InternalVersionImpl) labelCache.get(= label); - if (version.equals(prev)) { - // ignore - return version; - } else if (prev !=3D null && !move) { - // already defined elsewhere, throw - throw new VersionException("Version label " + label + " alread= y defined for version " + prev.getName()); - } else if (prev !=3D null) { - // if already defined, but move, remove old label first - removeVersionLabel(label); + if (prev =3D=3D null) { + if (version =3D=3D null) { + return null; + } + } else { + if (prev.equals(version)) { + return version; + } else if (!move) { + // already defined elsewhere, throw + throw new VersionException("Version label " + label + " al= ready defined for version " + prev.getName()); + } } - labelCache.put(label, version); - ((InternalVersionImpl) version).internalAddLabel(label); + + // update persistence UpdatableItemStateManager stateMgr =3D getVersionManager().getItem= StateMgr(); - boolean succeeded =3D false; try { stateMgr.edit(); - PersistentNode lNode =3D labelNode.addNode(label, NT_UNSTRUCTU= RED, null); - lNode.setPropertyValue(NativePVM.PROPNAME_NAME, InternalValue.= create(label)); - lNode.setPropertyValue(NativePVM.PROPNAME_VERSION, InternalVal= ue.create(version.getId())); - labelNode.store(); =20 + if (prev !=3D null) { + labelNode.removeNode(label); + } + if (version !=3D null) { + PersistentNode lNode =3D labelNode.addNode(label, NT_UNSTR= UCTURED, null); + lNode.setPropertyValue(NativePVM.PROPNAME_NAME, InternalVa= lue.create(label)); + lNode.setPropertyValue(NativePVM.PROPNAME_VERSION, Interna= lValue.create(version.getId())); + } + labelNode.store(); stateMgr.update(); - succeeded =3D true; } catch (ItemStateException e) { + stateMgr.cancel(); throw new VersionException("Error while storing modifications"= , e); } catch (RepositoryException e) { + stateMgr.cancel(); throw new VersionException("Error while storing modifications"= , e); - } finally { - if (!succeeded) { - // update operation failed, cancel all modifications - stateMgr.cancel(); - } } - notifyModifed(); - return prev; - } - - /** - * {@inheritDoc} - */ - public InternalVersion removeVersionLabel(QName label) throws VersionE= xception { - =20 - InternalVersionImpl v =3D (InternalVersionImpl) labelCache.remove(= label); - if (v =3D=3D null) { - throw new VersionException("Version label " + label + " is not= in version history."); - } - v.internalRemoveLabel(label); - UpdatableItemStateManager stateMgr =3D getVersionManager().getItem= StateMgr(); - boolean succeeded =3D false; - try { - stateMgr.edit(); - labelNode.removeNode(label); - labelNode.store(); - stateMgr.update(); - succeeded =3D true; - } catch (ItemStateException e) { - throw new VersionException("Unable to store modifications", e); - } catch (RepositoryException e) { - throw new VersionException("Unable to store modifications", e); - } finally { - if (!succeeded) { - // update operation failed, cancel all modifications - stateMgr.cancel(); - } + // update internal structures + if (prev !=3D null) { + prev.internalRemoveLabel(label); + labelCache.remove(label); + } + if (version !=3D null) { + labelCache.put(label, version); + ((InternalVersionImpl) version).internalAddLabel(label); } - notifyModifed(); - return v; + return prev; } =20 /** @@ -484,7 +461,7 @@ pNode.setPropertyValue(NativePVM.PROPNAME_VERSIONABLE_ID, Internal= Value.create(src.internalGetUUID())); =20 // create label node - pNode.addNode(NativePVM.NODENAME_VERSION_LABELS, NT_UNSTRUCTURED, = null); + pNode.addNode(NativePVM.NODENAME_VERSION_LABELS, NativePVM.NT_REP_= VERSION_LABELS, null); =20 // create root version String versionId =3D UUID.randomUUID().toString(); Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ve= rsion/persistence/InternalVersionItemImpl.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/version/persistence/InternalVersionItemImpl.java?vie= w=3Ddiff&r1=3D159668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/InternalVersionItemImpl.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/InternalVersionItemImpl.java Fri Apr 1 01:23:19 2005 @@ -18,7 +18,8 @@ =20 import org.apache.jackrabbit.core.version.InternalVersionItem; import org.apache.jackrabbit.core.version.PersistentVersionManager; -import org.apache.jackrabbit.core.version.InternalVersionItemListener; +import org.apache.jackrabbit.core.version.InternalVersionHistory; +import org.apache.jackrabbit.core.version.InternalVersion; =20 import java.util.HashSet; import java.util.Set; @@ -35,11 +36,6 @@ private final PersistentVersionManager vMgr; =20 /** - * the item listeners - */ - private final Set listeners =3D new HashSet(); - - /** * Creates a new Internal version item impl * * @param vMgr @@ -58,29 +54,11 @@ } =20 /** - * {@inheritDoc} - */ - public void addListener(InternalVersionItemListener listener) { - listeners.add(listener); - } - - /** - * notifys the listeners that this item was modified - */ - protected void notifyModifed() { - Iterator iter =3D listeners.iterator(); - while (iter.hasNext()) { - ((InternalVersionItemListener) iter.next()).itemModifed(this); - } - } - - /** * Returns the external id of this item * * @return */ public abstract String getId(); - =20 /** * returns the parent version item or null Added: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/versi= on/persistence/InternalVersionLabelsImpl.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/version/persistence/InternalVersionLabelsImpl.java?v= iew=3Dauto&rev=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/InternalVersionLabelsImpl.java (added) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/InternalVersionLabelsImpl.java Fri Apr 1 01:23:19 2005 @@ -0,0 +1,47 @@ +/* + * Copyright 2004-2005 The Apache Software Foundation or its licensors, + * as applicable. + * + * 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.version.persistence; + +import org.apache.jackrabbit.core.version.InternalVersionItem; +import org.apache.jackrabbit.core.version.InternalVersionLabels; +import org.apache.jackrabbit.core.version.PersistentVersionManager; + +/** + * This Class represents a version labels + */ +public class InternalVersionLabelsImpl extends InternalVersionItemImpl imp= lements InternalVersionLabels { + + private final InternalVersionItem parent; + + private final PersistentNode node; + + protected InternalVersionLabelsImpl(PersistentVersionManager vMgr, + PersistentNode node, + InternalVersionItem parent) { + super(vMgr); + this.node =3D node; + this.parent =3D parent; + } + + public InternalVersionItem getParent() { + return parent; + } + + public String getId() { + return node.getUUID(); + } +} Propchange: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/= version/persistence/InternalVersionLabelsImpl.java ---------------------------------------------------------------------------= --- svn =3D=20 Propchange: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/= version/persistence/InternalVersionLabelsImpl.java ---------------------------------------------------------------------------= --- svn:eol-style =3D native Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ve= rsion/persistence/NativePVM.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/version/persistence/NativePVM.java?view=3Ddiff&r1=3D= 159668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/NativePVM.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/= persistence/NativePVM.java Fri Apr 1 01:23:19 2005 @@ -111,6 +111,11 @@ protected static final QName NT_REP_VERSION_HISTORY =3D new QName(NS_R= EP_URI, "versionHistory"); =20 /** + * The nodetype name of a presistent version label + */ + protected static final QName NT_REP_VERSION_LABELS =3D new QName(NS_RE= P_URI, "versionLabels"); + + /** * the nodetype name of a persistent frozen node */ protected static final QName NT_REP_FROZEN =3D new QName(NS_REP_URI, "= frozen"); @@ -261,7 +266,7 @@ } =20 versionedUUIDs.put(hist.getVersionableUUID(), hist.getId()); - =20 + log.info("Created new version history " + hist.getId() + " for " += node.safeGetJCRPath() + ". NumHistories=3D" + versionedUUIDs.size()); return hist; } @@ -383,6 +388,8 @@ item =3D ((InternalVersionHistory) parent).getVersion(= uuid); } else if (ntName.equals(NT_REP_VERSION_HISTORY)) { item =3D new InternalVersionHistoryImpl(this, pNode); + } else if (ntName.equals(NT_REP_VERSION_LABELS)) { + item =3D new InternalVersionLabelsImpl(this, pNode, pa= rent); } else { //return null; } @@ -453,9 +460,6 @@ InternalVersionImpl v =3D history.checkin(new QName("", versio= nName), node); stateMgr.update(); succeeded =3D true; - - // notify listeners - history.notifyModifed(); =20 return v; } catch (ItemStateException e) { Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/vi= rtual/AbstractVISProvider.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/virtual/AbstractVISProvider.java?view=3Ddiff&r1=3D15= 9668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/= AbstractVISProvider.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/= AbstractVISProvider.java Fri Apr 1 01:23:19 2005 @@ -42,6 +42,7 @@ import javax.jcr.RepositoryException; import java.util.HashSet; import java.util.Map; +import java.util.Iterator; =20 /** * This Class implements a virtual item state provider, in order to expose= the @@ -124,9 +125,6 @@ } else { s =3D cache(internalGetNodeState((NodeId) id)); } - if (s instanceof VersionHistoryNodeState) { - s.getId(); - } return s; } else { return internalGetPropertyState((PropertyId) id); @@ -304,6 +302,36 @@ */ protected NodeState evict(NodeId id) { return (NodeState) nodes.remove(id); + } + + /** + * Removes the item and all hard refernces from the cache and discards= the + * states. + * @param id + */ + public void invalidateItem(ItemId id) { + if (id.equals(rootNodeId)) { + if (root !=3D null) { + root.discard(); + try { + root =3D createRootNodeState(); + } catch (RepositoryException e) { + // ignore + } + } + return; + } + VirtualNodeState state =3D (VirtualNodeState) nodes.remove(id); + if (state !=3D null) { + HashSet set =3D state.removeAllStateReferences(); + if (set !=3D null) { + Iterator iter =3D set.iterator(); + while (iter.hasNext()) { + invalidateItem(((NodeState) iter.next()).getId()); + } + } + state.discard(); + } } =20 /** Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/vi= rtual/VirtualItemStateProvider.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/virtual/VirtualItemStateProvider.java?view=3Ddiff&r1= =3D159668&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/= VirtualItemStateProvider.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/= VirtualItemStateProvider.java Fri Apr 1 01:23:19 2005 @@ -82,4 +82,6 @@ * @return true if the reference target is one of its ite= ms. */ public boolean setNodeReferences(NodeReferences refs); + + } Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/vi= rtual/VirtualNodeState.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/= apache/jackrabbit/core/virtual/VirtualNodeState.java?view=3Ddiff&r1=3D15966= 8&r2=3D159669 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/= VirtualNodeState.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/virtual/= VirtualNodeState.java Fri Apr 1 01:23:19 2005 @@ -256,4 +256,14 @@ stateRefs.remove(state); } } + + /** + * Returns the hard references of this state + */ + public HashSet removeAllStateReferences() { + HashSet set =3D stateRefs; + stateRefs =3D null; + return set; + } + }