Given that we’re now resorting to class loader trickery as a workaround, 
wouldn’t it actually make more sense to use the specification which solves this 
properly? The object in question is already a DS component, so requiring a 
service is about as low effort as possible, and there must be a suitably 
packaged DocumentBuilder implementation somewhere in Karaf?

Tim

> On 27 Mar 2018, at 17:53, Kerry <karaf-u...@avionicengineers.com> wrote:
> 
> I'm a bit puzzled why it works with a Karaf command as this will be executed 
> with a differing classloader but as I don't have your code it's hard for me 
> to visualise your imports etc correctly.
> 
> I would temporarily change the classloader to that of a class that is in your 
> bundle, typically I would make it that of the class which is the entry point 
> from the 'outside world' into your bundle. Don't forget to reset the 
> classloader before the thread leaves your bundle and do this inside a finally 
> clause.
> 
> Kerry
> 
> On 27/03/18 22:16, Nicolas Brasey wrote:
>> Ideally I would like to avoid overloading too much from the vanilla karaf to 
>> avoid too much dependencies to ease the future karaf version upgrades, but 
>> since I'm blocked at the moment I can give it a try. The best for me would 
>> be to find a nasty workaround with the classloader just to make it work. 
>> Which classloader can I set on the current thread to make this work?
>> 
>> Thanks a lot Guillaume for your help!
>> 
>> Cheers,
>> Nicolas
>> 
>> 
>> 
>> On Tue, Mar 27, 2018 at 8:09 PM, Guillaume Nodet <gno...@apache.org 
>> <mailto:gno...@apache.org>> wrote:
>> You're right, I think the current setup on 4.1 is not optimal and a bit too 
>> sensitive to the thread context class loader.
>> Can you simply remove the xalan and xerces jars from the lib/endorsed folder 
>> and the corresponding export packages in etc/config.properties ?
>> If you want to use xalan and xerces, deploy them as bundles instead.
>> Also, please raise a JIRA so that we can fix that.
>> 
>> 2018-03-27 18:35 GMT+02:00 Nicolas Brasey <nicolas.bra...@gmail.com 
>> <mailto:nicolas.bra...@gmail.com>>:
>> Yes that was also my understanding and this is what I'm doing. Like I said 
>> before, it works well from the karaf command but not when the call is 
>> initiated from somewhere else. 
>> 
>> 
>> 
>> On Tue, Mar 27, 2018 at 6:21 PM, Guillaume Nodet <gno...@apache.org 
>> <mailto:gno...@apache.org>> wrote:
>> In Karaf, we ensure that you can use DocumentBuilderFactory#newInstance().
>> That's the standard java api to create a Parser and it works well in Karaf.
>> 
>> 2018-03-27 18:11 GMT+02:00 Nicolas Brasey <nicolas.bra...@gmail.com 
>> <mailto:nicolas.bra...@gmail.com>>:
>> Hi Guillaume,
>> 
>> Thanks for those infos. I'm running Karaf 4.1.2.  So I tried to lookup a 
>> DocumentBuilderFactory service but no one are availably in standard in this 
>> karaf version.
>> 
>> What do you exactly mean by "it should already work" ? If it can help, I 
>> actually based my implementation on the example I found in Karaf, in the Kar 
>> service implementation, the class FeatureDetector. It is parsing an XML 
>> feature file, which is exactly what I'm trying to do as well. My 
>> implementation is 1 to 1.
>> 
>> So the code seems perfectly working when a karaf command is calling it, but 
>> badly failing when coming from a jetty thread (REST endpoint). 
>> 
>> I would be happy to get away with a nasty workaround, I'm not looking by a 
>> by-the-book implementation :-)
>> 
>> Thanks again!
>> Nicolas   
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> On Tue, Mar 27, 2018 at 5:02 PM, Guillaume Nodet <gno...@apache.org 
>> <mailto:gno...@apache.org>> wrote:
>> Here's the way to solve the problem for Karaf 4.2, hopefully I can merge it 
>> before the release is done:
>>   https://github.com/apache/karaf/pull/481 
>> <https://github.com/apache/karaf/pull/481>
>> 
>> For 4.1, the distribution should already work.
>> 
>> The OSGi 133 (Service Loader) and 702 (XML Parser) are clearly not 
>> sufficient when working with libraries that have not been built solely for 
>> OSGi and which use the standard way to use the XML apis.
>> 
>> Fwiw, the openjdk code contains code specific to glassfish osgi environment, 
>> in a similar way than the above PR.
>> 
>> 
>> 2018-03-27 16:57 GMT+02:00 Nicolas Brasey <nicolas.bra...@gmail.com 
>> <mailto:nicolas.bra...@gmail.com>>:
>> Hi Kerry,
>> 
>> Yes it executes in another thread (jetty http executor thread pool), so the 
>> context is different. 
>> 
>> The code actually fails quite deep in the abyss of the java service loader:
>> 
>>  
>> Caused by: java.util.ServiceConfigurationError: 
>> javax.xml.parsers.DocumentBuilderFactory: Provider 
>> org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found
>>      at java.util.ServiceLoader.fail(ServiceLoader.java:239) ~[?:?]
>> 
>> 
>> I should switch the current thread classloader to use the classloader of the 
>> class java.util.ServiceLoader?
>> 
>> Thanks!!
>> Nicolas
>> 
>> 
>> 
>> On Tue, Mar 27, 2018 at 3:38 PM, Kerry <karaf-u...@avionicengineers.com 
>> <mailto:karaf-u...@avionicengineers.com>> wrote:
>> Hazarding a guess at this but when it fails when called by the camel route 
>> it will be executing on a different thread when then when executed by karaf 
>> command. You could try and confirm this by surrounding the code that is 
>> failing with a thread context switch so that it switches to the context of 
>> the class that has the failing code.
>> 
>> Kerry
>> 
>> Sent from BlueMail <http://www.bluemail.me/r?b=12512>
>> On 27 Mar 2018, at 14:17, Nicolas Brasey <nicolas.bra...@gmail.com 
>> <mailto:nicolas.bra...@gmail.com>> wrote:
>> Hi,
>> 
>> I'm feeling frustrated because like everytime I'm adventuring with XML in an 
>> OSGi context, I end up with classloading issues, and this time is no 
>> exception :-) So I would like to know what/how you guys are doing it...
>> 
>> My use case is extremely simple, yet I can't figure out what I'm doing 
>> wrong. I need to use an XML parser to get a Document object from an XML 
>> file. This XML parsing code is embedded inside a service (DS). The weird 
>> thing is that If I invoke this service with a karaf command, then it works 
>> fine. If the same code is invoked through a REST endpoint (another bundle), 
>> then I get the following class not found:
>> 
>> Caused by: java.util.ServiceConfigurationError: 
>> javax.xml.parsers.DocumentBuilderFactory: Provider 
>> org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found
>>  at java.util.ServiceLoader.fail(ServiceLoader.java:239) ~[?:?]
>>  at java.util.ServiceLoader.access$300(ServiceLoader.java:185) ~[?:?]
>>  at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:372) 
>> ~[?:?]
>> 
>> 
>> AFAIK, Karaf is pulling the servicemix implementation of Xerces, and I 
>> doubled check that the package is available in karaf:
>> 
>> 
>> dms@root>exports | grep org.apache.xerces.jaxp
>> org.apache.xerces.jaxp.datatype                                              
>>                           │ 2.11.0                             │ 348 │ 
>> org.apache.servicemix.bundles.xerces
>> org.apache.xerces.jaxp.validation                                            
>>                           │ 2.11.0                             │ 348 │ 
>> org.apache.servicemix.bundles.xerces
>> org.apache.xerces.jaxp                                                       
>>                           │ 2.11.0                             │ 348 │ 
>> org.apache.servicemix.bundles.xerces
>> 
>> 
>> 
>> So, I don't know what I'm doing wrong here.
>> 
>> Any clue ?
>> 
>> 
>> Thanks,
>> Nicolas
>> 
>> 
>> 
>> 
>> 
>> -- 
>> ------------------------
>> Guillaume Nodet
>> 
>> 
>> 
>> 
>> 
>> -- 
>> ------------------------
>> Guillaume Nodet
>> 
>> 
>> 
>> 
>> 
>> -- 
>> ------------------------
>> Guillaume Nodet
>> 
>> 
> 

Reply via email to