Выполнение удаленного запроса на сервере Jackrabbit - PullRequest
2 голосов
/ 17 июня 2011

Мы используем Jackrabbit 2.2.6 (webapp), развернутый на сервере приложений Glassfish. Мы также создаем клиент для загрузки файлов на сервер, используя интерфейс rmi, предоставляемый сервером. Мы можем войти и загрузить файлы с помощью стандартного API JCR с клиента на удаленный сервер. Тем не менее, мы испытываем трудности с запросом удаленного сервера (мы используем 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;

}

Любая помощь, указатели будут оценены. Благодаря.

Ответы [ 3 ]

1 голос
/ 14 июля 2011

Вы пытались использовать 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, и это работает.

0 голосов
/ 27 июня 2011

В конкретных условиях запросов я бы рекомендовал использовать XPath.Это технически устарело, но, кажется, широко используется сообществом, что означает, что реализация завершена и широко используется.Я подозреваю, что это более полно и в удаленном стеке RMI.

Возможно, вы уже знаете это, и другой ответ ссылается на это, но удаленное взаимодействие с rmi для jackrabbit, по-видимому, не предназначено для реального использования, как упоминалось в темах типа this one,

Удаленное взаимодействие с davex, похоже, является предпочтительным способом, и, хотя он еще не полностью реализован, кажется, достаточно для того, чтобы сделать все, что вам нужно сделать.

0 голосов
/ 17 июня 2011

SQL2 был представлен с JSR-283.JSR-283 не полностью поддерживается (пока) через RMI (см. JCRRMI-26 ).

Вы можете попытаться переформулировать запрос в XPATH или использовать DavEx вместо RMI для удаленного взаимодействия.

...