Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Node getBaseVersion causes Exception after node removal #954

Closed
wants to merge 1 commit into from

Conversation

alexpanov
Copy link

When a versioned node gets removed it still can be found by identifier (should it be?).
More importantly node.getBaseVersion() causes UnsupportedRepositoryOperationException like this:
javax.jcr.UnsupportedRepositoryOperationException: This operation requires that the node be versionable (that is, isNodeType("mix:versionable") == true)
at org.modeshape.jcr.AbstractJcrNode.getBaseVersion(AbstractJcrNode.java:3264)
at org.modeshape.jcr.JcrSystemNode.getBaseVersion(JcrSystemNode.java:33)
at org.modeshape.jcr.GetBaseVersionAfterNodeRemovalTest.testName(GetBaseVersionAfterNodeRemovalTest.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
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.rules.RunRules.evaluate(RunRules.java:18)
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.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

@hchiorean
Copy link
Member

Because a versionable node should be able to be restored even if removed, ModeShape uses the same ID to store the version history of the node. Even after the node is removed, the versionHistory still exists.

Therefore, when performing a session.getNodeByIdentifier after the node has been removed, ModeShape will return the versionHistory for that node which explains the reason for the exception - you should not be allowed to call getBaseVersion on a versionHistory instance.

IMO this is not a bug, but rather an invalid versioning usage scenario.

@rhauch thoughts ?

@alexpanov
Copy link
Author

I could argue that it is not a good thing that accessing removed node is done with the same method that one regularly retrieves them with, but at least the message is very misleading.

@hchiorean
Copy link
Member

According to the spec javadoc from getBaseVersion():

   @throws UnsupportedRepositoryOperationException  if this node is not versionable

@hchiorean
Copy link
Member

@madmeat can you please open a JIRA issue and attach this PR to it ?

It's unclear atm. what the exact issue you're reporting is: is it the exception message, the fact that getNodeByIdentifier() retrieves the node or something else. It can be argued that the getNodeByIdentifier() should not return a version history.

Thanks

@hchiorean
Copy link
Member

@madmeat: I've opened https://issues.jboss.org/browse/MODE-2055 and we will fix the behavior of session.getNodeByIdentifier

@hchiorean
Copy link
Member

Closing, as this issue has been addressed in #956

@hchiorean hchiorean closed this Sep 25, 2013
@VyacheslavPolulyakh VyacheslavPolulyakh deleted the EDOC-771 branch February 3, 2015 17:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants