2015-01-14 1 views
0

저는 packageAdmin.getBundles()를 사용하여 symbolicName과 버전 범위로 설치된 번들을 쿼리했습니다. 그러나이 클래스는 사용되지 않습니다.OSGi 컨테이너의 기능을 쿼리하는 올바른 방법은 무엇입니까

이제 IdentityNamespace (이 경우)를 사용하여 기능 및 쿼리 번들을 사용해야한다는 것을 알고 있습니다.

하지만 컨테이너에 설치된 모든 번들이 제공하는 기능을 쿼리하는 가장 빠르고 좋은 방법은 무엇입니까?

BundleContext.getBundles()에서 모든 번들의 배열을 가져 오는 메소드를 직접 작성해야합니까? 그런 다음 BundleRevision에 대한 각 번들을 적용한 다음 해당 배열을 탐색 한 다음 getDeclaredCapabilities() 메소드에서 반환 한 기능과 일치 시키려고합니까? 아니면 다른 간단한 방법이 있습니까?

답변

2

BundleContext.getBundles()에서 모든 번들의 배열을 가져 오는 메소드를 직접 작성해야합니까? 그런 다음 BundleRevision에 대한 각 번들을 적용한 다음 해당 배열을 탐색 한 다음 getDeclaredCapabilities() 메소드에서 반환 한 기능과 일치 시키려고합니까? 아니면 다른 간단한 방법이 있습니까?

거의. 당신은해야한다 :

  • BundleContext에
  • 에서 사용 가능한 번들
  • 이 BundleWirings

에서 능력을 얻을 BundleWirings에 번들을 적용 받기 예 :

자세한 내용은
Bundle[] bundles = context.getBundles(); 
foreach(Bundle : bundles) { 
    BundleWiring bundleWiring = bundle.adapt(BundleWiring.class); 
    List<BundleCapability> capabilities = bundleWiring.getCapabilities(null); 
    myCapabilityBasedLogic(capabilities); 
} 

, documentation of BundleWiring 클래스를 참조하십시오. 번들 설치 상태에있는 경우

업데이트

, 그것은 더 BundleWiring이 없습니다. 이전에 설치된 번들의 기능을 얻기 위해 코드 스 니펫을 작성했습니다 : https://github.com/everit-org/osgi-lqmg/blob/master/src/main/java/org/everit/osgi/dev/lqmg/internal/EquinoxHackUtilImpl.java.

기능을 참조하십시오. getAllCapabilities (번들, 상태).

관련 코드 : I 펠릭스에서 비슷한 가능성이 추측

PlatformAdmin platformAdmin = systemBundleContext.getService(platformServiceSR); 
State state = platformAdmin.getState(); 
Bundle[] bundles = systemBundleContext.getBundles(); 

List<BundleCapability> availableCapabilities = new ArrayList<BundleCapability>(); 
for (Bundle bundle : bundles) { 
    BundleDescription bundleDescription = state.getBundle(bundle.getBundleId()); 
    List<BundleCapability> declaredCapabilities = bundleDescription.getDeclaredCapabilities(null); 
    availableCapabilities.addAll(declaredCapabilities); 
} 
return availableCapabilities; 

. 어떻게 작동하는지 알게되면 나와 공유하십시오. 필자도 Felix를위한 HackUtil 구현체를 만들 것입니다.).

당신이 보편적 인 수제 솔루션을 원하는 경우에, 당신은 구문 분석 할 수있는 제공-기능 및 설치된 번들의 수출 패키지 헤더를. felix-utils로 헤더를 구문 분석 할 수 있습니다. 이 라이브러리는 여러 기술에 내장되어 있지만, 다시 패키징하여 OSGi bundle으로 maven-central에 업로드했습니다. 당신의 코드는 다음과 유사 할 수 있습니다 당신이 원하는대로

Dictionary<String, String> headers = installedBundle.getHeaders(); 
String header = headers.get("Provide-Capability"); 

if (header != null) { 
    // Parse with felix-utils 
    Clause[] clauses = Parse.parseHeader(header); 
    for(Clause clause : clauses) { 
     String nameSpace = clause.getName(); 
     Attribute[] attributes = clause.getAttributes(); 
     Directive[] directives = clause.getDirectives(); 

     processCapability(nameSpace, attributes, directives); 
    } 
} 

당신은 processCapability를 구현해야합니다.내보내기 패키지 헤더를 구문 분석하고 OSGi 사양을 기반으로 기능으로 변환 할 수도 있습니다.

+0

글쎄, 내 번들은 상태가 설치되어있을 때 BundleWiring을 가지고 있지 않다는 것이 이해되었습니다. 그게 옳지 않아? – Cristiano

+0

당신 말이 맞아요. 나는 당신에게 필요한 능력 만 필요하다고 생각했습니다. 내가 아는 모든 정보로 답변을 업데이트했습니다 :). –

관련 문제