keycloak-aplcache

resource rest api

8/4/2013 1:57:12 PM

Details

diff --git a/core/src/main/java/org/keycloak/representations/idm/ResourceRepresentation.java b/core/src/main/java/org/keycloak/representations/idm/ResourceRepresentation.java
index 9a09302..6cf9de6 100755
--- a/core/src/main/java/org/keycloak/representations/idm/ResourceRepresentation.java
+++ b/core/src/main/java/org/keycloak/representations/idm/ResourceRepresentation.java
@@ -11,6 +11,7 @@ import java.util.Set;
  */
 public class ResourceRepresentation {
     protected String self; // link
+    protected String id;
     protected String name;
     protected String adminUrl;
     protected boolean surrogateAuthRequired;
@@ -29,6 +30,14 @@ public class ResourceRepresentation {
         this.self = self;
     }
 
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
     public String getName() {
         return name;
     }
diff --git a/examples/as7-eap-demo/server/src/main/resources/META-INF/testrealm.json b/examples/as7-eap-demo/server/src/main/resources/META-INF/testrealm.json
index a1500d1..642af04 100755
--- a/examples/as7-eap-demo/server/src/main/resources/META-INF/testrealm.json
+++ b/examples/as7-eap-demo/server/src/main/resources/META-INF/testrealm.json
@@ -72,6 +72,7 @@
    "resources" : [
        {
           "name" : "customer-portal",
+          "enabled" : true,
           "adminUrl" : "http://localhost:8080/customer-portal/j_admin_request",
           "useRealmMappings" : true,
           "credentials" : [
@@ -81,6 +82,7 @@
        },
        {
           "name" : "product-portal",
+          "enabled" : true,
           "adminUrl" : "http://localhost:8080/product-portal/j_admin_request",
           "useRealmMappings" : true,
           "credentials" : [
diff --git a/examples/as7-eap-demo/server/src/main/webapp/saas/saas-login.jsp b/examples/as7-eap-demo/server/src/main/webapp/saas/saas-login.jsp
index a646dee..e11fc81 100755
--- a/examples/as7-eap-demo/server/src/main/webapp/saas/saas-login.jsp
+++ b/examples/as7-eap-demo/server/src/main/webapp/saas/saas-login.jsp
@@ -67,7 +67,7 @@
                     </section>
                     <section class="info-area">
                         <h3>Info area</h3>
-                        <p>Does not have an account? <a href="<%=application.getContextPath()%>/saas/saas-register.html">Register</a>.</p>
+                        <p>Does not have an account? <a href="<%=application.getContextPath()%>/saas/saas-register.jsp">Register</a>.</p>
                         <ul>
                             <li><strong>Domain:</strong> 10.0.0.1</li>
                             <li><strong>Zone:</strong> Live</li>
diff --git a/services/src/main/java/org/keycloak/services/managers/ResourceManager.java b/services/src/main/java/org/keycloak/services/managers/ResourceManager.java
index 4db5c17..e1c2ebb 100755
--- a/services/src/main/java/org/keycloak/services/managers/ResourceManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/ResourceManager.java
@@ -27,6 +27,7 @@ public class ResourceManager {
 
     public ResourceModel createResource(RealmModel realm, RoleModel loginRole, ResourceRepresentation resourceRep) {
         ResourceModel resource = realm.addResource(resourceRep.getName());
+        resource.setEnabled(resourceRep.isEnabled());
         resource.setManagementUrl(resourceRep.getAdminUrl());
         resource.setSurrogateAuthRequired(resourceRep.isSurrogateAuthRequired());
         resource.updateResource();
@@ -82,16 +83,22 @@ public class ResourceManager {
         return createResource(realm, loginRole, resourceRep);
     }
 
-    public ResourceRepresentation getResource(ResourceModel resourceModel, boolean bulk) {
+    public void updateResource(ResourceRepresentation rep, ResourceModel resource) {
+        resource.setName(rep.getName());
+        resource.setEnabled(rep.isEnabled());
+        resource.setManagementUrl(rep.getAdminUrl());
+        resource.setSurrogateAuthRequired(rep.isSurrogateAuthRequired());
+        resource.updateResource();
+
+    }
+
+    public ResourceRepresentation toRepresentation(ResourceModel resourceModel) {
         ResourceRepresentation rep = new ResourceRepresentation();
+        rep.setId(resourceModel.getId());
         rep.setName(resourceModel.getName());
         rep.setEnabled(resourceModel.isEnabled());
         rep.setAdminUrl(resourceModel.getManagementUrl());
         rep.setSurrogateAuthRequired(resourceModel.isSurrogateAuthRequired());
-        List<RoleModel> roles = resourceModel.getRoles();
-        for (RoleModel role : roles) {
-            rep.role(realmManager.toRepresentation(role));
-        }
         return rep;
 
     }
diff --git a/services/src/main/java/org/keycloak/services/managers/TokenManager.java b/services/src/main/java/org/keycloak/services/managers/TokenManager.java
index 121de14..6072c51 100755
--- a/services/src/main/java/org/keycloak/services/managers/TokenManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/TokenManager.java
@@ -9,14 +9,10 @@ import org.keycloak.services.models.RealmModel;
 import org.keycloak.services.models.ResourceModel;
 import org.keycloak.services.models.RoleModel;
 import org.keycloak.services.models.UserModel;
-import org.keycloak.services.resources.RealmsResource;
 
 import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.NewCookie;
-import javax.ws.rs.core.UriInfo;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
-import java.net.URI;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -135,7 +131,7 @@ public class TokenManager {
         }
 
         if (accessCodeEntry.getResourceRolesRequested().size() > 0) {
-            Map<String, ResourceModel> resourceMap = realm.getResourceMap();
+            Map<String, ResourceModel> resourceMap = realm.getResourceNameMap();
             for (String resourceName : accessCodeEntry.getResourceRolesRequested().keySet()) {
                 ResourceModel resource = resourceMap.get(resourceName);
                 SkeletonKeyToken.Access access = token.addAccess(resourceName).verifyCaller(resource.isSurrogateAuthRequired());
diff --git a/services/src/main/java/org/keycloak/services/models/picketlink/RealmAdapter.java b/services/src/main/java/org/keycloak/services/models/picketlink/RealmAdapter.java
index 4884a1f..fe023f7 100755
--- a/services/src/main/java/org/keycloak/services/models/picketlink/RealmAdapter.java
+++ b/services/src/main/java/org/keycloak/services/models/picketlink/RealmAdapter.java
@@ -416,7 +416,7 @@ public class RealmAdapter implements RealmModel {
      * @return
      */
     @Override
-    public Map<String, ResourceModel> getResourceMap() {
+    public Map<String, ResourceModel> getResourceNameMap() {
         Map<String, ResourceModel> resourceMap = new HashMap<String, ResourceModel>();
         for (ResourceModel resource : getResources()) {
             resourceMap.put(resource.getName(), resource);
@@ -424,6 +424,24 @@ public class RealmAdapter implements RealmModel {
         return resourceMap;
     }
 
+    /**
+     * Makes sure that the resource returned is owned by the realm
+     *
+     * @return
+     */
+    @Override
+    public ResourceModel getResourceById(String id) {
+        RelationshipQuery<ResourceRelationship> query = getRelationshipManager().createRelationshipQuery(ResourceRelationship.class);
+        query.setParameter(ResourceRelationship.REALM, realm.getName());
+        query.setParameter(ResourceRelationship.RESOURCE, id);
+        List<ResourceRelationship> results = query.getResultList();
+        if (results.size() == 0) return null;
+        ResourceData resource = partitionManager.getPartition(ResourceData.class, id);
+        ResourceModel model = new ResourceAdapter(resource, this, partitionManager);
+        return model;
+    }
+
+
     @Override
     public List<ResourceModel> getResources() {
         RelationshipQuery<ResourceRelationship> query = getRelationshipManager().createRelationshipQuery(ResourceRelationship.class);
diff --git a/services/src/main/java/org/keycloak/services/models/picketlink/relationships/ResourceRelationship.java b/services/src/main/java/org/keycloak/services/models/picketlink/relationships/ResourceRelationship.java
index 429ea25..3c48b97 100755
--- a/services/src/main/java/org/keycloak/services/models/picketlink/relationships/ResourceRelationship.java
+++ b/services/src/main/java/org/keycloak/services/models/picketlink/relationships/ResourceRelationship.java
@@ -14,6 +14,7 @@ public class ResourceRelationship extends AbstractAttributedType implements Rela
     private static final long serialVersionUID = 1L;
 
     public static final AttributeParameter REALM = new AttributeParameter("realm");
+    public static final AttributeParameter RESOURCE = new AttributeParameter("resource");
 
     public ResourceRelationship() {
     }
diff --git a/services/src/main/java/org/keycloak/services/models/RealmModel.java b/services/src/main/java/org/keycloak/services/models/RealmModel.java
index 0f7811d..404f837 100755
--- a/services/src/main/java/org/keycloak/services/models/RealmModel.java
+++ b/services/src/main/java/org/keycloak/services/models/RealmModel.java
@@ -79,7 +79,7 @@ public interface RealmModel {
 
     List<RoleModel> getRoles();
 
-    Map<String, ResourceModel> getResourceMap();
+    Map<String, ResourceModel> getResourceNameMap();
 
     List<ResourceModel> getResources();
 
@@ -110,4 +110,6 @@ public interface RealmModel {
     List<RequiredCredentialModel> getOAuthClientRequiredCredentials();
 
     boolean hasRole(UserModel user, String role);
+
+    ResourceModel getResourceById(String id);
 }
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
index 255d59a..bf2a7ca 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
@@ -1,5 +1,6 @@
 package org.keycloak.services.resources.admin;
 
+import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.logging.Logger;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.representations.idm.RoleRepresentation;
@@ -47,7 +48,13 @@ public class RealmAdminResource {
         this.realm = realm;
     }
 
+    @Path("resources")
+    public RealmResourcesResource getResources() {
+        return new RealmResourcesResource(admin, realm);
+    }
+
     @GET
+    @NoCache
     @Produces("application/json")
     public RealmRepresentation getRealm() {
         return new Transaction() {
@@ -70,6 +77,7 @@ public class RealmAdminResource {
 
     @Path("roles")
     @GET
+    @NoCache
     @Produces("application/json")
     public List<RoleRepresentation> getRoles() {
         return new Transaction() {
@@ -88,6 +96,7 @@ public class RealmAdminResource {
 
     @Path("roles/{id}")
     @GET
+    @NoCache
     @Produces("application/json")
     public RoleRepresentation getRole(final @PathParam("id") String id) {
         return new Transaction() {
@@ -147,6 +156,7 @@ public class RealmAdminResource {
 
     @Path("users")
     @GET
+    @NoCache
     @Produces("application/json")
     public List<UserRepresentation> getUsers() {
         return null;
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RealmResourcesResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RealmResourcesResource.java
index acb6c55..2bb844d 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/RealmResourcesResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/RealmResourcesResource.java
@@ -1,13 +1,28 @@
 package org.keycloak.services.resources.admin;
 
+import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.logging.Logger;
 import org.keycloak.representations.idm.ResourceRepresentation;
+import org.keycloak.services.managers.RealmManager;
+import org.keycloak.services.managers.ResourceManager;
 import org.keycloak.services.models.RealmModel;
+import org.keycloak.services.models.ResourceModel;
 import org.keycloak.services.models.UserModel;
+import org.keycloak.services.resources.Transaction;
 
+import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
+import javax.ws.rs.NotFoundException;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -26,7 +41,68 @@ public class RealmResourcesResource {
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
-    List<ResourceRepresentation> getResources() {
-        return null;
+    @NoCache
+    public List<ResourceRepresentation> getResources() {
+        return new Transaction() {
+            @Override
+            protected List<ResourceRepresentation> callImpl() {
+                List<ResourceRepresentation> rep = new ArrayList<ResourceRepresentation>();
+                List<ResourceModel> resourceModels = realm.getResources();
+                ResourceManager resourceManager = new ResourceManager(new RealmManager(session));
+                for (ResourceModel resourceModel : resourceModels) {
+                    rep.add(resourceManager.toRepresentation(resourceModel));
+                }
+                return rep;
+            }
+        }.call();
+    }
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response createResource(final @Context UriInfo uriInfo, final ResourceRepresentation rep) {
+        return new Transaction() {
+            @Override
+            protected Response callImpl() {
+                ResourceManager resourceManager = new ResourceManager(new RealmManager(session));
+                ResourceModel resourceModel = resourceManager.createResource(realm, rep);
+                return Response.created(uriInfo.getAbsolutePathBuilder().path(resourceModel.getId()).build()).build();
+            }
+        }.call();
+    }
+
+    @Path("{id}")
+    @PUT
+    @Consumes(MediaType.APPLICATION_JSON)
+    public void update(final @PathParam("id") String id, final ResourceRepresentation rep) {
+        new Transaction() {
+            @Override
+            protected void runImpl() {
+                ResourceModel resourceModel = realm.getResourceById(id);
+                if (resourceModel == null) {
+                    throw new NotFoundException();
+                }
+                ResourceManager resourceManager = new ResourceManager(new RealmManager(session));
+                resourceManager.updateResource(rep, resourceModel);
+            }
+        }.run();
+    }
+
+
+    @Path("{id}")
+    @GET
+    @NoCache
+    @Produces(MediaType.APPLICATION_JSON)
+    public ResourceRepresentation getResource(final @PathParam("id") String id) {
+        return new Transaction() {
+            @Override
+            protected ResourceRepresentation callImpl() {
+                ResourceModel resourceModel = realm.getResourceById(id);
+                if (resourceModel == null) {
+                    throw new NotFoundException();
+                }
+                ResourceManager resourceManager = new ResourceManager(new RealmManager(session));
+                return resourceManager.toRepresentation(resourceModel);
+            }
+        }.call();
     }
 }
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java
index 7980877..015f150 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java
@@ -1,5 +1,6 @@
 package org.keycloak.services.resources.admin;
 
+import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.logging.Logger;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.services.managers.RealmManager;
@@ -49,6 +50,7 @@ public class RealmsAdminResource {
     }
 
     @GET
+    @NoCache
     @Produces("application/json")
     public Response getRealms() {
         return new Transaction() {
diff --git a/services/src/main/java/org/keycloak/services/resources/PublicRealmResource.java b/services/src/main/java/org/keycloak/services/resources/PublicRealmResource.java
index bef77ff..ab12f38 100755
--- a/services/src/main/java/org/keycloak/services/resources/PublicRealmResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/PublicRealmResource.java
@@ -1,5 +1,6 @@
 package org.keycloak.services.resources;
 
+import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.logging.Logger;
 import org.keycloak.representations.idm.PublishedRealmRepresentation;
 import org.keycloak.services.models.KeycloakSession;
@@ -37,6 +38,7 @@ public class PublicRealmResource {
     }
 
     @GET
+    @NoCache
     @Produces("application/json")
     public PublishedRealmRepresentation getRealm(@PathParam("realm") String id) {
         return new Transaction() {
@@ -47,6 +49,7 @@ public class PublicRealmResource {
     }
 
     @GET
+    @NoCache
     @Path("html")
     @Produces("text/html")
     public String getRealmHtml(@PathParam("realm") String id) {
diff --git a/services/src/main/java/org/keycloak/services/resources/TokenService.java b/services/src/main/java/org/keycloak/services/resources/TokenService.java
index ba4d265..4f295fe 100755
--- a/services/src/main/java/org/keycloak/services/resources/TokenService.java
+++ b/services/src/main/java/org/keycloak/services/resources/TokenService.java
@@ -1,5 +1,6 @@
 package org.keycloak.services.resources;
 
+import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.jose.jws.JWSBuilder;
 import org.jboss.resteasy.jose.jws.JWSInput;
 import org.jboss.resteasy.jose.jws.crypto.RSAProvider;
@@ -381,6 +382,7 @@ public class TokenService extends AbstractLoginService {
 
     @Path("logout")
     @GET
+    @NoCache
     public Response logout(final @QueryParam("redirect_uri") String redirectUri) {
         return new Transaction() {
             protected Response callImpl() {
diff --git a/services/src/test/resources/testrealm.json b/services/src/test/resources/testrealm.json
index c0bf2eb..7239086 100755
--- a/services/src/test/resources/testrealm.json
+++ b/services/src/test/resources/testrealm.json
@@ -76,6 +76,7 @@
    "resources" : [
        {
           "name" : "Application",
+          "enabled" : true,
           "roles" : [
               { "name" : "admin" },
               { "name" : "user" }
@@ -97,8 +98,9 @@
              }
           ]
        },
-              {
+       {
                  "name" : "OtherApp",
+                  "enabled" : true,
           "roles" : [
               { "name" : "admin" },
               { "name" : "user" }