/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.addthis.hydra.job.web.resources; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import com.addthis.basis.kv.KVPairs; import com.addthis.hydra.job.entity.JobEntityManager; import com.addthis.hydra.job.entity.JobMacro; import com.addthis.hydra.job.spawn.Spawn; import com.addthis.maljson.JSONArray; import com.addthis.maljson.JSONObject; import com.google.common.base.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Path("/macro") public class MacroResource { private static final Logger log = LoggerFactory.getLogger(MacroResource.class); private final JobEntityManager<JobMacro> jobMacroManager; public MacroResource(JobEntityManager<JobMacro> jobMacroManager) { this.jobMacroManager = jobMacroManager; } @GET @Path("/list") @Produces(MediaType.APPLICATION_JSON) public Response listMacros() { JSONArray macros = new JSONArray(); try { for (String key : jobMacroManager.getKeys()) { JobMacro macro = jobMacroManager.getEntity(key); macros.put(macro.toJSON().put("macro", "").put("name", key)); } return Response.ok(macros.toString()).build(); } catch (Exception ex) { log.warn("", ex); return Response.serverError().entity(ex.toString()).build(); } } @GET @Path("/map") @Produces(MediaType.APPLICATION_JSON) public Response mapMacros() { JSONObject macros = new JSONObject(); try { for (String key : jobMacroManager.getKeys()) { JobMacro macro = jobMacroManager.getEntity(key); macros.put(key, macro.toJSON()); } return Response.ok(macros.toString()).build(); } catch (Exception ex) { log.warn("", ex); return Response.serverError().entity(ex.toString()).build(); } } @GET @Path("/get") @Produces(MediaType.APPLICATION_JSON) public Response getMacros(@QueryParam("label") String label, @QueryParam("field") Optional<String> field) throws Exception { JobMacro macro = jobMacroManager.getEntity(label); JSONObject macroJson = macro.toJSON(); macroJson.put("modified", macro.getModified()); macroJson.put("owner", macro.getOwner()); macroJson.put("name", label); if (field.isPresent()) { if (macroJson.has(field.get())) { Object fieldObject = macroJson.get(field.get()); if (fieldObject != null) { return Response.ok(fieldObject.toString()).build(); } else { return Response.ok().build(); } } return Response.noContent().build(); } return Response.ok(macroJson.toString()).build(); } @POST @Path("/save") @Produces(MediaType.APPLICATION_JSON) public Response saveMacro(@QueryParam("pairs") KVPairs kv, @QueryParam("user") String user, @QueryParam("token") String token) { String label = kv.getValue("label"); try { if (label == null) { log.error("Macro submitted without label field"); throw new Exception("missing field"); } JobMacro oldMacro = jobMacroManager.getEntity(label); String description = kv.getValue("description", oldMacro != null ? oldMacro.getDescription() : null); String owner = kv.getValue("owner", oldMacro != null ? oldMacro.getOwner() : user); String group = kv.getValue("group", oldMacro != null ? oldMacro.getGroup() : null); String macro = kv.getValue("macro", oldMacro != null ? oldMacro.getMacro() : null); if (macro != null && macro.length() > Spawn.INPUT_MAX_NUMBER_OF_CHARACTERS) { throw new IllegalArgumentException("Macro length of " + macro.length() + " characters is greater than max length of " + Spawn.INPUT_MAX_NUMBER_OF_CHARACTERS); } JobMacro jobMacro = new JobMacro(owner, group, description, macro); jobMacroManager.putEntity(label, jobMacro, true); return Response.ok().entity(jobMacro.toJSON().put("macro", "").put("name", label).toString()).build(); } catch (Exception ex) { log.error("Error while saving macro {}: ", label, ex); return Response.serverError().entity(ex.toString()).build(); } } @POST @Path("/delete") @Produces(MediaType.APPLICATION_JSON) public Response deleteMacro(@QueryParam("pairs") KVPairs kv, @QueryParam("user") String user, @QueryParam("token") String token) { try { String name = kv.getValue("name"); if (name == null) { return Response.serverError().entity("missing macro name").build(); } String error = jobMacroManager.deleteEntity(name); if (error == null) { return Response.ok().build(); } else { return Response.serverError().entity(error).build(); } } catch (Exception ex) { return Response.serverError().entity(ex.getMessage()).build(); } } }