package org.jboss.resteasy.keystone.server; import org.infinispan.Cache; import org.jboss.resteasy.keystone.model.Project; import org.jboss.resteasy.keystone.model.Projects; import org.jboss.resteasy.keystone.model.Role; import org.jboss.resteasy.keystone.model.Roles; import org.jboss.resteasy.keystone.model.StoredProject; import org.jboss.resteasy.keystone.model.User; import javax.annotation.security.RolesAllowed; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; 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.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ @Path("/projects") @SuppressWarnings({"rawtypes", "unchecked"}) public class ProjectsService { private Cache cache; private UsersService usersResource; private RolesService rolesResource; @Context private UriInfo uriInfo; public ProjectsService(Cache cache, UsersService usersResource, RolesService rolesResource) { this.cache = cache; this.usersResource = usersResource; this.rolesResource = rolesResource; } public void createProject(Project project) throws Exception { if (project.getId() == null) { String id = UUID.randomUUID().toString(); project.setId(id); } StoredProject storedProject = new StoredProject(project); cache.put(projectCacheId(project.getId()), storedProject, -1L, TimeUnit.MILLISECONDS); } @GET @Produces("application/json") public Projects getProjects(@QueryParam("name") String name) { Projects projects = new Projects(); List<Project> list = new ArrayList<Project>(); projects.setList(list); for (Object key : cache.keySet()) { if (!(key instanceof String)) continue; if (!key.toString().startsWith("/projects/")) continue; StoredProject stored = (StoredProject) cache.get(key); if (stored == null) throw new NotFoundException(); if (name == null || name.equals(stored.getProject().getName())) { list.add(stored.getProject()); } } return projects; } @POST @Consumes("application/json") @Produces("application/json") @RolesAllowed("admin") public Response create(Project project) throws Exception { createProject(project); return Response.created(uriInfo.getAbsolutePathBuilder().path(project.getId()).build()).build(); } @PUT @Consumes("application/json") @Produces("application/json") @Path("{id}") @RolesAllowed("admin") public void update(@PathParam("id") String id, Project project) throws Exception { StoredProject storedProject = (StoredProject)cache.get(projectCacheId(id)); if (storedProject == null) throw new NotFoundException(); Project stored = (Project) storedProject.getProject(); if (project.getName() != null) stored.setName(project.getName()); if (project.getDescription() != null) stored.setDescription(project.getDescription()); if (project.getEnabled() != null) stored.setEnabled(project.getEnabled()); cache.put(projectCacheId(id), storedProject, -1, TimeUnit.MILLISECONDS); } @DELETE @Path("{id}") @RolesAllowed("admin") public Response delete(@PathParam("id") String id) { if (cache.containsKey(projectCacheId(id))) { cache.remove(projectCacheId(id)); return Response.noContent().build(); } else { return Response.status(Response.Status.GONE).build(); } } public static String projectCacheId(String id) { return "/projects/" + id; } @GET @Path("{id}") @Produces("application/json") public Project getProject(@PathParam("id") String id) { StoredProject storedProject = (StoredProject)cache.get(projectCacheId(id)); if (storedProject == null) throw new NotFoundException(); return storedProject.getProject(); } public String getUserIdByName(String projectId, String username) { StoredProject storedProject = (StoredProject)cache.get(projectCacheId(projectId)); if (storedProject == null) throw new NotFoundException(); return storedProject.getUserNameIds().get(username); } public Roles getUserRoles(String id, String userId) { StoredProject storedProject = (StoredProject)cache.get(projectCacheId(id)); Set<String> roleMapping = storedProject.roleMapping(userId); Roles roles = new Roles(); if (roleMapping == null) { return roles; } else { for (String roleId : roleMapping) { Role role = rolesResource.get(roleId); if (role != null) { roles.getRoles().add(role); } } return roles; } } @PUT @Path("{id}/users/{user}/roles/{role}") @RolesAllowed("admin") public void addUserRole(@PathParam("id") String id, @PathParam("user") String userId, @PathParam("role") String roleId) { StoredProject storedProject = (StoredProject)cache.get(projectCacheId(id)); if (storedProject == null) throw new NotFoundException(); User user = usersResource.get(userId); Role role = rolesResource.get(roleId); storedProject.addUserRoleMapping(user, role); cache.put(projectCacheId(id), storedProject, -1, TimeUnit.MILLISECONDS); } @DELETE @Path("{id}/users/{user}/roles/{role}") @RolesAllowed("admin") public void removeUserRole(@PathParam("id") String id, @PathParam("user") String userId, @PathParam("role") String roleId) { StoredProject storedProject = (StoredProject)cache.get(projectCacheId(id)); if (storedProject == null) throw new NotFoundException(); User user = usersResource.get(userId); Role role = rolesResource.get(roleId); storedProject.removeUserRoleMapping(user, role); cache.put(projectCacheId(id), storedProject, -1, TimeUnit.MILLISECONDS); } }