You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by tr...@apache.org on 2013/11/28 00:45:06 UTC

svn commit: r1546234 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ReferencesTest.java

Author: tripod
Date: Wed Nov 27 23:45:05 2013
New Revision: 1546234

URL: http://svn.apache.org/r1546234
Log:
OAK-1234 Node.getReferences() also returns weak references on same node

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ReferencesTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java?rev=1546234&r1=1546233&r2=1546234&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/IdentifierManager.java Wed Nov 27 23:45:05 2013
@@ -218,7 +218,10 @@ public class IdentifierManager {
             Result result = root.getQueryEngine().executeQuery(
                     "SELECT * FROM [nt:base] WHERE PROPERTY([" + pName + "], '" + reference + "') = $uuid",
                     Query.JCR_SQL2, Long.MAX_VALUE, 0, bindings, new NamePathMapper.Default());
-            return findPaths(result, uuid, propertyName, nodeTypeNames, weak ? Type.WEAKREFERENCE : Type.REFERENCE);
+            return findPaths(result, uuid, propertyName, nodeTypeNames,
+                    weak ? Type.WEAKREFERENCE : Type.REFERENCE,
+                    weak ? Type.WEAKREFERENCES : Type.REFERENCES
+                    );
         } catch (ParseException e) {
             log.error("query failed", e);
             return Collections.emptySet();
@@ -226,7 +229,7 @@ public class IdentifierManager {
     }
 
     private Iterable<String> findPaths(final Result result, final String uuid, final String propertyName,
-            final String[] nodeTypeNames, final Type<?> propertyType) {
+            final String[] nodeTypeNames, final Type<?> type, final Type<?> types) {
         return new Iterable<String>() {
             @Override
             public Iterator<String> iterator() {
@@ -242,15 +245,19 @@ public class IdentifierManager {
                     class PropertyToPath implements Function<PropertyState, String> {
                         @Override
                         public String apply(PropertyState pState) {
-                            if (pState.getType() == propertyType) {
-                                if (pState.isArray()) {
+                            if (pState.isArray()) {
+                                if (pState.getType() == types) {
                                     for (String value : pState.getValue(Type.STRINGS)) {
                                         if (uuid.equals(value)) {
                                             return PathUtils.concat(rowPath, pState.getName());
                                         }
                                     }
-                                } else if (uuid.equals(pState.getValue(Type.STRING))) {
-                                    return PathUtils.concat(rowPath, pState.getName());
+                                }
+                            } else {
+                                if (pState.getType() == type) {
+                                    if (uuid.equals(pState.getValue(Type.STRING))) {
+                                        return PathUtils.concat(rowPath, pState.getName());
+                                    }
                                 }
                             }
                             return null;

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ReferencesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ReferencesTest.java?rev=1546234&r1=1546233&r2=1546234&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ReferencesTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ReferencesTest.java Wed Nov 27 23:45:05 2013
@@ -144,6 +144,22 @@ public class ReferencesTest extends Abst
         checkReferences("refs", ref.getWeakReferences(), n0.getPath() + "/weak_reference");
     }
 
+    public void testMixedReferencesOnSameNode3() throws RepositoryException {
+        Node ref = testRootNode.addNode(nodeName2, testNodeType);
+        ref.addMixin(mixReferenceable);
+        superuser.save();
+
+        Node n0 = testRootNode.addNode(nodeName1, testNodeType);
+        n0.setProperty("strong_reference", ref);
+        n0.setProperty("mv_strong_reference", new Value[]{superuser.getValueFactory().createValue(ref, false)});
+        n0.setProperty("weak_reference", superuser.getValueFactory().createValue(ref, true));
+        n0.setProperty("mv_weak_reference", new Value[]{superuser.getValueFactory().createValue(ref, true)});
+        superuser.save();
+
+        checkReferences("refs", ref.getReferences(), n0.getPath() + "/strong_reference", n0.getPath() + "/mv_strong_reference");
+        checkReferences("refs", ref.getWeakReferences(), n0.getPath() + "/weak_reference", n0.getPath() + "/mv_weak_reference");
+    }
+
     // OAK-1195 Unable to move referenced mode
     public void testMovedReferences() throws RepositoryException {
         Node ref = testRootNode.addNode(nodeName2, testNodeType);