什么是JAVA内容仓库(Java Content Repository)(3)(一)

2014-11-24 00:44:57 · 作者: · 浏览: 2


开发我们的例子程序
jackrabbit已经配置好了,现在让我们来创建我们的示例程序。这个例子程序将调用JCR-170 API。很显然,我们需要做两件事情:一个是作为后台的对数据进行增删改查(持久层),另一个是开发相对应的UI界面(WEB 层)。首先,让我们定义一个DAO接口。这个接口BlogEntryDAO.java 如下:
public interface BlogEntryDAO {
public void insertBlogEntry(BlogEntryDTO blogEntryDTO)
throws BlogApplicationException;
public void updateBlogEntry(BlogEntryDTO blogEntryDTO)
throws BlogApplicationException;
public ArrayList getBlogList()
throws BlogApplicationException;
public BlogEntryDTO getBlogEntry(String blogTitle)
throws BlogApplicationException;
public void removeBlogEntry(String blogTitle)
throws BlogApplicationException;
public ArrayList searchBlogList(String userName)
throws BlogApplicationException;
public void attachFileToBlogEntry(String blogTitle, InputStream uploadInputStream)
throws BlogApplicationException;
public InputStream getAttachedFile(String blogTitle)
throws BlogApplicationException;
}
正如你看到的,这个接口提供了增删改查的方法,同时还提供了两个方法来处理附件。接下来,我们需要一个DTO对象用来在两个层之间传递数据。
public class BlogEntryDTO {

private String userName;
private String title;
private String blogContent;
private Calendar creationTime;

//Getter and setter methods for each of these properties
}
这里我们将仅仅讨论持久层。

连接jackrabbit
现在,第一件事情是开发一个组件,获得一个到jackrabbit内容仓库的连接。为了简单,我们将在程序启动的时候获得这个连接,然后在程序停止的时候释放这个连接。这里我们使用了Struts ,所以我们需要开发一个PlugIn 类。如下:
public class JackrabbitPlugin implements PlugIn{
public static Session session;
public void destroy() {
session.logout();
}
public void init(ActionServlet actionServlet, ModuleConfig moduleConfig)
throws ServletException {
try {
System.setProperty("org.apache.jackrabbit.repository.home",
"c:/temp/Blogging");
Repository repository = new TransientRepository();
session = repository.login(new SimpleCredentials("username",
"password".toCharArray()));
} catch (LoginException e) {
throw new ServletException(e);
} catch (IOException e) {
throw new ServletException(e);
} catch (RepositoryException e) {
throw new ServletException(e);
}
}
public static Session getSession() {
return session;
}
}
init()方法将会在程序启动的时候调用,destroy()将会在程序停止的时候调用。我们在init()方法里获得了到jackrabbit内容仓库的连接。看看代码,我们做的第一件事是设定了org.apache.jackrabbit.repository.home这个系统属性,在上篇文章里提到,这个属性是用来指向我们的内容仓库主目录。这里我们设定它为c:/temp/blogging。接下来,我们创建了TransientRepository的一个实例。这是jackrabbit提供的类,它提供了一个到内容仓库的代理。它在第一个session 打开的时候自动启动内容仓库,在最后一个session 关闭的时候自动关闭内容仓库。
一旦我们获得了一个内容仓库对象,我们就可以调用它的login() 方法来打开一个连接。login() 方法需要一个Credential 对象作为参数。如果Credential 对象是NULL,jackrabbit会认为其他的机制做了这个验证(比如JAAS)。login() 方法还可以传入一个workspace名字作为参数,如果不传入这个参数,jackrabbit会返回一个session对象指向默认的workspace。注意workspace和session是一对一的,即一个session仅对应一个workspace。(注:如果不传入Credential对象,返回的session对workspace是只读的)

增加内容
连接已经建立起来了,下面让我们实现BlogEntryDAO这个接口。第一个我们想实现的方法是插入数据 insertBlogEntry()
public void insertBlogEntry(BlogEntryDTO blogEntryDTO)
throws BlogApplicationException {
Session session = JackrabbitPlugin.getSession();
Node rootNode = session.getRootNode();
Node blogEntr