package com.trendmicro.tme.grapheditor; import java.io.IOException; import java.util.List; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.CacheControl; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.StreamingOutput; import javax.xml.bind.JAXBException; import com.google.gson.Gson; import com.sun.jersey.api.core.InjectParam; import com.sun.jersey.api.view.Viewable; import com.trendmicro.codi.CODIException; import com.trendmicro.codi.ZNode; import com.trendmicro.tme.grapheditor.ProcessorModel.RenderView; @Path("/processor") public class ProcessorManager { @InjectParam GraphEditorMain graphEditor; @GET @Produces(MediaType.APPLICATION_JSON) public List<String> getProcessorList() throws CODIException { return new ZNode("/global/graph/processor").getChildren(); } @GET @Produces(MediaType.TEXT_HTML) public Response getProcessorIndex() throws CODIException { CacheControl cc = new CacheControl(); cc.setMustRevalidate(true); cc.setNoCache(true); cc.setNoStore(true); return Response.status(Status.OK).cacheControl(cc).entity(new Viewable("/processor/index.jsp", getProcessorList())).build(); } @Path("/{name}") @GET @Produces(MediaType.APPLICATION_JSON) public ProcessorModel getProcessor(@PathParam("name") String name) throws JAXBException, CODIException { ZNode node = new ZNode("/global/graph/processor/" + name); return new Gson().fromJson(node.getContentString(), ProcessorModel.class); } @Path("/{name}") @PUT public void createProcessor(@PathParam("name") String name, @Context SecurityContext sc) throws CODIException, JAXBException { if(graphEditor.isSecurityEnabled() && !(sc.isUserInRole("admin") || sc.isUserInRole("super"))){ throw new WebApplicationException(new Exception("You are not in the role 'admin'!"), Status.FORBIDDEN.getStatusCode()); } ZNode node = new ZNode("/global/graph/processor/" + name); ProcessorModel processor = new ProcessorModel(name); processor.addInput(name + ".in"); processor.addOutput(name + ".out"); node.create(false, new Gson().toJson(processor)); } @Path("/{name}") @DELETE public void removeProcessor(@PathParam("name") String name) throws CODIException, JAXBException { ZNode node = new ZNode("/global/graph/processor/" + name); node.delete(); } private void setProcessor(ProcessorModel processor) throws CODIException, JAXBException { ZNode node = new ZNode("/global/graph/processor/" + processor.getName()); node.setContent(new Gson().toJson(processor)); } private String generateGraph(ProcessorModel processor) { StringBuilder sb = new StringBuilder(); sb.append(String.format("digraph \"G_%s\"{\n", processor.getName())); sb.append("compound=true;\n"); sb.append("rankdir=LR;\n"); sb.append(processor.toSubgraph(RenderView.PROCESSOR_EDITOR)); sb.append("}\n"); return sb.toString(); } @Path("/{name}") @GET @Produces("application/x-xdot") public StreamingOutput getXDot(@PathParam("name") String name) throws CODIException, JAXBException, IOException { return new GraphvizStreamingOutput(generateGraph(getProcessor(name)), "xdot"); } @Path("/{name}") @GET @Produces("text/html") public Viewable getPage(@PathParam("name") String name) throws CODIException, JAXBException, IOException { return new Viewable("/processor/processor.jsp", getProcessor(name)); } @Path("/{name}/output/{output}") @DELETE public void removeOutput(@PathParam("name") String name, @PathParam("output") String output) throws JAXBException, CODIException { ProcessorModel processor = getProcessor(name); processor.removeOutput(output); setProcessor(processor); } @Path("/{name}/output/{output}") @PUT public void addOutput(@PathParam("name") String name, @PathParam("output") String output) throws JAXBException, CODIException { ProcessorModel processor = getProcessor(name); processor.addOutput(output); setProcessor(processor); } @Path("/{name}/input/{input}") @DELETE public void removeInput(@PathParam("name") String name, @PathParam("input") String input) throws JAXBException, CODIException { ProcessorModel processor = getProcessor(name); processor.removeInput(input); setProcessor(processor); } @Path("/{name}/input/{input}") @PUT public void addInput(@PathParam("name") String name, @PathParam("input") String input) throws JAXBException, CODIException { ProcessorModel processor = getProcessor(name); processor.addInput(input); setProcessor(processor); } }