[ 
https://issues.apache.org/jira/browse/SHIRO-537?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16697774#comment-16697774
 ] 

Steinar Bang commented on SHIRO-537:
------------------------------------

I tried to use the workaround mentioned in this bug, and in the linked-to 
stackoverflow answer, but the activator still failed with the same stack trace.

With the workaround in place, the activate method looked like this:
{code:java}
    @Activate
    public void activate(BundleContext ctx) {
        BundleWiring wiring = ctx.getBundle().adapt(BundleWiring.class);
        ClassLoader bundleClassloader = wiring.getClassLoader();
        Thread current = Thread.currentThread();
        ClassLoader originalClassloader = current.getContextClassLoader();
        current.setContextClassLoader(bundleClassloader);
        try {
            IniWebEnvironment webenvironment = new IniWebEnvironment();
            webenvironment.setIni(INI_FILE);
            webenvironment.setServletContext(getServletContext());
            webenvironment.init();
            DefaultWebSecurityManager securityManager = 
(DefaultWebSecurityManager) webenvironment.getSecurityManager();
            UkelonnRealm realm = 
createRealmProgramaticallyBecauseOfShiroIniClassCastException();
            securityManager.setRealm(realm);
            setSecurityManager(securityManager);
            setFilterChainResolver(webenvironment.getFilterChainResolver());
        } finally {
            current.setContextClassLoader(originalClassloader);
        }
    }
{code}
I've debugged into the activator, using remote debugging from eclipse into 
apache karaf. And I have verified that a BundleContext is injected, and a 
BundleWiring is successfully retrieved, and the classloaders are successfully 
retrieved and replaced.

The activator fails (as before adding the workaround), when the 
IniWebEnvironment() constructor tries to create a WebIniSecurityManagerFactory 
instance using reflection.

The stack trace in karaf.log with the workaround in place, is:
{noformat}
2018-11-24T11:48:41,006 | ERROR | Thread-50        | security                   
      | 171 - no.priv.bang.ukelonn.web.security - 1.0.0.SNAPSHOT | 
[no.priv.bang.ukelonn.web.security.UkelonnShiroFilter(9)] The activate method 
has thrown an exception
java.lang.NoClassDefFoundError: 
org/apache/shiro/web/config/WebIniSecurityManagerFactory
        at 
org.apache.shiro.web.env.IniWebEnvironment.<init>(IniWebEnvironment.java:60) 
~[?:?]
        at 
no.priv.bang.ukelonn.web.security.UkelonnShiroFilter.activate(UkelonnShiroFilter.java:67)
 ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]
        at 
org.apache.felix.scr.impl.inject.BaseMethod.invokeMethod(BaseMethod.java:229) 
~[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.inject.BaseMethod.access$500(BaseMethod.java:39) 
~[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.inject.BaseMethod$Resolved.invoke(BaseMethod.java:650)
 ~[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.inject.BaseMethod.invoke(BaseMethod.java:506) 
[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.inject.ActivateMethod.invoke(ActivateMethod.java:307) 
[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.inject.ActivateMethod.invoke(ActivateMethod.java:299) 
[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:298)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:109)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:906)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:879)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:823)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:347)
 [?:?]
        at 
org.apache.felix.framework.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:247)
 [?:?]
        at 
org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:350) 
[?:?]
        at org.apache.felix.framework.Felix.getService(Felix.java:3737) [?:?]
        at 
org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:470)
 [?:?]
        at 
org.ops4j.pax.web.extender.whiteboard.internal.tracker.AbstractTracker.addingService(AbstractTracker.java:168)
 [242:org.ops4j.pax.web.pax-web-extender-whiteboard:6.0.9]
        at 
org.ops4j.pax.web.extender.whiteboard.internal.tracker.AbstractTracker.addingService(AbstractTracker.java:41)
 [242:org.ops4j.pax.web.pax-web-extender-whiteboard:6.0.9]
        at 
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)
 [?:?]
        at 
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:870)
 [?:?]
        at 
org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) 
[?:?]
        at 
org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) [?:?]
        at 
org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:901)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:990)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:838)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.fireServiceEvent(EventDispatcher.java:545)
 [?:?]
        at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4595) 
[?:?]
        at org.apache.felix.framework.Felix.registerService(Felix.java:3587) 
[?:?]
        at 
org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:348)
 [?:?]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:887)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:874)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:132)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:941)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:741)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:675)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:430)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:657)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:341)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:390) 
[179:org.apache.felix.scr:2.0.12]
        at org.apache.felix.scr.impl.Activator.access$200(Activator.java:54) 
[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:265) 
[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:254)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(AbstractExtender.java:227)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:482)
 [?:?]
        at 
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:415)
 [?:?]
        at 
org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232) [?:?]
        at 
org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:915)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:834)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.fireBundleEvent(EventDispatcher.java:516)
 [?:?]
        at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4579) 
[?:?]
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2174) [?:?]
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998) 
[?:?]
        at 
org.apache.karaf.bundle.core.internal.BundleWatcherImpl.run(BundleWatcherImpl.java:125)
 [22:org.apache.karaf.bundle.core:4.1.5]
        at java.lang.Thread.run(Thread.java:748) [?:?]
{noformat}

> Class load issue in OSGI in ClassUtils
> --------------------------------------
>
>                 Key: SHIRO-537
>                 URL: https://issues.apache.org/jira/browse/SHIRO-537
>             Project: Shiro
>          Issue Type: Bug
>    Affects Versions: 1.2.3
>         Environment: OSGi Felix 4.0.3
>            Reporter: Tom Nelson
>            Priority: Major
>
> I had the same issue that is described in:
> http://stackoverflow.com/questions/20653146/how-to-load-class-in-an-osgi-e4-environment-while-using-shiro
>  where it was suggested a bug was entered but never was, so here it is.  A 
> similar workaround worked for me:
>             Thread currentThread = Thread.currentThread();
>             ClassLoader originalCl = currentThread.getContextClassLoader();
>             try {
>                 Class<?> clazz = ((InfrastructureServer) 
> server).getBundleContext().getBundle()
>                         
> .loadClass(CustomRolePermissionResolver.class.getName());
>                 ClassLoader bundleClassLoader = clazz.getClassLoader();
>                 currentThread.setContextClassLoader(bundleClassLoader);
>                 webappContext.deploy(httpServer);
>             } catch (ClassNotFoundException e) {
>                 // TODO Auto-generated catch block
>                 e.printStackTrace();
>             } finally {
>                 currentThread.setContextClassLoader(originalCl);
>             }
> In addition, commons-collections 3.2.1 must be used in an OSGi environment, I 
> suggest bumping your dependency.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to