2010-07-20 1 views

ответ

3

Я не эксперт в области управления версиями Jackrabbit, но насколько я знаю, нет простого способа найти такой узел, если вы не знаете некоторые его данные. Если вы это знаете, вы можете использовать запрос и перейти к следующему родительскому экземпляру, являющемуся экземпляром javax.jcr.version.Version, и восстановить его. Если вы этого не знаете, вам нужно перебирать хранилище версий и распечатывать все данные. Вы можете отфильтровать узлы, которые не удалены, но в противном случае это ручное задание, потому что путь узла не сохраняется в хранилище версии (если вы не добавите свойство, содержащее путь). Ниже приведен пример того, как перечислять все узлы в хранилище версий. Он восстановит последнее javax.jcr.version.Version, которое он находит:

import javax.jcr.Node; 
import javax.jcr.NodeIterator; 
import javax.jcr.Property; 
import javax.jcr.PropertyIterator; 
import javax.jcr.Session; 
import javax.jcr.SimpleCredentials; 
import javax.jcr.version.Version; 
import javax.jcr.version.VersionManager; 
import org.apache.jackrabbit.core.TransientRepository; 
public class TestRestoreDeleted { 
    public static void main(String... args) throws Exception { 
     TransientRepository rep = new TransientRepository(); 
     Session s = rep.login(
       new SimpleCredentials("", new char[0])); 
     try { 
      // clear the repository first 
      if (s.getRootNode().hasNode("test")) { 
       s.getRootNode().getNode("test").remove(); 
       s.save(); 
      } 
      // add test/t1 and check in the change 
      Node test = s.getRootNode().addNode("test"); 
      Node t1 = test.addNode("t1"); 
      t1.addMixin("mix:versionable"); 
      s.save(); 
      VersionManager vm = s.getWorkspace(). 
        getVersionManager(); 
      for(int i=0; i<3; i++) { 
       vm.checkout("/test/t1"); 
       t1.setProperty("data", "Hello" + i); 
       s.save(); 
       vm.checkin("/test/t1"); 
      } 
      // remove the node 
      t1.remove(); 
      s.save(); 
      // list all versions of all nodes in the repository 
      Node vs = s.getRootNode(). 
        getNode("jcr:system"). 
        getNode("jcr:versionStorage"); 
      Version v = traverseVersionStorage(vs, 0); 
      // restore a version 
      vm.restore("/test/t1", v, false); 
      // get the node and print the data 
      t1 = s.getRootNode(). 
        getNode("test").getNode("t1"); 
      System.out.println("Restored: " + 
        t1.getProperty("data").getString()); 
     } finally { 
      s.logout(); 
     } 
    } 

    private static Version traverseVersionStorage(
      Node n, int level) throws Exception { 
     Version v = null; 
     for (NodeIterator it = n.getNodes(); it.hasNext();) { 
      Node n2 = it.nextNode(); 
      if (n2 instanceof Version 
        && !n2.getName().startsWith("jcr:")) { 
       v = (Version) n2; 
       System.out.println("version " + n2.getName() + 
         " of node " + n2.getParent().getName() + ":"); 
       Node n3 = n2.getNode("jcr:frozenNode"); 
       for (PropertyIterator pt = 
          n3.getProperties(); pt.hasNext();) { 
        Property p = pt.nextProperty(); 
        if (!p.getName().startsWith("jcr:")) { 
         System.out.println(" " + p.getName() + "=" 
           + (p.isMultiple() ? p.getValues().toString() 
             : p.getValue().getString())); 
        } 
       } 
       System.out.println(); 
      } 
      Version v2 = traverseVersionStorage(n2, level + 1); 
      v = v == null ? v2 : v; 
     } 
     return v; 
    } 

} 
Смежные вопросы