package org.jboss.seam.rest.examples.tasks.resource; import java.util.Date; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; 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.UriInfo; import org.jboss.seam.rest.examples.tasks.entity.Category; import org.jboss.seam.rest.examples.tasks.entity.JaxbTaskWrapper; import org.jboss.seam.rest.examples.tasks.entity.Task; import org.jboss.seam.rest.examples.tasks.entity.TaskValidationGroup; import org.jboss.seam.rest.templating.ResponseTemplate; import org.jboss.seam.rest.validation.ValidateRequest; /** * CRUD resource for resources * * @author <a href="http://community.jboss.org/people/jharting">Jozef Hartinger</a> */ @Consumes({"application/xml", "application/json"}) @ValidateRequest(groups = TaskValidationGroup.class) @Stateless public class TaskResource extends AbstractEntityResource { @PersistenceContext private EntityManager em; @GET @ResponseTemplate(value = "/freemarker/task.ftl", produces = "application/task+xml", responseName = "task") @Produces({"application/task+xml", "application/json"}) public Task getTask(@PathParam("taskId") long taskId, @Context UriInfo uriInfo) { return loadTask(taskId, uriInfo); } @POST @Path("/move") public void move(@PathParam("taskId") long taskId, @QueryParam("category") String newCategoryName, @Context UriInfo uriInfo) { Task task = loadTask(taskId, uriInfo); Category newCategory = (Category) em.createNamedQuery("categoryByName").setParameter("category", newCategoryName) .getSingleResult(); Category oldCategory = task.getCategory(); oldCategory.getTasks().remove(task); newCategory.getTasks().add(task); task.setCategory(newCategory); task.setUpdated(new Date()); } @PUT public void updateTask(@PathParam("taskId") long taskId, @Context UriInfo uriInfo, JaxbTaskWrapper incommingTask) { Task task = loadTask(taskId, uriInfo); if (incommingTask.getName() != null) { task.setName(incommingTask.getName()); } if (incommingTask.isResolved() != null) { task.setResolved(incommingTask.isResolved()); } task.setUpdated(new Date()); } @DELETE public void deleteTask(@PathParam("taskId") long taskId, @Context UriInfo uriInfo) { Task task = loadTask(taskId, uriInfo); task.getCategory().getTasks().remove(task); em.remove(task); } protected Task loadTask(long taskId, UriInfo uriInfo) { String categoryName = uriInfo.getPathParameters().getFirst("category"); if (categoryName == null) { return (Task) em.createNamedQuery("taskById").setParameter("tid", taskId).getSingleResult(); } else { return (Task) em.createNamedQuery("taskByCategoryAndId").setParameter("tid", taskId) .setParameter("category", categoryName).getSingleResult(); } } }