jackrabbit API学习(by quqi99)
作者:张华 发表于:2008-10-23 ( http://blog.csdn.net/quqi99 )
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明。
运行下面程序,需加JAR包如下(这些JAR包我是从magnolia中拿出来的):
commons-collections-3.2.jar
concurrent-1.3.4.jar
derby-10.3.1.4.jar
jackrabbit-api-1.4.jar
jackrabbit-core-1.4.5.jar
jackrabbit-jcr-commons-1.4.jar
jackrabbit-spi-1.4.jar
jackrabbit-spi-commons-1.4.jar
jackrabbit-text-extractors-1.4.jar
jcl104-over-slf4j-1.4.1.jar
jcr-1.0.jar
log4j-1.2.14.jar
lucene-core-2.2.0.jar
slf4j-api-1.4.1.jar
slf4j-log4j12-1.4.1.jar
standard-1.1.2.jar
xercesImpl-2.8.1.jar
程序如下:
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Calendar;
import java.util.Hashtable;
import javax.jcr.ImportUUIDBehavior;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Property;
import javax.jcr.Repository;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.Value;
import javax.jcr.ValueFormatException;
import javax.jcr.Workspace;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.apache.jackrabbit.core.TransientRepository;
import org.apache.jackrabbit.core.jndi.RegistryHelper;
import org.apache.jackrabbit.value.StringValue;
import sun.net.www.MimeTable;
/**
** @作者 张华
** @时间 2008-10-23 下午12:14:57
** @描述 http://wrong1111.javaeye.com/blog/186388
**/
public class Test {
/**手动配置仓库**/
private void configRepByHand() throws Exception {
String configFile = "E:/workspace3.3/jackrabbit/repository.xml";
String repHomeDir = "E:/workspace3.3/jackrabbit/repository";
//用JDNI获得仓库
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.jackrabbit.core.jndi" +
".provider.DummyInitialContextFactory");
env.put(Context.PROVIDER_URL, "localhost");
InitialContext ctx = new InitialContext(env);
RegistryHelper.registerRepository(ctx,
"repo",
configFile,
repHomeDir,
false);
Repository r = (Repository) ctx.lookup("repo");
//获得工作区及根结点
//因为正在使用 JAAS,所以请记得将 -Djava.security.auth.login.config==jaas.config. 以 Java JVM 参数的形式包含进来
SimpleCredentials cred = new SimpleCredentials("userid","".toCharArray()); //SimpleCredentials 接受所有用户名。替代的 JCR 实现可以提供更复杂的认证机制,可以连接到 LDAP 服务器或外部数据库来提供凭据信息
//一旦我们获得了一个内容仓库对象,我们就可以调用它的login() 方法来打开一个连接。login() 方法需要一个Credential 对象作为参数。如果Credential 对象是NULL,jackrabbit会认为其他的机制做了这个验证(比如JAAS)。login() 方法还可以传入一个workspace名字作为参数,如果不传入这个参数,jackrabbit会返回一个session对象指向默认的 workspace。注意workspace和session是一对一的,即一个session仅对应一个workspace。(注:如果不传入 Credential对象,返回的session对workspace是只读的)
Session session = r.login(cred, null); //Session 对象为程序员提供了一个临时的存储层,它非常像传统的对象关系映射工具中可以看到的层,而且还可以将它看作到特定工作区的连接。它允许客户访问绑定到这个会话的任何节点或属性。通过会话,可以得到工作区,再从工作区得到根节点
Workspace ws = session.getWorkspace();
Node rn = session.getRootNode();
//输出根结点,验证仓库是否配置成功
System.out.println(rn.getPrimaryNodeType().getName());
//所有的 JCRWiki 内容都放在 wiki 名称空间下。为了让仓库识别这个名称空间,必须在初始化时注册名称空间
ws.getNamespaceRegistry().registerNamespace
("wiki", "http://www.barik.net/wiki/1.0 ");
}
/**自动配置仓库
* Jackrabbit 实现还提供了一个 TransientRepository 类,这个类来自其核心 API,可以在启动第一个会话时自动初始化内容仓库,
* 并在最后一个会话关闭时停止使用仓库。对于简单的独立应用程序,使用 TransientRepository 可以极大地简化仓库的配置,
* 但要以 JSR-170 的移植性作为代价。TransientRepository 自动创建 repository.xml 和仓库文件夹。它还在内部提供了处理身份验证和安全性的 SimpleAccessManager。
* **/
private Node configRepByAuto() throws Exception {
Repository r = new TransientRepository();
Session session = r.login(new SimpleCredentials("userid", "".toCharArray()));
Workspace ws = session.getWorkspace();
Node rn = session.getRootNode();
ws.getNamespaceRegistry().registerNamespace
("wiki", "http://www.barik.net/wiki/1.0 ");
write(rn,session);
//使用XPATH搜索内容
QueryManager qm = ws.getQueryManager();
Query q = qm.createQuery
("//wiki:encyclopedia/wiki:entry[@wiki:title = 'rose']",Query.XPATH);
QueryResult result = q.execute();
NodeIterator it = result.getNodes();
while (it.hasNext()) {
Node n = it.nextNode();
System.out.println(n.getName());
System.out.println(n.getProperty("wiki:title").getString());
System.out.println(n.getProperty("wiki:content").getString());
}
//用 XML 导入和导出内容
File outputFile = new File("systemview.xml");
FileOutputStream out = new FileOutputStream(outputFile);
session.exportSystemView("/wiki:encyclopedia", out, false, false);
File inputFile = new File("systemview.xml");
FileInputStream in = new FileInputStream(inputFile);
session.importXML("/", in, ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW);
session.save();
return rn;
}
/**写内容仓库**/
private void write(Node rn,Session session) throws Exception{
//将内容添加到内容仓库
Node encyclopedia = rn.addNode("wiki:encyclopedia");
Node p = encyclopedia.addNode("wiki:entry");
p.setProperty("wiki:title", new StringValue("rose"));
p.setProperty("wiki:content", new
StringValue("A rose is a flowering shrub."));
p.setProperty("wiki:category",
new Value[]{
new StringValue("flower"),
new StringValue("plant"),
new StringValue("rose")});
Node n = encyclopedia.addNode("wiki:entry");
n.setProperty("wiki:title", new StringValue("Shakespeare"));
n.setProperty("wiki:content", new
StringValue("A famous poet who likes roses."));
n.setProperty("wiki:category", new StringValue("poet"));
//添加二进制内容
File file = new File("rose.gif");
MimeTable mt = MimeTable.getDefaultTable();
String mimeType = mt.getContentTypeFor(file.getName());
if (mimeType == null) mimeType = "application/octet-stream";
Node fileNode = n.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();
}
/**浏览内容仓库**/
private void read(Node rn) throws Exception{
//普通遍历搜索内容
Node encyclopedia = rn.getNode("wiki:encyclopedia");
NodeIterator entries = encyclopedia.getNodes("wiki:entry");
while (entries.hasNext()) {
Node entry = entries.nextNode();
System.out.println(entry.getName());
System.out.println(entry.getProperty("wiki:title").getString());
System.out.println(entry.getProperty("wiki:content").getString());
System.out.println(entry.getPath());
Property category = entry.getProperty("wiki:category");
try {
String c = category.getValue().getString();
System.out.println("Category: " + c);
} catch (ValueFormatException e) {
Value[] categories = category.getValues();
for (Value c : categories) {
System.out.println("Category: " + c.getString());
}
}
}
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Test test = new Test();
//test.configRepByHand();
Node rn = test.configRepByAuto();
test.read(rn);
}
}