keycloak-uncached

Details

diff --git a/integration/as7-eap6/adapter/src/main/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactory.java b/integration/as7-eap6/adapter/src/main/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactory.java
index 3d8930e..1b01b75 100755
--- a/integration/as7-eap6/adapter/src/main/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactory.java
+++ b/integration/as7-eap6/adapter/src/main/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactory.java
@@ -14,6 +14,7 @@ import org.keycloak.adapters.KeycloakAccount;
 import org.keycloak.adapters.tomcat.GenericPrincipalFactory;
 
 import javax.security.auth.Subject;
+import java.lang.reflect.Constructor;
 import java.security.Principal;
 import java.security.acl.Group;
 import java.util.ArrayList;
@@ -29,6 +30,8 @@ import java.util.Set;
  */
 public class JBossWebPrincipalFactory extends GenericPrincipalFactory {
 
+    private static Constructor jbossWebPrincipalConstructor = findJBossGenericPrincipalConstructor();
+
     @Override
     protected GenericPrincipal createPrincipal(Principal userPrincipal, List<String> roles) {
         return null;
@@ -84,9 +87,12 @@ public class JBossWebPrincipalFactory extends GenericPrincipalFactory {
         sc.getUtil().createSubjectInfo(userPrincipal, account, subject);
         List<String> rolesAsStringList = new ArrayList<String>();
         rolesAsStringList.addAll(roleSet);
-        return new JBossGenericPrincipal(realm, userPrincipal.getName(), null, rolesAsStringList,
-                userPrincipal, null, account, null, subject);
 
+        try {
+            return (GenericPrincipal) jbossWebPrincipalConstructor.newInstance(realm, userPrincipal.getName(), null, rolesAsStringList, userPrincipal, null, account, null, subject);
+        } catch (Throwable t) {
+            throw new RuntimeException("Failed to create JBossGenericPrincipal", t);
+        }
     }
 
     /**
@@ -150,4 +156,19 @@ public class JBossWebPrincipalFactory extends GenericPrincipalFactory {
         return roleSets;
     }
 
+    static Constructor findJBossGenericPrincipalConstructor() {
+        for (Constructor<?> c : JBossGenericPrincipal.class.getConstructors()) {
+            if (c.getParameterTypes().length == 9 &&
+                    c.getParameterTypes()[0].equals(Realm.class) &&
+                    c.getParameterTypes()[1].equals(String.class) &&
+                    c.getParameterTypes()[3].equals(List.class) &&
+                    c.getParameterTypes()[4].equals(Principal.class) &&
+                    c.getParameterTypes()[6].equals(Object.class) &&
+                    c.getParameterTypes()[8].equals(Subject.class)) {
+                return c;
+            }
+        }
+        return null;
+    }
+
 }
diff --git a/integration/as7-eap6/adapter/src/test/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactoryTest.java b/integration/as7-eap6/adapter/src/test/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactoryTest.java
new file mode 100644
index 0000000..f27bca2
--- /dev/null
+++ b/integration/as7-eap6/adapter/src/test/java/org/keycloak/adapters/jbossweb/JBossWebPrincipalFactoryTest.java
@@ -0,0 +1,29 @@
+package org.keycloak.adapters.jbossweb;
+
+import org.apache.catalina.Realm;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.security.auth.Subject;
+import java.lang.reflect.Constructor;
+import java.security.Principal;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
+ */
+public class JBossWebPrincipalFactoryTest {
+
+    @Test
+    public void test() {
+        Constructor constructor = JBossWebPrincipalFactory.findJBossGenericPrincipalConstructor();
+        Assert.assertNotNull(constructor);
+        Assert.assertEquals(Realm.class, constructor.getParameterTypes()[0]);
+        Assert.assertEquals(String.class, constructor.getParameterTypes()[1]);
+        Assert.assertEquals(List.class, constructor.getParameterTypes()[3]);
+        Assert.assertEquals(Principal.class, constructor.getParameterTypes()[4]);
+        Assert.assertEquals(Object.class, constructor.getParameterTypes()[6]);
+        Assert.assertEquals(Subject.class, constructor.getParameterTypes()[8]);
+    }
+
+}