要学习Magnolia(木兰),第一步就是要了解什么是JSR-170,这样才能从底层了解Magnolia的架构,从developerworks摘抄简介如下:
2005 年 9 月 12 日
随着内容管理应用程序的日益普及,对用于内容仓库的普通、标准化 API的需求已凸现出来。Content Repository for Java Technology API (JSR-170)的目标就是提供这样一个接口。在本文中,通过设计一个简单的类 Wikipedia 的综合后端,您将使用 JSR-170 的开放源码的Apache Jackrabbit 实现来探讨这个期望的框架提供的特性。
如果您曾经试图开发一个内容管理应用程序,那么您肯定非常了解实现内容系统有多困难。技术上形成了分立局面,很多供应商都提供专有的仓库引擎。这些困难加剧了此类系统的复杂性和不可维护性,促进了供应商封闭,并增加了企业市场中长期遗留支持的需要。随着公司 weblogs和电子的公司文档管理的日益普及,对标准的内容仓库接口的需求到达了前所未有的紧迫程度。
Content Repository for Java Technology 规范由 Java Community Process 开发为 JSR-170,目的就是满足这些行业需求。该规范在 javax.jcr 名称空间下提供一个统一的 API,允许人们以供应商中立的方式访问任何规范兼容的仓库实现。
但是 API 标准并不是 Java Content Repository (JCR) 提供的惟一特性。JSR-170的一个主要优点是,它不绑定到任何特定的底层架构。例如,JSR-170 实现的后端数据存储可以是文件系统、WebDAV 仓库、支持 XML的系统,甚至还可以是 SQL 数据库。此外,JSR-170 的导出和导入功能允许一个集成器在内容后端与 JCR实现之间无缝地切换。最后,JCR提供一个直观的界面,可以出现在各种现有内容仓库上面,同时同步地标准化诸如版本控制、访问控制和搜索之类的复杂功能。
在讨论 JCR时,有好几种方法可以采用。在本文中,我从开发人员的角度介绍 JSR-170 规范提供的特性,集中讲述可用的 API和界面,它们允许程序员在设计内容应用程序时高效地使用 JSR-170 仓库。作为一个虚构的例子,我将为类 Wikipedia的综合系统实现一个简单的后端,叫做 JCRWiki,它支持二进制内容、版本控制、备份和搜索。在开发这个应用程序的过程中,我将用到 ApacheJackrabbit,这是 JSR-170 的一个开放源码的实现。
Repository 模型
为了熟悉 JCR,我们首先对 Repository 模型进行高级讨论。Repository 模型是一个简单的层次结构,看起来很像一棵 n 层的树。它包含单个内容仓库和一个或多个工作区 (workspace)。(在本文中,我只讨论单个工作区。)每个工作区包含一棵条目 (item) 树;条目可以是节点 (node) 或者属性 (property)。节点可以具有零个或多个子节点,以及零个或多个相关的属性,实际内容就存储在这些属性中。
每个节点有且只有一个主节点类型 (primary node type)。主节点类型定义节点的特征,比如允许节点具有的属性和子节点。除了主节点类型之外,节点还可能具有一个或多个 mixin 类型。mixin 类型很像修饰器 (decorator),为节点提供额外的特征。具体来说,JCR 实现可以提供三种预定义的 mixin 类型:
mix:versionable,它允许节点支持版本控制。mix:lockable,它为节点启用锁定功能。mix:referenceable,它提供一个自动创建的 jcr:uuid 属性,该属性给予节点一个惟一的、可引用的标识符。
图 1 中阐释了这一结构。圆圈代表节点,矩形代表属性。有趣的是,节点 A、B 和 C 起源于单个根节点。节点 A 有两个属性:一个字符串“John”和一个整数 22。
图 1. 一个具有多个工作区的 Repository 模型
预定义的节点类型
每个仓库都必须支持主节点类型 nt:base。还有很多仓库可以支持的其他公共节点类型:
nt:unstructured 是最灵活的节点类型。它允许任意数量的子节点或属性,而这些子节点和属性又可以具有任意的名称。该节点类型将用于表示 JCRWiki 项。
nt:file 用于表示文件。它需要单个子节点,叫做 jcr:content。该节点类型将用于表示图像和 JCRWiki 项中的其他二进制内容。
nt:folder 节点类型可用于表示文件夹,比如常规文件系统中的文件夹。
nt:resource 通常用于表示文件的实际内容。
nt:version 支持版本控制的仓库所必需的节点类型。
在 JSR-170 规范的第 6.7.22.1 节中可以找到整个节点类型层次结构(参见 参考资料 部分的链接)。
名称空间
Repository 模型的一个有用却常被忽视的特性是它对名称空间 (namespace) 的支持。名称空间防止来自不同来源和应用领域的条目及节点类型之间出现命名冲突。名称空间利用一个前缀进行定义,并由一个 :(冒号)字符分隔。在本文中,您已经遇到了针对 JCR 内部属性的 jcr、针对 mixin 类型的 mix 和针对节点类型的 nt 等名称空间。在 JCRWiki 中,您会将 wiki 名称空间用于您的所有数据。
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=601559