JAVA内容仓库
Java Content Repository API(JSR-170)试图建立一套标准的API去访问内容仓库。如果你对内容管理系统(CMS)不熟悉的话,你一定会对内容仓库是什么感到疑惑。你可以这样去理解,把内容仓库理解为一个用来存储文本和二进制数据(图片,word文档,PDF等等)的数据存储应用程序。一个显著的特点是你不用关心你真正的数据到底存储在什么地方,是关系数据库?是文件系统?还是XML?不仅仅是数据的存储和读取,大多数的内容仓库还提供了更加高级的功能,例如访问控制,查找,版本控制,锁定内容等等。
一段时间以来市场上出现了各个厂家开发的不同的CMS系统,这些系统都建立在他们各自的内容仓库之上。
问题出现了,每个CMS开发商都提供了他们自己的API来访问内容仓库。这对应用程序的开发者带来了困扰,因为他们要学习不同的开发商提供的API,同时,他们的代码也与这些特定的API产生了绑定。
JSR-170正是为解决这一问题而出现的,它提供了一套标准的API来访问任何数据仓库。通过JSR-170,你开发代码只需要引用 javax.jcr.* 这些类和接口。它适用于任何兼容JSR-170规范的内容仓库。
我们将通过一个例子来逐步了解JSR-170。
为什么需要 Java Content Repository API
随着各个厂家各自的内容仓库实现数量的增长,人们越来越需要一组通用的编程接口来使用这些内容仓库,这就是JSR-170所要做的东西。它提供一组通用的编程接口来连接内容仓库。你可以把JSR-170理解为和JDBC类似的API,这样你可以不依赖任何具体的内容仓库实现来开发你的程序。你可以直接使用支持JSR-170的内容仓库;或者如果一些厂家的内容仓库不支持JSR-170则可以通过这些厂家提供的JSR-170驱动来完成从JSR-170与厂家特定的内容仓库的转换。
JSR-170 API对不同的人员提供了不同的好处。
●对于开发者无需了解厂家的仓库特定的API,只要兼容JSR-170就可以通过JSR-170访问其仓库。
●对于使用CMS的公司则无需花费资金用于在不同种类CMS的内容仓库之间进行转换。
●对于CMS厂家,无需自己开发内容仓库,而专注于开发CMS应用。\
JCR定义的内容仓库模型是一个树状结构,树上的元素(Item)分为两类:节点(node)和属性(property)。整棵树具有单根结构。从根开始,内容元素的定位采用UNIX文件系统风格,例如“/A/B/ccc”(根下面A节点的B子节点的ccc属性),相对定位符(“.”和“..”)也是可用的。每个属性有且仅有一个父节点,不能有子元素。每个节点可以有一个或多个父节点(根节点无父节点),也可以有任意多个子节点或属性。注意,节点可以有多个父节点,也就是说可以从不同的路径导航获得同一内容,这是网站常见的一个需求(来自不同栏目的两个链接指向同一篇文章)。
除了Node和Property之外,API中还有几个重要的对象。Repository代表整个内容仓库,Credentials代表一个用户身份,Ticket代表进入该内容仓库的门票。获得内容根节点的代码大致如下:
Repository repository = (Repository)java.rmi.Naming.lookup("MyRepo");
Credentials credentials = new SimpleCredentials("MyName", "MyPassword".toCharArray());
Ticket myTicket = repository.login(credentials, "MyWorkspace");
Node root = myTicket.getRootNode();
从root节点就可以遍历访问整课内容树。Ticket对象也支持通过绝对路径或者UUID直接获得某一内容元素(节点或属性)。