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

Reply via email to