Skip to content

Commit 8622bbe

Browse files
author
Mark Robinson
committed
Implement controller methods for Graphviz images
1 parent 732b0d4 commit 8622bbe

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

src/main/java/org/commonwl/viewer/web/WorkflowController.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919

2020
package org.commonwl.viewer.web;
2121

22+
import com.github.jabbalaci.graphviz.GraphViz;
2223
import org.apache.commons.lang.StringUtils;
24+
import org.apache.tomcat.util.http.fileupload.IOUtils;
25+
import org.apache.tomcat.util.http.parser.MediaType;
2326
import org.commonwl.viewer.domain.GithubDetails;
2427
import org.commonwl.viewer.domain.Workflow;
2528
import org.commonwl.viewer.domain.WorkflowForm;
@@ -29,17 +32,22 @@
2932
import org.slf4j.Logger;
3033
import org.slf4j.LoggerFactory;
3134
import org.springframework.beans.factory.annotation.Autowired;
35+
import org.springframework.beans.factory.annotation.Value;
3236
import org.springframework.core.io.FileSystemResource;
3337
import org.springframework.stereotype.Controller;
3438
import org.springframework.validation.BindingResult;
3539
import org.springframework.web.bind.annotation.*;
40+
import org.springframework.web.context.ServletContextAware;
3641
import org.springframework.web.servlet.HandlerMapping;
3742
import org.springframework.web.servlet.ModelAndView;
3843

44+
import javax.servlet.ServletContext;
3945
import javax.servlet.http.HttpServletRequest;
4046
import javax.servlet.http.HttpServletResponse;
4147
import javax.validation.Valid;
4248
import java.io.File;
49+
import java.io.IOException;
50+
import java.io.InputStream;
4351

4452
@Controller
4553
public class WorkflowController {
@@ -191,4 +199,66 @@ public FileSystemResource downloadROBundle(@PathVariable("workflowID") String wo
191199
logger.info("Serving download for workflow " + workflowID + " [" + bundleDownload.toString() + "]");
192200
return new FileSystemResource(bundleDownload);
193201
}
202+
203+
/**
204+
* Download a generated DOT graph for a workflow as an svg
205+
* @param workflowID The ID of the workflow to download the graph for
206+
*/
207+
@RequestMapping(value = "/workflows/{workflowID}/graph/svg",
208+
method = RequestMethod.GET,
209+
produces = "image/svg+xml")
210+
@ResponseBody
211+
public FileSystemResource getGraphAsSvg(@Value("${graphvizStorage}") String graphvizStorage,
212+
@PathVariable("workflowID") String workflowID,
213+
HttpServletResponse response) throws IOException {
214+
215+
// Get workflow from database
216+
Workflow workflowModel = workflowRepository.findOne(workflowID);
217+
218+
// 404 error if workflow does not exist
219+
if (workflowModel == null) {
220+
throw new WorkflowNotFoundException();
221+
}
222+
223+
// Generate graphviz image if it does not already exist
224+
File out = new File(graphvizStorage + "/" + workflowID + ".svg");
225+
if (!out.exists()) {
226+
GraphViz gv = new GraphViz();
227+
gv.writeGraphToFile(gv.getGraph(workflowModel.getDotGraph(), "svg", "dot"), out.getAbsolutePath());
228+
}
229+
230+
// Output the graph image
231+
return new FileSystemResource(out);
232+
}
233+
234+
/**
235+
* Download a generated DOT graph for a workflow as a png
236+
* @param workflowID The ID of the workflow to download the graph for
237+
*/
238+
@RequestMapping(value = "/workflows/{workflowID}/graph/png",
239+
method = RequestMethod.GET,
240+
produces = "image/png")
241+
@ResponseBody
242+
public FileSystemResource getGraphAsPng(@Value("${graphvizStorage}") String graphvizStorage,
243+
@PathVariable("workflowID") String workflowID,
244+
HttpServletResponse response) throws IOException {
245+
246+
// Get workflow from database
247+
Workflow workflowModel = workflowRepository.findOne(workflowID);
248+
249+
// 404 error if workflow does not exist
250+
if (workflowModel == null) {
251+
throw new WorkflowNotFoundException();
252+
}
253+
254+
// Generate graphviz image if it does not already exist
255+
File out = new File(graphvizStorage + "/" + workflowID + ".png");
256+
if (!out.exists()) {
257+
GraphViz gv = new GraphViz();
258+
gv.writeGraphToFile(gv.getGraph(workflowModel.getDotGraph(), "png", "dot"), out.getAbsolutePath());
259+
}
260+
261+
// Output the graph image
262+
return new FileSystemResource(out);
263+
}
194264
}

0 commit comments

Comments
 (0)