You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2010/08/23 17:25:11 UTC
svn commit: r988151 - in /jackrabbit/trunk:
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/
jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/
jackrabbit-core/src/...
Author: stefan
Date: Mon Aug 23 15:25:11 2010
New Revision: 988151
URL: http://svn.apache.org/viewvc?rev=988151&view=rev
Log:
JCR-2490: jackrabbit wrongly think nodetype is changed on nodetype re-registration
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeTypeInstanceHandler.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/JackrabbitRepositoryStub.properties
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrencyTest3.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentRenameTest.java
jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/WorkspaceManagementTest.java
jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QItemDefinitionImpl.java
jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeDefinitionImpl.java
jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java
jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QPropertyDefinitionImpl.java
jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/NodeTypeDefDiff.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeTypeInstanceHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeTypeInstanceHandler.java?rev=988151&r1=988150&r2=988151&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeTypeInstanceHandler.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeTypeInstanceHandler.java Mon Aug 23 15:25:11 2010
@@ -63,7 +63,6 @@ public class NodeTypeInstanceHandler {
* @param property property state
* @param parent parent node state
* @param def property definition
- * @param userId user identifier associated with the current session
* @throws RepositoryException if the default values could not be created
*/
public void setDefaultValues(
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java?rev=988151&r1=988150&r2=988151&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java Mon Aug 23 15:25:11 2010
@@ -424,7 +424,7 @@ public class NodeTypeRegistry implements
}
String message =
- "The following nodetype change contains non-trivial changes."
+ "The following node type change contains non-trivial changes."
+ "Up until now only trivial changes are supported."
+ " (see javadoc for "
+ NodeTypeDefDiff.class.getName()
Modified: jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/JackrabbitRepositoryStub.properties
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/JackrabbitRepositoryStub.properties?rev=988151&r1=988150&r2=988151&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/JackrabbitRepositoryStub.properties (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/resources/org/apache/jackrabbit/core/JackrabbitRepositoryStub.properties Mon Aug 23 15:25:11 2010
@@ -46,6 +46,7 @@ javax.jcr.tck.holdname=hold
# repository factory class name
javax.jcr.tck.repository.factory=org.apache.jackrabbit.core.RepositoryFactoryImpl
+javax.jcr.tck.repository_stub_impl=org.apache.jackrabbit.core.JackrabbitRepositoryStub
# sample for per test case config overriding
# Test class: AddNodeText
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrencyTest3.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrencyTest3.java?rev=988151&r1=988150&r2=988151&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrencyTest3.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrencyTest3.java Mon Aug 23 15:25:11 2010
@@ -33,9 +33,9 @@ import org.apache.jackrabbit.core.config
public class ConcurrencyTest3 extends TestCase {
- private static final int NUM_ITERATIONS = 1;
+ private static final int NUM_ITERATIONS = 5;
- private static final int NUM_THREADS = 5;
+ private static final int NUM_THREADS = 10;
private File repoDescriptor;
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentRenameTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentRenameTest.java?rev=988151&r1=988150&r2=988151&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentRenameTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentRenameTest.java Mon Aug 23 15:25:11 2010
@@ -27,8 +27,8 @@ import javax.jcr.Session;
*/
public class ConcurrentRenameTest extends AbstractConcurrencyTest {
- private static final int NUM_MOVES = 100;
- private static final int NUM_THREADS = 2;
+ private static final int NUM_MOVES = 1000;
+ private static final int NUM_THREADS = 20;
public void testConcurrentRename() throws Exception {
runTask(new Task() {
Modified: jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/WorkspaceManagementTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/WorkspaceManagementTest.java?rev=988151&r1=988150&r2=988151&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/WorkspaceManagementTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-tests/src/main/java/org/apache/jackrabbit/test/api/WorkspaceManagementTest.java Mon Aug 23 15:25:11 2010
@@ -18,7 +18,6 @@ package org.apache.jackrabbit.test.api;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
-import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.Workspace;
import javax.jcr.NoSuchWorkspaceException;
@@ -37,6 +36,8 @@ public class WorkspaceManagementTest ext
super.checkSupportedOption(Repository.OPTION_WORKSPACE_MANAGEMENT_SUPPORTED);
workspace = superuser.getWorkspace();
+ superuser.getRootNode().addNode("foo" + System.currentTimeMillis());
+ superuser.save();
}
/**
Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QItemDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QItemDefinitionImpl.java?rev=988151&r1=988150&r2=988151&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QItemDefinitionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QItemDefinitionImpl.java Mon Aug 23 15:25:11 2010
@@ -167,10 +167,17 @@ public abstract class QItemDefinitionImp
}
/**
- * See {@link QNodeDefinition#hashCode()} and {@link QPropertyDefinition#hashCode()}.
- *
- * @return the hashcode
+ * {@inheritDoc}
*/
@Override
- public abstract int hashCode();
+ public int hashCode() {
+ int h = 17;
+ h = 37 * h + getDeclaringNodeType().hashCode();
+ h = 37 * h + getName().hashCode();
+ h = 37 * h + getOnParentVersion();
+ h = 37 * h + (isProtected() ? 11 : 43);
+ h = 37 * h + (isMandatory() ? 11 : 43);
+ h = 37 * h + (isAutoCreated() ? 11 : 43);
+ return h;
+ }
}
Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeDefinitionImpl.java?rev=988151&r1=988150&r2=988151&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeDefinitionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeDefinitionImpl.java Mon Aug 23 15:25:11 2010
@@ -69,7 +69,7 @@ public class QNodeDefinitionImpl extends
* Creates a new SPI node definition based on a JCR NodeDefinition.
*
* @param name the name of the child item.
- * @param declaringNodeType the delaring node type
+ * @param declaringNodeType the declaring node type
* @param isAutoCreated if this item is auto created.
* @param isMandatory if this is a mandatory item.
* @param onParentVersion the on parent version behaviour.
@@ -87,6 +87,10 @@ public class QNodeDefinitionImpl extends
onParentVersion, isProtected);
this.defaultPrimaryType = defaultPrimaryType;
this.requiredPrimaryTypes.addAll(Arrays.asList(requiredPrimaryTypes));
+ // sanitize field value
+ if (this.requiredPrimaryTypes.isEmpty()) {
+ this.requiredPrimaryTypes.add(NameConstants.NT_BASE);
+ }
this.allowsSameNameSiblings = allowsSameNameSiblings;
}
@@ -148,7 +152,7 @@ public class QNodeDefinitionImpl extends
//-------------------------------------------------------------< Object >---
/**
* Compares two node definitions for equality. Returns <code>true</code>
- * if the given object is a node defintion and has the same attributes
+ * if the given object is a node definition and has the same attributes
* as this node definition.
*
* @param obj the object to compare this node definition with
@@ -182,28 +186,14 @@ public class QNodeDefinitionImpl extends
@Override
public int hashCode() {
if (hashCode == 0) {
- // build hashCode (format: <declaringNodeType>/<name>/<requiredPrimaryTypes>)
- StringBuffer sb = new StringBuffer();
-
- if (getDeclaringNodeType() != null) {
- sb.append(getDeclaringNodeType().toString());
- sb.append('/');
- }
- if (definesResidual()) {
- sb.append('*');
- } else {
- sb.append(getName().toString());
- }
- sb.append('/');
- // set of required node type names, sorted in ascending order
- TreeSet<Name> set = new TreeSet<Name>();
- Name[] names = getRequiredPrimaryTypes();
- set.addAll(Arrays.asList(names));
- sb.append(set.toString());
-
- hashCode = sb.toString().hashCode();
+ int h = super.hashCode();
+ h = 37 * h + (defaultPrimaryType == null ? 0 : defaultPrimaryType.hashCode());
+ h = 37 * h + requiredPrimaryTypes.hashCode();
+ h = 37 * h + (allowsSameNameSiblings ? 11 : 43);
+ hashCode = h;
}
return hashCode;
+
}
//-----------------------------------------------------------< internal >---
Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java?rev=988151&r1=988150&r2=988151&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java Mon Aug 23 15:25:11 2010
@@ -167,7 +167,7 @@ public class QNodeTypeDefinitionImpl imp
this.primaryItemName = primaryItemName;
this.propertyDefs = getSerializablePropertyDefs(declaredPropDefs);
this.childNodeDefs = getSerializableNodeDefs(declaredNodeDefs);
- // make sure supertypes are sorted
+ // make sure super types are sorted
SortedSet<Name> types = new TreeSet<Name>();
types.addAll(Arrays.asList(supertypes));
this.supertypes = types.toArray(new Name[types.size()]);
@@ -355,7 +355,7 @@ public class QNodeTypeDefinitionImpl imp
QNodeTypeDefinitionImpl other = (QNodeTypeDefinitionImpl) obj;
return (name == null ? other.name == null : name.equals(other.name))
&& (primaryItemName == null ? other.primaryItemName == null : primaryItemName.equals(other.primaryItemName))
- && Arrays.equals(getSupertypes(), other.getSupertypes())
+ && new HashSet(Arrays.asList(getSupertypes())).equals(new HashSet(Arrays.asList(other.getSupertypes())))
&& isMixin == other.isMixin
&& hasOrderableChildNodes == other.hasOrderableChildNodes
&& isAbstract == other.isAbstract
Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QPropertyDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QPropertyDefinitionImpl.java?rev=988151&r1=988150&r2=988151&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QPropertyDefinitionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QPropertyDefinitionImpl.java Mon Aug 23 15:25:11 2010
@@ -229,7 +229,7 @@ public class QPropertyDefinitionImpl ext
//-------------------------------------------------------------< Object >---
/**
* Compares two property definitions for equality. Returns <code>true</code>
- * if the given object is a property defintion and has the same attributes
+ * if the given object is a property definition and has the same attributes
* as this property definition.
*
* @param obj the object to compare this property definition with
@@ -244,51 +244,38 @@ public class QPropertyDefinitionImpl ext
}
if (obj instanceof QPropertyDefinition) {
QPropertyDefinition other = (QPropertyDefinition) obj;
+
return super.equals(obj)
&& requiredType == other.getRequiredType()
&& multiple == other.isMultiple()
&& fullTextSearchable == other.isFullTextSearchable()
&& queryOrderable == other.isQueryOrderable()
- && Arrays.equals(valueConstraints, other.getValueConstraints())
- && Arrays.equals(defaultValues, other.getDefaultValues())
- && Arrays.equals(availableQueryOperators, other.getAvailableQueryOperators());
+ && (valueConstraints == null || other.getValueConstraints() == null) ? (valueConstraints == other.getValueConstraints())
+ : new HashSet(Arrays.asList(valueConstraints)).equals(new HashSet(Arrays.asList(other.getValueConstraints())))
+ && (defaultValues == null || other.getDefaultValues() == null) ? (defaultValues == other.getDefaultValues())
+ : new HashSet(Arrays.asList(defaultValues)).equals(new HashSet(Arrays.asList(other.getDefaultValues())))
+ && new HashSet(Arrays.asList(availableQueryOperators)).equals(new HashSet(Arrays.asList(other.getAvailableQueryOperators())));
}
return false;
}
/**
- * Overwrites {@link QItemDefinitionImpl#hashCode()}.
+ * Overrides {@link QItemDefinitionImpl#hashCode()}.
*
- * @return the hashcode
+ * @return the hash code
*/
@Override
public int hashCode() {
if (hashCode == 0) {
- // build hashCode (format: <declaringNodeType>/<name>/<requiredType>/<multiple>)
- StringBuffer sb = new StringBuffer();
-
- sb.append(getDeclaringNodeType().toString());
- sb.append('/');
- if (definesResidual()) {
- sb.append('*');
- } else {
- sb.append(getName().toString());
- }
- sb.append('/');
- sb.append(requiredType);
- sb.append('/');
- sb.append(multiple ? 1 : 0);
- sb.append('/');
- sb.append(fullTextSearchable ? 1 : 0);
- sb.append('/');
- sb.append(queryOrderable ? 1 : 0);
- sb.append('/');
- Set<String> s = new HashSet<String>();
- String[] names = getAvailableQueryOperators();
- s.addAll(Arrays.asList(names));
- sb.append(s.toString());
-
- hashCode = sb.toString().hashCode();
+ int h = super.hashCode();
+ h = 37 * h + requiredType;
+ h = 37 * h + (multiple ? 11 : 43);
+ h = 37 * h + (queryOrderable ? 11 : 43);
+ h = 37 * h + (fullTextSearchable ? 11 : 43);
+ h = 37 * h + ((valueConstraints != null) ? new HashSet(Arrays.asList(valueConstraints)).hashCode() : 0);
+ h = 37 * h + ((defaultValues != null) ? new HashSet(Arrays.asList(defaultValues)).hashCode() : 0);
+ h = 37 * h + new HashSet(Arrays.asList(availableQueryOperators)).hashCode();
+ hashCode = h;
}
return hashCode;
}
@@ -296,7 +283,7 @@ public class QPropertyDefinitionImpl ext
//-----------------------------------------------------------< internal >---
/**
- * Convers JCR {@link Value}s to {@link QValue}s.
+ * Converts JCR {@link Value}s to {@link QValue}s.
*
* @param values the JCR values.
* @param resolver the name/path resolver of the session that provided the
@@ -310,13 +297,14 @@ public class QPropertyDefinitionImpl ext
NamePathResolver resolver,
QValueFactory factory)
throws RepositoryException {
- QValue[] defaultValues = null;
if (values != null) {
- defaultValues = new QValue[values.length];
+ QValue[] defaultValues = new QValue[values.length];
for (int i = 0; i < values.length; i++) {
defaultValues[i] = ValueFormat.getQValue(values[i], resolver, factory);
}
+ return defaultValues;
+ } else {
+ return null;
}
- return defaultValues;
}
}
Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/NodeTypeDefDiff.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/NodeTypeDefDiff.java?rev=988151&r1=988150&r2=988151&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/NodeTypeDefDiff.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/NodeTypeDefDiff.java Mon Aug 23 15:25:11 2010
@@ -43,8 +43,8 @@ import java.util.Set;
* <b><code>NONE</code></b> inidcates that there is no modification at all.
* <p/>
* A <b><code>TRIVIAL</code></b> modification has no impact on the consistency
- * of existing content and does not affect existing/assigned definition id's.
- * The following modifications are considered <code>TRIVIAL</code>:
+ * of existing content. The following modifications are considered
+ * <code>TRIVIAL</code>:
* <ul>
* <li>changing node type <code>orderableChildNodes</code> flag
* <li>changing node type <code>primaryItemName</code> value
@@ -53,27 +53,22 @@ import java.util.Set;
* <li>changing property/child node <code>onParentVersion</code> value
* <li>changing property/child node <code>mandatory</code> flag to <code>false</code>
* <li>changing property/child node <code>autoCreated</code> flag
+ * <li>changing specific property/child node <code>name</code> to <code>*</code>
* <li>changing child node <code>defaultPrimaryType</code>
* <li>changing child node <code>sameNameSiblings</code> flag to <code>true</code>
- * <li>weaken property <code>valueConstraints</code> (e.g. by removing completely
- * or by adding to existing or by making a single constraint less restrictive)
- * <li>changing property <code>defaultValues</code>
- * </ul>
- * <p/>
- * A <b><code>MINOR</code></b> modification has no impact on the consistency
- * of existing content but <i>does</i> affect existing/assigned definition id's.
- * The following modifications are considered <code>MINOR</code>:
- * <ul>
- * <li>changing specific property/child node <code>name</code> to <code>*</code>
* <li>weaken child node <code>requiredPrimaryTypes</code> (e.g. by removing)
+ * <li>weaken property <code>valueConstraints</code> (e.g. by removing a constraint
+ * or by making a specific constraint less restrictive)
+ * <li>changing property <code>defaultValues</code>
* <li>changing specific property <code>requiredType</code> to <code>undefined</code>
* <li>changing property <code>multiple</code> flag to <code>true</code>
* </ul>
* <p/>
- * A <b><code>MAJOR</code></b> modification <i>affects</i> the consistency of
- * existing content and <i>does</i> change existing/assigned definition id's.
- * All modifications that are neither <b><code>TRIVIAL</code></b> nor
- * <b><code>MINOR</code></b> are considered <b><code>MAJOR</code></b>.
+ * A <b><code>MAJOR</code></b> modification potentially <i>affects</i> the
+ * consistency of existing content.
+ *
+ * All modifications that are not <b><code>TRIVIAL</code></b> are considered
+ * <b><code>MAJOR</code></b>.
*
* @see #getType()
*/
@@ -84,20 +79,13 @@ public class NodeTypeDefDiff {
*/
public static final int NONE = 0;
/**
- * trivial modification: does neither affect consistency of existing content
- * nor does it change existing/assigned definition id's
+ * trivial modification: does not affect consistency of existing content
*/
public static final int TRIVIAL = 1;
/**
- * minor modification: does not affect consistency of existing content but
- * <i>does</i> change existing/assigned definition id's
- */
- public static final int MINOR = 2;
- /**
* major modification: <i>does</i> affect consistency of existing content
- * and <i>does</i> change existing/assigned definition id's
*/
- public static final int MAJOR = 3;
+ public static final int MAJOR = 2;
private final QNodeTypeDefinition oldDef;
private final QNodeTypeDefinition newDef;
@@ -195,13 +183,6 @@ public class NodeTypeDefDiff {
}
/**
- * @return <code>true</code> if minor
- */
- public boolean isMinor() {
- return type == MINOR;
- }
-
- /**
* @return <code>true</code> if major
*/
public boolean isMajor() {
@@ -212,12 +193,10 @@ public class NodeTypeDefDiff {
* Returns the type of modification as expressed by the following constants:
* <ul>
* <li><b><code>NONE</code></b>: no modification at all
- * <li><b><code>TRIVIAL</code></b>: does neither affect consistency of
- * existing content nor does it change existing/assigned definition id's
- * <li><b><code>MINOR</code></b>: does not affect consistency of existing
- * content but <i>does</i> change existing/assigned definition id's
+ * <li><b><code>TRIVIAL</code></b>: does not affect consistency of
+ * existing content
* <li><b><code>MAJOR</code></b>: <i>does</i> affect consistency of existing
- * content and <i>does</i> change existing/assigned definition id's
+ * content
* </ul>
*
* @return the type of modification
@@ -244,18 +223,15 @@ public class NodeTypeDefDiff {
* @return <code>true</code> if supertypes diff
*/
public int supertypesDiff() {
- return !Arrays.equals(oldDef.getSupertypes(), newDef.getSupertypes()) ? MAJOR : NONE;
+ Set<Name> set1 = new HashSet<Name>(Arrays.asList(oldDef.getSupertypes()));
+ Set<Name> set2 = new HashSet<Name>(Arrays.asList(newDef.getSupertypes()));
+ return !set1.equals(set2) ? MAJOR : NONE;
}
/**
* @return diff type
*/
private int buildPropDefDiffs() {
- /**
- * propDefId determinants: declaringNodeType, name, requiredType, multiple
- * todo: try also to match entries with modified id's
- */
-
int maxType = NONE;
Map<QPropertyDefinitionId, QPropertyDefinition> oldDefs = new HashMap<QPropertyDefinitionId, QPropertyDefinition>();
for (QPropertyDefinition def : oldDef.getPropertyDefs()) {
@@ -303,11 +279,6 @@ public class NodeTypeDefDiff {
* @return diff type
*/
private int buildChildNodeDefDiffs() {
- /**
- * nodeDefId determinants: declaringNodeType, name, requiredPrimaryTypes
- * todo: try also to match entries with modified id's
- */
-
int maxType = NONE;
QNodeDefinition[] cnda1 = oldDef.getChildNodeDefs();
Map<QNodeDefinitionId, QNodeDefinition> defs1 = new HashMap<QNodeDefinitionId, QNodeDefinition>();
@@ -395,9 +366,6 @@ public class NodeTypeDefDiff {
case TRIVIAL:
typeString = "TRIVIAL";
break;
- case MINOR:
- typeString = "MINOR";
- break;
case MAJOR:
typeString = "MAJOR";
break;
@@ -449,8 +417,8 @@ public class NodeTypeDefDiff {
} else {
if (!oldDef.definesResidual()
&& newDef.definesResidual()) {
- // just making a child item residual is a MINOR change
- type = MINOR;
+ // just making a child item residual is a TRIVIAL change
+ type = TRIVIAL;
} else {
if (!oldDef.getName().equals(newDef.getName())) {
// changing the name of a child item is a MAJOR change
@@ -525,15 +493,12 @@ public class NodeTypeDefDiff {
super.init();
/**
* only need to do comparison if base class implementation
- * detected a non-MAJOR modification (i.e. TRIVIAL or MINOR);
+ * detected a non-MAJOR (i.e. TRIVIAL) modification;
* no need to check for additions or removals as this is already
* handled in base class implementation.
*/
- if (isModified() && type != NONE && type != MAJOR) {
- /**
- * check if valueConstraints were made more restrictive
- * (constraints are ORed)
- */
+ if (isModified() && type == TRIVIAL) {
+ // check if valueConstraints were made more restrictive
QValueConstraint[] vca1 = getOldDef().getValueConstraints();
Set<String> set1 = new HashSet<String>();
for (QValueConstraint aVca1 : vca1) {
@@ -545,12 +510,20 @@ public class NodeTypeDefDiff {
set2.add(aVca2.getString());
}
- if (set1.isEmpty() && !set2.isEmpty()) {
- // added constraint where there was no constraint (MAJOR change)
- type = MAJOR;
- } else if (!set2.containsAll(set1) && !set2.isEmpty()) {
- // removed existing constraint (MAJOR change)
- type = MAJOR;
+ if (!set1.equals(set2)) {
+ // valueConstraints have been modified
+ if (set2.containsAll(set1)) {
+ // new set is a superset of old set
+ // => constraints have been removed
+ // (TRIVIAL change, since constraints are OR'ed)
+ type = TRIVIAL;
+ } else {
+ // constraint have been removed/modified (MAJOR change);
+ // since we're unable to semantically compare
+ // value constraints (e.g. regular expressions), all
+ // modifications are considered a MAJOR change.
+ type = MAJOR;
+ }
}
// no need to check defaultValues (TRIVIAL change)
@@ -562,8 +535,8 @@ public class NodeTypeDefDiff {
int t2 = getNewDef().getRequiredType();
if (t1 != t2) {
if (t2 == PropertyType.UNDEFINED) {
- // changed getRequiredType to UNDEFINED (MINOR change)
- type = MINOR;
+ // changed getRequiredType to UNDEFINED (TRIVIAL change)
+ type = TRIVIAL;
} else {
// changed getRequiredType to specific type (MAJOR change)
type = MAJOR;
@@ -573,8 +546,8 @@ public class NodeTypeDefDiff {
boolean b2 = getNewDef().isMultiple();
if (b1 != b2) {
if (b2) {
- // changed multiple flag to true (MINOR change)
- type = MINOR;
+ // changed multiple flag to true (TRIVIAL change)
+ type = TRIVIAL;
} else {
// changed multiple flag to false (MAJOR change)
type = MAJOR;
@@ -604,11 +577,11 @@ public class NodeTypeDefDiff {
super.init();
/**
* only need to do comparison if base class implementation
- * detected a non-MAJOR modification (i.e. TRIVIAL or MINOR);
+ * detected a non-MAJOR (i.e. TRIVIAL) modification;
* no need to check for additions or removals as this is already
* handled in base class implementation.
*/
- if (isModified() && type != NONE && type != MAJOR) {
+ if (isModified() && type == TRIVIAL) {
boolean b1 = getOldDef().allowsSameNameSiblings();
boolean b2 = getNewDef().allowsSameNameSiblings();
@@ -623,11 +596,14 @@ public class NodeTypeDefDiff {
List<Name> l1 = Arrays.asList(getOldDef().getRequiredPrimaryTypes());
List<Name> l2 = Arrays.asList(getNewDef().getRequiredPrimaryTypes());
if (!l1.equals(l2)) {
+ // requiredPrimaryTypes have been modified
if (l1.containsAll(l2)) {
- // removed requiredPrimaryType (MINOR change)
- type = MINOR;
+ // old list is a superset of new list
+ // => removed requiredPrimaryType (TRIVIAL change)
+ type = TRIVIAL;
} else {
- // added requiredPrimaryType (MAJOR change)
+ // added/modified requiredPrimaryType (MAJOR change)
+ // todo check whether aggregate of old requiredTypes would include aggregate of new requiredTypes => trivial change
type = MAJOR;
}
}