2
回答
jackrabbit API学习
【腾讯云】学生服务器套餐10元/月 >>>   

API学习(by 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);

 }

}

举报
红薯
发帖于9年前 2回/3K+阅
顶部