2 * Rozšířené atributy – program na správu rozšířených atributů souborů
3 * Copyright © 2023 František Kučera (frantovo.cz)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 package cz.frantovo.rozsireneatributy;
19 import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceAtributu;
20 import cz.frantovo.rozsireneatributy.Konfigurace.DefiniceHodnoty;
22 import java.util.Arrays;
23 import java.util.Collection;
24 import java.util.ResourceBundle;
27 * Converts command line arguments from String array to object. Checks basic
28 * constraints (if only supported options are used and if they have correct
29 * number of parameters)
31 * @author Ing. František Kučera (frantovo.cz)
33 public class CLIParser {
35 private static final ResourceBundle překlady = ResourceBundle
36 .getBundle(Atribut.class.getPackageName() + ".Překlady");
38 public Konfigurace parsujParametry(String[] parametry)
39 throws CLIParserException {
40 Konfigurace k = new Konfigurace();
42 for (int i = 0; i < parametry.length; i++) {
43 String parametr = parametry[i];
45 boolean odpovídá = false;
47 for (Token t : Token.values()) {
48 if (t.odpovídá(parametr)) {
49 int parsedArgs = t.parsuj(parametry, i, k);
56 throw new CLIParserException(
57 překlady.getString("chyba.cli.neznámýParametr") + parametr);
61 if (k.getSoubor() == null)
62 throw new CLIParserException(
63 překlady.getString("chyba.cli.chybíSoubor"));
68 private static String načtiDalší(String[] parametry, int index)
69 throws CLIParserException {
70 if (index < parametry.length) {
71 return parametry[index];
73 throw new CLIParserException("Expecting value for option: "
74 + parametry[index - 1]);
78 private static boolean načtiDalšíBoolean(String[] parametry, int index)
79 throws CLIParserException {
80 String s = načtiDalší(parametry, index);
89 throw new CLIParserException("Neplatná logická hodnota: " + s);
93 private static enum Token {
95 SOUBOR("--soubor", "--file") {
97 public int parsuj(String[] parametry, int index, Konfigurace k)
98 throws CLIParserException {
99 int originalIndex = index;
100 k.setSoubor(new File(načtiDalší(parametry, ++index)));
101 return index - originalIndex;
104 POVINNÉ_ZAMYKÁNÍ("--povinné-zamykání", "--mandatory-locking") {
106 public int parsuj(String[] parametry, int index, Konfigurace k)
107 throws CLIParserException {
108 int originalIndex = index;
109 k.setPovinnéZamykání(načtiDalšíBoolean(parametry, ++index));
110 return index - originalIndex;
113 DEFINICE_ATRIBUTU("--definice-atributu", "--attribute-definition") {
115 public int parsuj(String[] parametry, int index, Konfigurace k)
116 throws CLIParserException {
117 int originalIndex = index;
118 String název = načtiDalší(parametry, ++index);
119 String popis = načtiDalší(parametry, ++index);
120 k.addAtribut(new DefiniceAtributu(název, popis));
121 return index - originalIndex;
124 HODNOTA_ATRIBUTU("--hodnota", "--value") {
126 public int parsuj(String[] parametry, int index, Konfigurace k)
127 throws CLIParserException {
128 int originalIndex = index;
129 String hodnota = načtiDalší(parametry, ++index);
130 String popis = načtiDalší(parametry, ++index);
132 if (k.getAtributy().isEmpty())
133 throw new CLIParserException(
134 překlady.getString("chyba.cli.chybíDefiniceAtributu"));
137 .get(k.getAtributy().size() - 1)
138 .addHodnota(new DefiniceHodnoty(hodnota, popis));
140 return index - originalIndex;
144 private final Collection<String> parametry;
146 private Token(String... parametry) {
147 this.parametry = Arrays.asList(parametry);
151 * @param parametr e.g. „--input-file“
152 * @return whether option is this token
154 public boolean odpovídá(String parametr) {
155 return parametry.contains(parametr);
159 * Parse String arguments and fill values into the options object.
161 * @param parametry CLI arguments
162 * @param index index of the option matched by this token, like
164 * @param k object to be filled
165 * @return number of parsed arguments – if option has no arguments (just
166 * boolean flag), return 0, otherwise return positive integer: number of
168 * @throws CLIParserException
170 public abstract int parsuj(String[] parametry, int index, Konfigurace k)
171 throws CLIParserException;