package org.modeshape; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.Workspace; import javax.jcr.nodetype.NodeDefinitionTemplate; import javax.jcr.nodetype.NodeTypeDefinition; import javax.jcr.nodetype.NodeTypeManager; import javax.jcr.nodetype.NodeTypeTemplate; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import junit.framework.Assert; import org.junit.Test; public class SharedNodeQueryTest { private Session session; @SuppressWarnings("unchecked") @Test public void testChildSharedNodeQuery() throws RepositoryException { final Workspace workspace = session.getWorkspace(); workspace.getNamespaceRegistry().registerNamespace("t", "urn:test"); final NodeTypeManager ntMgr = workspace.getNodeTypeManager(); final NodeTypeTemplate typeA = ntMgr.createNodeTypeTemplate(); typeA.setName("t:a"); final NodeDefinitionTemplate typeAChildren = ntMgr.createNodeDefinitionTemplate(); typeAChildren.setRequiredPrimaryTypeNames(new String[] {"t:x"}); typeA.getNodeDefinitionTemplates().add(typeAChildren); final NodeTypeTemplate typeX = ntMgr.createNodeTypeTemplate(); typeX.setName("t:x"); typeX.setDeclaredSuperTypeNames(new String[] {"mix:shareable"}); ntMgr.registerNodeTypes(new NodeTypeDefinition[] {typeA, typeX}, false); final Node root = session.getRootNode(); final Node a1 = root.addNode("A1", "t:a"); final Node a2 = root.addNode("A2", "t:a"); final Node a1x = a1.addNode("X", "t:x"); session.save(); workspace.clone(workspace.getName(), "/A1/X", "/A2/X", false); final Node a2x = a2.getNode("X"); Assert.assertNotNull(a2x); Assert.assertEquals("t:x", a2x.getPrimaryNodeType().getName()); final NodeIterator a1xSharedSetIt = a1x.getSharedSet(); boolean a2xFoundInA1xSharedSet = false; while (a1xSharedSetIt.hasNext()) { final Node node = a1xSharedSetIt.nextNode(); a2xFoundInA1xSharedSet = node.isSame(a2x); if (a2xFoundInA1xSharedSet) break; } Assert.assertTrue(a2xFoundInA1xSharedSet); final QueryManager qMgr = workspace.getQueryManager(); final Query a1Query = qMgr.createQuery("select x.* from [t:x] as x where ischildnode(x, [/A1])", Query.JCR_SQL2); final NodeIterator a1QueryResult = a1Query.execute().getNodes(); Assert.assertTrue(a1QueryResult.hasNext()); final Node maybeXFromA1 = a1QueryResult.nextNode(); Assert.assertTrue(a2x.isSame(maybeXFromA1)); final Query a2Query = qMgr.createQuery("select x.* from [t:x] as x where ischildnode(x, [/A2])", Query.JCR_SQL2); final NodeIterator a2QueryResult = a2Query.execute().getNodes(); Assert.assertTrue("Query should find X under A2", a2QueryResult.hasNext()); final Node maybeXFromA2 = a2QueryResult.nextNode(); Assert.assertTrue(a2x.isSame(maybeXFromA2)); } }