You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jackrabbit.apache.org by herbert <io...@gmx.de> on 2009/09/17 16:44:50 UTC

Removing a set of nodes via NodeIterator fails

Hi!

I'm quite new to Jackrabbit and have a problem deleting nodes in my
repository with jackrabbit 1.6.0.

Here's the problem-point in my code:

NodeIterator itTestNodes = result.getNodes();
while (itTestNodes.hasNext()) {
  Node testNode = itTestNodes.nextNode();
  System.out.println("Deleting Node " +testNode.getName());
  testNode.remove();	
}
session.save();

I iterate over a collection of nodes. After the first iteration has
completed, testNode references to the second node in NodeIterator and I get
an InvalidItemStateException "the item does not exist anymore" when
testNode.getName() is executed.

Where is my error? (full code and exception appended.)

Herbert


*********************************************************************

The full code:

Context context = new InitialContext();
ClientAdapterFactory adapter = new ClientAdapterFactory();
RemoteRepository rr = (RemoteRepository)
context.lookup("jnp://localhost:1099/jcrServer");
Repository repository = adapter.getRepository(rr);
Session session = repository.login(new SimpleCredentials("user",
"password".toCharArray()), "default");

QueryManager qm = session.getWorkspace().getQueryManager();
Query query = qm.createQuery("//*", Query.XPATH);
QueryResult result = query.execute();

NodeIterator itTestNodes = result.getNodes();
while (itTestNodes.hasNext()) {

  Node testNode = itTestNodes.nextNode();
  System.out.println("Examining Node " +testNode.getName());
  if (testNode.getName().startsWith("TEST")) {
	System.out.println("Deleting Node " +testNode.getName());
	testNode.remove();	
  }
}

session.save();
session.logout();

*********************************************************************

The exception:

javax.jcr.InvalidItemStateException: 7ccb179d-8830-48ad-91d8-cb6726a29b2e:
the item does not exist anymore
	at
org.apache.jackrabbit.rmi.server.ServerObject.getRepositoryException(ServerObject.java:104)
	at org.apache.jackrabbit.rmi.server.ServerItem.getName(ServerItem.java:71)
	at sun.reflect.GeneratedMethodAccessor332.invoke(Unknown Source)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
	at sun.rmi.transport.Transport$1.run(Transport.java:153)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
	at
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
	at java.lang.Thread.run(Thread.java:595)
	at
sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
	at
sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:126)
	at org.apache.jackrabbit.rmi.server.ServerNode_Stub.getName(Unknown Source)
	at org.apache.jackrabbit.rmi.client.ClientItem.getName(ClientItem.java:85)
	at de.firma.deleteTestNodes2(TestMeta.java:96)
	at de.firma.tearDown(TestMeta.java:74)
	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:585)
	at org.junit.internal.runners.ClassRoadie.runAfters(ClassRoadie.java:65)
	at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:40)
	at
org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
	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)


*********************************************************************
-- 
View this message in context: http://www.nabble.com/Removing-a-set-of-nodes-via-NodeIterator-fails-tp25491923p25491923.html
Sent from the Jackrabbit - Users mailing list archive at Nabble.com.


Re: Removing a set of nodes via NodeIterator fails

Posted by Alexander Klimetschek <ak...@day.com>.
On Thu, Sep 17, 2009 at 16:44, herbert <io...@gmx.de> wrote:
> I iterate over a collection of nodes. After the first iteration has
> completed, testNode references to the second node in NodeIterator and I get
> an InvalidItemStateException "the item does not exist anymore" when
> testNode.getName() is executed.
>
> Where is my error? (full code and exception appended.)

Since you query the whole repository, ie. iterate over all nodes, you
might be deleting first a node that is a parent of the second one
(because removal deletes the whole subtree as well). In this case you
get an InvalidItemStateEx, as the Node object is still there but
points to a node that no longer exists (in the transient space).

Regards,
Alex

-- 
Alexander Klimetschek
alexander.klimetschek@day.com