Changeset 5279 in josm


Ignore:
Timestamp:
2012-06-16T15:55:24+02:00 (7 years ago)
Author:
bastiK
Message:

use gnu getopt for command line processing

improvements:

  • long options can be separated by space from the argument (currently

only "=" works as seperator)

  • short options can be grouped (there aren't many short options at the moment, this is for later)
Location:
trunk/src
Files:
4 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/Main.java

    r5278 r5279  
    5858import org.openstreetmap.josm.data.validation.OsmValidator;
    5959import org.openstreetmap.josm.gui.GettingStarted;
     60import org.openstreetmap.josm.gui.MainApplication.Option;
    6061import org.openstreetmap.josm.gui.MainMenu;
    6162import org.openstreetmap.josm.gui.MapFrame;
     
    474475     * @param args The parsed argument list.
    475476     */
    476     public static void preConstructorInit(Map<String, Collection<String>> args) {
     477    public static void preConstructorInit(Map<Option, Collection<String>> args) {
    477478        ProjectionPreference.setProjection();
    478479
     
    514515
    515516        geometry = WindowGeometry.mainWindow("gui.geometry",
    516             (args.containsKey("geometry") ? args.get("geometry").iterator().next() : null),
    517             !args.containsKey("no-maximize") && Main.pref.getBoolean("gui.maximized", false));
    518     }
    519 
    520     public void postConstructorProcessCmdLine(Map<String, Collection<String>> args) {
    521         if (args.containsKey("download")) {
     517            (args.containsKey(Option.GEOMETRY) ? args.get(Option.GEOMETRY).iterator().next() : null),
     518            !args.containsKey(Option.NO_MAXIMIZE) && Main.pref.getBoolean("gui.maximized", false));
     519    }
     520
     521    public void postConstructorProcessCmdLine(Map<Option, Collection<String>> args) {
     522        if (args.containsKey(Option.DOWNLOAD)) {
    522523            List<File> fileList = new ArrayList<File>();
    523             for (String s : args.get("download")) {
     524            for (String s : args.get(Option.DOWNLOAD)) {
    524525                File f = null;
    525526                switch(paramType(s)) {
     
    556557            }
    557558        }
    558         if (args.containsKey("downloadgps")) {
    559             for (String s : args.get("downloadgps")) {
     559        if (args.containsKey(Option.DOWNLOADGPS)) {
     560            for (String s : args.get(Option.DOWNLOADGPS)) {
    560561                switch(paramType(s)) {
    561562                case httpUrl:
     
    576577            }
    577578        }
    578         if (args.containsKey("selection")) {
    579             for (String s : args.get("selection")) {
     579        if (args.containsKey(Option.SELECTION)) {
     580            for (String s : args.get(Option.SELECTION)) {
    580581                SearchAction.search(s, SearchAction.SearchMode.add);
    581582            }
  • trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java

    r5239 r5279  
    55
    66import java.util.ArrayList;
    7 import java.util.Arrays;
    87import java.util.HashMap;
    9 import java.util.HashSet;
    108import java.util.List;
    119import java.util.Map;
    12 import java.util.Set;
    1310import java.util.regex.Matcher;
    1411import java.util.regex.Pattern;
     
    340337    }
    341338
    342     public Bounds parseBounds(String boundsStr) throws ProjectionConfigurationException {
     339    public static Bounds parseBounds(String boundsStr) throws ProjectionConfigurationException {
    343340        String[] numStr = boundsStr.split(",");
    344341        if (numStr.length != 4)
     
    350347    }
    351348
    352     public double parseDouble(Map<String, String> parameters, String parameterName) throws ProjectionConfigurationException {
     349    public static double parseDouble(Map<String, String> parameters, String parameterName) throws ProjectionConfigurationException {
    353350        String doubleStr = parameters.get(parameterName);
    354351        if (doubleStr == null && parameters.containsKey(parameterName))
     
    358355    }
    359356
    360     public double parseDouble(String doubleStr, String parameterName) throws ProjectionConfigurationException {
     357    public static double parseDouble(String doubleStr, String parameterName) throws ProjectionConfigurationException {
    361358        try {
    362359            return Double.parseDouble(doubleStr);
     
    367364    }
    368365
    369     public double parseAngle(String angleStr, String parameterName) throws ProjectionConfigurationException {
     366    public static double parseAngle(String angleStr, String parameterName) throws ProjectionConfigurationException {
    370367        String s = angleStr;
    371368        double value = 0;
  • trunk/src/org/openstreetmap/josm/gui/MainApplet.java

    r4982 r5279  
    2828import org.openstreetmap.josm.actions.JosmAction;
    2929import org.openstreetmap.josm.data.ServerSidePreferences;
     30import org.openstreetmap.josm.gui.MainApplication.Option;
    3031import org.openstreetmap.josm.tools.GBC;
    3132import org.openstreetmap.josm.tools.I18n;
     
    127128        }
    128129
    129         Main.preConstructorInit(args);
     130        Main.preConstructorInit(Option.fromStringMap(args));
    130131        Main.parent = frame;
    131132        Main.addListener();
    132133
    133         new MainCaller().postConstructorProcessCmdLine(args);
     134        new MainCaller().postConstructorProcessCmdLine(Option.fromStringMap(args));
    134135
    135136        MainMenu m = Main.main.menu; // shortcut
  • trunk/src/org/openstreetmap/josm/gui/MainApplication.java

    r5201 r5279  
    77import java.awt.Image;
    88import java.awt.Toolkit;
    9 import java.awt.event.ActionEvent;
    109import java.awt.event.WindowAdapter;
    1110import java.awt.event.WindowEvent;
     
    1918import java.security.Permissions;
    2019import java.security.Policy;
     20import java.util.ArrayList;
    2121import java.util.Collection;
    2222import java.util.HashMap;
     
    2828import javax.swing.RepaintManager;
    2929import javax.swing.SwingUtilities;
     30
     31import gnu.getopt.Getopt;
     32import gnu.getopt.LongOpt;
    3033
    3134import org.jdesktop.swinghelper.debug.CheckThreadViolationRepaintManager;
     
    9598                "\tjava -jar josm.jar <options>...\n\n"+
    9699                tr("options")+":\n"+
    97                 "\t--help|-?|-h                              "+tr("Show this help")+"\n"+
     100                "\t--help|-h                                 "+tr("Show this help")+"\n"+
    98101                "\t--geometry=widthxheight(+|-)x(+|-)y       "+tr("Standard unix geometry argument")+"\n"+
    99102                "\t[--download=]minlat,minlon,maxlat,maxlon  "+tr("Download the bounding box")+"\n"+
     
    125128    }
    126129
    127     private static Map<String, Collection<String>> buildCommandLineArgumentMap(String[] args) {
    128         Map<String, Collection<String>> argMap = new HashMap<String, Collection<String>>();
    129         for (String arg : args) {
    130             if ("-h".equals(arg) || "-?".equals(arg)) {
    131                 arg = "--help";
    132             } else if ("-v".equals(arg)) {
    133                 arg = "--version";
    134             }
    135             // handle simple arguments like file names, URLs, bounds
    136             if (!arg.startsWith("--")) {
    137                 arg = "--download="+arg;
    138             }
    139             int i = arg.indexOf('=');
    140             String key = i == -1 ? arg.substring(2) : arg.substring(2,i);
    141             String value = i == -1 ? "" : arg.substring(i+1);
    142             Collection<String> v = argMap.get(key);
    143             if (v == null) {
    144                 v = new LinkedList<String>();
    145             }
    146             v.add(value);
    147             argMap.put(key, v);
    148         }
     130    public enum Option {
     131        HELP(false),
     132        VERSION(false),
     133        LANGUAGE(true),
     134        RESET_PREFERENCES(false),
     135        LOAD_PREFERENCES(true),
     136        SET(true),
     137        GEOMETRY(true),
     138        NO_MAXIMIZE(false),
     139        MAXIMIZE(false),
     140        DOWNLOAD(true),
     141        DOWNLOADGPS(true),
     142        SELECTION(true);
     143
     144        private String name;
     145        private boolean requiresArgument;
     146
     147        private Option(boolean requiresArgument) {
     148            this.name = name().toLowerCase().replace("_", "-");
     149            this.requiresArgument = requiresArgument;
     150        }
     151
     152        public String getName() {
     153            return name;
     154        }
     155
     156        public boolean requiresArgument() {
     157            return requiresArgument;
     158        }
     159
     160        public static Map<Option, Collection<String>> fromStringMap(Map<String, Collection<String>> opts) {
     161            Map<Option, Collection<String>> res = new HashMap<Option, Collection<String>>();
     162            for (Map.Entry<String, Collection<String>> e : opts.entrySet()) {
     163                Option o = Option.valueOf(e.getKey().toUpperCase().replace("-", "_"));
     164                if (o != null) {
     165                    res.put(o, e.getValue());
     166                }
     167            }
     168            return res;
     169        }
     170    }
     171
     172    private static Map<Option, Collection<String>> buildCommandLineArgumentMap(String[] args) {
     173
     174        List<LongOpt> los = new ArrayList<LongOpt>();
     175        for (Option o : Option.values()) {
     176            los.add(new LongOpt(o.getName(), o.requiresArgument() ? LongOpt.REQUIRED_ARGUMENT : LongOpt.NO_ARGUMENT, null, 0));
     177        }
     178
     179        Getopt g = new Getopt("JOSM", args, "hv", los.toArray(new LongOpt[0]));
     180
     181        Map<Option, Collection<String>> argMap = new HashMap<Option, Collection<String>>();
     182
     183        int c;
     184        while ((c = g.getopt()) != -1 ) {
     185            Option opt = null;
     186            switch (c) {
     187                case 'h':
     188                    opt = Option.HELP;
     189                    break;
     190                case 'v':
     191                    opt = Option.VERSION;
     192                    break;
     193                case 0:
     194                    opt = Option.values()[g.getLongind()];
     195                    break;
     196            }
     197            if (opt != null) {
     198                Collection<String> values = argMap.get(opt);
     199                if (values == null) {
     200                    values = new ArrayList<String>();
     201                    argMap.put(opt, values);
     202                }
     203                values.add(g.getOptarg());
     204            } else
     205                throw new IllegalArgumentException();
     206        }
     207        // positional arguments are a shortcut for the --download ... option
     208        for (int i = g.getOptind(); i < args.length; ++i) {
     209            Collection<String> values = argMap.get(Option.DOWNLOAD);
     210            if (values == null) {
     211                values = new ArrayList<String>();
     212                argMap.put(Option.DOWNLOAD, values);
     213            }
     214            values.add(args[i]);
     215        }
     216
    149217        return argMap;
    150218    }
     
    186254
    187255        // construct argument table
    188         final Map<String, Collection<String>> args = buildCommandLineArgumentMap(argArray);
    189 
    190         if (args.containsKey("version")) {
     256        Map<Option, Collection<String>> args = null;
     257        try {
     258            args = buildCommandLineArgumentMap(argArray);
     259        } catch (IllegalArgumentException e) {
     260            System.exit(1);
     261        }
     262
     263        if (args.containsKey(Option.VERSION)) {
    191264            System.out.println(Version.getInstance().getAgentString());
    192265            System.exit(0);
     
    195268        }
    196269
    197         Main.pref.init(args.containsKey("reset-preferences"));
     270        Main.pref.init(args.containsKey(Option.RESET_PREFERENCES));
    198271
    199272        // Check if passed as parameter
    200         if (args.containsKey("language")) {
    201             I18n.set(args.get("language").iterator().next());
     273        if (args.containsKey(Option.LANGUAGE)) {
     274            I18n.set(args.get(Option.LANGUAGE).iterator().next());
    202275        } else {
    203276            I18n.set(Main.pref.get("language", null));
     
    208281        Main.parent = mainFrame;
    209282
    210         if (args.containsKey("load-preferences")) {
     283        if (args.containsKey(Option.LOAD_PREFERENCES)) {
    211284            CustomConfigurator.XMLCommandProcessor config = new CustomConfigurator.XMLCommandProcessor(Main.pref);
    212             for (String i : args.get("load-preferences")) {
     285            for (String i : args.get(Option.LOAD_PREFERENCES)) {
    213286                System.out.println("Reading preferences from " + i);
    214287                try {
     
    221294        }
    222295
    223         if (args.containsKey("set")) {
    224             for (String i : args.get("set")) {
     296        if (args.containsKey(Option.SET)) {
     297            for (String i : args.get(Option.SET)) {
    225298                String[] kv = i.split("=", 2);
    226299                Main.pref.put(kv[0], "null".equals(kv[1]) ? null : kv[1]);
     
    234307
    235308        // asking for help? show help and exit
    236         if (args.containsKey("help")) {
     309        if (args.containsKey(Option.HELP)) {
    237310            showHelp();
    238311            System.exit(0);
     
    278351
    279352        boolean maximized = Boolean.parseBoolean(Main.pref.get("gui.maximized"));
    280         if ((!args.containsKey("no-maximize") && maximized) || args.containsKey("maximize")) {
     353        if ((!args.containsKey(Option.NO_MAXIMIZE) && maximized) || args.containsKey(Option.MAXIMIZE)) {
    281354            if (Toolkit.getDefaultToolkit().isFrameStateSupported(JFrame.MAXIMIZED_BOTH)) {
    282355                // Main.debug("Main window maximized");
     
    292365            main.menu.fullscreenToggleAction.initial();
    293366        }
     367
     368        final Map<Option, Collection<String>> args_final = args;
    294369
    295370        SwingUtilities.invokeLater(new Runnable() {
     
    319394                }
    320395
    321                 main.postConstructorProcessCmdLine(args);
     396                main.postConstructorProcessCmdLine(args_final);
    322397
    323398                DownloadDialog.autostartIfNeeded();
Note: See TracChangeset for help on using the changeset viewer.