Index: jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/NodeTypeDefDiff.java
===================================================================
--- jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/NodeTypeDefDiff.java (revision 1693686)
+++ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/NodeTypeDefDiff.java (working copy)
@@ -16,15 +16,6 @@
*/
package org.apache.jackrabbit.spi.commons.nodetype;
-import org.apache.jackrabbit.spi.Name;
-import org.apache.jackrabbit.spi.QItemDefinition;
-import org.apache.jackrabbit.spi.QNodeDefinition;
-import org.apache.jackrabbit.spi.QNodeTypeDefinition;
-import org.apache.jackrabbit.spi.QPropertyDefinition;
-import org.apache.jackrabbit.spi.QValueConstraint;
-import org.apache.jackrabbit.spi.commons.name.NameConstants;
-
-import javax.jcr.PropertyType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -36,8 +27,17 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
+import javax.jcr.PropertyType;
+
+import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.QItemDefinition;
+import org.apache.jackrabbit.spi.QNodeDefinition;
+import org.apache.jackrabbit.spi.QNodeTypeDefinition;
+import org.apache.jackrabbit.spi.QPropertyDefinition;
+import org.apache.jackrabbit.spi.QValueConstraint;
+import org.apache.jackrabbit.spi.commons.name.NameConstants;
+
/**
* A NodeTypeDefDiff
represents the result of the comparison of
* two node type definitions.
@@ -106,13 +106,6 @@
private NodeTypeDefDiff(QNodeTypeDefinition oldDef, QNodeTypeDefinition newDef) {
this.oldDef = oldDef;
this.newDef = newDef;
- init();
- }
-
- /**
- *
- */
- private void init() {
if (oldDef.equals(newDef)) {
// definitions are identical
type = NONE;
@@ -144,13 +137,17 @@
// no need to check queryable flag (TRIVIAL modification)
// check property definitions
- tmpType = buildPropDefDiffs();
+ PropDefDiffBuilder propDefDiffBuilder = new PropDefDiffBuilder(oldDef.getPropertyDefs(), newDef.getPropertyDefs());
+ propDefDiffs.addAll(propDefDiffBuilder.getChildItemDefDiffs());
+ tmpType = propDefDiffBuilder.getMaxType();
if (tmpType > type) {
type = tmpType;
}
// check child node definitions
- tmpType = buildChildNodeDefDiffs();
+ ChildNodeDefDiffBuilder childNodeDefDiffBuilder = new ChildNodeDefDiffBuilder(oldDef.getChildNodeDefs(), newDef.getChildNodeDefs());
+ childNodeDefDiffs.addAll(childNodeDefDiffBuilder.getChildItemDefDiffs());
+ tmpType = childNodeDefDiffBuilder.getMaxType();
if (tmpType > type) {
type = tmpType;
}
@@ -232,95 +229,6 @@
return !set1.equals(set2) ? MAJOR : NONE;
}
- /**
- * @return diff type
- */
- private int buildPropDefDiffs() {
- int maxType = NONE;
- Map oldDefs = new HashMap();
- for (QPropertyDefinition def : oldDef.getPropertyDefs()) {
- oldDefs.put(new QPropertyDefinitionId(def), def);
- }
-
- Map newDefs = new HashMap();
- for (QPropertyDefinition def : newDef.getPropertyDefs()) {
- newDefs.put(new QPropertyDefinitionId(def), def);
- }
-
- /**
- * walk through defs1 and process all entries found in
- * both defs1 & defs2 and those found only in defs1
- */
- for (Map.Entry entry : oldDefs.entrySet()) {
- QPropertyDefinitionId id = entry.getKey();
- QPropertyDefinition def1 = entry.getValue();
- QPropertyDefinition def2 = newDefs.get(id);
- PropDefDiff diff = new PropDefDiff(def1, def2);
- if (diff.getType() > maxType) {
- maxType = diff.getType();
- }
- propDefDiffs.add(diff);
- newDefs.remove(id);
- }
-
- /**
- * defs2 by now only contains entries found in defs2 only;
- * walk through defs2 and process all remaining entries
- */
- for (Map.Entry entry : newDefs.entrySet()) {
- QPropertyDefinition def = entry.getValue();
- PropDefDiff diff = new PropDefDiff(null, def);
- if (diff.getType() > maxType) {
- maxType = diff.getType();
- }
- propDefDiffs.add(diff);
- }
-
- return maxType;
- }
-
- /**
- * @return diff type
- */
- private int buildChildNodeDefDiffs() {
- int maxType = NONE;
- final Map> oldDefs = collectChildNodeDefs(oldDef.getChildNodeDefs());
- final Map> newDefs = collectChildNodeDefs(newDef.getChildNodeDefs());
-
- for (QNodeDefinitionId defId : oldDefs.keySet()) {
- final ChildNodeDefDiffs childNodeDefDiffs = new ChildNodeDefDiffs(oldDefs.get(defId), newDefs.get(defId));
- this.childNodeDefDiffs.addAll(childNodeDefDiffs.getChildNodeDefDiffs());
- newDefs.remove(defId);
- }
-
- for (QNodeDefinitionId defId : newDefs.keySet()) {
- final ChildNodeDefDiffs childNodeDefDiffs = new ChildNodeDefDiffs(null, newDefs.get(defId));
- this.childNodeDefDiffs.addAll(childNodeDefDiffs.getChildNodeDefDiffs());
- }
-
- for (ChildNodeDefDiff diff : childNodeDefDiffs) {
- if (diff.getType() > maxType) {
- maxType = diff.getType();
- }
- }
-
- return maxType;
- }
-
- private Map> collectChildNodeDefs(final QNodeDefinition[] cnda1) {
- Map> defs1 = new HashMap>();
- for (QNodeDefinition def1 : cnda1) {
- final QNodeDefinitionId def1Id = new QNodeDefinitionId(def1);
- List list = defs1.get(def1Id);
- if (list == null) {
- list = new ArrayList();
- defs1.put(def1Id, list);
- }
- list.add(def1);
- }
- return defs1;
- }
-
@Override
public String toString() {
String result = getClass().getName() + "[\n\tnodeTypeName="
@@ -373,12 +281,136 @@
//--------------------------------------------------------< inner classes >
- abstract class ChildItemDefDiff {
- protected final QItemDefinition oldDef;
- protected final QItemDefinition newDef;
+ private abstract class ChildItemDefDiffBuilder> {
+
+ private final List childItemDefDiffs = new ArrayList();
+
+ private ChildItemDefDiffBuilder(T[] oldDefs, T[] newDefs) {
+ buildChildItemDefDiffs(collectChildNodeDefs(oldDefs), collectChildNodeDefs(newDefs));
+ }
+
+ private void buildChildItemDefDiffs(Map