Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientISFactory.java Mon Oct 9 09:46:16 2006 @@ -54,11 +54,11 @@ NodeState parent, QName nodetypeName, QNodeDefinition definition) { NodeState nodeState = new NodeState(name, uuid, parent, nodetypeName, - definition, ItemState.STATUS_NEW, this, idFactory); + definition, Status.NEW, this, idFactory, false); // get a notification when this item state is saved or invalidated nodeState.addListener(listener); // notify listener that a node state has been created - listener.statusChanged(nodeState, ItemState.STATUS_NEW); + listener.statusChanged(nodeState, Status.NEW); return nodeState; } @@ -68,11 +68,11 @@ */ public PropertyState createNewPropertyState(QName name, NodeState parent, QPropertyDefinition definition) { PropertyState propState = new PropertyState(name, parent, - definition, ItemState.STATUS_NEW, idFactory); + definition, Status.NEW, idFactory, false); // get a notification when this item state is saved or invalidated propState.addListener(listener); // notify listener that a property state has been created - listener.statusChanged(propState, ItemState.STATUS_NEW); + listener.statusChanged(propState, Status.NEW); return propState; } @@ -85,7 +85,7 @@ // retrieve state to overlay NodeState overlayedState = (NodeState) parent.getRootState(); NodeState nodeState = new NodeState(overlayedState, null, - ItemState.STATUS_EXISTING, this, idFactory); + Status.EXISTING, this, idFactory); nodeState.addListener(listener); return nodeState; } @@ -104,7 +104,7 @@ parentState = (NodeState) ism.getItemState(overlayedParent.getId()); } NodeState nodeState = new NodeState(overlayedState, parentState, - ItemState.STATUS_EXISTING, this, idFactory); + Status.EXISTING, this, idFactory); nodeState.addListener(listener); return nodeState; } @@ -118,7 +118,7 @@ // retrieve state to overlay NodeState overlayedState = (NodeState) parent.getItemState(nodeId); NodeState nodeState = new NodeState(overlayedState, parentState, - ItemState.STATUS_EXISTING, this, idFactory); + Status.EXISTING, this, idFactory); nodeState.addListener(listener); return nodeState; } @@ -133,7 +133,7 @@ // retrieve state to overlay PropertyState overlayedState = (PropertyState) parent.getItemState(propertyId); PropertyState propState = new PropertyState(overlayedState, parentState, - ItemState.STATUS_EXISTING, idFactory); + Status.EXISTING, idFactory); propState.addListener(listener); return propState; } Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientItemStateManager.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientItemStateManager.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientItemStateManager.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientItemStateManager.java Mon Oct 9 09:46:16 2006 @@ -194,7 +194,7 @@ /** * Return an item state given its id. Please note that this implementation * also returns item states that are in removed state ({@link - * ItemState.STATUS_EXISTING_REMOVED} but not yet saved. + * Status#EXISTING_REMOVED} but not yet saved. * * @return item state. * @throws NoSuchItemStateException if there is no item state (not even a @@ -252,56 +252,56 @@ // a state which changes from 'existing' to 'existing modified' will // go into the modified set of the change log, etc. switch (state.getStatus()) { - case ItemState.STATUS_EXISTING: + case Status.EXISTING: switch (previousStatus) { - case ItemState.STATUS_EXISTING_MODIFIED: + case Status.EXISTING_MODIFIED: // was modified and is now refreshed changeLog.modifiedStates.remove(state); break; - case ItemState.STATUS_EXISTING_REMOVED: + case Status.EXISTING_REMOVED: // was removed and is now refreshed changeLog.deletedStates.remove(state); break; - case ItemState.STATUS_STALE_MODIFIED: + case Status.STALE_MODIFIED: // was modified and state and is now refreshed changeLog.modifiedStates.remove(state); break; - case ItemState.STATUS_NEW: + case Status.NEW: // was new and has been saved now changeLog.addedStates.remove(state); break; } break; - case ItemState.STATUS_EXISTING_MODIFIED: + case Status.EXISTING_MODIFIED: changeLog.modified(state); break; - case ItemState.STATUS_EXISTING_REMOVED: + case Status.EXISTING_REMOVED: // check if modified earlier - if (previousStatus == ItemState.STATUS_EXISTING_MODIFIED) { + if (previousStatus == Status.EXISTING_MODIFIED) { changeLog.modifiedStates.remove(state); // todo: remove operation(s) as well } changeLog.deleted(state); break; - case ItemState.STATUS_REMOVED: - if (previousStatus == ItemState.STATUS_NEW) { + case Status.REMOVED: + if (previousStatus == Status.NEW) { // was new and now removed again changeLog.addedStates.remove(state); // TODO: remove operation as well - } else if (previousStatus == ItemState.STATUS_EXISTING_REMOVED) { + } else if (previousStatus == Status.EXISTING_REMOVED) { // was removed and is now saved changeLog.deletedStates.remove(state); } break; - case ItemState.STATUS_STALE_DESTROYED: + case Status.STALE_DESTROYED: // state is now stale. remove from modified changeLog.modifiedStates.remove(state); // TODO: remove operation as well break; - case ItemState.STATUS_STALE_MODIFIED: + case Status.STALE_MODIFIED: // state is now stale. keep in modified. wait until refreshed break; - case ItemState.STATUS_NEW: + case Status.NEW: // new state has been created changeLog.added(state); break; Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java Mon Oct 9 09:46:16 2006 @@ -29,6 +29,7 @@ import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.value.QValue; import org.apache.jackrabbit.jcr2spi.WorkspaceManager; +import org.apache.jackrabbit.jcr2spi.state.entry.ChildNodeEntry; import org.apache.jackrabbit.jcr2spi.nodetype.EffectiveNodeType; import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeConflictException; import org.apache.jackrabbit.name.QName; @@ -142,18 +143,18 @@ // build the node state String uuid = null; - if (info.getId().getRelativePath() == null) { + if (info.getId().getPath() == null) { uuid = info.getId().getUUID(); } NodeState state = new NodeState(info.getQName(), uuid, parent, info.getNodetype(), - definition, ItemState.STATUS_EXISTING, this, service.getIdFactory()); + definition, Status.EXISTING, this, service.getIdFactory(), true); // child node entries Set childNodeEntries = new HashSet(); for (IdIterator it = info.getNodeIds(); it.hasNext(); ) { NodeInfo childInfo = service.getNodeInfo(sessionInfo, (NodeId) it.nextId()); String childUUID = null; - if (childInfo.getId().getRelativePath() == null) { + if (childInfo.getId().getPath() == null) { childUUID = childInfo.getId().getUUID(); } childNodeEntries.add(new CNE(childInfo.getQName(), childUUID)); @@ -241,7 +242,7 @@ // build the PropertyState PropertyState state = new PropertyState(info.getQName(), parent, - def, ItemState.STATUS_EXISTING, service.getIdFactory()); + def, Status.EXISTING, service.getIdFactory(), true); QValue[] qValues; if (info.getType() == PropertyType.BINARY) { Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateManager.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateManager.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateManager.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateManager.java Mon Oct 9 09:46:16 2006 @@ -127,6 +127,10 @@ log.error("Unexpected error while updating modified property state.", e); } } + // TODO: check again. parent must be notified if mixintypes or jcr:uuid prop is changed. + if (parent != null) { + parent.refresh(event, changeLog); + } } else { // should never occur throw new IllegalArgumentException("Invalid event type: " + event.getType()); Added: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildItemReference.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildItemReference.java?view=auto&rev=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildItemReference.java (added) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildItemReference.java Mon Oct 9 09:46:16 2006 @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.jcr2spi.state.entry; + +import org.apache.jackrabbit.name.QName; +import org.apache.jackrabbit.jcr2spi.state.NodeState; +import org.apache.jackrabbit.jcr2spi.state.ItemStateFactory; +import org.apache.jackrabbit.jcr2spi.state.ItemState; +import org.apache.jackrabbit.jcr2spi.state.ItemStateException; +import org.apache.jackrabbit.jcr2spi.state.NoSuchItemStateException; + +import java.lang.ref.WeakReference; + +/** + * ChildItemReference implements base functionality for child node + * and property references. + * @see ChildNodeReference + * @see PropertyReference + */ +abstract class ChildItemReference { + + /** + * Cached weak reference to the target NodeState. + */ + private WeakReference target; + + /** + * The parent that owns this ChildItemReference. + */ + protected final NodeState parent; + + /** + * The name of the target item state. + */ + protected final QName name; + + /** + * The item state factory to create the the item state. + */ + protected final ItemStateFactory isf; + + /** + * Creates a new ChildItemReference with the given parent + * NodeState. + * + * @param parent the NodeState that owns this child node + * reference. + * @param name the name of the child item. + * @param isf the item state factory to create the item state. + */ + public ChildItemReference(NodeState parent, QName name, ItemStateFactory isf) { + this.parent = parent; + this.name = name; + this.isf = isf; + } + + /** + * Creates a new ChildItemReference with the given parent + * NodeState and an already initialized child item state. + * + * @param parent the NodeState that owns this child node + * reference. + * @param child the child item state. + * @param name the name of the child item. + * @param isf the item state factory to re-create the item state. + */ + public ChildItemReference(NodeState parent, ItemState child, QName name, ItemStateFactory isf) { + this.parent = parent; + this.name = name; + this.isf = isf; + this.target = new WeakReference(child); + } + + /** + * Resolves this ChildItemReference and returns the target + * ItemState of this reference. This method may return a + * cached ItemState if this method was called before already + * otherwise this method will forward the call to {@link #doResolve()} + * and cache its return value. + * + * @return the ItemState where this reference points to. + * @throws NoSuchItemStateException if the referenced ItemState + * does not exist. + * @throws ItemStateException if an error occurs. + */ + public ItemState resolve() + throws NoSuchItemStateException, ItemStateException { + // check if cached + if (target != null) { + ItemState state = (ItemState) target.get(); + if (state != null) { + return state; + } + } + // not cached. retrieve and keep weak reference to state + ItemState state = doResolve(); + target = new WeakReference(state); + return state; + } + + /** + * Returns the parent NodeState. This is the source of this + * ChildItemReference. + * + * @return the parent NodeState. + */ + public NodeState getParent() { + return parent; + } + + /** + * @return true if this reference is resolved; + * false otherwise. + */ + protected boolean isResolved() { + ItemState state = null; + if (target != null) { + state = (ItemState) target.get(); + } + return state != null; + } + + /** + * Resolves this ChildItemReference and returns the target + * ItemState of this reference. + * + * @return the ItemState where this reference points to. + * @throws NoSuchItemStateException if the referenced ItemState + * does not exist. + * @throws ItemStateException if an error occurs. + */ + protected abstract ItemState doResolve() + throws NoSuchItemStateException, ItemStateException; +} Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildItemReference.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildItemReference.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeEntry.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeEntry.java?view=auto&rev=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeEntry.java (added) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeEntry.java Mon Oct 9 09:46:16 2006 @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.jcr2spi.state.entry; + +import org.apache.jackrabbit.spi.NodeId; +import org.apache.jackrabbit.name.QName; +import org.apache.jackrabbit.jcr2spi.state.NodeState; +import org.apache.jackrabbit.jcr2spi.state.ItemStateException; +import org.apache.jackrabbit.jcr2spi.state.NoSuchItemStateException; + +/** + * ChildNodeEntry specifies the name, index (in the case of + * same-name siblings) and the UUID of a child node entry. + */ +public interface ChildNodeEntry { + + /** + * @return the NodeId of this child node entry. + */ + public NodeId getId(); + + /** + * @return the name of this child node entry. + */ + public QName getName(); + + /** + * @return the UUID of the node state which is referenced by this child node + * entry or null if the node state cannot be identified with a + * UUID. + */ + public String getUUID(); + + /** + * @return the index of this child node entry to suppport same-name siblings. + */ + public int getIndex(); + + /** + * @return the referenced NodeState. + * @throws NoSuchItemStateException if the NodeState does not + * exist anymore. + * @throws ItemStateException if an error occurs while retrieving the + * NodeState. + */ + public NodeState getNodeState() + throws NoSuchItemStateException, ItemStateException; + + /** + * Returns true if the referenced NodeState is + * available. That is, the referenced NodeState is already + * cached and ready to be returned by {@link #getNodeState()}. + * + * @return true if the NodeState is available; + * otherwise false. + */ + public boolean isAvailable(); +} Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeEntry.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeEntry.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeReference.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeReference.java?view=auto&rev=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeReference.java (added) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeReference.java Mon Oct 9 09:46:16 2006 @@ -0,0 +1,130 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.jcr2spi.state.entry; + +import org.apache.jackrabbit.name.QName; +import org.apache.jackrabbit.spi.IdFactory; +import org.apache.jackrabbit.jcr2spi.state.NodeState; +import org.apache.jackrabbit.jcr2spi.state.ItemStateFactory; +import org.apache.jackrabbit.jcr2spi.state.NoSuchItemStateException; +import org.apache.jackrabbit.jcr2spi.state.ItemStateException; + +/** + * ChildNodeReference implements common functionality for child + * node entry implementations. + */ +public abstract class ChildNodeReference extends ChildItemReference implements ChildNodeEntry { + + /** + * Creates a new ChildNodeEntry for an already initialized + * child node state. The child node must already be attached to its parent. + * + * @param child the child node state. + * @param isf the item state factory to re-create node states. + * @param idFactory the IdFactory to create new ItemIds + * @return + */ + public static ChildNodeEntry create(NodeState child, ItemStateFactory isf, + IdFactory idFactory) { + ChildNodeEntry cne; + if (child.getUUID() == null) { + cne = new PathElementReference(child, isf, idFactory); + } else { + cne = new UUIDReference(child, isf); + } + return cne; + } + + /** + * Creates a ChildNodeEntry instance based on + * nodeName and an optional uuid. + * + * @param parent + * @param childName + * @param childUUID + * @param isf + * @param idFactory + * @return + */ + public static ChildNodeEntry create(NodeState parent, QName childName, + String childUUID, ItemStateFactory isf, + IdFactory idFactory) { + if (childUUID == null) { + return new PathElementReference(parent, childName, isf, idFactory); + } else { + return new UUIDReference(parent, idFactory.createNodeId(childUUID), isf, childName); + } + } + + /** + * Creates a new ChildNodeReference with the given parent + * NodeState. + * + * @param parent the NodeState that owns this child node + * reference. + * @param name the name of the child item. + * @param isf the item state factory to create the item state. + */ + ChildNodeReference(NodeState parent, QName name, ItemStateFactory isf) { + super(parent, name, isf); + } + + + /** + * Creates a new ChildNodeReference with the given parent + * NodeState and an already initialized child node state. + * + * @param child the child node state. + * @param isf the item state factory to re-create the node state. + */ + ChildNodeReference(NodeState child, ItemStateFactory isf) { + super(child.getParent(), child, child.getQName(), isf); + } + + /** + * @inheritDoc + * @see ChildNodeEntry#getIndex() + */ + public int getIndex() { + return parent.getChildNodeIndex(getName(), this); + } + + /** + * @inheritDoc + * @see ChildNodeEntry#getName() + */ + public QName getName() { + return name; + } + + /** + * @inheritDoc + * @see ChildNodeEntry#getNodeState() + */ + public NodeState getNodeState() + throws NoSuchItemStateException, ItemStateException { + return (NodeState) resolve(); + } + + /** + * @inheritDoc + * @see ChildNodeEntry#isAvailable() + */ + public boolean isAvailable() { + return isResolved(); + } +} Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeReference.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildNodeReference.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildPropertyEntry.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildPropertyEntry.java?view=auto&rev=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildPropertyEntry.java (added) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildPropertyEntry.java Mon Oct 9 09:46:16 2006 @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.jcr2spi.state.entry; + +import org.apache.jackrabbit.spi.PropertyId; +import org.apache.jackrabbit.name.QName; +import org.apache.jackrabbit.jcr2spi.state.ItemStateException; +import org.apache.jackrabbit.jcr2spi.state.NoSuchItemStateException; +import org.apache.jackrabbit.jcr2spi.state.PropertyState; + +/** + * ChildPropertyEntry... + */ +public interface ChildPropertyEntry { + + /** + * @return the NodeId of this child node entry. + */ + public PropertyId getId(); + + /** + * @return the name of this child node entry. + */ + public QName getName(); + + /** + * @return the referenced PropertyState. + * @throws NoSuchItemStateException if the PropertyState does not + * exist anymore. + * @throws ItemStateException if an error occurs while retrieving the + * PropertyState. + */ + public PropertyState getPropertyState() throws NoSuchItemStateException, ItemStateException; + + /** + * Returns true if the referenced PropertyState is + * available. That is, the referenced PropertyState is already + * cached and ready to be returned by {@link #getPropertyState()}. + * + * @return true if the PropertyState is available; + * otherwise false. + */ + public boolean isAvailable(); +} \ No newline at end of file Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildPropertyEntry.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/ChildPropertyEntry.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PathElementReference.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PathElementReference.java?view=auto&rev=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PathElementReference.java (added) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PathElementReference.java Mon Oct 9 09:46:16 2006 @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.jcr2spi.state.entry; + +import org.apache.jackrabbit.name.QName; +import org.apache.jackrabbit.name.Path; +import org.apache.jackrabbit.spi.NodeId; +import org.apache.jackrabbit.spi.IdFactory; +import org.apache.jackrabbit.jcr2spi.state.NodeState; +import org.apache.jackrabbit.jcr2spi.state.ItemStateFactory; +import org.apache.jackrabbit.jcr2spi.state.ItemState; +import org.apache.jackrabbit.jcr2spi.state.NoSuchItemStateException; +import org.apache.jackrabbit.jcr2spi.state.ItemStateException; + +/** + * PathElementReference implements a {@link ChildNodeEntry} based + * on a {@link Path.PathElement}. + */ +class PathElementReference extends ChildNodeReference implements ChildNodeEntry { + + /** + * IdFactory to create an ItemId based on the parent NodeId + */ + private final IdFactory idFactory; + + /** + * Creates a new PathElementReference + * + * @param parent the ItemState that owns this child item + * reference. + * @param name the name of the child node. + * @param isf the item state factory to create the node state. + * @param idFactory the IdFactory to create new ItemIds + */ + PathElementReference(NodeState parent, QName name, + ItemStateFactory isf, IdFactory idFactory) { + super(parent, name, isf); + this.idFactory = idFactory; + } + + /** + * Creates a new PathElementReference with the given parent + * NodeState and an already initialized child node state. + * + * @param child the child node state. + * @param isf the item state factory to re-create the node state. + * @param idFactory the IdFactory to create new ItemIds + */ + PathElementReference(NodeState child, ItemStateFactory isf, + IdFactory idFactory) { + super(child, isf); + this.idFactory = idFactory; + } + + /** + * @inheritDoc + * @see ChildItemReference#doResolve() + *

