2

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

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(row.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;

}

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

4

3 回答 3

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 后端,这很有效。

于 2011-07-13T20:26:31.157 回答
0

SQL2 是随 JSR-283 引入的。JSR-283 还没有通过 RMI 得到完全支持(参见JCRRMI-26)。

您可以尝试在 XPATH 中重新编写查询或使用DavEx而不是 RMI 进行远程处理。

于 2011-06-17T11:59:15.083 回答
0

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

您可能已经知道这一点,而另一个答案暗示了这一点,但是 jackrabbit 的 rmi 远程处理似乎并不适合实际使用,正如在类似线程中提到的那样

davex 远程处理似乎是首选方式,虽然它也没有完全实现,但似乎有足够的空间来完成您需要做的所有事情。

于 2011-06-27T17:34:40.000 回答