package org.fenixedu.bennu.scheduler.api; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; 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.core.MediaType; import javax.ws.rs.core.Response; import org.fenixedu.bennu.core.groups.Group; import org.fenixedu.bennu.core.rest.BennuRestResource; import org.fenixedu.bennu.scheduler.api.json.TaskScheduleJsonAdapter; import org.fenixedu.bennu.scheduler.domain.SchedulerSystem; import org.fenixedu.bennu.scheduler.domain.TaskSchedule; import org.joda.time.DateTime; import pt.ist.fenixframework.Atomic; import pt.ist.fenixframework.Atomic.TxMode; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @Path("/bennu-scheduler/schedule") public class ScheduleResource extends BennuRestResource { @GET @Produces(MediaType.APPLICATION_JSON) public JsonElement getSchedule() { accessControl(Group.managers()); return view(SchedulerSystem.getInstance().getTaskScheduleSet(), "schedule"); } @GET @Path("dump") public Response dump() { accessControl(Group.managers()); final String filename = ScheduleResource.class.getSimpleName() + "_" + new DateTime().toString("MM-dd-yyyy-kk-mm-ss") + ".json"; return Response.ok(view(SchedulerSystem.getInstance().getTaskScheduleSet(), "schedule")) .header("Content-Disposition", "attachment; filename=" + filename).build(); } @DELETE public Response delete() { accessControl(Group.managers()); clearAllSchedules(); return ok(); } @POST @Deprecated @Path("dump") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public Response loadDump(@FormParam("data") JsonObject json) { accessControl(Group.managers()); clearAllSchedules(); createSchedulesFromDump(json); return ok(); } @POST @Path("load-dump") @Consumes(MediaType.APPLICATION_JSON) public JsonElement loadDumpNew(JsonObject json) { accessControl(Group.managers()); clearAllSchedules(); createSchedulesFromDump(json); return getSchedule(); } @Atomic(mode = TxMode.WRITE) public void createSchedulesFromDump(JsonObject json) { TaskScheduleJsonAdapter taskScheduleJsonAdapter = new TaskScheduleJsonAdapter(); for (JsonElement schedule : json.get("schedule").getAsJsonArray()) { taskScheduleJsonAdapter.create(schedule, null); } } @Atomic(mode = TxMode.WRITE) public void clearAllSchedules() { for (TaskSchedule schedule : SchedulerSystem.getInstance().getTaskScheduleSet()) { schedule.delete(); } } @GET @Path("{oid}") @Produces(MediaType.APPLICATION_JSON) public JsonElement get(@PathParam("oid") String taskOid) { accessControl(Group.managers()); return view(readDomainObject(taskOid)); } @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public JsonElement addSchedule(JsonElement configJson) { accessControl(Group.managers()); return view(create(configJson, TaskSchedule.class)); } @PUT @Path("{oid}") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public JsonElement changeSchedule(JsonElement taskScheduleJson, @PathParam("oid") String taskScheduleOid) { accessControl(Group.managers()); return view(update(taskScheduleJson, readDomainObject(taskScheduleOid))); } @DELETE @Path("{oid}") public Response delete(@PathParam("oid") String taskOid) { accessControl(Group.managers()); TaskSchedule schedule = readDomainObject(taskOid); schedule.delete(); return ok(); } }