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;
21 import cz.frantovo.rozsireneatributy.Konfigurace.RežimZamykání;
23 import java.util.Arrays;
24 import java.util.Collection;
25 import java.util.ResourceBundle;
28 * Converts command line arguments from String array to object. Checks basic
29 * constraints (if only supported options are used and if they have correct
30 * number of parameters)
32 * @author Ing. František Kučera (frantovo.cz)
34 public class CLIParser {
36 private static final ResourceBundle překlady = ResourceBundle
37 .getBundle(Atribut.class.getPackageName() + ".Překlady");
39 public Konfigurace parsujParametry(String[] parametry)
40 throws CLIParserException {
41 Konfigurace k = new Konfigurace();
43 for (int i = 0; i < parametry.length; i++) {
44 String parametr = parametry[i];
46 boolean odpovídá = false;
48 for (Token t : Token.values()) {
49 if (t.odpovídá(parametr)) {
50 int parsedArgs = t.parsuj(parametry, i, k);
57 throw new CLIParserException(
58 překlady.getString("chyba.cli.neznámýParametr") + parametr);
62 if (k.getSoubor() == null)
63 throw new CLIParserException(
64 překlady.getString("chyba.cli.chybíSoubor"));
69 private static String načtiDalší(String[] parametry, int index)
70 throws CLIParserException {
71 if (index < parametry.length) {
72 return parametry[index];
74 throw new CLIParserException("Expecting value for option: "
75 + parametry[index - 1]);
79 private static boolean načtiDalšíBoolean(String[] parametry, int index)
80 throws CLIParserException {
81 String s = načtiDalší(parametry, index);
90 throw new CLIParserException("Neplatná logická hodnota: " + s);
94 private static enum Token {
96 SOUBOR("--soubor", "--file") {
98 public int parsuj(String[] parametry, int index, Konfigurace k)
99 throws CLIParserException {
100 int originalIndex = index;
101 k.setSoubor(new File(načtiDalší(parametry, ++index)));
102 return index - originalIndex;
105 REŽIM_ZAMYKÁNÍ("--režim-zamykání", "--locking-mode") {
107 public int parsuj(String[] parametry, int index, Konfigurace k)
108 throws CLIParserException {
109 int originalIndex = index;
110 String hodnota = načtiDalší(parametry, ++index);
111 k.setRežimZamykání(RežimZamykání.najdiRežim(hodnota));
112 if (k.getRežimZamykání() == null)
113 throw new CLIParserException(
115 "Neplatný režim zamykání: " + hodnota);
116 return index - originalIndex;
119 DEFINICE_ATRIBUTU("--definice-atributu", "--attribute-definition") {
121 public int parsuj(String[] parametry, int index, Konfigurace k)
122 throws CLIParserException {
123 int originalIndex = index;
124 String název = načtiDalší(parametry, ++index);
125 String popis = načtiDalší(parametry, ++index);
126 k.addAtribut(new DefiniceAtributu(název, popis));
127 return index - originalIndex;
130 HODNOTA_ATRIBUTU("--hodnota", "--value") {
132 public int parsuj(String[] parametry, int index, Konfigurace k)
133 throws CLIParserException {
134 int originalIndex = index;
135 String hodnota = načtiDalší(parametry, ++index);
136 String popis = načtiDalší(parametry, ++index);
138 if (k.getAtributy().isEmpty())
139 throw new CLIParserException(
140 překlady.getString("chyba.cli.chybíDefiniceAtributu"));
143 .get(k.getAtributy().size() - 1)
144 .addHodnota(new DefiniceHodnoty(hodnota, popis));
146 return index - originalIndex;
150 private final Collection<String> parametry;
152 private Token(String... parametry) {
153 this.parametry = Arrays.asList(parametry);
157 * @param parametr e.g. „--input-file“
158 * @return whether option is this token
160 public boolean odpovídá(String parametr) {
161 return parametry.contains(parametr);
165 * Parse String arguments and fill values into the options object.
167 * @param parametry CLI arguments
168 * @param index index of the option matched by this token, like
170 * @param k object to be filled
171 * @return number of parsed arguments – if option has no arguments (just
172 * boolean flag), return 0, otherwise return positive integer: number of
174 * @throws CLIParserException
176 public abstract int parsuj(String[] parametry, int index, Konfigurace k)
177 throws CLIParserException;