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;
}
任意のヘルプ、ポインタをいただければ幸いです。ありがとう。