Hello all, I was struggling to get a fragment installed for log4j configuration, setup as a fragment with host=org.apache.log4j. However, I would keep getting the error:
org.osgi.framework.BundleException: Unresolved constraint in bundle 21: host; (bundle-symbolic-name=org.apache.log4j) (bundle 21 is my log4jconfig-fragment), and the log4j bundle (7) seems correctly installed: -> headers 7 Apache Jakarta log4j Plug-in (7) -------------------------------- Bundle-ClassPath = . Bundle-RequiredExecutionEnvironment = J2SE-1.4 Export-Package = org.apache.log4j,org.apache.log4j.chainsaw,org.apache.log4j.config,org.apache.log4j.helpers,org.apache.log4j.jdbc,org.apache.log4j.jmx,org.apac he.log4j.lf5,org.apache.log4j.lf5.config,org.apache.log4j.lf5.util,org.apache.log4j.lf5.viewer,org.apache.log4j.lf5.viewer.categoryexplorer,org.apache.log4j.lf5 .viewer.configure,org.apache.log4j.lf5.viewer.images,org.apache.log4j.net ,org.apache.log4j.nt,org.apache.log4j.or,org.apache.log4j.or.jms, org.apache.log4j.or.sa x,org.apache.log4j.spi,org.apache.log4j.varia,org.apache.log4j.xml Bundle-Version = 1.2.13.v200806030600 Manifest-Version = 1.0 Bundle-Vendor = Eclipse.org Bundle-ManifestVersion = 2 Eclipse-BuddyPolicy = registered Bundle-Name = Apache Jakarta log4j Plug-in Bundle-Localization = plugin Bundle-SymbolicName = org.apache.log4j In all case, stepping through the code (in org.apache.felix.framework.searchpolicy.R4SearchPolicyCore), it looks like the boolean checks have been reversed? private List getPotentialHosts(IModule fragment) { // ... IModule[] modules = m_factory.getModules(); for (int modIdx = 0; (hostReq != null) && (modIdx < modules.length); modIdx++) { if (!fragment.equals(modules[modIdx]) && !isResolved(modules[modIdx])) { ... I'm thinking this should be if (!fragment.equals(modules[modIdx]) && isResolved(modules[modIdx])) { the host bundle is resolved and it's not the same as the fragment bundle, and can be selected as a potential host: ICapability[] caps = modules[modIdx].getDefinition().getCapabilities(); for (int capIdx = 0; (caps != null) && (capIdx < caps.length); capIdx++) { if (caps[capIdx].getNamespace().equals(ICapability.HOST_NAMESPACE) && hostReq.isSatisfied(caps[capIdx]) && !modules[modIdx].isStale()) { hostList.add(modules[modIdx]); break; } } I've attached a patch for that change... Do you guys agree? or did I misunderstand some part of the logic? I can raise a defect and attach the patch if no one disagrees. Cheers, w