[ 
https://issues.apache.org/jira/browse/CXF-2893?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Hynek Mlnarik updated CXF-2893:
-------------------------------

    Description: 
The class org.apache.cxf.common.logging.LogUtils should attempt to use plain 
Class.forName(cname) if Class.forName(cname, true, 
Thread.currentThread().getContextClassLoader()) fails.

Rationale: Current thread might not be able to access cxf classes. Take as an 
example the following OSGi bundles:
1) bundle with a http server.
2) bundle with CXF-based servlet SomeCXFServlet. The bundle contains CXF as 
private OSGi library.
A servlet SomeCXFServlet from bundle (2) has access to CXF via 
SomeCXFServlet.class.getClassloader(), similarly LogUtils class via its 
classloader. However, the servlet initialization is performed from http server 
thread that does not have access to bundle (2) private classes. Initialization 
of a logger is hence also made from the http thread. CXF tries to load its 
org.apache.cxf.common.logging.*Logger classes - the attempt however fails 
because the current thread's classloader is used instead of the LogUtils'.

Solution: Try to load the class using Class.forName(cname) if 
Class.forName(cname, true, Thread.currentThread().getContextClassLoader()) 
fails.

Will attach diff in a separate comment

  was:
The class org.apache.cxf.common.logging.LogUtils should attempt to use plain 
Class.forName(cname) if Class.forName(cname, true, 
Thread.currentThread().getContextClassLoader()) fails.

Rationale: Current thread might not be able to access cxf classes. Take as an 
example the following OSGi bundles:
1) bundle with a http server
2) bundle with CXF-based servlet SomeCXFServlet
A servlet SomeCXFServlet from bundle (2) has access to CXF via 
SomeCXFServlet.class.getClassloader(), similarly for LogUtils class via its 
classloader. However, its initialization is performed from http server thread 
that does not have access to bundle (2) classes. Initialization of a logger is 
hence also made from the http thread. CXF tries to load its 
org.apache.cxf.common.logging.*Logger classes - the attempt however fails 
because the current thread's classloader is used instead of the LogUtils'.

Solution: Try to load the class using Class.forName(cname) if 
Class.forName(cname, true, Thread.currentThread().getContextClassLoader()) 
fails.

Will attach diff in a separate comment


> CXF should use class' classloader for initialization of its loggers
> -------------------------------------------------------------------
>
>                 Key: CXF-2893
>                 URL: https://issues.apache.org/jira/browse/CXF-2893
>             Project: CXF
>          Issue Type: Bug
>    Affects Versions: 2.2.9
>            Reporter: Hynek Mlnarik
>            Priority: Trivial
>         Attachments: patch.diff
>
>
> The class org.apache.cxf.common.logging.LogUtils should attempt to use plain 
> Class.forName(cname) if Class.forName(cname, true, 
> Thread.currentThread().getContextClassLoader()) fails.
> Rationale: Current thread might not be able to access cxf classes. Take as an 
> example the following OSGi bundles:
> 1) bundle with a http server.
> 2) bundle with CXF-based servlet SomeCXFServlet. The bundle contains CXF as 
> private OSGi library.
> A servlet SomeCXFServlet from bundle (2) has access to CXF via 
> SomeCXFServlet.class.getClassloader(), similarly LogUtils class via its 
> classloader. However, the servlet initialization is performed from http 
> server thread that does not have access to bundle (2) private classes. 
> Initialization of a logger is hence also made from the http thread. CXF tries 
> to load its org.apache.cxf.common.logging.*Logger classes - the attempt 
> however fails because the current thread's classloader is used instead of the 
> LogUtils'.
> Solution: Try to load the class using Class.forName(cname) if 
> Class.forName(cname, true, Thread.currentThread().getContextClassLoader()) 
> fails.
> Will attach diff in a separate comment

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to