001    package org.kuali.maven.plugins.graph.dot;
002    
003    import java.io.File;
004    import java.io.IOException;
005    import java.util.ArrayList;
006    import java.util.List;
007    
008    import org.apache.commons.io.FileUtils;
009    import org.apache.commons.io.FilenameUtils;
010    import org.codehaus.plexus.util.cli.CommandLineException;
011    import org.codehaus.plexus.util.cli.CommandLineUtils;
012    import org.codehaus.plexus.util.cli.Commandline;
013    import org.codehaus.plexus.util.cli.DefaultConsumer;
014    import org.codehaus.plexus.util.cli.StreamConsumer;
015    import org.kuali.maven.plugins.graph.pojo.DotContext;
016    import org.slf4j.Logger;
017    import org.slf4j.LoggerFactory;
018    
019    public class Dot {
020        private static final Logger logger = LoggerFactory.getLogger(Dot.class);
021    
022        public DotContext getDotContext(File graph, String content, boolean keepDotFile) {
023            File dotFile = createDotFile(graph, content);
024            String type = getType(graph);
025    
026            DotContext context = new DotContext();
027            context.setGraph(graph);
028            context.setDotFile(dotFile);
029            context.setType(type);
030            context.setKeepDotFile(keepDotFile);
031            return context;
032        }
033    
034        protected String[] getArgs(DotContext context) {
035            List<String> args = new ArrayList<String>();
036            args.add("-T" + context.getType());
037            args.add("-o" + context.getGraph().getAbsolutePath());
038            args.add(context.getDotFile().getAbsolutePath());
039            return args.toArray(new String[args.size()]);
040        }
041    
042        protected Commandline getCommandLine(DotContext context) {
043            Commandline commandline = new Commandline();
044            try {
045                commandline.addSystemEnvironment();
046            } catch (Exception ignore) {
047                ; // ignore
048            }
049            commandline.setExecutable(context.getExecutable());
050            commandline.addArguments(getArgs(context));
051            return commandline;
052        }
053    
054        protected int execute(Commandline commandLine, DotContext context) {
055            try {
056                StreamConsumer stdout = new DefaultConsumer();
057                StreamConsumer stderr = new DefaultConsumer();
058                int exitValue = CommandLineUtils.executeCommandLine(commandLine, stdout, stderr);
059                if (exitValue != 0) {
060                    throw new GraphException(getErrorMessage(context, exitValue));
061                }
062                return exitValue;
063            } catch (CommandLineException e) {
064                throw new GraphException(e);
065            }
066        }
067    
068        protected String getErrorMessage(DotContext context, int exitValue) {
069            StringBuilder sb = new StringBuilder();
070            sb.append("Execution of the '" + context.getExecutable() + "' command failed.");
071            sb.append(" Exit value: '" + exitValue + "'");
072            sb.append(" Is it installed? See: http://www.graphviz.org");
073            return sb.toString();
074        }
075    
076        public void execute(DotContext context) {
077            Commandline commandline = getCommandLine(context);
078            execute(commandline, context);
079            if (!context.isKeepDotFile()) {
080                context.getDotFile().delete();
081            } else {
082                logger.info(context.getDotFile().getPath());
083            }
084            logger.info(context.getGraph().getPath());
085        }
086    
087        protected File createDotFile(File graph, String content) {
088            File dotFile = getDotFile(graph);
089            try {
090                FileUtils.write(dotFile, content);
091                return dotFile;
092            } catch (IOException e) {
093                throw new GraphException(e);
094            }
095        }
096    
097        protected String getType(File graph) {
098            return FilenameUtils.getExtension(graph.getName());
099        }
100    
101        protected File getDotFile(File graph) {
102            File dir = graph.getParentFile();
103            String path = dir.getAbsolutePath();
104            String basename = FilenameUtils.getBaseName(graph.getName());
105            String extension = "dot";
106            String filename = path + File.separator + basename + "." + extension;
107            return new File(filename);
108        }
109    
110    }