我们正在使用部署在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;
}
任何帮助,指针将不胜感激。感谢。
答案 0 :(得分: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后端,这很有效。
答案 1 :(得分:0)
答案 2 :(得分:0)
在查询的具体方面,我建议您使用XPath。它在技术上被弃用,但似乎被社区广泛使用,这意味着实现已经完成并被广泛使用。我怀疑它在RMI远程堆栈中也更完整。
你可能已经知道了这一点,另一个答案暗示了这一点,但是对于实际使用来说,长耳机的rmi远程处理并不是真正意义上的,如this之类的线程所述。
davex远程控制似乎是首选方式,虽然它还没有完全实现,但似乎已经足够用来完成你需要做的所有事情。