public CapabilityComparator() {}
public int compare(Capability o1, Capability o2) {
Resource res1 = o1.getResource();
Resource res2 = o2.getResource();
// 1. Framework bundle
if (res1 == getFrameworkResource())
return -1;
if (res2 == getFrameworkResource())
return +1;
// 2. Wired
Map<Resource,Wiring> wirings = getWirings();
Wiring w1 = wirings.get(res1);
Wiring w2 = wirings.get(res2);
if (w1 != null && w2 == null)
return -1;
if (w1 == null && w2 != null)
return +1;
// 3. Input requirements
if (isInputRequirementResource(res1)) {
if (!isInputRequirementResource(res2))
return -1;
}
if (isInputRequirementResource(res2)) {
if (!isInputRequirementResource(res1))
return +1;
}
// 4. Higher package version
String ns1 = o1.getNamespace();
String ns2 = o2.getNamespace();
if (PACKAGE_NAMESPACE.equals(ns1) && PACKAGE_NAMESPACE.equals(ns2)) {
Version v1 = getVersion(o1, PackageNamespace.CAPABILITY_VERSION_ATTRIBUTE);
Version v2 = getVersion(o2, PackageNamespace.CAPABILITY_VERSION_ATTRIBUTE);
if (!v1.equals(v2))
return v2.compareTo(v1);
}
// 5. Higher resource version
if (BUNDLE_NAMESPACE.equals(ns1) && BUNDLE_NAMESPACE.equals(ns2)) {
Version v1 = getVersion(o1, BundleNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE);
Version v2 = getVersion(o2, BundleNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE);
if (!v1.equals(v2))
return v2.compareTo(v1);
} else if (IdentityNamespace.IDENTITY_NAMESPACE.equals(ns1)
&& IdentityNamespace.IDENTITY_NAMESPACE.equals(ns2)) {
Version v1 = getVersion(o1, IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE);
Version v2 = getVersion(o2, IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE);
if (!v1.equals(v2))
return v2.compareTo(v1);
}
// 6. Same package version, higher bundle version
if (PACKAGE_NAMESPACE.equals(ns1) && PACKAGE_NAMESPACE.equals(ns2)) {
String bsn1 = (String) o1.getAttributes().get(Constants.BUNDLE_SYMBOLIC_NAME_ATTRIBUTE);
String bsn2 = (String) o2.getAttributes().get(Constants.BUNDLE_SYMBOLIC_NAME_ATTRIBUTE);
if (bsn1 != null && bsn1.equals(bsn2)) {
Version v1 = getVersion(o1, BundleNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE);
Version v2 = getVersion(o2, BundleNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE);
if (!v1.equals(v2))
return v2.compareTo(v1);
}
}
// 7. The resource with the fewest requirements
int diff = res1.getRequirements(null).size() - res2.getRequirements(null).size();
if (diff != 0)
return diff;
// 8. The resource with most capabilities
return res2.getCapabilities(null).size() - res1.getCapabilities(null).size();
}