设为首页 收藏本站
查看: 891|回复: 0

[经验分享] Apache Jackrabbit入门

[复制链接]

尚未签到

发表于 2016-12-30 08:55:17 | 显示全部楼层 |阅读模式
  产品里需要包含一个文档(内容)管理的功能,找了一些开源的:
  KnowledgeTree,Alfresco,OpenKM。
经过试用,相中了OpenKM的各种功能。
但是--公司的产品前台是swing(已经好多年了,不是我能改变的),而OpenKM是web的,如果直接嵌入(把浏览器嵌入swing中),登陆、权限控制等是个大问题,而且以后扩展起来也比较麻烦,后患无穷啊。。。
看了下介绍,OpenKM是基本Apache Jackrabbit引擎实现的,那我们能不能直接用Jackrabbit来做后台,swing做前台呢?
贴一段Apache Jackrabbit的简介,来自http://www.oschina.net/p/jackrabbit
Apache Jackrabbit 是由 Apache Foundation 提供的 JSR-170 的开放源码实现..

随着内容管理应用程序的日益普及,对用于内容仓库的普通、标准化 API 的需求已凸现出来。Content Repository for Java Technology API (JSR-170) 的目标就是提供这样一个接口。JSR-170 的一个主要优点是,它不绑定到任何特定的底层架构。例如,JSR-170 实现的后端数据存储可以是文件系统、WebDAV 仓库、支持 XML 的系统,甚至还可以是 SQL 数据库。此外,JSR-170 的导出和导入功能允许一个集成器在内容后端与 JCR 实现之间无缝地切换。

----------------------------------------------------------------------
注:上面说的JSR-170指jcr1.0,而现在已经是jsr283了--jcr2.0了

官方主页:
http://jackrabbit.apache.org/

Jackrabbit的资料相对比较少,就找到这么一篇比较详细的,但时间是2006年的,当时还是jcr1.0
http://www.ibm.com/developerworks/cn/java/j-jcr/

不管怎么样,试试吧。
下载2.4的源代码,maven2编译一下。

把jar包导入到新建的工程中。

然后根据文章说的,照猫画虎,折腾2个小时,终于搞定了。
过程:
  1.初始化仓库。

// 初始化
String configFile = "F:\\jackrabbit_repository\\repository.xml";
String repHomeDir = "F:\\jackrabbit_repository\\repository";
Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.INITIAL_CONTEXT_FACTORY,
DummyInitialContextFactory.class.getName());
env.put(Context.PROVIDER_URL, "localhost");
InitialContext ctx = new InitialContext(env);
RegistryHelper.registerRepository(ctx, "repo", configFile, repHomeDir,
true);
Repository r = (Repository) ctx.lookup("repo");
  2.登陆,这里注意一点,需要以管理员的身份登陆,否则很多操作都没有权限,默认用户名和密码都是admin

Repository r = (Repository) ctx.lookup("repo");
// 登陆
SimpleCredentials cred = new SimpleCredentials("admin",
"admin".toCharArray());
Session session = r.login(cred, null);
  3.注册工作区命名空间

  // 根节点
Node rn = session.getRootNode();
// 注册命名空间
Workspace ws = session.getWorkspace();
ws.getNamespaceRegistry().registerNamespace("wiki",
"http://localhost/wiki/1.0");
  4.增加内容。

Node encyclopedia = rn.addNode("wiki:encyclopedia");
Node p = encyclopedia.addNode("wiki:entry");
p.setProperty("wiki:title", toStringValue("rose"));
p.setProperty("wiki:content",
toStringValue("A rose is a flowering shrub."));
p.setProperty("wiki:category", new Value[] { toStringValue("flower"),
toStringValue("plant"), toStringValue("rose") });
Node n = encyclopedia.addNode("wiki:entry");
n.setProperty("wiki:title", toStringValue("Shakespeare"));
n.setProperty("wiki:content",
toStringValue("A famous poet who likes roses."));
n.setProperty("wiki:category", toStringValue("poet"));
// 保存
session.save();
  可以看出,里面是以属性结构存储的,可以想象出修改和删除的操作了吧。
  无非是root.getNode(),然后修改或者删除就可以了,当然,最后别忘了保存
  5.看个查找的例子吧

// 查找
QueryManager qm = ws.getQueryManager();
Query q = qm.createQuery(
"//wiki:encyclopedia/wiki:entry[@wiki:title = 'rose']",
Query.XPATH);// deprecated
QueryResult result = q.execute();// 执行查询
NodeIterator it = result.getNodes();
// 然后就可以了遍历了
while (it.hasNext()) {
Node entry = it.nextNode();
// 简单的输出,后面会有输出详细内容的方法
System.out.println(entry.toString());
}
  6。前面都是字符串的,如果想存文件怎么办?
  大家注意到,setProperty有个String,InputStream参数的,对,就是它了。

// 加入文件
File file = new File("f:\\2012-03-07_111233.png");
MimeTable mt = MimeTable.getDefaultTable();
String mimeType = mt.getContentTypeFor(file.getName());
if (mimeType == null) {
mimeType = "application/octet-stream";
}
Node fileNode = rn.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);
// 保存
session.save();
  写完后,可以运行,但编译器警告:deprecated
  那用什么代替呢?
  查看了jcr2.0,使用setPropery(String,Binary)代替

Binary fileBinary = new BinaryImpl(new FileInputStream(file));
resNode.setProperty("jcr:data", fileBinary);
   7.由于是树形结构,我们可以递归打出所有的信息:

private static void printAll(Node node) throws RepositoryException {
printFormat(node.toString());
PropertyIterator propertys = node.getProperties();
while (propertys.hasNext()) {
Property entry = propertys.nextProperty();
if (entry.isMultiple()) {
Value[] values = entry.getValues();
if (values == null) {
continue;
}
for (Value v : values) {
printFormat(v.getString());
}
} else {
printFormat(entry.getValue().getString());
}
}
NodeIterator entries = node.getNodes();
while (entries.hasNext()) {
Node entry = entries.nextNode();
printAll(entry);
}
}
   完整代码见附件
  另外附件中的jcr2.0.jar就是jcr2.0的规范接口,编译后的
jackrabbit 是不带的(我找了好几个地方才找到)



由于目前最新版本已经使用了jcr2.0,所以有必要看一下2.0与1.0的区别:
API Differences between jcr-1.0 and jcr-2.0
http://www.day.com/maven/jdiff-jcr1-jcr2/changes.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-321351-1-1.html 上篇帖子: apache,tomcat ,loadbalance 下篇帖子: Apache 分割日志
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表