我們使用部署在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;
}
任何幫助,指針將不勝感激。謝謝。
我挖了一些更多 - 像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