Apache JackRabbit 入门初体验

2022-08-24 10:56:34 浏览数 (1)

Apache Jackrabbit™ 内容存储库是 Java 技术 API(JCR,在 JSR 170 和 JSR 283 中指定)的内容存储库的完全一致的实现。内容存储库是分层内容存储,支持结构化和非结构化内容、全文搜索、版本控制、事务、观察等。Jackrabbit Oak 是 JCR 规范的补充实现。努力实现可扩展且高性能的分层内容存储库,以用作现代世界级网站和其他要求苛刻的内容应用程序的基础

  以上是Apache JackRabbit上的一段内容,最近单位做的系统需要一定的安全性。本来想的是用它来作为测试开发的文件上传保存内容库,后来研究了开源的一些文件存储库后,觉得对于当前的并发量来说,对象存储和分布式文件系统都并不是一个安全的方法。 后期需要请专门的安全团队对系统存储方面做一个评估。

  下面贴上JackRabbit上传和下载文件的代码。

FileService
代码语言:javascript复制
public class FileService { 
 /** 
     * RMI地址 
     */ 
 private final static String RMI = "http://127.0.0.1:7000/rmi"; 
 /** 
     * 仓库 
     */ 
 private static Repository repository = null; 
 /** 
     * 初始化仓库 
     *  
     * @return 
     */ 
 public Repository init() { 
 if (null == repository) { 
 try { 
 //repository = new URLRemoteRepository(RMI); 
                repository = JcrUtils.getRepository(); 
 } catch ( RepositoryException e) { 
 System.out.println("----------------------JackRabbit 仓库初始化失败----------------------"); 
                e.printStackTrace(); 
 } 
 } 
 return repository; 
 } 
 /** 
     * 获取Session 
     *  
     * @return 
     */ 
 public Session getSession() { 
 Session session = null; 
 try { 
            session = init().login(new SimpleCredentials("admin", "admin".toCharArray())); 
 } catch (LoginException e) { 
            e.printStackTrace(); 
 } catch (RepositoryException e) { 
            e.printStackTrace(); 
 } 
 return session; 
 } 
 /** 
     * 向仓库中存入一个文件 
     * @param is 待存入文件的输入流 
     * @return 
     */ 
 public String save(InputStream is) { 
 //获取一个UUID作为文件id 
 String fileId = KeyProvider.getPrimaryKey(); 
 //获取Session 
 Session session = getSession(); 
 try { 
 //获取根节点 
 Node root = session.getRootNode(); 
 //给根节点添加一个文件节点 
 Node filenode = root.addNode(fileId, "nt:file"); 
 //给文件节点添加一个资源节点 
 Node resourcenode = filenode.addNode("jcr:content", "nt:resource"); 
 //设置资源节点的MIME类型 
            resourcenode.setProperty("jcr:mimeType", "application/octest-stream"); 
 //设置待存入文件的输入流 
            resourcenode.setProperty("jcr:data", is); 
 //设置编码 
            resourcenode.setProperty("jcr:encoding", "UTF-8"); 
 //保存文件 
            session.save(); 
 //关闭输入流 
            is.close(); 
 //注销Session 
            session.logout(); 
 } catch (RepositoryException e) { 
 System.out.println("---------------------上传文件过程中出现异常------------------------"); 
            e.printStackTrace(); 
 } catch (IOException e) { 
 System.out.println("---------------------上传文件过程中出现异常------------------------"); 
            e.printStackTrace(); 
 } 
 return fileId; 
 } 
 /** 
     * 按Fileid取出单个文件(相当于下载) 
     * @param fileId 保存文件时拿到的FileId 
     * @return 
     */ 
 public InputStream getByFileId(String fileId) { 
 //用于读取文件的输入流对象 
 InputStream is = null; 
 //获取Session 
 Session session = getSession(); 
 try { 
 //获取根节点 
 Node root = session.getRootNode(); 
 //按照FileId取出符合条件的节点 
 NodeIterator filenodeite = root.getNodes(fileId); 
 if (filenodeite.hasNext()) { 
 //如果能找到相关记录 
 while (filenodeite.hasNext()) { 
 //取出一个文件节点 
 Node filenode = filenodeite.nextNode(); 
 //取出这个文件结点下的资源子节点 
 NodeIterator resourcenodeite = filenode.getNodes(); 
 //如果有资源子节点 
 while (resourcenodeite.hasNext()) { 
 //取出一个资源节点 
 Node resourcenode = resourcenodeite.nextNode(); 
 //找出数据域 
 if (resourcenode.getName().equals("jcr:content")) { 
 //得到文件输入流 
                            is = resourcenode.getProperty("jcr:data").getStream(); 
 } 
 } 
 } 
 } 
 } catch (RepositoryException e) { 
            e.printStackTrace(); 
 } 
 return is; 
 } 
 /** 
     * 按Fileid删除文件 
     * @param fileId 保存文件时拿到的FileId 
     * @return 
     */ 
 public void delete(String fileId) { 
 //获取Session 
 Session session = getSession(); 
 try { 
 //获取根节点 
 Node root = session.getRootNode(); 
 //按照FileId取出符合条件的节点 
 NodeIterator filenodeite = root.getNodes(fileId); 
            filenodeite.remove(); 
            session.save(); 
 //注销Session 
            session.logout(); 
 } catch (RepositoryException e) { 
 System.out.println("----------------------删除过程中出错-------------------------"); 
            e.printStackTrace(); 
 } 
 } 
} 

保存文档

   调用上面的FileService操作内容仓库。

代码语言:javascript复制
 String fileId = fileService.save(doc.getInputStream()); 

所需依赖
代码语言:javascript复制
 <!-- Jack Rabbit相关配置 --> 
 <!-- JCR API --> 
 <dependency> 
 <groupId>javax.jcr</groupId> 
 <artifactId>jcr</artifactId> 
 <version>2.0</version> 
 </dependency> 
 <!-- jackrabbit-jcr-commons --> 
 <dependency> 
 <groupId>org.apache.jackrabbit</groupId> 
 <artifactId>jackrabbit-jcr-commons</artifactId> 
 <version>2.4.3</version> 
 </dependency> 
 <!-- jackrabbit-core --> 
 <dependency> 
 <groupId>org.apache.jackrabbit</groupId> 
 <artifactId>jackrabbit-core</artifactId> 
 <version>2.4.3</version> 
 </dependency> 
 <!-- jackrabbit-jcr-rmi --> 
 <dependency> 
 <groupId>org.apache.jackrabbit</groupId> 
 <artifactId>jackrabbit-jcr-rmi</artifactId> 
 <version>2.4.3</version> 
 </dependency> 

以上是JackRabbit的相关流程代码。

0 人点赞