/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jackrabbit.jcr2spi; import org.apache.jackrabbit.test.AbstractJCRTest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.jcr.InvalidItemStateException; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Session; import java.util.Calendar; /** <code>IsSameTest</code>... */ public class IsSameTest extends AbstractJCRTest { private static Logger log = LoggerFactory.getLogger(IsSameTest.class); public void testIsSameProperty() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Property p = n.setProperty(propertyName1, "anyvalue"); testRootNode.save(); // access same property through different session Session otherSession = getHelper().getReadOnlySession(); try { Property otherProperty = (Property) otherSession.getItem(p.getPath()); assertTrue(p.isSame(otherProperty)); } finally { otherSession.logout(); } } public void testIsSameProperty2() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Property p = n.setProperty(propertyName1, "anyvalue"); testRootNode.save(); // add transient modification to the property: p.setValue("someOtherValue"); // access same property through different session Session otherSession = getHelper().getReadOnlySession(); try { Property otherProperty = (Property) otherSession.getItem(p.getPath()); assertTrue(p.isSame(otherProperty)); } finally { otherSession.logout(); } } public void testIsSameProperty3() throws RepositoryException { // create a node (nt:resource) that implicitly is referenceable Node n = testRootNode.addNode("aFile", "nt:file"); n = n.addNode("jcr:content", "nt:resource"); n.setProperty("jcr:lastModified", Calendar.getInstance()); n.setProperty("jcr:mimeType", "text/plain"); Property jcrData = n.setProperty("jcr:data", "abc", PropertyType.BINARY); testRootNode.save(); // access same property through different session Session otherSession = getHelper().getReadOnlySession(); try { Property otherProperty = (Property) otherSession.getItem(jcrData.getPath()); assertTrue(jcrData.isSame(otherProperty)); } finally { otherSession.logout(); } } public void testIsSameProperty4() throws RepositoryException { // create a node (nt:resource) that implicitly is referenceable Node n = testRootNode.addNode("aFile", "nt:file"); n = n.addNode("jcr:content", "nt:resource"); n.setProperty("jcr:lastModified", Calendar.getInstance()); n.setProperty("jcr:mimeType", "text/plain"); Property jcrData = n.setProperty("jcr:data", "abc", PropertyType.BINARY); testRootNode.save(); // access same property through different session Session otherSession = getHelper().getReadOnlySession(); try { Property otherProperty = (Property) otherSession.getItem(jcrData.getPath()); assertTrue(n.getProperty("jcr:data").isSame(otherProperty)); } finally { otherSession.logout(); } } public void testIsSameNode() throws RepositoryException { // create a node (nt:resource) that implicitly is referenceable Node n = testRootNode.addNode("aFile", "nt:file"); n = n.addNode("jcr:content", "nt:resource"); n.setProperty("jcr:lastModified", Calendar.getInstance()); n.setProperty("jcr:mimeType", "text/plain"); n.setProperty("jcr:data", "abc", PropertyType.BINARY); testRootNode.save(); // access nt:resource node through different session Session otherSession = getHelper().getReadOnlySession(); try { Node otherNode = (Node) otherSession.getItem(n.getPath()); assertTrue(n.isSame(otherNode)); } finally { otherSession.logout(); } } public void testIsSameNode2() throws RepositoryException { // create a node (nt:resource) that implicitly is referenceable Node n = testRootNode.addNode("aFile", "nt:file"); n = n.addNode("jcr:content", "nt:resource"); n.setProperty("jcr:lastModified", Calendar.getInstance()); n.setProperty("jcr:mimeType", "text/plain"); n.setProperty("jcr:data", "abc", PropertyType.BINARY); testRootNode.save(); // access nt:resource node through different session Session otherSession = getHelper().getReadOnlySession(); try { Node otherNode = (Node) otherSession.getItem(n.getPath()); assertTrue(otherNode.isSame(n)); } finally { otherSession.logout(); } } public void testIsSameNode3() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Property p = n.setProperty(propertyName1, "anyvalue"); testRootNode.save(); String srcPath = n.getPath(); String destPath = testRootNode.getPath() + "/" + nodeName2; // transiently move the node. testRootNode.getSession().move(srcPath, destPath); assertTrue(n.isSame(superuser.getItem(destPath))); } public void testIsSameNode4() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Property p = n.setProperty(propertyName1, "anyvalue"); testRootNode.save(); // transiently move the node. String srcPath = n.getPath(); String destPath = testRootNode.getPath() + "/" + nodeName2; testRootNode.getSession().move(srcPath, destPath); Session otherSession = getHelper().getReadOnlySession(); try { Node otherNode = (Node) otherSession.getItem(srcPath); assertTrue(n.isSame(otherNode)); assertTrue(superuser.getItem(destPath).isSame(otherNode)); } finally { otherSession.logout(); } } public void testIsSameNode5() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); n.addMixin(mixReferenceable); testRootNode.save(); // transiently move the node. String srcPath = n.getPath(); String destPath = testRootNode.getPath() + "/" + nodeName2; Session otherSession = getHelper().getReadOnlySession(); try { Node otherNode = (Node) otherSession.getItem(srcPath); testRootNode.getSession().getWorkspace().move(srcPath, destPath); assertTrue(otherNode.isSame(n)); assertTrue(n.isSame(otherNode)); } finally { otherSession.logout(); } } public void testIsSameNode6() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); n.addMixin(mixReferenceable); testRootNode.save(); // transiently move the node. String srcPath = n.getPath(); String destPath = testRootNode.getPath() + "/" + nodeName2; Session otherSession = getHelper().getReadOnlySession(); try { Node otherNode = (Node) otherSession.getItem(srcPath); testRootNode.getSession().getWorkspace().move(srcPath, destPath); otherNode.refresh(false); try { assertTrue(n.isSame(otherNode)); } catch (InvalidItemStateException e) { // ok as well. } try { assertTrue(otherNode.isSame(n)); } catch (InvalidItemStateException e) { // ok as well. } } finally { otherSession.logout(); } } public void testIsSameNode7() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Node n2 = n.addNode(nodeName2); Node n3 = n2.addNode(nodeName3); testRootNode.save(); n.addMixin(mixReferenceable); testRootNode.save(); Session otherSession = getHelper().getReadOnlySession(); try { Node otherNode3 = (Node) otherSession.getItem(n3.getPath()); assertTrue(otherNode3.isSame(n3)); Node parent = otherNode3.getParent(); assertTrue(parent.isSame(n2)); parent = parent.getParent(); assertTrue(parent.isSame(n)); parent = parent.getParent(); assertTrue(testRootNode.isSame(parent)); } finally { otherSession.logout(); } } public void testSameInstanceIsSame() throws RepositoryException { assertTrue(testRootNode.isSame(testRootNode)); Property p = testRootNode.getProperty(jcrPrimaryType); assertTrue(p.isSame(p)); } public void testNewNodeIsSame() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); assertTrue(n.isSame(n)); n.remove(); Node n2 = testRootNode.addNode(nodeName1, testNodeType); try { assertFalse(n2.isSame(n)); } catch (InvalidItemStateException e) { // ok as well } try { assertFalse(n.isSame(n2)); } catch (InvalidItemStateException e) { // ok as well } } public void testNewPropertyIsSame() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Property p = n.setProperty(propertyName1, "anyValue"); assertTrue(p.isSame(p)); } public void testNewItemFromDifferentSessions() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Property p = n.setProperty(propertyName1, "anyValue"); Session s2 = getHelper().getReadWriteSession(); try { Node trn = (Node) s2.getItem(testRootNode.getPath()); Node n2 = trn.addNode(nodeName1, testNodeType); Property p2 = n2.setProperty(propertyName1, "anyValue"); assertFalse(n.isSame(n2)); assertFalse(n2.isSame(n)); assertFalse(p.isSame(p2)); assertFalse(p2.isSame(p)); } finally { s2.logout(); } } public void testDifferentItemType() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Property p = n.setProperty(propertyName1, "anyValue"); assertFalse(p.isSame(n)); assertFalse(n.isSame(p)); } public void testShadowingItems() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Node n2 = testRootNode.addNode(nodeName2, testNodeType); Property p = n.setProperty(propertyName1, "anyValue"); testRootNode.save(); testRootNode.getSession().move(n.getPath(), n2.getPath() + "/destination"); Node replaceNode = testRootNode.addNode(nodeName1, testNodeType); Property replaceProp = replaceNode.setProperty(propertyName1, "anyValue"); assertFalse(replaceNode.isSame(n)); assertFalse(replaceProp.isSame(p)); } public void testShadowingItems2() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Node n2 = testRootNode.addNode(nodeName2, testNodeType); Property p = n.setProperty(propertyName1, "anyValue"); testRootNode.getSession().move(n.getPath(), n2.getPath() + "/destination"); Node replaceNode = testRootNode.addNode(nodeName1, testNodeType); Property replaceProp = replaceNode.setProperty(propertyName1, "anyValue"); assertFalse(replaceNode.isSame(n)); assertFalse(replaceProp.isSame(p)); } public void testShadowingItems3() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Property p = n.setProperty(propertyName1, "anyValue"); testRootNode.save(); p.remove(); Property p2 = n.setProperty(propertyName1, "anyValue"); try { assertFalse(p2.isSame(p)); } catch (InvalidItemStateException e) { // ok as well. } } /** * 283 specific test where node and prop with same name can be siblings. * * @throws RepositoryException */ /* public void testIsSameDifferentItemType() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); testRootNode.save(); Session s2 = helper.getReadWriteSession(); try { Node trn = (Node) s2.getItem(testRootNode.getPath()); Property p = trn.setProperty(nodeName1, "anyValue"); trn.save(); assertFalse(n.isSame(p)); } finally { s2.logout(); } } */ }