felix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Stuart McCulloch" <mccu...@gmail.com>
Subject Re: Fragment-Host resolution fails (bug?)
Date Mon, 17 Nov 2008 19:31:52 GMT
2008/11/18 Richard S. Hall <heavy@ungoverned.org>

>
> Walid "jo" Gedeon wrote:
>
>> Hello Richard,
>>
>>
>>> 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.
>>>
>>>
>> Hmm... ok, I wasnt aware of that.
>>
>>
>
> To be clear, the spec is purposely vague here. So, it doesn't forbid or
> mandate dynamic attachment.
>

yes, looking at the core OSGi spec, page 48:

   "Before a bundle is resolved, all its Fragments must be attached."

but earlier on in the spec, page 36, I found:

   "The framework must recognize the following directives for the
Bundle-SymbolicName header:
      • fragment-attachment – Defines how fragments are allowed to be
attached, see the fragments
        in Fragment Bundles on page 68. The following values are valid for
this directive:
         • always – Fragments can attach at any time while the host is
resolved or during the process of resolving.
         • never – No fragments are allowed.
         • resolve-time – Fragments must only be attached during resolving."

though it doesn't state what the default setting is (perhaps 'resolve-time'
?)

anyway, I don't think we support the "fragment-attachment" directive in
Felix yet...


>  Are you resolving the host first before installing the fragment?
>>>
>>>
>> Yes I am.
>>
>> So the steps would be:
>> - install log4j -> Installed
>> - install config fragment -> Installed
>> - start config fragment -> Active (log4j now resolved)
>> - start log4j -> Active.
>>
>> But what would happen if the host bundle has many fragments?
>>
>>
>
> Install the host and all fragments then start the host. That is all you
> need to do. All fragments will be attached when resolving the host. You
> don't need to start fragments, because they don't have an activator in the
> first place.
>
> -> richard
>
>
>  Thanks,
>> w
>>
>> On Mon, Nov 17, 2008 at 7:27 PM, Richard S. Hall <heavy@ungoverned.org
>> >wrote:
>>
>>
>>
>>> 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
>>>>
>>>>
>>>>
>>>
>>
>>
>


-- 
Cheers, Stuart

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message