source: josm/trunk/src/org/openstreetmap/josm/gui/ProgramArguments.java @ 12633

Last change on this file since 12633 was 12633, checked in by Don-vip, 4 weeks ago

see #15182 - move GUI program arguments management from Main to gui.MainApplication

  • Property svn:eol-style set to native
File size: 7.6 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui;
3
4import java.util.ArrayList;
5import java.util.Collection;
6import java.util.Collections;
7import java.util.EnumMap;
8import java.util.HashMap;
9import java.util.List;
10import java.util.Locale;
11import java.util.Map;
12import java.util.Optional;
13import java.util.logging.Level;
14import java.util.stream.Stream;
15
16import org.openstreetmap.josm.tools.Logging;
17
18import gnu.getopt.Getopt;
19import gnu.getopt.LongOpt;
20
21/**
22 * This class holds the arguments passed on to {@link MainApplication#main}.
23 * @author Michael Zangl
24 * @since 10899
25 */
26public class ProgramArguments {
27
28    /**
29     * JOSM command line options.
30     * @see <a href="https://josm.openstreetmap.de/wiki/Help/CommandLineOptions">Help/CommandLineOptions</a>
31     */
32    public enum Option {
33        /** --help|-h                                  Show this help */
34        HELP(false),
35        /** --version                                  Displays the JOSM version and exits */
36        VERSION(false),
37        /** --debug                                    Print debugging messages to console */
38        DEBUG(false),
39        /** --trace                                    Print detailed debugging messages to console */
40        TRACE(false),
41        /** --language=&lt;language&gt;                Set the language */
42        LANGUAGE(true),
43        /** --reset-preferences                        Reset the preferences to default */
44        RESET_PREFERENCES(false),
45        /** --load-preferences=&lt;url-to-xml&gt;      Changes preferences according to the XML file */
46        LOAD_PREFERENCES(true),
47        /** --set=&lt;key&gt;=&lt;value&gt;            Set preference key to value */
48        SET(true),
49        /** --geometry=widthxheight(+|-)x(+|-)y        Standard unix geometry argument */
50        GEOMETRY(true),
51        /** --no-maximize                              Do not launch in maximized mode */
52        NO_MAXIMIZE(false),
53        /** --maximize                                 Launch in maximized mode */
54        MAXIMIZE(false),
55        /** --download=minlat,minlon,maxlat,maxlon     Download the bounding box <br>
56         *  --download=&lt;URL&gt;                     Download the location at the URL (with lat=x&amp;lon=y&amp;zoom=z) <br>
57         *  --download=&lt;filename&gt;                Open a file (any file type that can be opened with File/Open) */
58        DOWNLOAD(true),
59        /** --downloadgps=minlat,minlon,maxlat,maxlon  Download the bounding box as raw GPS <br>
60         *  --downloadgps=&lt;URL&gt;                  Download the location at the URL (with lat=x&amp;lon=y&amp;zoom=z) as raw GPS */
61        DOWNLOADGPS(true),
62        /** --selection=&lt;searchstring&gt;           Select with the given search */
63        SELECTION(true),
64        /** --offline=&lt;osm_api|josm_website|all&gt; Disable access to the given resource(s), delimited by comma */
65        OFFLINE(true),
66        /** --skip-plugins */
67        SKIP_PLUGINS(false);
68
69        private final String name;
70        private final boolean requiresArg;
71
72        Option(boolean requiresArgument) {
73            this.name = name().toLowerCase(Locale.ENGLISH).replace('_', '-');
74            this.requiresArg = requiresArgument;
75        }
76
77        /**
78         * Replies the option name
79         * @return The option name, in lowercase
80         */
81        public String getName() {
82            return name;
83        }
84
85        /**
86         * Determines if this option requires an argument.
87         * @return {@code true} if this option requires an argument, {@code false} otherwise
88         */
89        public boolean requiresArgument() {
90            return requiresArg;
91        }
92
93        LongOpt toLongOpt() {
94            return new LongOpt(getName(), requiresArgument() ? LongOpt.REQUIRED_ARGUMENT : LongOpt.NO_ARGUMENT, null, 0);
95        }
96    }
97
98    private final Map<Option, List<String>> argMap = new EnumMap<>(Option.class);
99
100    /**
101     * Construct the program arguments object
102     * @param args The args passed to main.
103     * @since 10936
104     */
105    public ProgramArguments(String... args) {
106        Stream.of(Option.values()).forEach(o -> argMap.put(o, new ArrayList<>()));
107        buildCommandLineArgumentMap(args);
108    }
109
110    /**
111     * Builds the command-line argument map.
112     * @param args command-line arguments array
113     */
114    private void buildCommandLineArgumentMap(String... args) {
115        LongOpt[] los = Stream.of(Option.values()).map(Option::toLongOpt).toArray(i -> new LongOpt[i]);
116
117        Getopt g = new Getopt("JOSM", args, "hv", los);
118
119        int c;
120        while ((c = g.getopt()) != -1) {
121            Option opt;
122            switch (c) {
123            case 'h':
124                opt = Option.HELP;
125                break;
126            case 'v':
127                opt = Option.VERSION;
128                break;
129            case 0:
130                opt = Option.values()[g.getLongind()];
131                break;
132            default:
133                opt = null;
134            }
135            if (opt != null) {
136                addOption(opt, g.getOptarg());
137            } else
138                throw new IllegalArgumentException("Invalid option: "+ (char) c);
139        }
140        // positional arguments are a shortcut for the --download ... option
141        for (int i = g.getOptind(); i < args.length; ++i) {
142            addOption(Option.DOWNLOAD, args[i]);
143        }
144    }
145
146    private void addOption(Option opt, String optarg) {
147        argMap.get(opt).add(optarg);
148    }
149
150    /**
151     * Gets a single argument (the first) that was given for the given option.
152     * @param option The option to search
153     * @return The argument as optional value.
154     */
155    public Optional<String> getSingle(Option option) {
156        return get(option).stream().findFirst();
157    }
158
159    /**
160     * Gets all values that are given for a given option
161     * @param option The option
162     * @return The values that were given. May be empty.
163     */
164    public Collection<String> get(Option option) {
165        return Collections.unmodifiableList(argMap.get(option));
166    }
167
168    /**
169     * Test if a given option was used by the user.
170     * @param option The option to test for
171     * @return <code>true</code> if the user used it.
172     */
173    public boolean hasOption(Option option) {
174        return !get(option).isEmpty();
175    }
176
177    /**
178     * Helper method to indicate if version should be displayed.
179     * @return <code>true</code> to display version
180     */
181    public boolean showVersion() {
182        return hasOption(Option.VERSION);
183    }
184
185    /**
186     * Helper method to indicate if help should be displayed.
187     * @return <code>true</code> to display version
188     */
189    public boolean showHelp() {
190        return !get(Option.HELP).isEmpty();
191    }
192
193    /**
194     * Get the log level the user wants us to use.
195     * @return The log level.
196     */
197    public Level getLogLevel() {
198        if (hasOption(Option.TRACE)) {
199            return Logging.LEVEL_TRACE;
200        } else if (hasOption(Option.DEBUG)) {
201            return Logging.LEVEL_DEBUG;
202        } else {
203            return Logging.LEVEL_INFO;
204        }
205    }
206
207    /**
208     * Gets a map of all preferences the user wants to set.
209     * @return The preferences to set. It contains null values for preferences to unset
210     */
211    public Map<String, String> getPreferencesToSet() {
212        HashMap<String, String> map = new HashMap<>();
213        get(Option.SET).stream().map(i -> i.split("=", 2)).forEach(kv -> map.put(kv[0], getValue(kv)));
214        return map;
215    }
216
217    private static String getValue(String... kv) {
218        if (kv.length < 2) {
219            return "";
220        } else if ("null".equals(kv[1])) {
221            return null;
222        } else {
223            return kv[1];
224        }
225    }
226}
Note: See TracBrowser for help on using the repository browser.