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:22:10 UTC

svn commit: r1546228 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/ oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/

Author: tripod
Date: Wed Nov 27 23:22:09 2013
New Revision: 1546228

URL: http://svn.apache.org/r1546228
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
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.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=1546228&r1=1546227&r2=1546228&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:22:09 2013
@@ -218,7 +218,7 @@ 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);
+            return findPaths(result, uuid, propertyName, nodeTypeNames, weak ? Type.WEAKREFERENCE : Type.REFERENCE);
         } catch (ParseException e) {
             log.error("query failed", e);
             return Collections.emptySet();
@@ -226,7 +226,7 @@ public class IdentifierManager {
     }
 
     private Iterable<String> findPaths(final Result result, final String uuid, final String propertyName,
-            final String[] nodeTypeNames) {
+            final String[] nodeTypeNames, final Type<?> propertyType) {
         return new Iterable<String>() {
             @Override
             public Iterator<String> iterator() {
@@ -242,14 +242,16 @@ public class IdentifierManager {
                     class PropertyToPath implements Function<PropertyState, String> {
                         @Override
                         public String apply(PropertyState pState) {
-                            if (pState.isArray()) {
-                                for (String value : pState.getValue(Type.STRINGS)) {
-                                    if (uuid.equals(value)) {
-                                        return PathUtils.concat(rowPath, pState.getName());
+                            if (pState.getType() == propertyType) {
+                                if (pState.isArray()) {
+                                    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 (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=1546228&r1=1546227&r2=1546228&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:22:09 2013
@@ -25,6 +25,7 @@ import javax.jcr.ItemNotFoundException;
 import javax.jcr.Node;
 import javax.jcr.Property;
 import javax.jcr.PropertyIterator;
+import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 import javax.jcr.version.Version;
@@ -114,6 +115,35 @@ public class ReferencesTest extends Abst
         checkReferences("refs", ref.getReferences("myref1"), n1.getPath() + "/myref1");
     }
 
+    public void testMixedReferences() throws RepositoryException {
+        Node ref = testRootNode.addNode(nodeName2, testNodeType);
+        ref.addMixin(mixReferenceable);
+        superuser.save();
+
+        Node n0 = testRootNode.addNode(nodeName1, testNodeType);
+        n0.setProperty("strong_reference", ref);
+        Node n1 = testRootNode.addNode(nodeName3, testNodeType);
+        n1.setProperty("weak_reference", superuser.getValueFactory().createValue(ref, true));
+        superuser.save();
+
+        checkReferences("refs", ref.getReferences(), n0.getPath() + "/strong_reference");
+        checkReferences("refs", ref.getWeakReferences(), n1.getPath() + "/weak_reference");
+    }
+
+    public void testMixedReferencesOnSameNode() 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("weak_reference", superuser.getValueFactory().createValue(ref, true));
+        superuser.save();
+
+        checkReferences("refs", ref.getReferences(), n0.getPath() + "/strong_reference");
+        checkReferences("refs", ref.getWeakReferences(), n0.getPath() + "/weak_reference");
+    }
+
     // OAK-1195 Unable to move referenced mode
     public void testMovedReferences() throws RepositoryException {
         Node ref = testRootNode.addNode(nodeName2, testNodeType);

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java?rev=1546228&r1=1546227&r2=1546228&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java Wed Nov 27 23:22:09 2013
@@ -28,6 +28,7 @@ import javax.jcr.Binary;
 import javax.jcr.Credentials;
 import javax.jcr.NamespaceRegistry;
 import javax.jcr.Node;
+import javax.jcr.PropertyIterator;
 import javax.jcr.PropertyType;
 import javax.jcr.Repository;
 import javax.jcr.Session;
@@ -123,6 +124,7 @@ public class RepositoryUpgradeTest {
             properties.setProperty("double", Math.PI);
             properties.setProperty("long", 9876543210L);
             properties.setProperty("reference", referenceable);
+            properties.setProperty("weak_reference", session.getValueFactory().createValue(referenceable, true));
             properties.setProperty("string", "test");
             properties.setProperty("multiple", "a,b,c".split(","));
             session.save();
@@ -215,6 +217,23 @@ public class RepositoryUpgradeTest {
             assertEquals(
                     "/referenceable",
                     properties.getProperty("reference").getNode().getPath());
+            PropertyIterator refs = session.getNode("/referenceable").getReferences();
+            assertTrue(refs.hasNext());
+            assertEquals(properties.getPath() + "/reference", refs.nextProperty().getPath());
+            assertFalse(refs.hasNext());
+            assertEquals(
+                    PropertyType.WEAKREFERENCE,
+                    properties.getProperty("weak_reference").getType());
+            assertEquals(
+                    identifier,
+                    properties.getProperty("weak_reference").getString());
+            assertEquals(
+                    "/referenceable",
+                    properties.getProperty("weak_reference").getNode().getPath());
+            PropertyIterator weakRefs = session.getNode("/referenceable").getWeakReferences();
+            assertTrue(weakRefs.hasNext());
+            assertEquals(properties.getPath() + "/weak_reference", weakRefs.nextProperty().getPath());
+            assertFalse(weakRefs.hasNext());
             assertEquals(
                     PropertyType.STRING,
                     properties.getProperty("string").getType());