svn commit: r1853229 - /jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeTest.java

2019-02-08 Thread reschke
Author: reschke
Date: Fri Feb  8 17:42:24 2019
New Revision: 1853229

URL: http://svn.apache.org/viewvc?rev=1853229=rev
Log:
OAK-8037: add test case for making a node type referenceable

Modified:

jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeTest.java

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeTest.java?rev=1853229=1853228=1853229=diff
==
--- 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/nodetype/NodeTypeTest.java
 Fri Feb  8 17:42:24 2019
@@ -20,6 +20,7 @@ package org.apache.jackrabbit.oak.jcr.no
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.StringReader;
@@ -172,7 +173,7 @@ public class NodeTypeTest extends Abstra
 pdt.add(opts);
 ntt.add(nt);
 }
-
+
 logCustomizer = 
LogCustomizer.forLogger(TypeEditorProvider.class.getName()).enable(Level.INFO)
 .contains("appear to be trivial, repository will not be 
scanned").create();
 try {
@@ -350,4 +351,51 @@ public class NodeTypeTest extends Abstra
 n.getProperty("test:mandatory").remove();
 session.save();
 }
+
+@Test
+public void addReferenceableToExistingType() throws Exception {
+Session session = getAdminSession();
+Node root = session.getRootNode();
+
+// 1. Create node type that is not referencable
+String cnd = "<'test'='http://www.apache.org/jackrabbit/test'> 
[test:AlmostReferenceable] > nt:base";
+CndImporter.registerNodeTypes(new StringReader(cnd), session, false);
+
+// 2. Create test node
+Node newnode = root.addNode("testnode", "test:AlmostReferenceable");
+session.save();
+
+// 3. Attempt node type upgrade, adding optional jcr:uuid property
+cnd = "<'test'='http://www.apache.org/jackrabbit/test'> 
[test:AlmostReferenceable] > nt:base - jcr:uuid (string)";
+CndImporter.registerNodeTypes(new StringReader(cnd), session, true);
+
+// 4. fill jcr:uuid
+newnode = root.getNode("testnode");
+String uuid = UUID.randomUUID().toString();
+newnode.setProperty("jcr:uuid", uuid);
+session.save();
+// property is not a system property yet
+
assertFalse(newnode.getProperty("jcr:uuid").getDefinition().isAutoCreated());
+
assertFalse(newnode.getProperty("jcr:uuid").getDefinition().isProtected());
+
+// 5. Attempt node type upgrade, making the type referencable
+cnd = "<'test'='http://www.apache.org/jackrabbit/test'> 
[test:AlmostReferenceable] > mix:referenceable, nt:base";
+CndImporter.registerNodeTypes(new StringReader(cnd), session, true);
+
+// 6. new node should be referenceable and have jcr:uuid
+newnode = root.getNode("testnode");
+assertTrue(newnode.hasProperty("jcr:uuid"));
+// property is now a system property
+
assertTrue(newnode.getProperty("jcr:uuid").getDefinition().isAutoCreated());
+
assertTrue(newnode.getProperty("jcr:uuid").getDefinition().isProtected());
+
+// 7. try to reference the node
+Node refnode = root.addNode("refnode", "nt:unstructured");
+refnode.setProperty("refprop", newnode);
+session.save();
+
+// 8. get the node by UUID
+Node found = session.getNodeByIdentifier(uuid);
+assertTrue(found.isSame(newnode));
+}
 }




svn commit: r1853228 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java

2019-02-08 Thread stillalex
Author: stillalex
Date: Fri Feb  8 16:00:20 2019
New Revision: 1853228

URL: http://svn.apache.org/viewvc?rev=1853228=rev
Log:
OAK-6221 Deprecate SecurityProviderImpl
 - trivial javadoc note


Modified:

jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java?rev=1853228=1853227=1853228=diff
==
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java
 Fri Feb  8 16:00:20 2019
