/* GanttProject is an opensource project management tool. Copyright (C) 2011-2012 GanttProject Team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject.export; import com.beust.jcommander.Parameter; import com.beust.jcommander.converters.FileConverter; import net.sourceforge.ganttproject.GPLogger; import net.sourceforge.ganttproject.GanttProject; import net.sourceforge.ganttproject.PluginPreferencesImpl; import net.sourceforge.ganttproject.plugins.PluginManager; import net.sourceforge.ganttproject.task.Task; import org.eclipse.core.runtime.jobs.Job; import org.osgi.service.prefs.Preferences; import org.w3c.util.DateParser; import java.io.File; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; public class CommandLineExportApplication { public static class Args { @Parameter(names = "-export", description = "Export format") public String exporter; @Parameter(names = "-stylesheet", description = "Stylesheet used for export") public String stylesheet; @Parameter(names = "-chart", description = "Chart to export (resource or gantt)") public String chart; @Parameter(names = "-zoom", description = "Zoom scale to use in the exported charts") public Integer zooming = 3; @Parameter(names = { "-o", "-out" }, description = "Output file name", converter = FileConverter.class) public File outputFile; @Parameter(names = "-expand-resources", description = "Expand resource nodes on the resource load chart") public boolean expandResources = false; @Parameter(names = "-expand-tasks", description = "Expand all tasks nodes on the Gantt chart", arity = 1) public boolean expandTasks = true; } private final Map<String, Exporter> myFlag2exporter = new HashMap<String, Exporter>(); private final Args myArgs = new Args(); public CommandLineExportApplication() { for (Exporter exporter : PluginManager.getExporters()) { List<String> keys = Arrays.asList(exporter.getCommandLineKeys()); for (String key : keys) { myFlag2exporter.put(key, exporter); } } } public Collection<String> getCommandLineFlags() { return myFlag2exporter.keySet(); } public Args getArguments() { return myArgs; } public boolean export(GanttProject.Args mainArgs) { if (myArgs.exporter == null || mainArgs.file == null || mainArgs.file.isEmpty()) { return false; } Exporter exporter = myFlag2exporter.get(myArgs.exporter); GPLogger.log("Using exporter=" + exporter); if (exporter == null) { return false; } GanttProject project = new GanttProject(false); ConsoleUIFacade consoleUI = new ConsoleUIFacade(project.getUIFacade()); File inputFile = new File(mainArgs.file.get(0)); if (false == inputFile.exists()) { consoleUI.showErrorDialog("File " + mainArgs.file + " does not exist."); return true; } if (false == inputFile.canRead()) { consoleUI.showErrorDialog("File " + mainArgs.file + " is not readable."); return true; } project.openStartupDocument(mainArgs.file.get(0)); if (myArgs.expandTasks) { for (Task t : project.getTaskManager().getTasks()) { project.getUIFacade().getTaskTree().setExpanded(t, true); } } Job.getJobManager().setProgressProvider(null); File outputFile = myArgs.outputFile == null ? FileChooserPage.proposeOutputFile(project, exporter) : myArgs.outputFile; Preferences prefs = new PluginPreferencesImpl(null, ""); prefs.putInt("zoom", myArgs.zooming); prefs.put( "exportRange", DateParser.getIsoDate(project.getTaskManager().getProjectStart()) + " " + DateParser.getIsoDate(project.getTaskManager().getProjectEnd())); prefs.putBoolean("commandLine", true); // If chart to export is defined, then add a string to prefs if (myArgs.chart != null) { prefs.put("chart", myArgs.chart); } // If stylesheet is defined, then add a string to prefs if (myArgs.stylesheet != null) { prefs.put("stylesheet", myArgs.stylesheet); } prefs.putBoolean("expandResources", myArgs.expandResources); exporter.setContext(project, consoleUI, prefs); final CountDownLatch latch = new CountDownLatch(1); try { ExportFinalizationJob finalizationJob = new ExportFinalizationJob() { @Override public void run(File[] exportedFiles) { latch.countDown(); } }; exporter.run(outputFile, finalizationJob); latch.await(); } catch (Exception e) { consoleUI.showErrorDialog(e); } return true; } }