2014-01-10 5 views
0

많은 쿼리 옵션에 대해 URL로 호출 할 수있는 adobe API 문서 QueryBuilder Service에서 JSON 기반 응답을 반환합니다. 아주 잘. 나는 자바 API에서 이것을 사용하기를 원한다. 몇 가지 예제를 발견하고 이클립스에서 시도했지만, 내가 알지 못하는 어떤 것은 아래 주어진 코드 에서처럼 "슬링"서비스를 얻는 방법을 알지 못한다. 또는 다른 말로하면 QueryBuilder Java 오브젝트를 만드는 방법이다.CQ5 Java QueryBuilder API

내 모든 PC에 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(); 

답변

1

당신이 오히려 JSP보다 자바 클래스에서 작업하는 경우, 당신은 주어진 서비스의 룩업을 할 @Reference 주석을 사용할 수 있습니다 -이됩니다 OSGi가 등록한 일치하는 서비스를 찾아 구현을 반환합니다. Felix SCR documentation에서

:

@Reference 주석은 다른 서비스에 대한 참조는 서비스 컴포넌트 런타임 구성 요소에 사용할 수 했다 정의합니다.

코드는 단순히됩니다 :

이 어도비 CQ OSGI 마법을 사용하여 달성 할 수
@Reference 
QueryBuilder qbuilder; 
+0

감사하지만 여전히 QueryBuilder 런타임에 null의

private ComponentContext context; 

는 activate 메소드를 구현합니다. main() 메소드로 간단한 클래스를 가진다. 그리고 빌드 경로에 Flix Annotation Jar를 추가했습니다. CQ5 서버가 로컬에서 실행 중입니다. – zaxeer

+0

@zaxeer CQ 인스턴스에 배포 할 때 또는 독립 실행 형 클래스로이 코드를 실행하고 있습니까? OSGi 컨테이너에 없어도'getService' 나'@ Reference'를 사용할 수 없습니다 - 각각의 경우에 서비스를 제공하는 것은 Felix입니다. – anotherdave

+0

독립 실행 형 Java 응용 프로그램으로 코드를 실행 중입니다. Java 응용 프로그램에서 JCR 트리를 구문 분석하지만 내용을 검색하는 것이 새로운 요구 사항이었습니다. – zaxeer

1

...을 ComponentContext을 보유 할 클래스의 private 필드를 추가합니다.

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

그런 다음 당신이 queryBuilder 얻을이 컨텍스트를 사용할 수 있습니다 : 답변

ServiceReference queryBuilderReference = context.getBundleContext().getServiceReference(QueryBuilder.class.getName()); 
QueryBuilder queryBuilder = (QueryBuilder) context.getBundleContext().getService(queryBuilderReference); 
+0

고마워요 @ 칼라 하드. 나는 많은 것들을 시도했지만 오직 당신의 솔루션은 오직 일했습니다 :) –