JCR 实现的移植性已经做了许多工作。它促进移植性的方式之一就是使用标准的 XML 导入和导出特性。通过使用这些工具,符合规范的供应商仓库内容可以很容易地转移到另一个符合规范的供应商仓库。使用 XML 进行序列化的另一个优势是:可以用传统的 XML 解析工具操纵导出的仓库。只要用清单 11 的三行代码就可以执行导出:
清单 11. 导出数据
File outputFile = new File("systemview.xml");
FileOutputStream out = new FileOutputStream(outputFile);
session.exportSystemView("/wiki:encyclopedia", out, false, false);
然后可以把生成的 XML 文件转移给另一个新仓库,如清单 12 所示:
清单 12. 转移数据
File inputFile = new File("systemview.xml");
FileInputStream in = new FileInputStream(inputFile);
session.importXML
("/", in, ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW);
session.save();
添加二进制内容
直到现在,一直都是用 StringValue 表示属性和节点。但是 JCR 还支持其他类型,包括布尔型和长整型。清单 13 演示了 JCR 中可使用的流类型,可在节点中保存二进制图片。在这个清单中,可将文件 rose.gif 作为元数据添加到 nt:file 节点中。文件数据本身被保存为 nt:resource 子节点。
清单 13. 添加二进制内容
File file = new File("rose.gif");
MimeTable mt = MimeTable.getDefaultTable();
String mimeType = mt.getContentTypeFor(file.getName());
if (mimeType == null) mimeType = "application/octet-stream";
Node fileNode = roseMode.addNode(file.getName(), "nt:file");
Node resNode = fileNode.addNode("jcr:content", "nt:resource");
resNode.setProperty("jcr:mimeType", mimeType);
resNode.setProperty("jcr:encoding", "");
resNode.setProperty("jcr:data", new FileInputStream(file));
Calendar lastModified = Calendar.getInstance();
lastModified.setTimeInMillis(file.lastModified());
resNode.setProperty("jcr:lastModified", lastModified);
在使用 MimeTable 类确定了内容类型之后,用 FileInputStream 装入文件。这个问题很简单,只要给 nt:resource 节点类型添加命名正确的属性即可,属性包含实际的文件数据。
Java Content Repository API简介(10)
时间:2011-06-25 IBM Titus Barik
版本管理
JSR-170 支持许多可选特性,包括访问控制、事务、锁定和版本管理。这些特性本身都可以是个完整的主题,所以我必须简要地总结一下,只介绍它们当中最流行的那一个:版本管理。在最简单的情况下,只需将 mix:versionable 混合类型添加到任何节点,就可以执行版本管理。在节点上,可以用一组类似 CVS 操作的方法实现版本管理,如清单 14 所示:
清单 14. 版本管理方法
n.checkout();
n.setProperty("wiki:content", "Updated content for the entry.");
n.save();
n.checkin();
JCR 中的其他操作包括:更新、合并和恢复以前版本。要浏览指定节点的整个版本历史,可以通过清单 15 中的步骤进行:
清单 15. 浏览版本历史
VersionHistory vh = n.getVersionHistory();
VersionIterator vi = vh.getAllVersions();
vi.skip(1);
while (vi.hasNext()) {
Version v = vi.nextVersion();
NodeIterator ni = v.getNodes();
while (ni.hasNext()) {
Node nv = ni.nextNode();
Sys
|