Query with Joins produces NPE
lexsoto Dec 21, 2011 1:37 PMHello:
This NPE exception:
java.lang.NullPointerException at org.modeshape.graph.query.process.JoinComponent$6.evaluate(JoinComponent.java:359) at org.modeshape.graph.query.process.NestedLoopJoinComponent.execute(NestedLoopJoinComponent.java:68) at org.modeshape.graph.query.process.ProjectComponent.execute(ProjectComponent.java:48) at org.modeshape.graph.query.process.QueryProcessor.execute(QueryProcessor.java:100) at org.modeshape.graph.query.QueryEngine.execute(QueryEngine.java:124) at org.modeshape.jcr.RepositoryQueryManager$SelfContained.query(RepositoryQueryManager.java:435) at org.modeshape.jcr.JcrQueryManager$SessionQueryContext.execute(JcrQueryManager.java:1422) at org.modeshape.jcr.query.JcrQuery.execute(JcrQuery.java:103) at com.cht.member.MemberAuthorizationServiceBeanTest.testJoinQuery(MemberAuthorizationServiceBeanTest.java:127) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Is thrown by this code:
final Session session = repository.login(new SimpleCredentials("jsmith", "secret".toCharArray())); final NamespaceRegistry registry = session.getWorkspace().getNamespaceRegistry(); final String NAMESPACE_PREFIX = "tt"; final String NAMESPACE_URI = "http://test.com/tt"; final String FRIENDLY = "tt:friendly"; final String FRIEND = "tt:friend"; registry.registerNamespace(NAMESPACE_PREFIX, NAMESPACE_URI); NodeTypeManager manager = session.getWorkspace().getNodeTypeManager(); NodeTypeTemplate nodeType = manager.createNodeTypeTemplate(); nodeType.setMixin(true); nodeType.setName(FRIENDLY); nodeType.setQueryable(true); nodeType.setDeclaredSuperTypeNames(new String[]{"mix:referenceable"}); PropertyDefinitionTemplate propertyDef = manager.createPropertyDefinitionTemplate(); propertyDef.setName(FRIEND); propertyDef.setMultiple(true); propertyDef.setRequiredType(PropertyType.REFERENCE); propertyDef.setOnParentVersion(OnParentVersionAction.COPY); propertyDef.setProtected(false); nodeType.getPropertyDefinitionTemplates().add(propertyDef); manager.registerNodeType(nodeType, true); final String USER_NAME = "Paul"; final Node userNode = session.getRootNode().addNode(USER_NAME, "nt:folder"); userNode.addMixin(FRIENDLY); session.save(); final QueryManager queryManager = session.getWorkspace().getQueryManager(); final String expression = "SELECT grantee.* FROM [tt:friendly] as grantor " + "INNER JOIN [tt:friendly] as grantee ON grantor.[tt:friend] = grantee.[jcr:uuid] "; final QueryResult queryResult = queryManager.createQuery(expression, "JCR-SQL2").execute();
but not if I comment the line adding the mixin
userNode.addMixin(FRIENDLY);
Without adding a node with the "tt:friendly" mixin, the query runs fine.
Any idea?
Thanks