You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by un...@apache.org on 2014/12/11 16:10:29 UTC
svn commit: r1644665 -
/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/NodeTypeDefDiff.java
Author: unico
Date: Thu Dec 11 15:10:29 2014
New Revision: 1644665
URL: http://svn.apache.org/r1644665
Log:
JCR-3840 limit the number of null child node definitions to match with to the number of slots available
Modified:
jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/NodeTypeDefDiff.java
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=1644665&r1=1644664&r2=1644665&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 Thu Dec 11 15:10:29 2014
@@ -36,6 +36,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* A <code>NodeTypeDefDiff</code> represents the result of the comparison of
@@ -716,12 +717,16 @@ public class NodeTypeDefDiff {
}
if (defs2.size() < defs1.size()) {
for (QNodeDefinition def1 : defs1) {
- diffs.add(new ChildNodeDefDiff(def1, null));
+ for (int i = 0; i < defs1.size() - defs2.size(); i++) {
+ diffs.add(new ChildNodeDefDiff(def1, null));
+ }
}
}
if (defs1.size() < defs2.size()) {
for (QNodeDefinition def2 : defs2) {
- diffs.add(new ChildNodeDefDiff(null, def2));
+ for (int i = 0; i < defs2.size() - defs1.size(); i++) {
+ diffs.add(new ChildNodeDefDiff(null, def2));
+ }
}
}
// sort them according to decreasing compatibility
@@ -733,10 +738,18 @@ public class NodeTypeDefDiff {
});
// select the most compatible ones
final int size = defs1.size() > defs2.size() ? defs1.size() : defs2.size();
+ AtomicInteger allowedNewNull = new AtomicInteger(defs1.size() - defs2.size());
+ AtomicInteger allowedOldNull = new AtomicInteger(defs2.size() - defs1.size());
final List<ChildNodeDefDiff> results = new ArrayList<ChildNodeDefDiff>();
for (ChildNodeDefDiff diff : diffs) {
- if (!alreadyMatched(results, diff.getNewDef(), diff.getOldDef())) {
+ if (!alreadyMatched(results, diff.getNewDef(), diff.getOldDef(), allowedNewNull, allowedOldNull)) {
results.add(diff);
+ if (diff.getNewDef() == null) {
+ allowedNewNull.decrementAndGet();
+ }
+ if (diff.getOldDef() == null) {
+ allowedOldNull.decrementAndGet();
+ }
}
if (results.size() == size) {
break;
@@ -745,17 +758,31 @@ public class NodeTypeDefDiff {
return results;
}
- private boolean alreadyMatched(final List<ChildNodeDefDiff> result, final QNodeDefinition newDef, final QNodeDefinition oldDef) {
+ private boolean alreadyMatched(final List<ChildNodeDefDiff> result, final QNodeDefinition newDef, final QNodeDefinition oldDef, final AtomicInteger allowedNewNull, final AtomicInteger allowedOldNull) {
boolean containsNewDef = false, containsOldDef = false;
for (ChildNodeDefDiff d : result) {
if (d.getNewDef() != null && d.getNewDef().equals(newDef)) {
containsNewDef = true;
+ break;
}
if (d.getOldDef() != null && d.getOldDef().equals(oldDef)) {
containsOldDef = true;
+ break;
+ }
+ }
+ if (oldDef == null) {
+ if (allowedOldNull.get() < 1) {
+ containsOldDef = true;
}
}
+ if (newDef == null) {
+ if (allowedNewNull.get() < 1) {
+ containsNewDef = true;
+ }
+ }
+
return containsNewDef || containsOldDef;
}
}
+
}