CQ5 API Java QueryBuilder

Я видел в документации Adobe API службу QueryBuilder, которую можно вызывать по URL-адресам для многих параметров запроса, это возвращает ответы на основе JSON. Очень хорошо. Я хочу использовать это в java API. Я нашел несколько примеров и попробовал в eclipse, но кое-что я не знаю, как получить «слинг» службы, как в приведенном ниже коде: ИЛИ, другими словами, как создать объект Java QueryBuilder.

Любой конкретный JAR, который мне нужен, или мне нужно установить Apache SLING на свой компьютер, я не уверен, что кто-то, кто может поделиться этим, будет полезен, поскольку я новичок в CQ5 и понятия не имею.

Пример кода выглядит следующим образом:

        Repository repository = JcrUtils.getRepository(SERVER);
        SimpleCredentials credentials = new SimpleCredentials(USERNAME, PASSWORD.toCharArray());
        Session session = repository.login(credentials);
        System.out.println("got session: " + session);

        /*HERE SLING IS THE PROBLEM HOW TO GET SLING */  
        QueryBuilder qbuilder = sling.getService(QueryBuilder.class);
        String fulltextSearchTerm = "Geometrixx";

        // create query description as hash map (simplest way, same as form
        // post)
        Map<String, String> map = new HashMap<String, String>();

        // create query description as hash map (simplest way, same as form
        // post)
        map.put("path", "/content");
        map.put("type", "cq:Page");
        map.put("group.p.or", "true"); // combine this group with OR
        map.put("group.1_fulltext", fulltextSearchTerm);
        map.put("group.1_fulltext.relPath", "jcr:content");
        map.put("group.2_fulltext", fulltextSearchTerm);
        map.put("group.2_fulltext.relPath", "jcr:content/@cq:tags");

        // can be done in map or with Query methods
        map.put("p.offset", "0"); // same as query.setStart(0) below
        map.put("p.limit", "20"); // same as query.setHitsPerPage(20) below

        Query query = qbuilder.createQuery(PredicateGroup.create(map), session);
        query.setStart(0);
        query.setHitsPerPage(20);

        SearchResult result = query.getResult();

person zaxeer    schedule 10.01.2014    source источник


Ответы (2)


Если вы работаете с классом Java, а не с JSP, вы можете использовать аннотацию @Reference для поиска данной службы — это найдет соответствующую службу, зарегистрированную OSGi, и вернет вам ее реализацию.

Из документации Felix SCR:

Аннотация @Reference определяет ссылки на другие службы, предоставляемые компоненту средой выполнения компонента службы.

Затем ваш код становится просто:

@Reference
QueryBuilder qbuilder;
person anotherdave    schedule 10.01.2014
comment
спасибо за ответ, но все же QueryBuilder имеет значение null во время выполнения. У меня есть простой класс с методом main(). И я добавил Flix Annotation Jar в путь сборки. Сервер CQ5 работает локально. - person zaxeer; 10.01.2014
comment
@zaxeer Вы запускаете этот код при развертывании в своем экземпляре CQ или как автономный класс? Вы не сможете использовать getService или @Reference, не находясь в контейнере OSGi — Felix предоставляет услугу в каждом случае. - person anotherdave; 10.01.2014
comment
Я запускаю код как отдельное java-приложение, мое java-приложение анализирует дерево JCR, но новым требованием был поиск по содержимому. - person zaxeer; 10.01.2014
comment
Использование JavaDoc, QueryBuilder не предоставляет общедоступный конструктор и упоминает, что Все примеры предполагают, что queryBuilder доступен как ссылка OSGi SCR.. — Возможно, вы могли бы использовать отражение для создания экземпляра, хотя я бы сказал, что вы определенно смотрите на неподдерживаемый сценарий, если используете его вне CQ. - person anotherdave; 10.01.2014
comment
Да понял: спасибо за помощь - person zaxeer; 10.01.2014

Этого можно добиться с помощью магии Adobe CQ OSGI... Добавьте в свой класс приватное поле для хранения ComponentContext.

private ComponentContext context;

Реализуйте метод активации:

protected void activate(ComponentContext context) {
    this.context = context;
}

Затем вы можете использовать этот контекст для получения queryBuilder:

ServiceReference queryBuilderReference = context.getBundleContext().getServiceReference(QueryBuilder.class.getName());
QueryBuilder queryBuilder = (QueryBuilder) context.getBundleContext().getService(queryBuilderReference);
person Calahad    schedule 18.02.2014
comment
Спасибо @Калахад. Я пробовал много вещей, но только ваше решение сработало :) - person Surya Chandra; 20.04.2015