2011-06-16 45 views
2

我们使用部署在Glassfish应用服务器上的Jackrabbit 2.2.6(webapp)。我们还在构建一个客户端,使用服务器公开的rmi接口将文件上传到服务器。我们可以使用标准JCR API从客户端登录和上传文件到远程服务器。但是,我们很难查询远程服务器(我们正在使用JCR-SQL2)。下面是我们使用查询远程服务器的代码片段:在Jackrabbit服务器上执行远程查询

public static List<Node> getNode(Session session, String q) { 
    try { 
     QueryManager qman = session.getWorkspace().getQueryManager(); 

     Query query = qman.createQuery(q, Query.JCR_SQL2); 
     QueryResult result = query.execute(); 
     RowIterator rowIt = result.getRows(); 
     System.err.println("Found results " + rowIt.hasNext()); 
     List<Node> nList = new LinkedList<Node>(); 
     while (rowIt.hasNext()) { 
      Row row = rowIt.nextRow(); 
      nList.add(row.getNode()); 
     } 
     return nList; 
    } catch (RepositoryException ex) { 
     Logger.getLogger(BasicArtifacts.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return null; 

} 

这就是我们得到了执行代码时:

javax.jcr.UnsupportedRepositoryOperationException: TODO: JCRRMI-26 
    at org.apache.jackrabbit.rmi.client.ClientRow.getNode(ClientRow.java:70) 

好像nList.add(行.getNode());是罪魁祸首。看起来这不是在Jackrabbit服务器上进行远程查询的最佳方式。

我们确认它可以在本地临时存储库上工作。

在浏览Jackrabbit代码库时,我们遇到了RemoteQuery和相关的类。我试图编写一些代码 - 但不能使它工作。下面是摘录

public static List<Node> getNode(Session session, String q) throws RemoteException { 
    try { 
     QueryManager qman = session.getWorkspace().getQueryManager(); 

     ServerAdapterFactory factory = new ServerAdapterFactory(); 
     RemoteQueryManager rqman = factory.getRemoteQueryManager(session, qman); 
     RemoteQuery rquery = rqman.createQuery(q, Query.JCR_SQL2); 
     //this is a basic query - not yet sure how to implement the constraints as yet. 
     RemoteQueryResult rresult = rquery.execute(); 
     RemoteIterator rit = rresult.getRows(); 


     Object[] objs = rit.nextObjects(); 
     System.err.println("Found results " + rit.getSize()); 

     List<Node> nList = new LinkedList<Node>(); 

     for(Object obj:objs){ 

      //System.err.println(row.getPath()); 
      ServerRow row = (ServerRow)obj; 
      for(Value val:row.getValues()){ 
       System.err.println("Value:"+ val.getString()); 
      } 
      //How to get the Node out of the ServerRow? 
      //nList.add(row.); 
     } 
     return nList; 
    } 
    catch (RepositoryException ex) { 
     Logger.getLogger(UploadContentToRemote.class.getName()).log(Level.SEVERE, null, ex); 

    } 
    return null; 

}

任何帮助,指针将不胜感激。谢谢。

回答

0

SQL2是在JSR-283中引入的。 JSR-283尚未通过RMI完全支持(请参阅JCRRMI-26)。

您可以尝试在XPATH中重新创建查询,也可以使用DavEx而不是RMI进行远程处理。

+0

我挖了一些更多 - 像Jackrabbit的实现仍然返回正确的[节点视图](http://www.day.com/specs/jcr/2.0/6_Query.html#6.11.2%20Node%20View) rmi与JCR-SQL2。如您所说,表格视图并不完全支持。节点视图同时支持XPATH和JCR-SQL2。 – Amar 2011-06-17 16:12:48

0

在查询的具体条款中,我会建议您使用XPath。它在技术上已被弃用,但似乎被社区广泛使用,这意味着该实现是完整且广泛使用的。我怀疑它在RMI远程堆栈中也更完整。

您可能已经知道了这一点,而另一个答案暗示这一点,但是jackrabbit的rmi远程并没有用于实际用途,正如this这样的线程中提到的那样。

davex remoting似乎是首选方式,尽管它还没有完全实现,但似乎有足够的位置来完成您需要做的所有事情。

1

您是否尝试过使用NodeIterator:

Query q = queryManager.createQuery(sqlText, Query.JCR_SQL2); 
QueryResult result = q.execute(); 
NodeIterator iter = result.getNodes(); 
while (iter.hasNext()) { 
    nList.add(iter.nextNode()); 
} 

我使用JackRabbit用RMI将CRX后端和工作原理。