You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2006/10/05 09:10:18 UTC
svn commit: r453120 - in
/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi:
operation/ state/
Author: angela
Date: Thu Oct 5 00:10:16 2006
New Revision: 453120
URL: http://svn.apache.org/viewvc?view=rev&rev=453120
Log:
work in progress
- remove 'add' and 'set' methods on NodeState/PropertyState, that were
used for initialization and did not mark the state modified. this
was confusing, since similar methods called 'markmodified'.
replaced by an 'init' method.
- SessionISM: fix options for addMixin (should not check for protected)
- move validation of PropertyState from ItemStateValidator to state.
- add TODO: TransientISM must clean up operations upon status changes.
Modified:
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/SetMixin.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChangeLog.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateValidator.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientItemStateManager.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/operation/SetMixin.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/SetMixin.java?view=diff&rev=453120&r1=453119&r2=453120
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/SetMixin.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/SetMixin.java Thu Oct 5 00:10:16 2006
@@ -38,10 +38,12 @@
this.nodeState = nodeState;
this.mixinNames = mixinNames;
- // set affected states
+ // remember node state as affected state
addAffectedItemState(nodeState);
- // TODO: correct?
+ // add the jcr:mixinTypes property state as affected if it already exists
+ // and therefore gets modified by this operation.
if (nodeState.hasPropertyName(QName.JCR_MIXINTYPES)) {
+
try {
addAffectedItemState(nodeState.getPropertyState(QName.JCR_MIXINTYPES));
} catch (ItemStateException e) {
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChangeLog.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChangeLog.java?view=diff&rev=453120&r1=453119&r2=453120
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChangeLog.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChangeLog.java Thu Oct 5 00:10:16 2006
@@ -18,7 +18,6 @@
import org.apache.jackrabbit.jcr2spi.operation.Operation;
import org.apache.jackrabbit.spi.EventIterator;
-import org.apache.commons.collections.iterators.IteratorChain;
import java.util.Iterator;
import java.util.Set;
@@ -108,10 +107,10 @@
* @param state state that has been deleted
*/
public void deleted(ItemState state) {
- if (addedStates.remove(state)) {
+ if (!addedStates.remove(state)) {
modifiedStates.remove(state);
deletedStates.add(state);
- }
+ }
}
/**
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateValidator.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateValidator.java?view=diff&rev=453120&r1=453119&r2=453120
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateValidator.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateValidator.java Thu Oct 5 00:10:16 2006
@@ -18,7 +18,6 @@
import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeConflictException;
import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeRegistry;
-import org.apache.jackrabbit.jcr2spi.nodetype.ValueConstraint;
import org.apache.jackrabbit.jcr2spi.nodetype.EffectiveNodeType;
import org.apache.jackrabbit.jcr2spi.ManagerProvider;
import org.apache.jackrabbit.jcr2spi.util.LogUtil;
@@ -26,7 +25,6 @@
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
-import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import javax.jcr.ItemNotFoundException;
import javax.jcr.AccessDeniedException;
@@ -41,7 +39,6 @@
import org.apache.jackrabbit.name.QName;
import org.apache.jackrabbit.name.Path;
import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.value.QValue;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
@@ -176,42 +173,6 @@
throw new ConstraintViolationException(msg);
}
}
- }
-
- /**
- * Checks whether the given property parameters are consistent and satisfy
- * the constraints specified by the given definition. The following
- * validations/checks are performed:
- * <ul>
- * <li>make sure the type is not undefined and matches the type of all
- * values given</li>
- * <li>make sure all values have the same type.</li>
- * <li>check if the type of the property values does comply with the
- * requiredType specified in the property's definition</li>
- * <li>check if the property values satisfy the value constraints
- * specified in the property's definition</li>
- * </ul>
- *
- * @param propertyType
- * @param values
- * @param definition
- * @throws ConstraintViolationException If any of the validations fails.
- * @throws RepositoryException If another error occurs.
- */
- public void validate(int propertyType, QValue[] values, QPropertyDefinition definition)
- throws ConstraintViolationException, RepositoryException {
- if (propertyType == PropertyType.UNDEFINED) {
- throw new RepositoryException("'Undefined' is not a valid property type for existing values.");
- }
- if (definition.getRequiredType() != PropertyType.UNDEFINED && definition.getRequiredType() != propertyType) {
- throw new ConstraintViolationException("RequiredType constraint is not satisfied");
- }
- for (int i = 0; i < values.length; i++) {
- if (propertyType != values[i].getType()) {
- throw new ConstraintViolationException("Inconsistent value types: Required type = " + PropertyType.nameFromValue(propertyType) + "; Found value with type = " + PropertyType.nameFromValue(values[i].getType()));
- }
- }
- ValueConstraint.checkValueConstraints(definition, values);
}
//-------------------------------------------------< misc. helper methods >
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java?view=diff&rev=453120&r1=453119&r2=453120
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java Thu Oct 5 00:10:16 2006
@@ -165,6 +165,29 @@
pull();
}
+ void init(QName[] mixinTypeNames, Collection childEntries, Collection propertyNames, NodeReferences references) {
+ if (mixinTypeNames != null) {
+ this.mixinTypeNames = mixinTypeNames;
+ }
+ // re-create property references
+ propertiesInAttic.clear();
+ properties.clear(); // TODO: any more cleanup work to do? try some kind of merging?
+ Iterator it = propertyNames.iterator();
+ while (it.hasNext()) {
+ QName propName = (QName) it.next();
+ properties.put(propName, new PropertyReference(this, propName, isf, idFactory));
+ }
+ // re-create child node entries
+ childNodeEntries.removeAll(); // TODO: any mre cleanup work to do? try some kind of merging?
+ it = childEntries.iterator();
+ while (it.hasNext()) {
+ ChildNodeEntry cne = (ChildNodeEntry) it.next();
+ childNodeEntries.add(cne.getName(), cne.getUUID());
+ }
+ // set the node references
+ this.references = references;
+ }
+
/**
* {@inheritDoc}
*/
@@ -175,22 +198,9 @@
uuid = nodeState.uuid;
//parent = nodeState.parent; // TODO: parent from wrong ism layer
nodeTypeName = nodeState.nodeTypeName;
- mixinTypeNames = nodeState.mixinTypeNames;
definition = nodeState.definition;
- // re-create property references
- propertiesInAttic.clear();
- properties.clear(); // TODO: any more cleanup work to do? try some kind of merging?
- Iterator it = nodeState.getPropertyNames().iterator();
- while (it.hasNext()) {
- addPropertyName((QName) it.next());
- }
- // re-create child node entries
- childNodeEntries.removeAll(); // TODO: any mre cleanup work to do? try some kind of merging?
- it = nodeState.getChildNodeEntries().iterator();
- while (it.hasNext()) {
- ChildNodeEntry cne = (ChildNodeEntry) it.next();
- childNodeEntries.add(cne.getName(), cne.getUUID());
- }
+
+ init(nodeState.getMixinTypeNames(), nodeState.getChildNodeEntries(), nodeState.getPropertyNames(), nodeState.getNodeReferences());
}
}
@@ -286,6 +296,7 @@
} else {
this.mixinTypeNames = new QName[0];
}
+ markModified();
}
/**
@@ -371,7 +382,6 @@
* @return the <code>ChildNodeEntry</code> with the specified
* <code>NodeState</code> or <code>null</code> if there's no
* matching entry.
- * @see #addChildNodeEntry
*/
public synchronized ChildNodeEntry getChildNodeEntry(NodeState nodeState) {
return childNodeEntries.get(nodeState);
@@ -382,7 +392,6 @@
* denoting the child nodes of this node.
*
* @return collection of <code>ChildNodeEntry</code> objects
- * @see #addChildNodeEntry
*/
public synchronized Collection getChildNodeEntries() {
// NOTE: 'childNodeEntries' are already unmodifiable
@@ -395,7 +404,6 @@
*
* @param nodeName name of the child node entries that should be returned
* @return list of <code>ChildNodeEntry</code> objects
- * @see #addChildNodeEntry
*/
public synchronized List getChildNodeEntries(QName nodeName) {
// NOTE: SubList retrieved from 'ChildNodeEntries' is already unmodifiable
@@ -403,21 +411,6 @@
}
/**
- * Adds a new <code>ChildNodeEntry</code>.
- *
- * @param nodeName <code>QName</code> object specifying the name of the new
- * entry.
- * @param uuid the uuid the new entry is refering to or
- * <code>null</code> if the child node state cannot be
- * identified with a uuid.
- * @return the newly added <code>ChildNodeEntry</code>
- */
- synchronized ChildNodeEntry addChildNodeEntry(QName nodeName,
- String uuid) {
- return childNodeEntries.add(nodeName, uuid);
- }
-
- /**
* TODO: move this method to a node state implementation which contains all transient related methods?
*
* Adds a child node state to this node state.
@@ -734,15 +727,6 @@
props = properties.values();
}
return Collections.unmodifiableCollection(props);
- }
-
- /**
- * Adds a property name entry. This method will not create a property!
- *
- * @param propName <code>QName</code> object specifying the property name
- */
- synchronized void addPropertyName(QName propName) {
- properties.put(propName, new PropertyReference(this, propName, isf, idFactory));
}
/**
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java?view=diff&rev=453120&r1=453119&r2=453120
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java Thu Oct 5 00:10:16 2006
@@ -18,6 +18,8 @@
import javax.jcr.PropertyType;
import javax.jcr.ValueFormatException;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.ConstraintViolationException;
import org.apache.jackrabbit.spi.QPropertyDefinition;
import org.apache.jackrabbit.name.QName;
@@ -25,6 +27,7 @@
import org.apache.jackrabbit.spi.ItemId;
import org.apache.jackrabbit.spi.IdFactory;
import org.apache.jackrabbit.value.QValue;
+import org.apache.jackrabbit.jcr2spi.nodetype.ValueConstraint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -92,6 +95,16 @@
}
/**
+ *
+ * @param type
+ * @param values
+ */
+ void init(int type, QValue[] values) {
+ this.type = type;
+ this.values = (values == null) ? QValue.EMPTY_ARRAY : values;
+ }
+
+ /**
* @inheritDoc
*/
public void remove() {
@@ -232,17 +245,6 @@
}
/**
- * Sets the type of the property value(s)
- *
- * @param type the type to be set
- * @see PropertyType
- */
- void setType(int type) {
- this.type = type;
- }
-
-
- /**
* Returns true if this property is multi-valued, otherwise false.
*
* @return true if this property is multi-valued, otherwise false.
@@ -276,21 +278,13 @@
*
* @param values the new values
*/
- void setValues(QValue[] values) {
- internalSetValues(values);
- markModified();
- }
-
- /**
- * TODO: rather separate PropertyState into interface and implementation
- * TODO: and move internalSetValues to implementation only.
- * Sets the value(s) of this property without marking this property state
- * as modified.
- *
- * @param values the new values
- */
- void internalSetValues(QValue[] values) {
+ void setValues(QValue[] values, int type) throws RepositoryException {
+ // make sure the arguements are consistent and do not violate the
+ // given property definition.
+ validate(values, type, this.def);
this.values = values;
+ this.type = type;
+ markModified();
}
/**
@@ -308,5 +302,41 @@
} else {
return values[0];
}
+ }
+
+ /**
+ * Checks whether the given property parameters are consistent and satisfy
+ * the constraints specified by the given definition. The following
+ * validations/checks are performed:
+ * <ul>
+ * <li>make sure the type is not undefined and matches the type of all
+ * values given</li>
+ * <li>make sure all values have the same type.</li>
+ * <li>check if the type of the property values does comply with the
+ * requiredType specified in the property's definition</li>
+ * <li>check if the property values satisfy the value constraints
+ * specified in the property's definition</li>
+ * </ul>
+ *
+ * @param values
+ * @param propertyType
+ * @param definition
+ * @throws ConstraintViolationException If any of the validations fails.
+ * @throws RepositoryException If another error occurs.
+ */
+ private static void validate(QValue[] values, int propertyType, QPropertyDefinition definition)
+ throws ConstraintViolationException, RepositoryException {
+ if (propertyType == PropertyType.UNDEFINED) {
+ throw new RepositoryException("'Undefined' is not a valid property type for existing values.");
+ }
+ if (definition.getRequiredType() != PropertyType.UNDEFINED && definition.getRequiredType() != propertyType) {
+ throw new ConstraintViolationException("RequiredType constraint is not satisfied");
+ }
+ for (int i = 0; i < values.length; i++) {
+ if (propertyType != values[i].getType()) {
+ throw new ConstraintViolationException("Inconsistent value types: Required type = " + PropertyType.nameFromValue(propertyType) + "; Found value with type = " + PropertyType.nameFromValue(values[i].getType()));
+ }
+ }
+ ValueConstraint.checkValueConstraints(definition, values);
}
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java?view=diff&rev=453120&r1=453119&r2=453120
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java Thu Oct 5 00:10:16 2006
@@ -319,7 +319,10 @@
}
}
if (modified) {
- setPropertyStateValue(propState, newVals, PropertyType.REFERENCE);
+ // TODO improve
+ int options = ItemStateValidator.CHECK_LOCK //| ItemStateValidator.CHECK_COLLISION
+ | ItemStateValidator.CHECK_VERSIONING | ItemStateValidator.CHECK_CONSTRAINTS;
+ setPropertyStateValue(propState, newVals, PropertyType.REFERENCE, options);
}
}
// make sure all entries are removed
@@ -527,7 +530,8 @@
// mixin-names to be execute on the nodestate (and corresponding property state)
if (mixinNames != null && mixinNames.length > 0) {
// find out if any of the existing mixins is removed
- List originalMixins = Arrays.asList(nState.getMixinTypeNames());
+ List originalMixins = new ArrayList();
+ originalMixins.addAll(Arrays.asList(nState.getMixinTypeNames()));
originalMixins.removeAll(Arrays.asList(mixinNames));
anyRemoved = originalMixins.size() > 0;
@@ -539,7 +543,8 @@
// execute value of existing property
try {
PropertyState pState = nState.getPropertyState(QName.JCR_MIXINTYPES);
- setPropertyStateValue(pState, QValue.create(mixinNames), PropertyType.NAME);
+ int options = ItemStateValidator.CHECK_LOCK | ItemStateValidator.CHECK_VERSIONING;
+ setPropertyStateValue(pState, QValue.create(mixinNames), PropertyType.NAME, options);
} catch (ItemStateException e) {
// should not occur, since existance has been asserted before
throw new RepositoryException(e);
@@ -625,7 +630,10 @@
*/
public void visit(SetPropertyValue operation) throws ValueFormatException, LockException, ConstraintViolationException, AccessDeniedException, ItemExistsException, UnsupportedRepositoryOperationException, VersionException, RepositoryException {
PropertyState pState = operation.getPropertyState();
- setPropertyStateValue(pState, operation.getValues(), operation.getPropertyType());
+ // TODO improve
+ int options = ItemStateValidator.CHECK_LOCK //| ItemStateValidator.CHECK_COLLISION
+ | ItemStateValidator.CHECK_VERSIONING | ItemStateValidator.CHECK_CONSTRAINTS;
+ setPropertyStateValue(pState, operation.getValues(), operation.getPropertyType(), options);
transientStateMgr.addOperation(operation);
}
@@ -662,7 +670,8 @@
}
public void visit(Update operation) throws NoSuchWorkspaceException, AccessDeniedException, LockException, InvalidItemStateException, RepositoryException {
- throw new UnsupportedOperationException("Internal error: Update cannot be handled by session ItemStateManager.");
+ // TODO: TOBEFIXED. not correct.
+ workspaceItemStateMgr.execute(operation);
}
public void visit(Restore operation) throws VersionException, PathNotFoundException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
@@ -724,16 +733,11 @@
validator.checkAddProperty(parent, propertyName, pDef, options);
- // make sure the arguements are consistent and do not violate the
- // given property definition.
- validator.validate(propertyType, values, pDef);
-
// create property state
PropertyState propState = transientStateMgr.createNewPropertyState(propertyName, parent, pDef);
// NOTE: callers must make sure, the property type is not 'undefined'
- propState.setType(propertyType);
- propState.setValues(values);
+ propState.setValues(values, propertyType);
}
private void addNodeState(NodeState parent, QName nodeName, QName nodeTypeName, String uuid, QNodeDefinition definition, int options) throws RepositoryException, ConstraintViolationException, AccessDeniedException, UnsupportedRepositoryOperationException, NoSuchNodeTypeException, ItemExistsException, VersionException {
@@ -817,16 +821,12 @@
* @throws VersionException
* @throws RepositoryException
*/
- private void setPropertyStateValue(PropertyState propState, QValue[] iva, int valueType) throws ValueFormatException, LockException, ConstraintViolationException, AccessDeniedException, ItemExistsException, UnsupportedRepositoryOperationException, VersionException, RepositoryException {
+ private void setPropertyStateValue(PropertyState propState, QValue[] iva,
+ int valueType, int options)
+ throws ValueFormatException, LockException, ConstraintViolationException, AccessDeniedException, ItemExistsException, UnsupportedRepositoryOperationException, VersionException, RepositoryException {
// assert that the property can be modified.
- // TODO improve
- int options = ItemStateValidator.CHECK_LOCK //| ItemStateValidator.CHECK_COLLISION
- | ItemStateValidator.CHECK_VERSIONING | ItemStateValidator.CHECK_CONSTRAINTS;
validator.checkSetProperty(propState, options);
- // make sure property is valid according to its definition
- validator.validate(valueType, iva, propState.getDefinition());
-
// free old values as necessary
QValue[] oldValues = propState.getValues();
if (oldValues != null) {
@@ -839,9 +839,7 @@
}
}
}
-
- propState.setValues(iva);
- propState.setType(valueType);
+ propState.setValues(iva, valueType);
}
/**
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=453120&r1=453119&r2=453120
==============================================================================
--- 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 Thu Oct 5 00:10:16 2006
@@ -268,6 +268,7 @@
* @see ItemStateLifeCycleListener#statusChanged(ItemState, int)
*/
public void statusChanged(ItemState state, int previousStatus) {
+ // TODO: cleanup operations as well.
// TODO: depending on status of state adapt change log
// e.g. a revert on states will reset the status from
// 'existing modified' to 'existing'.
@@ -316,6 +317,7 @@
if (previousStatus == ItemState.STATUS_NEW) {
// was new and now removed again
changeLog.addedStates.remove(state);
+ // TODO remove the 'add' operation as well
} else if (previousStatus == ItemState.STATUS_EXISTING_REMOVED) {
// was removed and is now saved
changeLog.deletedStates.remove(state);
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=453120&r1=453119&r2=453120
==============================================================================
--- 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 Thu Oct 5 00:10:16 2006
@@ -31,10 +31,12 @@
import org.apache.jackrabbit.jcr2spi.WorkspaceManager;
import org.apache.jackrabbit.jcr2spi.nodetype.EffectiveNodeType;
import org.apache.jackrabbit.jcr2spi.nodetype.NodeTypeConflictException;
+import org.apache.jackrabbit.name.QName;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.PropertyType;
+import javax.jcr.ItemNotFoundException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
import java.io.InputStream;
@@ -91,7 +93,7 @@
NodeState parent = (parentId != null) ? (NodeState) ism.getItemState(parentId) : null;
return createNodeState(info, parent);
- } catch (PathNotFoundException e) {
+ } catch (ItemNotFoundException e) {
throw new NoSuchItemStateException(e.getMessage(), e);
} catch (RepositoryException e) {
throw new ItemStateException(e.getMessage(), e);
@@ -146,32 +148,34 @@
NodeState state = new NodeState(info.getQName(), uuid, parent, info.getNodetype(),
definition, ItemState.STATUS_EXISTING, this, service.getIdFactory());
- // set mixin nodetypes
- state.setMixinTypeNames(info.getMixins());
-
- // references to child items
+ // 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) {
childUUID = childInfo.getId().getUUID();
}
- state.addChildNodeEntry(childInfo.getQName(), childUUID);
+ childNodeEntries.add(new CNE(childInfo.getQName(), childUUID));
}
- // references to properties
+ // names of child property entries
+ Set propNames = new HashSet();
for (IdIterator it = info.getPropertyIds(); it.hasNext(); ) {
PropertyId pId = (PropertyId) it.nextId();
- state.addPropertyName(pId.getQName());
+ propNames.add(pId.getQName());
}
// If the uuid is not null, the state could include mix:referenceable.
// Therefore build a NodeReference instance and add it to the state.
+ NodeReferences nodeRefs = null;
if (uuid != null) {
PropertyId[] references = info.getReferences();
- state.setNodeReferences(new NodeReferencesImpl(info.getId(), references));
+ nodeRefs = new NodeReferencesImpl(info.getId(), references);
}
+ state.init(info.getMixins(), childNodeEntries, propNames, nodeRefs);
+
// copied from local-state-mgr TODO... check
// register as listener
// TODO check if needed
@@ -238,7 +242,7 @@
// build the PropertyState
PropertyState state = new PropertyState(info.getQName(), parent,
def, ItemState.STATUS_EXISTING, service.getIdFactory());
- state.setType(info.getType());
+
QValue[] qValues;
if (info.getType() == PropertyType.BINARY) {
InputStream[] ins = info.getValuesAsStream();
@@ -254,7 +258,7 @@
}
}
- state.internalSetValues(qValues);
+ state.init(info.getType(), qValues);
// register as listener
// TODO check if needed
@@ -274,6 +278,43 @@
String msg = "internal error: failed to retrieve property definition.";
log.debug(msg);
throw new ItemStateException(msg, e);
+ }
+ }
+
+
+ //------------------------------------------------------< ChildNodeEntry >---
+ private class CNE implements ChildNodeEntry {
+
+ private final QName name;
+ private final String uuid;
+
+ private CNE(QName name, String uuid) {
+ this.name = name;
+ this.uuid = uuid;
+ }
+
+ public NodeId getId() {
+ throw new UnsupportedOperationException();
+ }
+
+ public QName getName() {
+ return name;
+ }
+
+ public String getUUID() {
+ return uuid;
+ }
+
+ public int getIndex() {
+ throw new UnsupportedOperationException();
+ }
+
+ public NodeState getNodeState() throws NoSuchItemStateException, ItemStateException {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean isAvailable() {
+ throw new UnsupportedOperationException();
}
}