+ * Returns a NodeState. + */ + protected ItemState doResolve() + throws NoSuchItemStateException, ItemStateException { + return isf.createNodeState(getId(), getParent()); + } + + /** + * @inheritDoc + * @see ChildNodeEntry#getId() + */ + public NodeId getId() { + return idFactory.createNodeId(parent.getNodeId(), Path.create(getName(), getIndex())); + } + + /** + * This implementation always returns null. + * @inheritDoc + * @see ChildNodeEntry#getUUID() + */ + public String getUUID() { + return null; + } +} Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PathElementReference.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PathElementReference.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PropertyReference.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PropertyReference.java?view=auto&rev=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PropertyReference.java (added) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PropertyReference.java Mon Oct 9 09:46:16 2006 @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.jcr2spi.state.entry; + +import org.apache.jackrabbit.name.QName; +import org.apache.jackrabbit.spi.IdFactory; +import org.apache.jackrabbit.spi.PropertyId; +import org.apache.jackrabbit.jcr2spi.state.ItemStateFactory; +import org.apache.jackrabbit.jcr2spi.state.NodeState; +import org.apache.jackrabbit.jcr2spi.state.PropertyState; +import org.apache.jackrabbit.jcr2spi.state.NoSuchItemStateException; +import org.apache.jackrabbit.jcr2spi.state.ItemState; +import org.apache.jackrabbit.jcr2spi.state.ItemStateException; + +/** + * PropertyReference implements a reference to a property state. + */ +public class PropertyReference extends ChildItemReference implements ChildPropertyEntry { + + /** + * IdFactory to create an ItemId based on the parent NodeId + */ + private final IdFactory idFactory; + + /** + * Creates a new ChildPropertyEntry. + * + * @param parent + * @param name + * @param isf + * @param idFactory + * @return new ChildPropertyEntry + */ + public static ChildPropertyEntry create(NodeState parent, QName name, ItemStateFactory isf, IdFactory idFactory) { + return new PropertyReference(parent, name, isf, idFactory); + } + + /** + * Creates a new ChildPropertyEntry for an property state that + * already exists. + * + * @param propState + * @param isf + * @param idFactory + * @return new ChildPropertyEntry + */ + public static ChildPropertyEntry create(PropertyState propState, ItemStateFactory isf, IdFactory idFactory) { + return new PropertyReference(propState, isf, idFactory); + } + + /** + * Creates a new PropertyReference. + * + * @param parent the parent NodeState where the property + * belongs to. + * @param name the name of the property. + * @param isf the item state factory to create the property state. + * @param idFactory the id factory to create new ids. + */ + private PropertyReference(NodeState parent, QName name, ItemStateFactory isf, IdFactory idFactory) { + super(parent, name, isf); + this.idFactory = idFactory; + } + + /** + * Creates a new PropertyReference for an property state that + * already exists. + * + * @param propState the property state. + * @param isf the item state factory to re-create the property state. + * @param idFactory the id factory to create new ids. + */ + private PropertyReference(PropertyState propState, ItemStateFactory isf, IdFactory idFactory) { + super(propState.getParent(), propState, propState.getQName(), isf); + this.idFactory = idFactory; + } + + /** + * @inheritDoc + * @see ChildItemReference#doResolve() + *

+ * Returns a PropertyState. + */ + protected ItemState doResolve() + throws NoSuchItemStateException, ItemStateException { + return isf.createPropertyState(getId(), getParent()); + } + + //-------------------------------------------------< ChildPropertyEntry >--- + /** + * @inheritDoc + */ + public PropertyId getId() { + return idFactory.createPropertyId(parent.getNodeId(), name); + } + + /** + * @inheritDoc + */ + public QName getName() { + return name; + } + + /** + * @inheritDoc + */ + public PropertyState getPropertyState() throws NoSuchItemStateException, ItemStateException { + return (PropertyState) resolve(); + } + + /** + * @inheritDoc + * @see ChildPropertyEntry#isAvailable() + */ + public boolean isAvailable() { + return isResolved(); + } +} Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PropertyReference.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/PropertyReference.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/UUIDReference.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/UUIDReference.java?view=auto&rev=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/UUIDReference.java (added) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/UUIDReference.java Mon Oct 9 09:46:16 2006 @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.jcr2spi.state.entry; + +import org.apache.jackrabbit.spi.NodeId; +import org.apache.jackrabbit.name.QName; +import org.apache.jackrabbit.jcr2spi.state.NodeState; +import org.apache.jackrabbit.jcr2spi.state.ItemStateFactory; +import org.apache.jackrabbit.jcr2spi.state.ItemState; +import org.apache.jackrabbit.jcr2spi.state.NoSuchItemStateException; +import org.apache.jackrabbit.jcr2spi.state.ItemStateException; + +/** + * UUIDReference implements a {@link ChildNodeEntry} based on a + * NodeId with just a UUID and no relative path component. + */ +class UUIDReference extends ChildNodeReference implements ChildNodeEntry { + + /** + * The NodeId with just a UUID that references the child node. + */ + private final NodeId childId; + + /** + * Creates a new UUIDReference. + * + * @param parent the NodeState that owns this child node + * reference. + * @param childId the id of the referenced NodeState. This id + * must not have a relative path component. + * @param name the name of the child node. + * @param isf the item state factory to create the node state. + * @throws IllegalArgumentException if childId has a relative + * path component. + */ + UUIDReference(NodeState parent, NodeId childId, ItemStateFactory isf, QName name) { + super(parent, name, isf); + if (childId.getPath() != null) { + throw new IllegalArgumentException("childId must not contain a relative path"); + } + this.childId = childId; + } + + /** + * Creates a new UUIDReference with the given parent + * NodeState and an already initialized child node state. + * + * @param child the child node state. + * @param isf the item state factory to re-create the node state. + * @throws IllegalArgumentException if the id of child has a + * relative path component. + */ + UUIDReference(NodeState child, ItemStateFactory isf) { + super(child, isf); + this.childId = child.getNodeId(); + if (childId.getPath() == null) { + throw new IllegalArgumentException("id of child must not contain a relative path"); + } + } + + /** + * @inheritDoc + * @see ChildItemReference#doResolve() + *

+ * Returns a NodeState. + */ + protected ItemState doResolve() + throws NoSuchItemStateException, ItemStateException { + return isf.createNodeState(childId, getParent()); + } + + /** + * @inheritDoc + * @see ChildNodeEntry#getId() + */ + public NodeId getId() { + return childId; + } + + /** + * This implementation always returns a non-null value. + * @inheritDoc + * @see ChildNodeEntry#getUUID() + */ + public String getUUID() { + return childId.getUUID(); + } +} Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/UUIDReference.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/entry/UUIDReference.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java Mon Oct 9 09:46:16 2006 @@ -25,7 +25,7 @@ import org.apache.jackrabbit.jcr2spi.LazyItemIterator; import org.apache.jackrabbit.jcr2spi.state.NodeState; import org.apache.jackrabbit.jcr2spi.state.ItemStateException; -import org.apache.jackrabbit.jcr2spi.state.ChildNodeEntry; +import org.apache.jackrabbit.jcr2spi.state.entry.ChildNodeEntry; import org.apache.jackrabbit.jcr2spi.state.PropertyState; import org.apache.jackrabbit.name.QName; import org.apache.jackrabbit.name.NameException; Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java Mon Oct 9 09:46:16 2006 @@ -19,8 +19,8 @@ import org.apache.jackrabbit.jcr2spi.state.NodeState; import org.apache.jackrabbit.jcr2spi.state.PropertyState; import org.apache.jackrabbit.jcr2spi.state.ItemStateException; -import org.apache.jackrabbit.jcr2spi.state.ItemState; import org.apache.jackrabbit.jcr2spi.state.ChangeLog; +import org.apache.jackrabbit.jcr2spi.state.Status; import org.apache.jackrabbit.jcr2spi.observation.InternalEventListener; import org.apache.jackrabbit.jcr2spi.operation.Operation; import org.apache.jackrabbit.jcr2spi.operation.Checkout; @@ -82,7 +82,7 @@ */ public boolean isCheckedOut(NodeState nodeState) throws RepositoryException { // shortcut: if state is new, its ancestor must be checkout - if (nodeState.getStatus() == ItemState.STATUS_NEW) { + if (nodeState.getStatus() == Status.NEW) { return true; } @@ -195,12 +195,6 @@ * an overlayed state. */ private NodeState getWorkspaceState(NodeState nodeState) { - if (nodeState.hasOverlayedState()) { - // nodestate has been obtained from Session-ISM - return (NodeState) nodeState.getOverlayedState(); - } else { - // nodestate has been obtained from Workspace-ISM already - return nodeState; - } + return (NodeState) nodeState.getWorkspaceState(); } } Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/SessionImporter.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/SessionImporter.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/SessionImporter.java (original) +++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/SessionImporter.java Mon Oct 9 09:46:16 2006 @@ -20,10 +20,11 @@ import org.apache.jackrabbit.jcr2spi.state.PropertyState; import org.apache.jackrabbit.jcr2spi.state.ItemState; import org.apache.jackrabbit.jcr2spi.state.SessionItemStateManager; -import org.apache.jackrabbit.jcr2spi.state.ChildNodeEntry; +import org.apache.jackrabbit.jcr2spi.state.entry.ChildNodeEntry; import org.apache.jackrabbit.jcr2spi.state.ItemStateException; import org.apache.jackrabbit.jcr2spi.state.NoSuchItemStateException; import org.apache.jackrabbit.jcr2spi.state.ItemStateValidator; +import org.apache.jackrabbit.jcr2spi.state.Status; import org.apache.jackrabbit.jcr2spi.SessionImpl; import org.apache.jackrabbit.jcr2spi.SessionListener; import org.apache.jackrabbit.jcr2spi.util.ReferenceChangeTracker; @@ -403,7 +404,7 @@ */ try { PropertyState conflicting = parent.getPropertyState(nodeInfo.getName()); - if (conflicting.getStatus() == ItemState.STATUS_NEW) { + if (conflicting.getStatus() == Status.NEW) { // assume this property has been imported as well; // rename conflicting property // TODO: use better reversible escaping scheme to create unique name Modified: jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/IdFactory.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/IdFactory.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/IdFactory.java (original) +++ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/IdFactory.java Mon Oct 9 09:46:16 2006 @@ -26,9 +26,9 @@ public PropertyId createPropertyId(NodeId parentId, QName propertyName); - public NodeId createNodeId(NodeId parentId, Path relativePath); + public NodeId createNodeId(NodeId parentId, Path path); - public NodeId createNodeId(String uuid, Path relativePath); + public NodeId createNodeId(String uuid, Path path); public NodeId createNodeId(String uuid); } Modified: jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/ItemId.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/ItemId.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/ItemId.java (original) +++ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/ItemId.java Mon Oct 9 09:46:16 2006 @@ -20,26 +20,23 @@ /** * An ItemId identifies an item using a combination of UUID and - * relative path. There are three basic forms of an ItemId. The following + * path. There are three basic forms of an ItemId. The following * table shows each of the allowed combinations where an X in * the column indicates that a value is set and a - indicates * that the value is null: * * - * + * * - * + * * - * + * *
UUIDrelative PathUsage
X-
X-The item can be identified with a UUID. In most cases such an item * is also mix:referenceable but there is no restriction in that respect. An * SPI implementation may also use a UUID to identify non-referenceable nodes. * Whether a node is referenceable is purely governed by its node type or * the assigned mixin types.
-X
-XThe item can not be identified with a UUID and none of its ancestors - * can be identified with a UUID. The item is identified by a relative path - * starting from the root node of the workspace as if calling - * {@link javax.jcr.Session#getRootNode() Session.getRootNode()}{@link - * javax.jcr.Node#getNode(String) .getNode(relPath)}. + * can be identified with a UUID. The item is identified by an absolute path. *
XX
XXThe item can not be identified with a UUID but one of its ancestors * can. {@link #getUUID} returns the UUID of the nearest ancestor, which * can be identified with a UUID. The relative path provides a navigation @@ -64,8 +61,8 @@ public String getUUID(); /** - * @return the relative path part of this item id. Returns null + * @return the path part of this item id. Returns null * if this item can be identified solely with a UUID. */ - public Path getRelativePath(); + public Path getPath(); } Modified: jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java (original) +++ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java Mon Oct 9 09:46:16 2006 @@ -61,15 +61,12 @@ */ public Properties getRepositoryDescriptors() throws RepositoryException; - //------------------------------------------------------< Initial login >--- - + //-----------------------------------< SessionInfo creation and release >--- /** - * Authenticates the user using the supplied credentials. If - * credentials is null an implementation will use - * the current security context to obtain the {@link - * javax.security.auth.Subject}. If credentials is - * null and there is no Subject present in the - * current security context a RepositoryException is thrown. + * Returns a SessionInfo that will be used by other methods + * on the RepositoryService. + * An implementation may choose to authenticate the user using the supplied + * credentials. * * @param credentials the credentials of the user. * @return a SessionInfo if authentication was successful. @@ -78,9 +75,17 @@ * is not recognized. * @throws RepositoryException if an error occurs. */ - public SessionInfo login(Credentials credentials, String workspaceName) + public SessionInfo obtain(Credentials credentials, String workspaceName) throws LoginException, NoSuchWorkspaceException, RepositoryException; + /** + * Indicates to the RepositoryService, that the given SessionInfo + * will not be used any more. + * + * @param sessionInfo + */ + public void dispose(SessionInfo sessionInfo) throws RepositoryException; + //-------------------------------------------------------------------------- /** * @param sessionInfo @@ -110,10 +115,10 @@ /** * The NodeId of the root node may basically have two * characteristics. If the root node can be identified with a UUID the - * returned NodeId simply has a UUID part and the relative path + * returned NodeId simply has a UUID part and the path * part is null. If the root node cannot be identified with a - * UUID the UUID part is null and the relative path will be set - * to '.' (current element). + * UUID the UUID part is null and the path part will be set + * to "/". * * @param sessionInfo * @return Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdFactoryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdFactoryImpl.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdFactoryImpl.java (original) +++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdFactoryImpl.java Mon Oct 9 09:46:16 2006 @@ -49,16 +49,16 @@ } } - public NodeId createNodeId(NodeId parentId, Path relativePath) { + public NodeId createNodeId(NodeId parentId, Path path) { try { - return new NodeIdImpl(parentId, relativePath); + return new NodeIdImpl(parentId, path); } catch (MalformedPathException e) { throw new IllegalArgumentException(e.getMessage()); } } - public NodeId createNodeId(String uuid, Path relativePath) { - return new NodeIdImpl(uuid, relativePath); + public NodeId createNodeId(String uuid, Path path) { + return new NodeIdImpl(uuid, path); } public NodeId createNodeId(String uuid) { @@ -69,16 +69,16 @@ private abstract class ItemIdImpl implements ItemId { private final String uuid; - private final Path relativePath; + private final Path path; private int hashCode = 0; - private ItemIdImpl(String uuid, Path relativePath) { - if (uuid == null && relativePath == null) { + private ItemIdImpl(String uuid, Path path) { + if (uuid == null && path == null) { throw new IllegalArgumentException("Only uuid or relative path might be null."); } this.uuid = uuid; - this.relativePath = relativePath; + this.path = path; } private ItemIdImpl(NodeId parentId, QName name) throws MalformedPathException { @@ -86,11 +86,11 @@ throw new IllegalArgumentException("Invalid ItemIdImpl: parentId and name must not be null."); } this.uuid = parentId.getUUID(); - Path parent = parentId.getRelativePath(); - if (parent != null) { - this.relativePath = Path.create(parent, name, true); + Path parentPath = parentId.getPath(); + if (parentPath != null) { + this.path = Path.create(parentPath, name, true); } else { - this.relativePath = Path.create(name, Path.INDEX_UNDEFINED); + this.path = Path.create(name, Path.INDEX_UNDEFINED); } } @@ -100,8 +100,8 @@ return uuid; } - public Path getRelativePath() { - return relativePath; + public Path getPath() { + return path; } /** @@ -123,11 +123,11 @@ boolean equals(ItemId other) { return (uuid == null) ? other.getUUID() == null : uuid.equals(other.getUUID()) - && (relativePath == null) ? other.getRelativePath() == null : relativePath.equals(other.getRelativePath()); + && (path == null) ? other.getPath() == null : path.equals(other.getPath()); } /** - * Returns the hash code of the uuid and the relativePath. The computed hash code + * Returns the hash code of the uuid and the path. The computed hash code * is memorized for better performance. * * @return hash code @@ -151,8 +151,8 @@ if (uuid != null) { b.append(uuid); } - if (relativePath != null) { - b.append(relativePath.toString()); + if (path != null) { + b.append(path.toString()); } return b.toString(); } @@ -164,12 +164,12 @@ super(uuid, null); } - public NodeIdImpl(String uuid, Path relativePath) { - super(uuid, relativePath); + public NodeIdImpl(String uuid, Path path) { + super(uuid, path); } - public NodeIdImpl(NodeId parentId, Path relativePath) throws MalformedPathException { - super(parentId.getUUID(), (parentId.getRelativePath() != null) ? Path.create(parentId.getRelativePath(), relativePath, true) : relativePath); + public NodeIdImpl(NodeId parentId, Path path) throws MalformedPathException { + super(parentId.getUUID(), (parentId.getPath() != null) ? Path.create(parentId.getPath(), path, true) : path); } public boolean denotesNode() { @@ -205,7 +205,7 @@ } public QName getQName() { - return getRelativePath().getNameElement().getName(); + return getPath().getNameElement().getName(); } public boolean equals(Object obj) { Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/NodeInfoImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/NodeInfoImpl.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/NodeInfoImpl.java (original) +++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/NodeInfoImpl.java Mon Oct 9 09:46:16 2006 @@ -64,7 +64,7 @@ this.id = id; // retrieve name - if (id.getRelativePath() == null) { + if (id.getPath() == null) { DavProperty nameProp = propSet.get(ItemResourceConstants.JCR_NAME); if (nameProp != null && nameProp.getValue() != null) { // not root node @@ -81,8 +81,8 @@ qName = QName.ROOT; } } else { - Path.PathElement el = id.getRelativePath().getNameElement(); - qName = (Path.CURRENT_ELEMENT == el) ? QName.ROOT : el.getName(); + Path.PathElement el = id.getPath().getNameElement(); + qName = (Path.ROOT_ELEMENT == el) ? QName.ROOT : el.getName(); } Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original) +++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Mon Oct 9 09:46:16 2006 @@ -373,10 +373,10 @@ /** * TODO: handle impersonation - * @see RepositoryService#login(Credentials, String) + * + * @see RepositoryService#obtain(Credentials, String) */ - public SessionInfo login(Credentials credentials, String workspaceName) - throws LoginException, NoSuchWorkspaceException, RepositoryException { + public SessionInfo obtain(Credentials credentials, String workspaceName) throws LoginException, NoSuchWorkspaceException, RepositoryException { // check if the workspace with the given name is accessible PropFindMethod method = null; try { @@ -413,6 +413,12 @@ } } + public void dispose(SessionInfo sessionInfo) throws RepositoryException { + checkSessionInfo(sessionInfo); + SubscriptionManager sMgr = ((SessionInfoImpl)sessionInfo).getSubscriptionManager(); + sMgr.dispose(); + } + /** * @see RepositoryService#getWorkspaceNames(SessionInfo) */ @@ -844,6 +850,8 @@ try { String uri = getItemUri(nodeId, sessionInfo); method = new PropFindMethod(uri, nameSet, DEPTH_0); + initMethod(method, sessionInfo, true); + getClient(sessionInfo).executeMethod(method); method.checkSuccess(); @@ -877,7 +885,8 @@ public EventIterator lock(SessionInfo sessionInfo, NodeId nodeId, boolean deep) throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, InvalidItemStateException, RepositoryException { try { String uri = getItemUri(nodeId, sessionInfo); - LockMethod method = new LockMethod(uri, Scope.EXCLUSIVE, Type.WRITE, null, DavConstants.INFINITE_TIMEOUT, true); + LockMethod method = new LockMethod(uri, Scope.EXCLUSIVE, Type.WRITE, + sessionInfo.getUserID(), DavConstants.INFINITE_TIMEOUT, deep); EventIterator events = execute(method, sessionInfo); String lockToken = method.getLockToken(); @@ -1868,6 +1877,16 @@ subscriptions.remove(listener); currentSubscriptions = null; if (subscriptions.isEmpty()) { + stopPolling(); + } + } + } + + public void dispose() { + synchronized (subscriptionsLock) { + if (!subscriptions.isEmpty()) { + subscriptions.clear(); + currentSubscriptions = null; stopPolling(); } } Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/SubscriptionManager.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/SubscriptionManager.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/SubscriptionManager.java (original) +++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/SubscriptionManager.java Mon Oct 9 09:46:16 2006 @@ -26,11 +26,13 @@ public void setSessionInfo(SessionInfo sessionInfo); - public boolean subscriptionExists(EventListener listener); + public boolean subscriptionExists(EventListener listener); - public String getSubscriptionId(EventListener listener); + public String getSubscriptionId(EventListener listener); - public void addSubscription(String uri, String subscriptionId, EventListener listener); + public void addSubscription(String uri, String subscriptionId, EventListener listener); - public void removeSubscription(EventListener listener); + public void removeSubscription(EventListener listener); + + public void dispose(); } Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java?view=diff&rev=454423&r1=454422&r2=454423 ============================================================================== --- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java (original) +++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java Mon Oct 9 09:46:16 2006 @@ -115,13 +115,13 @@ } else { StringBuffer uriBuffer = new StringBuffer(); - Path relativePath = itemId.getRelativePath(); + Path path = itemId.getPath(); String uuid = itemId.getUUID(); // resolver uuid part if (uuid != null) { - ItemId uuidId = (relativePath == null) ? itemId : service.getIdFactory().createNodeId(uuid); - if (relativePath != null & cache.containsItemId(uuidId)) { + ItemId uuidId = (path == null) ? itemId : service.getIdFactory().createNodeId(uuid); + if (path != null & cache.containsItemId(uuidId)) { // append uri of parent node, that is already cached uriBuffer.append(cache.getUri(uuidId)); } else { @@ -159,13 +159,10 @@ uriBuffer.append(getRootItemUri(workspaceName)); } // resolve relative-path part unless it denotes the root-item - if (relativePath != null && !relativePath.denotesRoot()) { + if (path != null && !path.denotesRoot()) { try { - String jcrPath = PathFormat.format(relativePath, nsResolver); - // TODO: TOBEFIXED rootId is currently build from absolute path and not - // from '.' as description in RS.getRootId defines. similarly - // the PathResolver does not accept a non-normalized root-path. - if (relativePath.isAbsolute()) { + String jcrPath = PathFormat.format(path, nsResolver); + if (path.isAbsolute()) { jcrPath = jcrPath.substring(1); } uriBuffer.append(Text.escapePath(jcrPath));