2017-09-16 2 views
1

ich einen Knoten in Hasen session.getWorkspace().copy(sourceNode.getPath(), destinationNode.getPath())Node Identifier des kopierten Knoten in Hasen nicht gefunden beim Löschen

Dieser Vorgang Änderungen beibehalten werden sofort soweit ich weiß mit kopiert. Aber als ich versuchte, den kopierten Knoten zum Löschen mit session.getNodeByIdentifier("nodeId of copied node") zu bekommen, gibt es ItemNotFoundException. Der Grund für diesen Fehler ist, dass der kopierte Knoten während der Kopie die Eigenschaft mix:referenceable verliert, wodurch getNodeByIdentifier fehlschlägt.

Die Frage ist, wie setze ich die mix:referenceable Eigenschaft zu kopierten Knoten, da ich nicht in der Lage bin, den Knoten von Sitzung nach Kopiervorgang zu erhalten. Könnte mir jemand dabei helfen?

UPDATE:

CODE:

Node srcNode = session.getNodeByIdentifier("SOURCE_NODE_ID"); 
    if(srcNode == null) { 
     System.out.println("File not found"); 
    } 

    Node rootNode = session.getRootNode(); 
    Node appNode = rootNode.getNode("JACKRABBIT"); 
    Node destNode = appNode.addNode("Copy_Test_"+System.currentTimeMillis(),"nt:file"); 

    session.getWorkspace().copy(srcNode.getPath(),destNode.getPath()); 
    destNode.addMixin(MIX_VERSIONABLE); 
    destNode.addMixin(MIX_LOCKABLE); 
    destNode.addMixin(MIX_REFERENCEABLE); 
    destNode.addNode(DMSConstants.RESOURCE_NODE,"nt:unstructured"); 
    session.refresh(true); 
    session.save(); 

EXCEPTION:

Exception in thread "main" javax.jcr.InvalidItemStateException: Es konnte keine abgestanden Artikel aktualisieren: item.save() bei org.apache.jackrabbit.rmi.server.ServerObject.getRepositoryException (ServerO bject.java:111) bei org.apache.jackrabbit.rmi.server.ServerSession.save (ServerSession.java:265) bei sun.reflect.NativeMethodAccessorImpl.invoke0 (native Methode) bei sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) bei sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) bei java.lang.reflect.Method.invoke (Method.java:498) bei sun.rmi.server.UnicastServerRef .dispatch (UnicastServerRef.java:346) bei sun.rmi.transport.Transport $ 1.run (Transport.java:200) bei sun.rmi.transport.Transport $ 1.run (Transport.java:197) bei java .security.AccessController.doPrivileged (Native Methode) bei sun.rmi.transport.Transport.serviceCall (Transport.java:196) unter sun.rmi.transport.tcp.TCPTransport.handleMessages (TCPTransport.java:568) unter sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0 (TCPTransport.java:826) bei sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.lambda $ run $ 0 (TCPTransport.java:683) unter java.security.AccessController.doPrivileged (Native Methode) unter sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler. run (TCPTransport.java:682) bei java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) bei java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) auf Java. lang.Thread.run (Thread.java:748) unter sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer (StreamRemoteC all.java:276) bei sun.rmi.transport.StreamRemoteCall.executeCall (StreamRemoteCall.java:253) bei sun.rmi.server.UnicastRef.invoke (UnicastRef.java:162) bei org.apache.jackrabbit. rmi.server.ServerXASession_Stub.save (Unknown Source) bei org.apache.jackrabbit.rmi.client.ClientSession.save (ClientSession.java:272)

Bitte beachten Sie, dass ich JCR bin auch mit 2.0, wenn ich Ändern Sie den Code in session.refresh(false), der Code funktioniert gut, aber ich bin nicht in der Lage, die Knoten-ID aus der Sitzung zum Löschen der gleichen, die mein ursprüngliches Problem ist.

Antwort

1

Warum erstellen Sie einen Knoten am Zielort und kopieren ihn dann an die gleiche Stelle? Ich glaube, dass die veraltete Ausnahme ist, weil der Aufruf an copy den zugrunde liegenden Knoten aktualisiert hat, der Ihre destNode Referenz veraltet/veraltet macht.

Entfernen Sie einfach die addNode dann etwas tun, wie ...

String destPath = "Copy_Test_" + System.currentTimeMillis()"; 
session.getWorkspace().copy(srcNode.getPath(), destPath); 
Node destNode = session.getPath(destPath); 
+0

Ich crackte es irgendwann zurück. Danke für die Antwort wie. – Gandhi

0

Wie @TedTrippin die Frage vor dem Kopieren mit der Erstellung eines Zielknoten darauf hingewiesen wurde, die nicht erforderlich war. Als Teil der Kopie wird der Knoten erstellt. Also mein abschließender Arbeitscode ist wie folgt:

Node srcNode = session.getNodeByIdentifier("SOURCE_NODE_ID"); 
if(srcNode == null) { 
    System.out.println("File not found"); 
} 

Node rootNode = session.getRootNode(); 
Node appNode = rootNode.getNode("JACKRABBIT");  
String destNodeName = "Copy_Test"; 
session.getWorkspace().copy(srcNode.getPath(),appNode.getPath() + "/" + destNodeName); 
Node destNode = appNode.getNode(destNodeName); 
destNode.addMixin(MIX_VERSIONABLE); 
destNode.addMixin(MIX_LOCKABLE); 
destNode.addMixin(MIX_REFERENCEABLE);  
session.refresh(true); 
session.save(); 
Verwandte Themen