I think the logic is correct. You cannot dynamically attach a fragment
to an already resolved host. Thus, the potential hosts for the fragment
are only those that are not yet resolved.
Are you resolving the host first before installing the fragment?
-> richard
Walid "jo" Gedeon wrote:
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
<http://org.apache.log4j.net>,org.apache.log4j.nt,org.apache.log4j.or,org.apache.log4j.or.jms,org.apache.log4j.or.sa
<http://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