keycloak-uncached

cache 1st iteration finished

6/13/2014 8:39:20 PM

Details

diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheKeycloakSessionSpi.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheKeycloakSessionSpi.java
index f0b53a4..7e4e8e6 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheKeycloakSessionSpi.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheKeycloakSessionSpi.java
@@ -12,7 +12,7 @@ public class CacheKeycloakSessionSpi implements Spi {
 
     @Override
     public String getName() {
-        return "cacheKeycloakSession";
+        return "modelCache";
     }
 
     @Override
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheKeycloakSession.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheKeycloakSession.java
new file mode 100755
index 0000000..afc35e3
--- /dev/null
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheKeycloakSession.java
@@ -0,0 +1,281 @@
+package org.keycloak.models.cache;
+
+import org.keycloak.models.ApplicationModel;
+import org.keycloak.models.ClientModel;
+import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.KeycloakTransaction;
+import org.keycloak.models.OAuthClientModel;
+import org.keycloak.models.RealmModel;
+import org.keycloak.models.RoleModel;
+import org.keycloak.models.SocialLinkModel;
+import org.keycloak.models.UserModel;
+import org.keycloak.models.UserSessionModel;
+import org.keycloak.models.UsernameLoginFailureModel;
+import org.keycloak.models.cache.entities.CachedApplication;
+import org.keycloak.models.cache.entities.CachedApplicationRole;
+import org.keycloak.models.cache.entities.CachedOAuthClient;
+import org.keycloak.models.cache.entities.CachedRealm;
+import org.keycloak.models.cache.entities.CachedRealmRole;
+import org.keycloak.models.cache.entities.CachedRole;
+import org.keycloak.provider.ProviderSession;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public class NoCacheKeycloakSession implements CacheKeycloakSession {
+    protected ProviderSession providerSession;
+    protected KeycloakSession sessionDelegate;
+    protected KeycloakTransaction transactionDelegate;
+    protected boolean transactionActive;
+    protected boolean setRollbackOnly;
+
+    public NoCacheKeycloakSession(ProviderSession providerSession) {
+        this.providerSession = providerSession;
+    }
+
+    @Override
+    public KeycloakSession getDelegate() {
+        if (!transactionActive) throw new IllegalStateException("Cannot access delegate without a transaction");
+        if (sessionDelegate != null) return sessionDelegate;
+        sessionDelegate = providerSession.getProvider(KeycloakSession.class);
+        transactionDelegate = sessionDelegate.getTransaction();
+        if (!transactionDelegate.isActive()) {
+            transactionDelegate.begin();
+            if (setRollbackOnly) {
+                transactionDelegate.setRollbackOnly();
+            }
+        }
+        return sessionDelegate;
+    }
+
+    @Override
+    public void registerRealmInvalidation(String id) {
+    }
+
+    @Override
+    public void registerApplicationInvalidation(String id) {
+    }
+
+    @Override
+    public void registerRoleInvalidation(String id) {
+    }
+
+    @Override
+    public void registerOAuthClientInvalidation(String id) {
+    }
+
+    @Override
+    public KeycloakTransaction getTransaction() {
+        return new KeycloakTransaction() {
+            @Override
+            public void begin() {
+                transactionActive = true;
+            }
+
+            @Override
+            public void commit() {
+                if (sessionDelegate == null) return;
+                try {
+                    sessionDelegate.getTransaction().commit();
+                } finally {
+                }
+            }
+
+            @Override
+            public void rollback() {
+                setRollbackOnly = true;
+                if (sessionDelegate == null) return;
+                try {
+                    sessionDelegate.getTransaction().rollback();
+                } finally {
+                }
+            }
+
+            @Override
+            public void setRollbackOnly() {
+                setRollbackOnly = true;
+                if (sessionDelegate == null) return;
+                sessionDelegate.getTransaction().setRollbackOnly();
+                setRollbackOnly = true;
+            }
+
+            @Override
+            public boolean getRollbackOnly() {
+                return setRollbackOnly;
+            }
+
+            @Override
+            public boolean isActive() {
+                return transactionActive;
+            }
+        };
+    }
+
+    @Override
+    public RealmModel createRealm(String name) {
+        return getDelegate().createRealm(name);
+    }
+
+    @Override
+    public RealmModel createRealm(String id, String name) {
+        return getDelegate().createRealm(id, name);
+    }
+
+    @Override
+    public RealmModel getRealm(String id) {
+        return getDelegate().getRealm(id);
+    }
+
+    @Override
+    public RealmModel getRealmByName(String name) {
+        return getDelegate().getRealmByName(name);
+    }
+
+    @Override
+    public UserModel getUserById(String id, RealmModel realm) {
+        return getDelegate().getUserById(id, realm);
+    }
+
+    @Override
+    public UserModel getUserByUsername(String username, RealmModel realm) {
+        return getDelegate().getUserByUsername(username, realm);
+    }
+
+    @Override
+    public UserModel getUserByEmail(String email, RealmModel realm) {
+        return getDelegate().getUserByEmail(email, realm);
+    }
+
+    @Override
+    public List<RealmModel> getRealms() {
+        // we don't cache this for now
+        return getDelegate().getRealms();
+    }
+
+    @Override
+    public boolean removeRealm(String id) {
+        return getDelegate().removeRealm(id);
+    }
+
+    @Override
+    public void removeAllData() {
+        getDelegate().removeAllData();
+    }
+
+    @Override
+    public void close() {
+        if (sessionDelegate != null) sessionDelegate.close();
+    }
+
+    @Override
+    public UserModel getUserBySocialLink(SocialLinkModel socialLink, RealmModel realm) {
+        return getDelegate().getUserBySocialLink(socialLink, realm);
+    }
+
+    @Override
+    public List<UserModel> getUsers(RealmModel realm) {
+        return getDelegate().getUsers(realm);
+    }
+
+    @Override
+    public List<UserModel> searchForUser(String search, RealmModel realm) {
+        return getDelegate().searchForUser(search, realm);
+    }
+
+    @Override
+    public List<UserModel> searchForUserByAttributes(Map<String, String> attributes, RealmModel realm) {
+        return getDelegate().searchForUserByAttributes(attributes, realm);
+    }
+
+    @Override
+    public Set<SocialLinkModel> getSocialLinks(UserModel user, RealmModel realm) {
+        return getDelegate().getSocialLinks(user, realm);
+    }
+
+    @Override
+    public SocialLinkModel getSocialLink(UserModel user, String socialProvider, RealmModel realm) {
+        return getDelegate().getSocialLink(user, socialProvider, realm);
+    }
+
+    @Override
+    public RoleModel getRoleById(String id, RealmModel realm) {
+       return getDelegate().getRoleById(id, realm);
+    }
+
+    @Override
+    public ApplicationModel getApplicationById(String id, RealmModel realm) {
+        return getDelegate().getApplicationById(id, realm);
+    }
+
+    @Override
+    public OAuthClientModel getOAuthClientById(String id, RealmModel realm) {
+        return getDelegate().getOAuthClientById(id, realm);
+    }
+
+    @Override
+    public UsernameLoginFailureModel getUserLoginFailure(String username, RealmModel realm) {
+        return getDelegate().getUserLoginFailure(username, realm);
+    }
+
+    @Override
+    public UsernameLoginFailureModel addUserLoginFailure(String username, RealmModel realm) {
+        return getDelegate().addUserLoginFailure(username, realm);
+    }
+
+    @Override
+    public List<UsernameLoginFailureModel> getAllUserLoginFailures(RealmModel realm) {
+        return getDelegate().getAllUserLoginFailures(realm);
+    }
+
+    @Override
+    public UserSessionModel createUserSession(RealmModel realm, UserModel user, String ipAddress) {
+        return getDelegate().createUserSession(realm, user, ipAddress);
+    }
+
+    @Override
+    public UserSessionModel getUserSession(String id, RealmModel realm) {
+        return getDelegate().getUserSession(id, realm);
+    }
+
+    @Override
+    public List<UserSessionModel> getUserSessions(UserModel user, RealmModel realm) {
+        return getDelegate().getUserSessions(user, realm);
+    }
+
+    @Override
+    public Set<UserSessionModel> getUserSessions(RealmModel realm, ClientModel client) {
+        return getDelegate().getUserSessions(realm, client);
+    }
+
+    @Override
+    public int getActiveUserSessions(RealmModel realm, ClientModel client) {
+        return getDelegate().getActiveUserSessions(realm, client);
+    }
+
+    @Override
+    public void removeUserSession(UserSessionModel session) {
+        getDelegate().removeUserSession(session);
+    }
+
+    @Override
+    public void removeUserSessions(RealmModel realm, UserModel user) {
+        getDelegate().removeUserSessions(realm, user);
+    }
+
+    @Override
+    public void removeExpiredUserSessions(RealmModel realm) {
+        getDelegate().removeExpiredUserSessions(realm);
+    }
+
+    @Override
+    public void removeUserSessions(RealmModel realm) {
+        getDelegate().removeUserSessions(realm);
+    }
+}
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheKeycloakSessionFactory.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheKeycloakSessionFactory.java
new file mode 100755
index 0000000..d3691a4
--- /dev/null
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/NoCacheKeycloakSessionFactory.java
@@ -0,0 +1,30 @@
+package org.keycloak.models.cache;
+
+import org.keycloak.Config;
+import org.keycloak.provider.ProviderSession;
+
+/**
+ * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public class NoCacheKeycloakSessionFactory implements CacheKeycloakSessionFactory {
+    @Override
+    public CacheKeycloakSession create(ProviderSession providerSession) {
+        return new NoCacheKeycloakSession(providerSession);
+    }
+
+    @Override
+    public void close() {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    @Override
+    public void init(Config.Scope config) {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    @Override
+    public String getId() {
+        return "none";
+    }
+}
diff --git a/model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.models.cache.CacheKeycloakSessionFactory b/model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.models.cache.CacheKeycloakSessionFactory
index 0cf4453..57939b6 100755
--- a/model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.models.cache.CacheKeycloakSessionFactory
+++ b/model/invalidation-cache/model-adapters/src/main/resources/META-INF/services/org.keycloak.models.cache.CacheKeycloakSessionFactory
@@ -1 +1,2 @@
-org.keycloak.models.cache.SimpleCacheKeycloakSessionFactory
\ No newline at end of file
+org.keycloak.models.cache.SimpleCacheKeycloakSessionFactory
+org.keycloak.models.cache.NoCacheKeycloakSessionFactory
\ No newline at end of file
diff --git a/model/tests/src/test/java/org/keycloak/model/test/AbstractModelTest.java b/model/tests/src/test/java/org/keycloak/model/test/AbstractModelTest.java
index 5366d04..3d61794 100755
--- a/model/tests/src/test/java/org/keycloak/model/test/AbstractModelTest.java
+++ b/model/tests/src/test/java/org/keycloak/model/test/AbstractModelTest.java
@@ -40,7 +40,7 @@ public class AbstractModelTest {
         providerSessionFactory = KeycloakApplication.createProviderSessionFactory();
 
         ProviderSession providerSession = providerSessionFactory.createSession();
-        KeycloakSession identitySession = providerSession.getProvider(CacheKeycloakSession.class);
+        KeycloakSession identitySession = providerSession.getProvider(CacheKeycloakSession.class, "simple");
         try {
             identitySession.getTransaction().begin();
             new ApplianceBootstrap().bootstrap(identitySession, "/auth");
@@ -59,7 +59,7 @@ public class AbstractModelTest {
     public void before() throws Exception {
         providerSession = providerSessionFactory.createSession();
 
-        identitySession = providerSession.getProvider(CacheKeycloakSession.class);
+        identitySession = providerSession.getProvider(CacheKeycloakSession.class, "simple");
         identitySession.getTransaction().begin();
         realmManager = new RealmManager(identitySession);
     }
@@ -70,7 +70,7 @@ public class AbstractModelTest {
         providerSession.close();
 
         providerSession = providerSessionFactory.createSession();
-        identitySession = providerSession.getProvider(CacheKeycloakSession.class);
+        identitySession = providerSession.getProvider(CacheKeycloakSession.class, "simple");
         try {
             identitySession.getTransaction().begin();
 
@@ -105,7 +105,7 @@ public class AbstractModelTest {
         providerSession.close();
 
         providerSession = providerSessionFactory.createSession();
-        identitySession = providerSession.getProvider(CacheKeycloakSession.class);
+        identitySession = providerSession.getProvider(CacheKeycloakSession.class, "simple");
         identitySession.getTransaction().begin();
         realmManager = new RealmManager(identitySession);
     }
diff --git a/project-integrations/aerogear-ups/auth-server/pom.xml b/project-integrations/aerogear-ups/auth-server/pom.xml
index 349dd13..07ec631 100755
--- a/project-integrations/aerogear-ups/auth-server/pom.xml
+++ b/project-integrations/aerogear-ups/auth-server/pom.xml
@@ -49,6 +49,11 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-invalidation-cache-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
             <artifactId>keycloak-model-jpa</artifactId>
             <version>${project.version}</version>
         </dependency>
diff --git a/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/keycloak-server.json b/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/keycloak-server.json
index 33b4c94..e321f7f 100755
--- a/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/keycloak-server.json
+++ b/project-integrations/aerogear-ups/auth-server/src/main/webapp/WEB-INF/keycloak-server.json
@@ -7,6 +7,10 @@
         "provider": "jpa"
     },
 
+    "modelCache": {
+        "provider": "${keycloak.model.cache.provider:simple}"
+    },
+
     "timer": {
         "provider": "basic"
     },

server/pom.xml 5(+5 -0)

diff --git a/server/pom.xml b/server/pom.xml
index 849c862..9185e34 100755
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -44,6 +44,11 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
+            <artifactId>keycloak-invalidation-cache-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.keycloak</groupId>
             <artifactId>keycloak-model-jpa</artifactId>
             <version>${project.version}</version>
         </dependency>
diff --git a/server/src/main/resources/META-INF/keycloak-server.json b/server/src/main/resources/META-INF/keycloak-server.json
index 7bc7ffd..2375215 100755
--- a/server/src/main/resources/META-INF/keycloak-server.json
+++ b/server/src/main/resources/META-INF/keycloak-server.json
@@ -14,6 +14,10 @@
         "provider": "jpa"
     },
 
+    "modelCache": {
+        "provider": "${keycloak.model.cache.provider:simple}"
+    },
+
     "timer": {
         "provider": "basic"
     },
diff --git a/testsuite/integration/src/main/resources/META-INF/keycloak-server.json b/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
index bc3370f..a1e1ec1 100755
--- a/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
+++ b/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
@@ -23,6 +23,10 @@
         }
     },
 
+    "modelCache": {
+        "provider": "${keycloak.model.cache.provider:simple}"
+    },
+
     "timer": {
         "provider": "basic"
     },
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/perf/AccessTokenPerfTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/perf/AccessTokenPerfTest.java
index 91027d3..ca22ebd 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/perf/AccessTokenPerfTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/perf/AccessTokenPerfTest.java
@@ -234,7 +234,7 @@ public class AccessTokenPerfTest {
     @Test
     public void perfJaxrsClientLogin()
     {
-        long ITERATIONS = 10;
+        long ITERATIONS = 100;
         JaxrsClientLogin login = new JaxrsClientLogin();
         long start = System.currentTimeMillis();
         for (int i = 0; i < ITERATIONS; i++) {
@@ -248,7 +248,7 @@ public class AccessTokenPerfTest {
     @Test
     public void perfBrowserLogin()
     {
-        long ITERATIONS = 10;
+        long ITERATIONS = 100;
         long start = System.currentTimeMillis();
         BrowserLogin login = new BrowserLogin();
         for (int i = 0; i < ITERATIONS; i++) {
@@ -260,7 +260,7 @@ public class AccessTokenPerfTest {
 
     @Test
     public void multiThread() throws Exception {
-        int num_threads = 10;
+        int num_threads = 20;
         Thread[] threads = new Thread[num_threads];
         for (int i = 0; i < num_threads; i++) {
             threads[i] = new Thread(new Runnable() {