deltaspike-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rudy De Busscher <rdebussc...@gmail.com>
Subject [DISCUSS] specific code required for integration tests of Security impl module for WebLogic 12c
Date Mon, 06 Aug 2012 20:08:36 GMT
Hi All,

The integration tests on WebLogic 12C fails at the Security Impl Module.
There are 2 problems (see also DELTASPIKE-261 - Integration tests of
security impl module fails on Weblogic
12c<https://issues.apache.org/jira/browse/DELTASPIKE-261>) :

1. ClassLoader issue
within the method
*org.apache.deltaspike.security.impl.extension.SecurityExtension#getMetaDataStorage
*, the call *ClassUtils.getClassLoader(null);* doesn't results in the same
classLoader depending on the 'part' of the test. During deployment, you get
another one then during testing itself. This results in an empty
SecurityMetaDataStorage and the exception "*No matching authorizer found
for security binding type [@ ... *"

<https://issues.apache.org/jira/browse/DELTASPIKE-261>2. beanManager issue
The *beanManager *supplied as parameter to the call
*org.apache.deltaspike.security.impl.extension.SecurityExtension#processAnnotatedType
* doesn't have the registered beans. Since that beanManager is passed to
the *Authorizer*, the managed bean could not be retrieved in the method *
org.apache.deltaspike.security.impl.extension.Authorizer#lazyInitTargetBean*.
It throws the exception *"Exception looking up authorizer method bean - no
beans found for method [ ..."*


I found solutions for both problems, but it requires some code specific for
wls12C (not dependent on wls12C dependencies but code that is only needed
and executed within wls12c) I know that is isn't very good but I can't see
any other solution to keep the integration tests running on WebLogic 12C.

I no one raises a veto (-1) against the code, I'll commit it by the end of
the week.

Any comments also appreciated of course.

Regards
Rudy

*1. Class Loader issue -> Try also the parent class loader to see If we
have an entry for that value.*

---
a/deltaspike/modules/security/impl/src/main/java/org/apache/deltaspike/security/impl/extension/SecurityExtension.java
+++
b/deltaspike/modules/security/impl/src/main/java/org/apache/deltaspike/security/impl/extension/SecurityExtension.java
@@ -62,6 +55,12 @@ public class SecurityExtension implements Extension,
Deactivatable

         if (securityMetaDataStorage == null)
         {
+            securityMetaDataStorage =
tryParentClassLoaderOnWeblogic(classLoader, securityMetaDataStorage);
+
+        }
+
+        if (securityMetaDataStorage == null)
+        {
             securityMetaDataStorage = new SecurityMetaDataStorage();
             SECURITY_METADATA_STORAGE_MAPPING.put(classLoader,
securityMetaDataStorage);
         }
@@ -69,6 +68,19 @@ public class SecurityExtension implements Extension,
Deactivatable
         return securityMetaDataStorage;
     }

+    private static SecurityMetaDataStorage
tryParentClassLoaderOnWeblogic(ClassLoader someClassLoader,
+                                           SecurityMetaDataStorage
someSecurityMetaDataStorage)
+    {
+        // Within Oracle WebLogic 12C, during deployment, we get another
classloader then during the execution
+        // of the application.
+        if (someClassLoader.getClass().getName().startsWith("weblogic."))
+        {
+
+            someSecurityMetaDataStorage =
SECURITY_METADATA_STORAGE_MAPPING.get(someClassLoader.getParent());
+        }
+        return someSecurityMetaDataStorage;
+    }
+
     public static void removeMetaDataStorage()
     {
         ClassLoader classLoader = ClassUtils.getClassLoader(null);

*2. beanManager issue -> A solution is looking in the beanManager retrieved
from the JNDI. *

---
a/deltaspike/modules/security/impl/src/main/java/org/apache/deltaspike/security/impl/extension/Authorizer.java
+++
b/deltaspike/modules/security/impl/src/main/java/org/apache/deltaspike/security/impl/extension/Authorizer.java
@@ -133,9 +131,22 @@ class Authorizer
             }
             else if (beans.isEmpty())
             {
-                throw new IllegalStateException("Exception looking up
authorizer method bean - " +
+                // Try the BeanManager from JNDI. On WebLogic we have more
luck with that one
+                beans =
BeanManagerProvider.getInstance().getBeanManager().getBeans(method.getDeclaringClass());
+                if (beans.size() == 1)
+                {
+                    boundAuthorizerBean = beans.iterator().next();
+                    // Keep the reference to the other BeanManager here
for further lookups.
+                    beanManager =
BeanManagerProvider.getInstance().getBeanManager();
+                }
+                else
+                {
+
+                    throw new IllegalStateException("Exception looking up
authorizer method bean - " +
                         "no beans found for method [" +
method.getDeclaringClass() + "." +
                         method.getName() + "]");
+                }
+
             }
             else if (beans.size() > 1)
             {

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message