@@ -59,6 +59,9 @@ import org.osgi.framework.BundleContext;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+/**
+ * @deprecated Replaced by {@code 
org.apache.jackrabbit.oak.security.internal.SecurityProviderBuilder}
+ */
 @Deprecated
 public class SecurityProviderImpl implements SecurityProvider, WhiteboardAware 
{
 




svn commit: r1853226 [1/2] - in /jackrabbit/oak/trunk/oak-security-spi: ./ src/test/java/org/apache/jackrabbit/oak/plugins/tree/ src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/acce

2019-02-08 Thread angela
Author: angela
Date: Fri Feb  8 15:54:14 2019
New Revision: 1853226

URL: http://svn.apache.org/viewvc?rev=1853226=rev
Log:
OAK-8036 : Improve test in oak-security-spi

Added:

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/plugins/tree/NullLocationTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/plugins/tree/PropertyLocationTest.java
Modified:
jackrabbit/oak/trunk/oak-security-spi/pom.xml

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/plugins/tree/AbstractTreeTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/plugins/tree/TreeLocationTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/plugins/tree/TreeUtilTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACETest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/AbstractAccessControlListTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/AbstractAccessControlManagerTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ImmutableACLTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/TestACL.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/PermissionsTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/AbstractRestrictionProviderTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/CompositeRestrictionProviderTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/RestrictionDefinitionImplTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/restriction/RestrictionImplTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/privilege/PrivilegeBitsTest.java

jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/xml/PropInfoTest.java

Modified: jackrabbit/oak/trunk/oak-security-spi/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-security-spi/pom.xml?rev=1853226=1853225=1853226=diff
==
--- jackrabbit/oak/trunk/oak-security-spi/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-security-spi/pom.xml Fri Feb  8 15:54:14 2019
@@ -34,7 +34,7 @@
   
 
 false
-0.89
+0.91
   
 
   

Modified: 
jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/plugins/tree/AbstractTreeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/plugins/tree/AbstractTreeTest.java?rev=1853226=1853225=1853226=diff
==
--- 
jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/plugins/tree/AbstractTreeTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/plugins/tree/AbstractTreeTest.java
 Fri Feb  8 15:54:14 2019
@@ -33,7 +33,9 @@ import static org.mockito.Mockito.withSe
 
