package org.jabref.cli; import java.util.Arrays; import java.util.List; import org.jabref.Globals; import org.jabref.logic.exporter.ExportFormats; import org.jabref.logic.l10n.Localization; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class JabRefCLI { private static final Log LOGGER = LogFactory.getLog(JabRefCLI.class); private List<String> leftOver; private final CommandLine cl; public JabRefCLI(String[] args) { Options options = getOptions(); try { this.cl = new DefaultParser().parse(options, args); this.leftOver = Arrays.asList(cl.getArgs()); } catch (ParseException e) { LOGGER.warn("Problem parsing arguments", e); this.printUsage(); throw new RuntimeException(); } } public boolean isHelp() { return cl.hasOption("help"); } public boolean isShowVersion() { return cl.hasOption("version"); } public boolean isBlank() { return cl.hasOption("blank"); } public boolean isLoadSession() { return cl.hasOption("loads"); } public boolean isDisableGui() { return cl.hasOption("nogui"); } public boolean isPreferencesExport() { return cl.hasOption("prexp"); } public String getPreferencesExport() { return cl.getOptionValue("prexp", "jabref_prefs.xml"); } public boolean isPreferencesImport() { return cl.hasOption("primp"); } public String getPreferencesImport() { return cl.getOptionValue("primp", "jabref_prefs.xml"); } public boolean isPreferencesReset() { return cl.hasOption("prdef"); } public String getPreferencesReset() { return cl.getOptionValue("prdef"); } public boolean isFileExport() { return cl.hasOption("output"); } public String getFileExport() { return cl.getOptionValue("output"); } public boolean isFileImport() { return cl.hasOption("import"); } public String getFileImport() { return cl.getOptionValue("import"); } public boolean isAuxImport() { return cl.hasOption("aux"); } public String getAuxImport() { return cl.getOptionValue("aux"); } public boolean isImportToOpenBase() { return cl.hasOption("importToOpen"); } public String getImportToOpenBase() { return cl.getOptionValue("importToOpen"); } public boolean isDebugLogging() { return cl.hasOption("debug"); } public boolean isFetcherEngine() { return cl.hasOption("fetch"); } public String getFetcherEngine() { return cl.getOptionValue("fetch"); } public boolean isExportMatches() { return cl.hasOption("exportMatches"); } public String getExportMatches() { return cl.getOptionValue("exportMatches"); } public boolean isGenerateBibtexKeys() { return cl.hasOption("generateBibtexKeys"); } public boolean isAutomaticallySetFileLinks() { return cl.hasOption("automaticallySetFileLinks"); } private Options getOptions() { Options options = new Options(); // boolean options options.addOption("v", "version", false, Localization.lang("Display version")); options.addOption("n", "nogui", false, Localization.lang("No GUI. Only process command line options.")); options.addOption("h", "help", false, Localization.lang("Display help on command line options")); options.addOption("b", "blank", false, Localization.lang("Do not open any files at startup")); options.addOption(null, "debug", false, Localization.lang("Show debug level messages")); options.addOption(Option.builder("i"). longOpt("import"). desc(String.format("%s: %s[,import format]", Localization.lang("Import file"), Localization.lang("filename"))). hasArg(). argName("FILE").build()); options.addOption(Option.builder("o"). longOpt("output"). desc(String.format("%s: %s[,export format]", Localization.lang("Output or export file"), Localization.lang("filename"))). hasArg(). argName("FILE"). build()); options.addOption(Option.builder("x"). longOpt("prexp"). desc(Localization.lang("Export preferences to file")). hasArg(). argName("FILE"). build()); options.addOption(Option.builder("p"). longOpt("primp"). desc(Localization.lang("Import preferences from file")). hasArg(). argName("FILE"). build()); options.addOption(Option.builder("d"). longOpt("prdef"). desc(Localization.lang("Reset preferences (key1,key2,... or 'all')")). hasArg(). argName("FILE"). build()); options.addOption(Option.builder("a"). longOpt("aux"). desc(String.format("%s: %s[.aux],%s[.bib]", Localization.lang("Sublibrary from AUX"), Localization.lang("file"), Localization.lang("new"))). hasArg(). argName("FILE"). build()); options.addOption(Option.builder(). longOpt("importToOpen"). desc(Localization.lang("Import to open tab")). hasArg(). argName("FILE"). build()); options.addOption(Option.builder("f"). longOpt("fetch"). desc(Localization.lang("Run fetcher, e.g. \"--fetch=Medline:cancer\"")). hasArg(). argName("FILE"). build()); options.addOption(Option.builder("m"). longOpt("exportMatches"). desc(JabRefCLI.getExportMatchesSyntax()). hasArg(). argName("FILE"). build()); options.addOption(Option.builder("g"). longOpt("generateBibtexKeys"). desc(Localization.lang("Regenerate all keys for the entries in a BibTeX file")) .build()); options.addOption(Option.builder("asfl"). longOpt("automaticallySetFileLinks"). desc(Localization.lang("Automatically set file links")). build()); return options; } public void displayVersion() { System.out.println(getVersionInfo()); } public void printUsage() { String header = ""; String importFormats = Globals.IMPORT_FORMAT_READER.getImportFormatList(); String importFormatsList = String.format("%s:%n%s%n", Localization.lang("Available import formats"), importFormats); String outFormats = ExportFormats.getConsoleExportList(70, 20, ""); String outFormatsList = String.format("%s: %s%n", Localization.lang("Available export formats"), outFormats); String footer = '\n' + importFormatsList + outFormatsList + "\nPlease report issues at https://github.com/JabRef/jabref/issues"; HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("jabref [OPTIONS] [BIBTEX_FILE]\n\nOptions:", header, getOptions(), footer, true); } private String getVersionInfo() { return String.format("JabRef %s", Globals.BUILD_INFO.getVersion()); } public List<String> getLeftOver() { return leftOver; } public static String getExportMatchesSyntax() { return String.format("[%s]searchTerm,outputFile: %s[,%s]", Localization.lang("field"), Localization.lang("file"), Localization.lang("exportFormat")); } }