Hi All, 6.1.12.34 public static final String FRAGMENT_ATTACHMENT_DIRECTIVE = "fragment-attachment" Manifest header directive (named "fragment-attachment") identifying if and when a fragment may attach to a host bundle. The default value is "always".
So the answer is not as happy as you thought. Regards, Lucas On Mon, Nov 17, 2008 at 5:31 PM, Stuart McCulloch <[EMAIL PROTECTED]> wrote: > 2008/11/18 Richard S. Hall <[EMAIL PROTECTED]> > >> >> 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 <[EMAIL PROTECTED] >>> >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 >