 public class AbstractTreeTest {
 
+static final String NON_EXISTING_PATH = "/nonExisting";
 static final String CHILD_PATH = "/z/child";
+static final String PROPERTY_PATH = CHILD_PATH + "/p";
 static final String STRING_VALUE = "value";
 static final long LONG_VALUE = 1;
 
@@ -50,11 +52,11 @@ public class AbstractTreeTest {
 when(rootTree.hasProperty("p")).thenReturn(true);
 
when(rootTree.getProperty("p")).thenReturn(PropertyStates.createProperty("p", 
LONG_VALUE));
 
-nonExisting = mockTree("/nonExisting", rootTree, false, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+nonExisting = mockTree(NON_EXISTING_PATH, rootTree, false, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
 
 Tree x = mockTree("/x", rootTree, true);
 z = mockTree("/z", rootTree, true, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
-child = mockTree("/z/child", z, true, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+child = mockTree(CHILD_PATH, z, true, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
 when(child.hasProperty("p")).thenReturn(true);
 
when(child.getProperty("p")).thenReturn(PropertyStates.createProperty("p", 
STRING_VALUE));
 

svn commit: r1853226 [2/2] - in /jackrabbit/oak/trunk/oak-security-spi: ./ src/test/java/org/apache/jackrabbit/oak/plugins/tree/ src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/acce

2019-02-08 Thread angela
Modified: 
jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/privilege/PrivilegeBitsTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/privilege/PrivilegeBitsTest.java?rev=1853226=1853225=1853226=diff
==
--- 
jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/privilege/PrivilegeBitsTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-security-spi/src/test/java/org/apache/jackrabbit/oak/spi/security/privilege/PrivilegeBitsTest.java
 Fri Feb  8 15:54:14 2019
@@ -125,7 +125,7 @@ public class PrivilegeBitsTest implement
 for (int i = 0; i < 10; i++) {
 PrivilegeBits nxt = pb.nextBits();
 assertEquals(nxt, pb.nextBits());
-assertFalse(pb.equals(nxt));
+assertNotEquals(pb, nxt);
 pb = nxt;
 }
 
@@ -227,16 +227,14 @@ public class PrivilegeBitsTest implement
 }
 }
 
+@Test(expected = UnsupportedOperationException.class)
+public void testEmptyAdd() {
+// empty privilege bits
+PrivilegeBits.EMPTY.add(PrivilegeBits.EMPTY);
+}
+
 @Test
 public void testAdd() {
-// empty
-try {
-PrivilegeBits.EMPTY.add(PrivilegeBits.EMPTY);
-fail("UnsupportedOperation expected");
-} catch (UnsupportedOperationException e) {
-// success
-}
-
 // other privilege bits
 PrivilegeBits pb = READ_NODES_PRIVILEGE_BITS;
 PrivilegeBits mod = PrivilegeBits.getInstance(pb);
@@ -295,16 +293,14 @@ public class PrivilegeBitsTest implement
 }
 }
 
+@Test(expected = UnsupportedOperationException.class)
+public void testEmptyDiff() {
+// empty privilege bits
+PrivilegeBits.EMPTY.diff(PrivilegeBits.EMPTY);
+}
+
 @Test
 public void testDiff() {
-// empty
-try {
-PrivilegeBits.EMPTY.diff(PrivilegeBits.EMPTY);
-fail("UnsupportedOperation expected");
-} catch (UnsupportedOperationException e) {
-// success
-}
-
 // other privilege bits
 PrivilegeBits pb = READ_NODES_PRIVILEGE_BITS;
 PrivilegeBits mod = PrivilegeBits.getInstance(pb);
@@ -329,7 +325,7 @@ public class PrivilegeBitsTest implement
 mod.diff(nxt);
 assertEquivalent(before, mod);
 mod.add(nxt);
-assertFalse(before.equals(mod));
+assertNotEquals(before, mod);
 mod.diff(nxt);
 assertEquivalent(before, mod);
 mod.add(nxt);
@@ -381,16 +377,14 @@ public class PrivilegeBitsTest implement
 }
 }
 
+@Test(expected = UnsupportedOperationException.class)
+public void testEmptyAddDifference() {
+// empty privilege bits
+PrivilegeBits.EMPTY.addDifference(PrivilegeBits.EMPTY, 
PrivilegeBits.EMPTY);
+}
+
 @Test
 public void testAddDifference() {
-// empty
-try {
-PrivilegeBits.EMPTY.addDifference(PrivilegeBits.EMPTY, 
PrivilegeBits.EMPTY);
-fail("UnsupportedOperation expected");
-} catch (UnsupportedOperationException e) {
-// success
-}
-
 // other privilege bits
 PrivilegeBits pb = READ_NODES_PRIVILEGE_BITS;
 PrivilegeBits mod = PrivilegeBits.getInstance(pb);
@@ -420,7 +414,7 @@ public class PrivilegeBitsTest implement
 tmp = PrivilegeBits.getInstance(nxt);
 PrivilegeBits mod2 = PrivilegeBits.getInstance(mod);
 tmp.addDifference(mod2, READ_NODES_PRIVILEGE_BITS);
-assertFalse(nxt.equals(tmp));  // tmp should be modified by 
addDifference call.
+assertNotEquals(nxt, tmp);  // tmp should be modified by 
addDifference call.
 assertEquivalent(mod2, mod);   // mod2 should not be 
modified here
 assertTrue(tmp.includes(pb));
 assertFalse(tmp.includes(READ_NODES_PRIVILEGE_BITS));
@@ -450,15 +444,9 @@ public class PrivilegeBitsTest implement
 }
 }
 
-@Test
+@Test(expected = UnsupportedOperationException.class)
 public void testRetainUnmodifiable() {
-PrivilegeBits unmodifiable = READ_NODES_PRIVILEGE_BITS;
-try {
-unmodifiable.retain(PrivilegeBits.getInstance());
-fail();
-} catch (UnsupportedOperationException e) {
-// success
-}
+READ_NODES_PRIVILEGE_BITS.retain(PrivilegeBits.getInstance());
 }
 
 @Test
@@ -572,7 +560,7 @@ public class PrivilegeBitsTest implement
 
 pb = PrivilegeBits.EMPTY;
 assertEquivalent(pb, PrivilegeBits.EMPTY);
-assertSame(pb, PrivilegeBits.EMPTY);
+assertSame(PrivilegeBits.EMPTY, pb);
 assertSame(pb, 

svn commit: r1853216 - in /jackrabbit/oak/branches/1.8: ./ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/luc

2019-02-08 Thread catholicon
Author: catholicon
Date: Fri Feb  8 13:41:35 2019
New Revision: 1853216

URL: http://svn.apache.org/viewvc?rev=1853216=rev
Log:
OAK-7246: Improve cleanup of locally copied index files (backport r1836548, 
r1840769 from trunk)
OAK-7751: CopyOnReadDirectory#removeDeletedFiles asks IndexCopier to check 
timestamp for (remote only) segments.gen leading to failure to clean up local 
files

OAK-7246: Improve cleanup of locally copied index files
Implement what was discussed except for s/creation time/modified time/

Update IndexCopierTest to use FSDirectory for CoR and CoW and also added
synthetic update of last modified timestamp delayes to simulate reality
without really sleep (this test would still pass with old impl... except
for constants of course)

Added IndexCopierCleanupTest to test new logic.


Added:

jackrabbit/oak/branches/1.8/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopierCleanupTest.java
  - copied, changed from r1836548, 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopierCleanupTest.java
Modified:
jackrabbit/oak/branches/1.8/   (props changed)

jackrabbit/oak/branches/1.8/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java

jackrabbit/oak/branches/1.8/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/CopyOnReadDirectory.java

jackrabbit/oak/branches/1.8/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/CopyOnWriteDirectory.java

jackrabbit/oak/branches/1.8/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/LocalIndexFile.java

jackrabbit/oak/branches/1.8/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopierTest.java

Propchange: jackrabbit/oak/branches/1.8/
--
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Feb  8 13:41:35 2019
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1820660-1820661,1820729,1820734,1820859,1820861,1820878,1820888,1820947,1821027,1821130,1821140-1821141,1821178,1821237,1821240,1821249,1821258,1821325,1821358,1821361-1821362,1821370,1821375,1821393,1821477,1821487,1821516,1821617,1821663,1821665,1821668,1821681,1821847,1821975-1821983,1822121,1822201,1822207,1822527,1822642,1822723,1822808,1822850,1822934,1823135,1823163,1823169,1823172,1823655,1823669,1824196,1824198,1824253,1824255,1824896,1824962,1825065,1825362,1825381,1825442,1825448,1825466,1825470-1825471,1825475,1825523,1825525,1825561,1825619-1825621,1825651,1825654,1825992,1826079,1826090,1826096,1826216,1826237,1826338,1826516,1826532,1826551,1826560,1826638,1826640,1826730,1826833,1826932,1826957,1827423,1827472,1827486,1827816,1827977,1828349,1828439,1828502,1828529,1828948,1829527,1829534,1829546,1829569,1829587,1829665,1829854,1829864,1829978,1829985,1829987,1829998,1830019,1830048,1830160,1830171,1830197,1830209,1830239,1830347,1830748,1830911
 
,1830923,1831157-1831158,1831163,1831190,1831374,1831560,1831689,1832258,1832376,1832379,1832535,1833308,1833347,1833833,1834112,1834117,1834287,1834291,1834302,1834326,1834328,1834336,1834428,1834468,1834483,1834610,1834648-1834649,1834681,1834823,1834857-1834858,1835060,1835518,1835521,1835635,1835642,1835780,1835819,1836082,1836121,1836167-1836168,1836170-1836187,1836189-1836196,1836206,1836487,1836493,1837057,1837274,1837296,1837326,1837475,1837503,1837547,1837569,1837600,1837657,1837718,1837998,1838076,1838637,1839549,1839570,1839637,1839746,1840019,1840024,1840031,1840226,1840455,1840462,1840574,1841314,1841352,1842089,1842677,1843175,1843222,1843231,1843398,1843618,1843652,1843911,1844325,1844549,1844625,1844627,1844642,1844728,1844775,1844932,1845135,1845336,1845405,1845415,1845730-1845731,1845863,1845865,1846057,1846617,1848073,1848181-1848182,1848191,1848217,1848822-1848823,1850837,1851533-1851535,1851619,1852451,1852492

svn commit: r1853206 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java

2019-02-08 Thread thomasm
Author: thomasm
Date: Fri Feb  8 10:47:35 2019
New Revision: 1853206

URL: http://svn.apache.org/viewvc?rev=1853206=rev
Log:
OAK-7997 : Adding restrictions to ACLs yields empty results for queries in 
Jackrabbit Oak (rename and simplify a bit)

Modified:

jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java?rev=1853206=1853205=1853206=diff
==
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
 Fri Feb  8 10:47:35 2019
@@ -169,7 +169,7 @@ public class SelectorImpl extends Source
 private String planIndexName;
 private TimerStats timerDuration;
 
-private LastTree lastTree;
+private CachedTree cachedTree;
 
 public SelectorImpl(NodeTypeInfo nodeTypeInfo, String selectorName) {
 this.nodeTypeInfo = checkNotNull(nodeTypeInfo);
@@ -528,7 +528,7 @@ public class SelectorImpl extends Source
 // where [a].[jcr:path] = $path"
 // because not checking would reveal existence
 // of the child node
-if (!getLastTree(currentRow.getPath()).exists()) {
+if (!getCachedTree(currentRow.getPath()).exists()) {
 continue;
 }
 }
@@ -565,13 +565,13 @@ public class SelectorImpl extends Source
 }
 
 private boolean evaluateTypeMatch() {
-LastTree lt = getLastTree(currentRow.getPath());
-if (!lt.exists()) {
+CachedTree ct = getCachedTree(currentRow.getPath());
+if (!ct.exists()) {
 return false;
 }
 
-Tree t = lt.getTree();
-LazyValue readOnly = lt.getReadOnlyTree();
+Tree t = ct.getTree();
+LazyValue readOnly = ct.getReadOnlyTree();
 String primaryTypeName = TreeUtil.getPrimaryTypeName(t, readOnly);
 if (primaryTypeName != null && primaryTypes.contains(primaryTypeName)) 
{
 return true;
@@ -611,7 +611,7 @@ public class SelectorImpl extends Source
 
 @Nullable
 Tree getTree(@NotNull String path) {
-return getLastTree(path).getTree();
+return getCachedTree(path).getTree();
 }
 
 /**
@@ -621,11 +621,11 @@ public class SelectorImpl extends Source
  * @return the tree, or null
  */
 @NotNull
-private LastTree getLastTree(@NotNull  String path) {
-if (lastTree == null || !lastTree.denotes(path)) {
-lastTree = new LastTree(path, query);
+private CachedTree getCachedTree(@NotNull  String path) {
+if (cachedTree == null || !cachedTree.denotes(path)) {
+cachedTree = new CachedTree(path, query);
 }
-return lastTree;
+return cachedTree;
 }
 
 /**
@@ -889,17 +889,23 @@ public class SelectorImpl extends Source
 return new SelectorImpl(nodeTypeInfo, selectorName);
 }
 
-private static final class LastTree {
+private static final class CachedTree {
 
 private final String path;
 private final Tree tree;
 private final ExecutionContext ctx;
-private LazyValue readOnlyTree;
+private final LazyValue readOnlyTree;
 
-private LastTree(@NotNull String path, @NotNull QueryImpl query) {
+private CachedTree(@NotNull String path, @NotNull QueryImpl query) {
 this.path = path;
 this.tree = query.getTree(path);
 this.ctx = query.getExecutionContext();
+this.readOnlyTree = new LazyValue() {
+@Override
+protected Tree createValue() {
+return new ImmutableRoot(ctx.getBaseState()).getTree(path);
+}
+};
 }
 
 private boolean denotes(@NotNull String path) {
@@ -917,14 +923,6 @@ public class SelectorImpl extends Source
 
 @NotNull
 private LazyValue getReadOnlyTree() {
-if (readOnlyTree == null) {
-readOnlyTree = new LazyValue() {
-@Override
-protected Tree createValue() {
-return new 
ImmutableRoot(ctx.getBaseState()).getTree(path);
-}
-};
-}
 return readOnlyTree;
 }
 }