java - 如何在 jackrabbit 中正确添加版本控制节点

标签 java jakarta-ee nodes versioning jackrabbit

我在 tomcat 上的 j2ee 应用程序中使用 Jackrabbit 2.0 和 java 1.7。 我想至少在根节点下创建一个用户节点,在该节点下创建一个可版本化的类(class)节点,在该节点下创建一个可版本化的文件卡节点。每个类(class)和文件卡节点都持有一个序列化对象作为属性。 我能够恢复每一个,但我期望在给定版本的类(class)节点下收到一个卡住节点,该节点保存当时的所有文件卡节点......但是如果我搜索子节点,则没有子节点。 任何建议我做错了什么,或者我可能理解规范中有问题。

这就是我保存节点的方式:

    public Node insertNewLessonNode(String userID, LessonEntity lessonEntity,
        Session session) throws PathNotFoundException, RepositoryException,
        IOException {
    //that adds a usernode if not there already 
    Node userNode = handleLessonParentNodes(lessonEntity, userID, session);

    Node lessonNode = userNode.addNode(LESSON
            + lessonEntity.getID(), "nt:unstructured");
    lessonNode.addMixin("mix:versionable");
    lessonNode.setProperty("id", lessonEntity.getID());
    lessonNode.setProperty("data", JRUtils.serializObject(lessonEntity));
    session.save();
    session.getWorkspace().getVersionManager()
            .checkin(lessonNode.getPath());

    System.out.println("Lesson "
            + session.getWorkspace().getVersionManager()
                    .getBaseVersion(lessonNode.getPath()));

    return lessonNode;
}

public Node insertNewFileCardNode(Node lessonNode,
        FileCardEntity fileCardEntity, String userID, Session session)
        throws UnsupportedRepositoryOperationException,
        RepositoryException, IOException {

    nodeCheckout(lessonNode, session);

    Node fileCardNode = null;
    fileCardNode = lessonNode.addNode(FILECARD + fileCardEntity.getID(),
            "nt:unstructured");
    fileCardNode.addMixin("mix:versionable");

    fileCardNode
            .setProperty("data", JRUtils.serializObject(fileCardEntity));
    session.save();
    session.getWorkspace()
            .getVersionManager()
            .checkin(
                    lessonNode.getPath() + DEL + FILECARD
                            + fileCardEntity.getID());

    System.out.println("FileCard "
            + session
                    .getWorkspace()
                    .getVersionManager()
                    .getBaseVersion(
                            lessonNode.getPath() + DEL + FILECARD
                                    + fileCardEntity.getID()));

    return fileCardNode;
}

这就是我恢复它的方法:

     public void restoreLesson(String lessonId,
        String userID, String versionName) throws SQLException, VersionException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
    Session session = JRRepository.getInstance().getSession();
    String userNodePath = session.getRootNode().getNode(USER + userID)
            .getPath();
    String absPath = userNodePath + DEL + LESSON+lessonId;
    VersionHistory versionHistory = session.getWorkspace()
            .getVersionManager().getVersionHistory(absPath);
    VersionIterator iterator = versionHistory.getAllVersions();




    LessonEntity lessonEntity = null;

    while (iterator.hasNext()) {
        Version version = (Version) iterator.next();
        if (version.getName().equals(versionName)) {
            Node frozenNode = version.getFrozenNode();
            Value value = frozenNode.getProperty("data").getValue();

            //here i expect a few of my filecardnodes...but theres nothin...
            //i tried already with differened searchpatterns
            for (NodeIterator iterator3 = frozenNode.getNodes("nt:unstructured"); iterator3.hasNext();) {
                Node type = (Node) iterator3.next();
                System.out.println(type.getName());
            }

            Object ob = JRUtils.deSerializeObject(value.getBinary());

            lessonEntity = (LessonEntity) ob;

        }
    }

    session.getWorkspace().getVersionManager()
            .restore(absPath, versionName, false);
    List<LessonEntity> updateList = new ArrayList<LessonEntity>();
    lessonEntity.setLastModified(new Date());
    updateList.add(lessonEntity);
    lessonDao.updateLessons(updateList, userID);

    session.logout();

}

任何帮助将不胜感激......提前致谢!

最佳答案

如果您希望能够检索版本化节点的子级,则必须仅使父级可版本化。

当您使父级子级可版本化时,它们将存储为单独的版本,因此它们之间没有链接。如果您确实想让它们都可版本化,那么您必须添加自己的属性,以便将特定版本的 filecardnode 与特定版本的 lessionnode 链接起来.

关于java - 如何在 jackrabbit 中正确添加版本控制节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29671729/

相关文章:

java Runtime.getRuntime().availableProcessors() 和 nproc 返回不同的值

java - 打开 Android 图片库

java - 如何从action类发送值并在jsp页面中查看

java - 单击recyclerView新 Activity 尝试调用虚拟方法时出错

java - HTTP 请求是通过 TCP 还是 UDP 接收的?

c - 尝试更改链表节点中的数据

java - EJB 3.1 绑定(bind)在 Websphere Application Server 上不起作用

java - 如何在 servlet 线程中获取新的有状态 session bean?

c# - 如何获取 SelectedItem 的所有子项

c - 关于结构体指针及其工作原理