`
suigara
  • 浏览: 81919 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Apache Jackrabbit入门

 
阅读更多

产品里需要包含一个文档(内容)管理的功能,找了一些开源的:

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 楼 pls890429 2012-10-23  
很清楚。谢谢,

相关推荐

    jackrabbit最全入门教程

    杰克兔(Jackrabbit)是Apache软件基金会的一个开源项目,它是Java Content Repository(JCR)规范的一个实现。JCR是一种标准接口,定义了如何在内容管理系统中存储、检索和管理结构化和非结构化数据。这个...

    jackrabbit:Apache Jackrabbit的镜像

    Apache Jackrabbit 是一个开源的、实现了Java Content Repository (JCR) API的内容管理系统,它是一个标准接口,用于在各种存储系统中管理和访问结构化和非结构化数据。Jackrabbit 提供了一个全面的、基于文件系统的...

    Jackrabbit入门实例

    Apache Jackrabbit是一个开源的、实现了Java Content Repository (JCR) API的内容管理系统,它允许开发者创建、管理和查询结构化和非结构化的数据。JCR是Java社区制定的一个标准,旨在为各种应用程序提供统一的数据...

    jackrabbit2.6

    Apache Jackrabbit 2.6 是一个开放源代码的、基于Java的内容管理系统(CMS),它实现了JCR(Java Content Repository)规范,提供了一种用于存储、管理和检索非结构化数据的标准接口。Jackrabbit 提供了一个高性能、...

    jackrabbit-filevault:Apache Jackrabbit FileVault

    欢迎使用Apache Jackrabbit FileVault FileVault将JCR存储库引入了文件系统映射。 该映射由API公开,并由“ FileVault Content Packages”使用,后者允许创建存储库内容的可移植软件包。 Vault命令行界面(又称“ ...

    Jackrabbit API

    Apache Jackrabbit API 是一个强大的内容管理系统(CMS)的核心组件,它是Apache Software Foundation 开发的Java Content Repository (JCR) 的实现。JCR 是一个标准,它定义了一个用于存储、管理和检索结构化内容的...

    jackrabbit-webdav-2.7.1.zip

    标题中的"jackrabbit-webdav-2.7.1.zip"指的是Apache Jackrabbit的一个特定版本——2.7.1的WebDAV模块的压缩包。Apache Jackrabbit是Java内容存储库(Content Repository)的一个实现,它遵循JCR(Java Content ...

    Jackrabbit Oak 是一个可扩展的高性能分层内容存储库,旨在用作现代世界级网站和其他要求苛刻的内容应用程序的基础

    Jackrabbit Oak 是一种可扩展的高性能分层内容 专为现代世界级基础而设计的存储库 网站和其他要求苛刻的内容应用程序。Oak 工作是 Apache Jackrabbit 项目的一... Apache Jackrabbit 是 Apache 软件基金会的一个项目

    flexible-search-oak:我在 ApacheCon EU '14 上的演讲“Flexible search with Apache Jackrabbit Oak”的回购

    Apache Jackrabbit Oak 是一个开源的、高性能的、基于NoSQL的文档存储系统,它是Apache Jackrabbit项目的一部分,专为内容管理而设计。在ApacheCon EU '14上进行的"Flexible search with Apache Jackrabbit Oak"演讲...

    查看jackrabbit仓库的小工具

    标题中的“查看jackrabbit仓库的小工具”指的是一个用于观察和管理Apache Jackrabbit仓库的实用程序。Jackrabbit是Java Content Repository (JCR) API的一个开源实现,它提供了一个内容管理系统(CMS)的基础框架,...

    jackrabbit-core-2.7.2.zip

    【标题】"jackrabbit-core-2.7.2.zip" 是一个包含Apache Jackrabbit Core库的压缩文件。Apache Jackrabbit是基于Java的内容管理系统(CMS)实现,它专注于内容存储和检索,符合Java Content Repository(JCR)API...

    jackrabbit-oak:阿帕奇Jackrabbit Oak的镜子

    Apache Jackrabbit是Apache软件基金会的项目。 入门 要开始使用Oak,请使用Maven 3和Java 8(或更高版本)构建最新的源代码,如下所示: mvn clean install 要启用所有集成测试,包括JCR TCK,请使用: mvn clean...

    jackrabbit-webdav-2.3.2.src.zip

    杰克兔(Jackrabbit)是Apache软件基金会的一个项目,它是一个完全实现WebDAV协议的Java库。WebDAV是一种基于HTTP协议的协议扩展,用于用户编辑和管理存储在远程服务器上的文档。Jackrabbit提供了对WebDAV协议的...

    JackRabbit 学习参考资料总汇

    JCR是一种Java API标准,用于与内容仓库进行交互,而JackRabbit则是Apache提供的一个开源实现。 JackRabbit的API学习涵盖了多方面,从基础的环境搭建到具体的编程实践。文档中提到的API演示程序,说明了如何手动...

    jackrabbit教程

    Apache Jackrabbit 是一个开源的内容管理系统(CMS)框架,它实现了Java Content Repository (JCR) API。JCR API 是一种标准接口,允许应用程序访问和管理结构化内容存储库,类似于文件系统,但支持更丰富的数据类型...

    jackrabbit-jcr-tests-2.4.1.zip

    标题中的"jackrabbit-jcr-tests-2.4.1.zip"指的是Apache Jackrabbit项目的JCR测试模块的一个版本,这是针对内容管理系统(Content Management System, CMS)标准Java Content Repository (JCR)的一套测试用例。...

    jackrabbit-datastore-migration

    jackrabbit-datastore-migration 适用于Apache Jackrabbit的DataStore迁移工具。 Apache Jackrabbit支持各种DataStore组件,例如FileDataStore , DbDataStore , S3DataStore和VFSDataStore 。 有关详细信息,请...

    jackrabbit内容仓库的实例(两个工程)

    杰克兔(Jackrabbit)是Apache软件基金会的一个开源项目,它是一个完全实现JSR 170(Java Content Repository API,即JCR)规范的内容管理系统(CMS)内核。JCR提供了一种标准的方式来访问和管理半结构化数据,如网页...

    jcr-oak-rpc-nodejs:NodeJS Apache Jackrabbit 3 (Oak) API 模块

    入门 安装模块: npm install jcr-oak-rpc-api-nodejs var jcr - oak - rpc - api - nodejs = require ( 'jcr-oak-rpc-api-nodejs' ) ; jcr - oak - rpc - api - nodejs . awesome ( ) ; // "awesome" 文档 (即将...

Global site tag (gtag.js) - Google Analytics