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 사양을 기반으로 기능으로 변환 할 수도 있습니다.
글쎄, 내 번들은 상태가 설치되어있을 때 BundleWiring을 가지고 있지 않다는 것이 이해되었습니다. 그게 옳지 않아? – Cristiano
당신 말이 맞아요. 나는 당신에게 필요한 능력 만 필요하다고 생각했습니다. 내가 아는 모든 정보로 답변을 업데이트했습니다 :). –