[
https://jira.jboss.org/jira/browse/DNA-518?page=com.atlassian.jira.plugin...
]
Brian Carothers updated DNA-518:
--------------------------------
Attachment: DNA-518_2.patch
The previous patch fixed the originally declared issue, but exposed a few regressions.
The attached patch fixes most of those regressions and corrects a significant design flaw
in the original locking implementation (using jcr:uuid to refer to another nodes uuid).
However, this patch does not correct two key defects. JCR imports (session and workspace)
that include collisions with existing nodes that share a UUID will fail if the
removeExisting flag is set to true. There is also a minor defect with moving locked nodes
on this connector.
Since the original defect is addressed, this defect can be resolved and two new defects
can be opened for the other regressions.
JPA connector fails to properly clone or update from another
workspace
----------------------------------------------------------------------
Key: DNA-518
URL:
https://jira.jboss.org/jira/browse/DNA-518
Project: DNA
Issue Type: Bug
Components: Connectors, JCR, Testing
Affects Versions: 0.6
Reporter: Randall Hauch
Assignee: Randall Hauch
Priority: Blocker
Fix For: 0.7
Attachments: DNA-518.patch, DNA-518_2.patch
The JPA connector's implementation of CloneBranchRequest is not correct when cloning
from another workspace. This is used in the JCR API in the 'Node.update(String
workspaceName)' method as well as the 'Workspace.clone( String srcWorkspace,
String srcAbsPath, String destAbsPath, boolean removeExisting )'.
The problem appears to be that the removeExisting behavior only works by comparing exact
UUIDs, whereas the removeExisting behavior (for clone) really should apply only to the
specified path. Yes, any existing nodes with the same UUIDs should be removed, but
certainly if 'removeExisting' is true any existing node at the desired location
for the clone should be removed as well.
This was discovered because the TCK tests are failing when they're run against a
repository using the JPA connector (both against HSQLDB and PostgreSQL):
JpaRepositoryTckTest
Tests for jpa(read-write)
org.apache.jackrabbit.test.api.NodeTest
testUpdate(org.apache.jackrabbit.test.api.NodeTest)
java.lang.IllegalArgumentException: The last segment of the actual location of
</{}testroot/{}node1[2] && [{http://www.jboss.org/dna/1.0}uuid =
c3863875-6422-46ee-b47f-5a12547e27d8]> does not have the requested child segment
{}node1
at
org.jboss.dna.graph.request.CloneBranchRequest.setActualLocations(CloneBranchRequest.java:199)
at
org.jboss.dna.connector.store.jpa.model.basic.BasicRequestProcessor.process(BasicRequestProcessor.java:1672)
at
org.jboss.dna.graph.request.processor.RequestProcessor.process(RequestProcessor.java:261)
at
org.jboss.dna.graph.request.processor.RequestProcessor.process(RequestProcessor.java:298)
at
org.jboss.dna.graph.request.processor.RequestProcessor.process(RequestProcessor.java:219)
at org.jboss.dna.connector.store.jpa.JpaConnection.execute(JpaConnection.java:150)
at
org.jboss.dna.graph.connector.federation.ForkRequestProcessor$Channel$3.call(ForkRequestProcessor.java:318)
at
org.jboss.dna.graph.connector.federation.ForkRequestProcessor$Channel$3.call(ForkRequestProcessor.java:308)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:637)
org.apache.jackrabbit.test.api.WorkspaceCloneReferenceableTest
testCloneNodesRemoveExistingTrue(org.apache.jackrabbit.test.api.WorkspaceCloneReferenceableTest)
junit.framework.AssertionFailedError: null
at junit.framework.Assert.fail(Assert.java:47)
at junit.framework.Assert.assertTrue(Assert.java:20)
at junit.framework.Assert.assertFalse(Assert.java:34)
at junit.framework.Assert.assertFalse(Assert.java:41)
at
org.apache.jackrabbit.test.api.WorkspaceCloneReferenceableTest.testCloneNodesRemoveExistingTrue(WorkspaceCloneReferenceableTest.java:81)
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 junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at org.apache.jackrabbit.test.AbstractJCRTest.run(AbstractJCRTest.java:406)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:81)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira