2011-06-16 50 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後端和工作原理。