2017-02-06 9:49 GMT+01:00 Markus Rathgeb <maggu2...@gmail.com>: > That looks good, thanks a lot. > > Do you think this is something others are interested in? > Should I create a Jira + PR if it is working? >
Sure, but it would be interesting to do a complete pass on the services provided by each framework for completeness. > > 2017-02-06 9:21 GMT+01:00 Guillaume Nodet <gno...@apache.org>: > > The best option is to: > > * fix the system bundle capabilities > > * use a dependency feature as you did > > > > To fix the system bundle capabilities, depending on the framework used, > you > > can do something along the following: > > > > org.osgi.framework.system.capabilities=\ > > ...\ > > ${${framework}-capabilities} > > > > felix-capabilities= > > > > equinox-capabilities=\ > > > > osgi.service;effective:=active;objectClass=javax.xml. > parsers.SAXParserFactory > > > > I haven't tested the above, but hopefully you'll get the idea. It's > similar > > to what's done for the ${jre-${java.specification.version}}... > > > > 2017-02-06 9:16 GMT+01:00 Markus Rathgeb <maggu2...@gmail.com>: > >> > >> Hi Guillaume, > >> thank you for your reply. > >> > >> In this special case it is about an implementation for > >> "javax.xml.parsers.SAXParserFactory" and a service for that. > >> The bundle "org.eclipse.equinox.registry" (I need to use to satisfy > >> third party dependencies) is using a tracker to find an implementation > >> and prints errors to stdout if there is no one. > >> To prevent that messages on every Karaf start I would like to have > >> such a service in the Karaf instance. > >> > >> The Equinox OSGi framework provides that service itself. Without any > >> provide capability in its manifest. > >> The Apache Felix OSGi framework doesn't provide such a service. > >> > >> So, what are the options: > >> > >> add it to "org.osgi.framework.system.capabilities" > >> IMHO this will be not correct, because the service is present if > >> Equinox is used and not present if Felix is used. > >> > >> Use "conditionals" in a feature to install another bundle that > >> provides a "javax.xml.parsers.SAXParserFactory" service if Felix is > >> used (and so the conditional will skip the installation if Equinox is > >> used). > >> If my reading has been correct, conditionals could be used for > >> installed features and not for the special OSGi framework > >> implementation. > >> > >> I can install another bundle / feature that provides that service > >> implementation for both frameworks. > >> This is okay, but if it is not necessary... > >> > >> So, is there a simple method to leave it up to the user to switch > >> between "karaf.framework" Felix or Equinox and handle that in some > >> way, so another implementation is installed only if not Equinox is > >> choosen? > >> > >> Best regards, > >> Markus > >> > >> 2017-02-06 8:45 GMT+01:00 Guillaume Nodet <gno...@apache.org>: > >> > You can modify the etc/config.properties file, in particular the > >> > org.osgi.framework.system.capabilities > >> > configuration. If some service are provided by default by the > framework > >> > and > >> > are missing, > >> > you may want to raise a JIRA issue and provide a patch / pull request. > >> > > >> > 2017-02-05 12:05 GMT+01:00 Markus Rathgeb <maggu2...@gmail.com>: > >> >> > >> >> Ah, okay, I assume it is caused by the missing > >> >> Provide-Capability of the Equinox bundle that it provides that > service. > >> >> Could this information be added by some configuration file without > >> >> modify the Equinox bundle itself? > >> >> > >> >> 2017-02-05 11:49 GMT+01:00 Markus Rathgeb <maggu2...@gmail.com>: > >> >> > Hello, > >> >> > > >> >> > I thought I understand how the dependency flag is working for > >> >> > features > >> >> > and bundles, but at least it seems to be different. > >> >> > Perhaps someone could explain me the following scenario: > >> >> > > >> >> > Feature file: > >> >> > === > >> >> > <?xml version="1.0" encoding="UTF-8"?> > >> >> > <features name="saxparserfactory" > >> >> > xmlns="http://karaf.apache.org/xmlns/features/v1.4.0"> > >> >> > > >> >> > <feature name="saxparserfactory" version="1.0-SNAPSHOT"> > >> >> > > >> >> > > >> >> > <requirement>osgi.service;filter:="(objectClass=javax. > xml.parsers.SAXParserFactory)";effective:=active</requirement> > >> >> > <feature dependency="true">jboss-xerces</feature> > >> >> > </feature> > >> >> > > >> >> > <feature name="jboss-xerces" description="JBoss Xerces" > >> >> > version="1.0-SNAPSHOT"> > >> >> > <details>OSGi service for > >> >> > 'javax.xml.parsers.SAXParserFactory'</details> > >> >> > > >> >> > <!-- Maven repository: > >> >> > https://repository.jboss.org/nexus/content/repositories/releases/ > --> > >> >> > <!-- <bundle > >> >> > > >> >> > > >> >> > start-level="30">mvn:org.jboss.osgi.xerces/jbosgi- > xerces/3.1.0.Final</bundle> > >> >> > --> > >> >> > <bundle > >> >> > > >> >> > start-level="30">https://repository.jboss.org/nexus/ > content/repositories/releases/org/jboss/osgi/xerces/jbosgi- > xerces/3.1.0.Final/jbosgi-xerces-3.1.0.Final.jar</bundle> > >> >> > > >> >> > > >> >> > <capability>osgi.service;objectClass=javax.xml.parsers. > SAXParserFactory</capability> > >> >> > > >> >> > <bundle dependency="true" > >> >> > start-level="30">mvn:org.osgi/org.osgi.util.xml/1.0.1</bundle> > >> >> > <bundle dependency="true" > >> >> > > >> >> > start-level="8">mvn:org.ops4j.pax.logging/pax-logging-api/1. > 9.1</bundle> > >> >> > </feature> > >> >> > > >> >> > </features> > >> >> > === > >> >> > > >> >> > I would expect if I install the feature "saxparserfactory" the > >> >> > feature > >> >> > jboss-xerces is installed only if the requirements are not already > >> >> > fulfilled. > >> >> > The only requirement the feature drops in should be to ensure that > >> >> > there is a SAXParserFactory service available. > >> >> > Should this be possible? > >> >> > > >> >> > > >> >> > Test > >> >> > === > >> >> > > >> >> > I used the current Karaf 4.1.0 form the second voting round. > >> >> > > >> >> > Start a clean instance: > >> >> > $ bin/karaf clean > >> >> > > >> >> > As expected Apache Felix is the used OSGi framework > >> >> > > >> >> > karaf@root()> bundle:list -t 0 -s 0 | grep Active > >> >> > 0 │ Active │ 0 │ 5.6.1 │ org.apache.felix.framework > >> >> > > >> >> > I added the feature repository file. > >> >> > > >> >> > karaf@root()> feature:repo-add > >> >> > file:///home/maggu2810/tmp/saxparserfactory-feature.xml > >> >> > Adding feature url > >> >> > file:///home/maggu2810/tmp/saxparserfactory-feature.xml > >> >> > > >> >> > After that let's look if there is already a SAXParserFactory > present: > >> >> > > >> >> > karaf@root()> service:list javax.xml.parsers.SAXParserFactory > >> >> > > >> >> > No output, so as expected, no service found. > >> >> > > >> >> > Check what will be done if the feature is installed: > >> >> > > >> >> > karaf@root()> feature:install -t -v saxparserfactory > >> >> > Adding features: saxparserfactory/[1.0.0.SNAPSHOT,1.0.0.SNAPSHOT] > >> >> > Changes to perform: > >> >> > Region: root > >> >> > Bundles to install: > >> >> > > >> >> > > >> >> > https://repository.jboss.org/nexus/content/repositories/ > releases/org/jboss/osgi/xerces/jbosgi-xerces/3.1.0. > Final/jbosgi-xerces-3.1.0.Final.jar > >> >> > mvn:org.osgi/org.osgi.util.xml/1.0.1 > >> >> > > >> >> > This is as I expect what should be done. > >> >> > > >> >> > Let's exit the Karaf container. > >> >> > > >> >> > karaf@root()> shutdown -f > >> >> > > >> >> > > >> >> > > >> >> > After that I used the Equinox framework > >> >> > > >> >> > $ echo 'karaf.framework=equinox' >> etc/custom.properties > >> >> > > >> >> > and started again a clean isntance. > >> >> > > >> >> > $ bin/karaf clean > >> >> > > >> >> > Ensure the feature repository is available: > >> >> > > >> >> > karaf@root()> feature:repo-add > >> >> > file:///home/maggu2810/tmp/saxparserfactory-feature.xml > >> >> > Adding feature url > >> >> > file:///home/maggu2810/tmp/saxparserfactory-feature.xml > >> >> > > >> >> > The Equinox OSGi framework bundle already provides a > SAXParserFactory > >> >> > service. > >> >> > > >> >> > karaf@root()> service:list javax.xml.parsers.SAXParserFactory > >> >> > [javax.xml.parsers.SAXParserFactory] > >> >> > ------------------------------------ > >> >> > service.pid = > >> >> > 0.org.eclipse.osgi.internal.framework.XMLParsingServiceFactory > >> >> > service.vendor = Eclipse.org - Equinox > >> >> > service.id = 20 > >> >> > service.bundleid = 0 > >> >> > service.scope = bundle > >> >> > Provided by : > >> >> > OSGi System Bundle (0) > >> >> > > >> >> > Now I would expect that the installation of the saxparserfactory > >> >> > feature will not trigger an installation of the jboss-xerces > feature, > >> >> > because all requirements should be already satisfied. > >> >> > But it looks like: > >> >> > > >> >> > karaf@root()> feature:install -t -v saxparserfactory > >> >> > Adding features: saxparserfactory/[1.0.0.SNAPSHOT,1.0.0.SNAPSHOT] > >> >> > Changes to perform: > >> >> > Region: root > >> >> > Bundles to install: > >> >> > > >> >> > > >> >> > https://repository.jboss.org/nexus/content/repositories/ > releases/org/jboss/osgi/xerces/jbosgi-xerces/3.1.0. > Final/jbosgi-xerces-3.1.0.Final.jar > >> >> > mvn:org.osgi/org.osgi.util.xml/1.0.1 > >> >> > > >> >> > What am I doing wrong? > >> >> > > >> >> > Best regards, > >> >> > Markus Rathgeb > >> > > >> > > >> > > >> > > >> > -- > >> > ------------------------ > >> > Guillaume Nodet > >> > > > > > > > > > > > -- > > ------------------------ > > Guillaume Nodet > > > -- ------------------------ Guillaume Nodet