keycloak-uncached

KEYCLOAK-105

11/16/2013 8:13:23 AM

Details

diff --git a/model/api/src/main/java/org/keycloak/models/RealmModel.java b/model/api/src/main/java/org/keycloak/models/RealmModel.java
index 724d3b5..f49cf8e 100755
--- a/model/api/src/main/java/org/keycloak/models/RealmModel.java
+++ b/model/api/src/main/java/org/keycloak/models/RealmModel.java
@@ -84,7 +84,7 @@ public interface RealmModel extends RoleContainerModel, RoleMapperModel, ScopeMa
 
     UserModel addUser(String username);
 
-    boolean deleteUser(String name);
+    boolean removeUser(String name);
 
     List<String> getDefaultRoles();
     
@@ -98,6 +98,8 @@ public interface RealmModel extends RoleContainerModel, RoleMapperModel, ScopeMa
 
     ApplicationModel addApplication(String name);
 
+    boolean removeApplication(String id);
+
     List<RequiredCredentialModel> getRequiredApplicationCredentials();
 
 
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserEntity.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserEntity.java
index 90d3341..bcddabd 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserEntity.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/UserEntity.java
@@ -34,9 +34,6 @@ import java.util.Set;
 })
 @Entity
 public class UserEntity {
-
-    public static final Class[] RELATIONSHIPS = new Class[] { ApplicationUserRoleMappingEntity.class, RealmUserRoleMappingEntity.class, SocialLinkEntity.class };
-
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     protected String id;
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
index 9cf12e0..faeea27 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
@@ -11,6 +11,7 @@ import org.keycloak.models.SocialLinkModel;
 import org.keycloak.models.UserCredentialModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.jpa.entities.ApplicationEntity;
+import org.keycloak.models.jpa.entities.ApplicationScopeMappingEntity;
 import org.keycloak.models.jpa.entities.ApplicationUserRoleMappingEntity;
 import org.keycloak.models.jpa.entities.CredentialEntity;
 import org.keycloak.models.jpa.entities.OAuthClientEntity;
@@ -458,22 +459,23 @@ public class RealmAdapter implements RealmModel {
     }
 
     @Override
-    public boolean deleteUser(String name) {
+    public boolean removeUser(String name) {
         TypedQuery<UserEntity> query = em.createNamedQuery("getRealmUserByLoginName", UserEntity.class);
         query.setParameter("loginName", name);
         query.setParameter("realm", realm);
         List<UserEntity> results = query.getResultList();
         if (results.size() == 0) return false;
+        removeUser(results.get(0));
+        return true;
+    }
 
-        UserEntity user = results.get(0);
-
-        for (Class r : UserEntity.RELATIONSHIPS) {
-            em.createQuery("delete from " + r.getSimpleName() + " where user = :user").setParameter("user", user).executeUpdate();
-        }
-
+    private void removeUser(UserEntity user) {
+        em.createQuery("delete from " + ApplicationScopeMappingEntity.class.getSimpleName() + " where user = :user").setParameter("user", user).executeUpdate();
+        em.createQuery("delete from " + ApplicationUserRoleMappingEntity.class.getSimpleName() + " where user = :user").setParameter("user", user).executeUpdate();
+        em.createQuery("delete from " + RealmScopeMappingEntity.class.getSimpleName() + " where user = :user").setParameter("user", user).executeUpdate();
+        em.createQuery("delete from " + RealmUserRoleMappingEntity.class.getSimpleName() + " where user = :user").setParameter("user", user).executeUpdate();
+        em.createQuery("delete from " + SocialLinkEntity.class.getSimpleName() + " where user = :user").setParameter("user", user).executeUpdate();
         em.remove(user);
-
-        return true;
     }
 
     @Override
@@ -573,6 +575,25 @@ public class RealmAdapter implements RealmModel {
     }
 
     @Override
+    public boolean removeApplication(String id) {
+        ApplicationEntity application = null;
+        for (ApplicationEntity a : realm.getApplications()) {
+            if (a.getId().equals(id)) {
+                application = a;
+            }
+        }
+        if (application == null) {
+            return false;
+        }
+        realm.getApplications().remove(application);
+        removeUser(application.getApplicationUser());
+        em.createQuery("delete from " + ApplicationScopeMappingEntity.class.getSimpleName() + " where application = :application").setParameter("application", application).executeUpdate();
+        em.createQuery("delete from " + ApplicationUserRoleMappingEntity.class.getSimpleName() + " where application = :application").setParameter("application", application).executeUpdate();
+        em.remove(application);
+        return true;
+    }
+
+    @Override
     public ApplicationModel getApplicationById(String id) {
         ApplicationEntity app = em.find(ApplicationEntity.class, id);
         if (app == null) return null;
diff --git a/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java b/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
index 9fb4eec..88bad1f 100755
--- a/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
+++ b/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
@@ -519,7 +519,7 @@ public class RealmAdapter implements RealmModel {
     }
 
     @Override
-    public boolean deleteUser(String name) {
+    public boolean removeUser(String name) {
         User user = findPicketlinkUser(name);
         if (user == null) {
             return false;
@@ -629,6 +629,19 @@ public class RealmAdapter implements RealmModel {
     }
 
     @Override
+    public boolean removeApplication(String id) {
+        RelationshipQuery<ApplicationRelationship> query = getRelationshipManager().createRelationshipQuery(ApplicationRelationship.class);
+        query.setParameter(ApplicationRelationship.REALM, realm.getName());
+        query.setParameter(ApplicationRelationship.APPLICATION, id);
+        List<ApplicationRelationship> results = query.getResultList();
+        if (results.size() == 0) return false;
+        ApplicationRelationship relationship = results.get(0);
+        ApplicationData application = partitionManager.getPartition(ApplicationData.class, relationship.getApplication());
+        partitionManager.remove(application);
+        return true;
+    }
+
+    @Override
     public boolean hasRole(UserModel user, RoleModel role) {
         return SampleModel.hasRole(getRelationshipManager(), ((UserAdapter) user).getUser(), ((RoleAdapter) role).getRole());
     }
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java
index 7a1e229..aa0671f 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java
@@ -54,6 +54,12 @@ public class ApplicationResource extends RoleContainerResource {
         return applicationManager.toRepresentation(application);
     }
 
+    @DELETE
+    @NoCache
+    public void deleteApplication() {
+        realm.removeApplication(application.getId());
+    }
+
     @Path("credentials")
     @PUT
     @Consumes("application/json")
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
index 2f506b1..3f72e38 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
@@ -111,7 +111,7 @@ public class UsersResource {
     @DELETE
     @NoCache
     public void deleteUser(final @PathParam("username") String username) {
-        realm.deleteUser(username);
+        realm.removeUser(username);
     }
 
     @GET
diff --git a/services/src/test/java/org/keycloak/test/AdapterTest.java b/services/src/test/java/org/keycloak/test/AdapterTest.java
index fff9532..0ad0169 100755
--- a/services/src/test/java/org/keycloak/test/AdapterTest.java
+++ b/services/src/test/java/org/keycloak/test/AdapterTest.java
@@ -176,7 +176,7 @@ public class AdapterTest extends AbstractKeycloakTest {
     }
 
     @Test
-    public void deleteUser() throws Exception {
+    public void testDeleteUser() throws Exception {
         test1CreateRealm();
 
         UserModel user = realmModel.addUser("bburke");
@@ -198,12 +198,34 @@ public class AdapterTest extends AbstractKeycloakTest {
         cred.setValue("password");
         realmModel.updateCredential(user, cred);
 
-        Assert.assertTrue(realmModel.deleteUser("bburke"));
-        Assert.assertFalse(realmModel.deleteUser("bburke"));
+        Assert.assertTrue(realmModel.removeUser("bburke"));
+        Assert.assertFalse(realmModel.removeUser("bburke"));
         Assert.assertNull(realmModel.getUser("bburke"));
     }
 
     @Test
+    public void testRemoveApplication() throws Exception {
+        test1CreateRealm();
+
+        UserModel user = realmModel.addUser("bburke");
+
+        OAuthClientModel client = realmModel.addOAuthClient("client");
+
+        ApplicationModel app = realmModel.addApplication("test-app");
+
+        RoleModel appRole = app.addRole("test");
+        app.grantRole(user, appRole);
+        app.addScopeMapping(client.getOAuthAgent(), appRole);
+
+        RoleModel realmRole = realmModel.addRole("test");
+        realmModel.addScopeMapping(app.getApplicationUser(), realmRole);
+
+        Assert.assertTrue(realmModel.removeApplication(app.getId()));
+        Assert.assertFalse(realmModel.removeApplication(app.getId()));
+        Assert.assertNull(realmModel.getApplicationById(app.getId()));
+    }
+
+    @Test
     public void testUserSearch() throws Exception {
         test1CreateRealm();
         {