如何在 jackrabbit 中正确添加版本控制节点
How to properly add versionable nodes in jackrabbit
我在 tomcat 和 java 1.7 上的 j2ee 应用程序中使用 Jackrabbit 2.0。
我想至少在根节点下对用户节点进行版本控制,在可版本化的课程节点下进行版本控制,在可版本化的文件卡节点下进行版本控制。每个 lesson- 和 filecardnode 都持有一个序列化对象 属性。
我能够恢复每一个,但我希望在给定版本的 lessonnode 下接收到一个 frozennode,它保存所有 filecardnodes 到那个时候....但是如果我在上面搜索子节点,则没有子节点。
任何建议我做错了什么,或者我可能理解规格中的错误。
这就是我保存节点的方式:
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();
}
如有任何帮助,我们将不胜感激....提前致谢!
如果您希望能够检索版本化节点的子节点,则必须仅使父节点可版本化。
当您将父项 和子项 设置为可版本化时,它们将存储为单独的 version
,因此它们之间没有 link。如果您 想让它们都可以版本化,那么您必须添加自己的属性才能 link 特定版本的 filecardnode
具有特定版本的 filecardnode
lessionnode
.
我在 tomcat 和 java 1.7 上的 j2ee 应用程序中使用 Jackrabbit 2.0。 我想至少在根节点下对用户节点进行版本控制,在可版本化的课程节点下进行版本控制,在可版本化的文件卡节点下进行版本控制。每个 lesson- 和 filecardnode 都持有一个序列化对象 属性。 我能够恢复每一个,但我希望在给定版本的 lessonnode 下接收到一个 frozennode,它保存所有 filecardnodes 到那个时候....但是如果我在上面搜索子节点,则没有子节点。 任何建议我做错了什么,或者我可能理解规格中的错误。
这就是我保存节点的方式:
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();
}
如有任何帮助,我们将不胜感激....提前致谢!
如果您希望能够检索版本化节点的子节点,则必须仅使父节点可版本化。
当您将父项 和子项 设置为可版本化时,它们将存储为单独的 version
,因此它们之间没有 link。如果您 想让它们都可以版本化,那么您必须添加自己的属性才能 link 特定版本的 filecardnode
具有特定版本的 filecardnode
lessionnode
.