Author: angela
Date: Tue Mar 6 07:53:51 2007
New Revision: 515167
URL: http://svn.apache.org/viewvc?view=rev&rev=515167
Log:
- adding a NodeEntry identified by uniqueID (or changing the uniqueID field) must remove any other NodeEntry, that is identified by the same uniqueID.
- creating ItemState must assert, that the path of the info corresponds to the path of the hierarchyEntry
Modified:
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/EntryFactory.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/UniqueIdResolver.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/EntryFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/EntryFactory.java?view=diff&rev=515167&r1=515166&r2=515167
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/EntryFactory.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/EntryFactory.java Tue Mar 6 07:53:51 2007
@@ -68,6 +68,9 @@
return isf;
}
+ public void notifyEntryCreated(NodeEntry entry) {
+ listener.entryCreated(entry);
+ }
public void notifyIdChange(NodeEntry entry, String previousUniqueID) {
listener.uniqueIdChanged(entry, previousUniqueID);
@@ -75,6 +78,8 @@
//--------------------------------------------------------------------------
public interface NodeEntryListener {
+
+ public void entryCreated(NodeEntry entry);
public void uniqueIdChanged (NodeEntry entry, String previousUniqueID);
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java?view=diff&rev=515167&r1=515166&r2=515167
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java Tue Mar 6 07:53:51 2007
@@ -117,6 +117,8 @@
super(parent, name, factory);
this.uniqueID = uniqueID; // NOTE: don't use setUniqueID (for mod only)
this.childNodeAttic = new ChildNodeAttic();
+
+ factory.notifyEntryCreated(this);
}
/**
@@ -1091,7 +1093,7 @@
ItemState state = internalGetItemState();
if (state == null || state.getStatus() != Status.NEW) {
try {
- NodeId id = (NodeId) getWorkspaceId();
+ NodeId id = getWorkspaceId();
Iterator it = factory.getItemStateFactory().getChildNodeInfos(id);
while (it.hasNext()) {
ChildInfo ci = (ChildInfo) it.next();
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/UniqueIdResolver.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/UniqueIdResolver.java?view=diff&rev=515167&r1=515166&r2=515167
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/UniqueIdResolver.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/UniqueIdResolver.java Tue Mar 6 07:53:51 2007
@@ -123,7 +123,19 @@
//-------------------------------------< EntryFactory.NodeEntryListener >---
/**
- * @param entry
+ * @see EntryFactory.NodeEntryListener#entryCreated(NodeEntry)
+ */
+ public void entryCreated(NodeEntry entry) {
+ String uniqueID = entry.getUniqueID();
+ if (uniqueID != null) {
+ Object previous = lookUp.put(uniqueID, entry);
+ if (previous != null) {
+ ((NodeEntry) previous).remove();
+ }
+ }
+ }
+
+ /**
* @see EntryFactory.NodeEntryListener#uniqueIdChanged(NodeEntry, String)
*/
public void uniqueIdChanged(NodeEntry entry, String previousUniqueID) {
@@ -133,7 +145,11 @@
}
String uniqueID = entry.getUniqueID();
if (uniqueID != null) {
- lookUp.put(uniqueID, entry);
+ Object previous = lookUp.put(uniqueID, entry);
+ if (previous != null && previous != entry) {
+ // some other entry existed before with the same uniqueID
+ ((NodeEntry) previous).remove();
+ }
}
}
}
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=515167&r1=515166&r2=515167
==============================================================================
--- 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 Tue Mar 6 07:53:51 2007
@@ -27,6 +27,7 @@
import org.apache.jackrabbit.spi.RepositoryService;
import org.apache.jackrabbit.spi.QNodeDefinition;
import org.apache.jackrabbit.spi.QPropertyDefinition;
+import org.apache.jackrabbit.spi.ItemInfo;
import org.apache.jackrabbit.jcr2spi.WorkspaceManager;
import org.apache.jackrabbit.jcr2spi.nodetype.EffectiveNodeType;
import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeRegistry;
@@ -252,7 +253,9 @@
* @param entry
* @return the new NodeState
.
*/
- private NodeState createNodeState(NodeInfo info, NodeEntry entry) {
+ private NodeState createNodeState(NodeInfo info, NodeEntry entry) throws NoSuchItemStateException, RepositoryException {
+ assertMatchingPath(info, entry);
+
// make sure the entry has the correct ItemId
// this make not be the case, if the hierachy has not been completely
// resolved yet -> if uniqueID is present, set it on this entry or on
@@ -321,7 +324,9 @@
* @param entry
* @return the new PropertyState
.
*/
- private PropertyState createPropertyState(PropertyInfo info, PropertyEntry entry) {
+ private PropertyState createPropertyState(PropertyInfo info, PropertyEntry entry) throws NoSuchItemStateException, RepositoryException {
+ assertMatchingPath(info, entry);
+
// make sure uuid part of id is correct
String uniqueID = info.getId().getUniqueID();
if (uniqueID != null) {
@@ -359,6 +364,17 @@
notifyCreated(state);
return state;
+ }
+
+ /**
+ * Validation check: Path of the given ItemInfo must match to the Path of
+ * the HierarchyEntry. This is required for Items that are identified by
+ * a uniqueID that may move within the hierarchy upon restore or clone.
+ */
+ private void assertMatchingPath(ItemInfo info, HierarchyEntry entry) throws NoSuchItemStateException, RepositoryException {
+ if (!info.getPath().equals(entry.getPath())) {
+ throw new NoSuchItemStateException("HierarchyEntry does not belong the given ItemInfo.");
+ }
}
private static NodeEntry getAncestor(HierarchyEntry entry, int degree) {