package org.fenixedu.bennu.scheduler.api.json; import org.fenixedu.bennu.core.annotation.DefaultJsonAdapter; import org.fenixedu.bennu.core.domain.exceptions.InvalidJsonException; import org.fenixedu.bennu.core.json.JsonAdapter; import org.fenixedu.bennu.core.json.JsonBuilder; import org.fenixedu.bennu.scheduler.domain.SchedulerSystem; import org.fenixedu.bennu.scheduler.domain.TaskSchedule; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @DefaultJsonAdapter(TaskSchedule.class) public class TaskScheduleJsonAdapter implements JsonAdapter<TaskSchedule> { private static final String TASK_TYPE = "type"; private static final String TASK_SCHEDULE = "schedule"; @Override public JsonElement view(TaskSchedule taskSchedule, JsonBuilder ctx) { JsonObject obj = new JsonObject(); obj.addProperty("id", taskSchedule.getExternalId()); obj.addProperty("type", taskSchedule.getTaskClassName()); obj.addProperty("name", taskSchedule.getTask().getLocalizedName()); obj.addProperty(TASK_SCHEDULE, taskSchedule.getSchedule()); return obj; } @Override public TaskSchedule create(JsonElement el, JsonBuilder ctx) { final JsonObject jsonObject = el.getAsJsonObject(); if (!jsonObject.has(TASK_TYPE) || !jsonObject.has(TASK_SCHEDULE)) { throw new InvalidJsonException(el, TASK_TYPE, TASK_SCHEDULE); } final String taskType = jsonObject.get(TASK_TYPE).getAsString(); final String schedule = jsonObject.get(TASK_SCHEDULE).getAsString(); return new TaskSchedule(taskType, schedule); } @Override public TaskSchedule update(JsonElement el, TaskSchedule taskSchedule, JsonBuilder ctx) { final JsonObject jsonObject = el.getAsJsonObject(); String taskType = null; String schedule = null; if (jsonObject.has(TASK_TYPE)) { taskType = jsonObject.get(TASK_TYPE).getAsString(); } if (jsonObject.has(TASK_SCHEDULE)) { schedule = jsonObject.get(TASK_SCHEDULE).getAsString(); } updateTaskSchedule(taskSchedule, taskType, schedule); return taskSchedule; } private void updateTaskSchedule(TaskSchedule taskSchedule, final String taskType, final String schedule) { SchedulerSystem.unschedule(taskSchedule); if (schedule != null && !schedule.equals(taskSchedule.getSchedule())) { taskSchedule.setSchedule(schedule); } if (taskType != null && !taskType.equals(taskSchedule.getTaskClassName())) { taskSchedule.setTaskClassName(taskType); } SchedulerSystem.schedule(taskSchedule); } }