Выполнение удаленного запроса на сервере Jackrabbit

Мы используем Jackrabbit 2.2.6 (веб-приложение), развернутое на сервере приложений 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;

}

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


person Amar    schedule 16.06.2011    source источник


Ответы (3)


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

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

person michid    schedule 17.06.2011
comment
Я накопал еще кое-что — похоже, что реализация Jackrabbit по-прежнему возвращает правильный Node View через rmi с JCR-SQL2. Table View, как вы сказали, не полностью поддерживается. Node View поддерживается как для XPATH, так и для JCR-SQL2. - person Amar; 17.06.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, и это работает.

person Morrell Jacobs    schedule 13.07.2011

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

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

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

person chad    schedule 27.06.2011