Changed license to CC0
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / commandline / parameterparser / Parser.java
1 /*
2  * Svjatoslav Commons - shared library of common functionality. Author: Svjatoslav Agejenko.
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5 package eu.svjatoslav.commons.commandline.parameterparser;
6
7 import java.util.ArrayList;
8
9 /**
10  * <pre>
11  * Single commandline parameter can have any amount of arguments.
12  * </pre>
13  */
14 public class Parser {
15
16     private final ArrayList<Parameter<?, ? extends Parameter>> parameters = new ArrayList<>();
17
18     public <E extends Parameter> E add(final E parameter) {
19         parameters.add(parameter);
20         return parameter;
21     }
22
23     /**
24      * @return <code>true</code> if no errors were found. <code>false</code>
25      * otherwise.
26      */
27     private boolean checkMandatoryArgumentsPresent() {
28
29         for (final Parameter parameter : parameters)
30             if (parameter.isMandatory() && (!parameter.isSpecified())) {
31                 System.out.println("Error! Mandatory parameter ("
32                         + parameter.getAliases() + ") is not specified.");
33                 return false;
34             }
35
36         return true;
37     }
38
39     /**
40      * Return parameter by given alias or <code>null</code> if no parameter
41      * exists for given alias.
42      *
43      * @param alias parameter alias
44      * @return found parameter or <code>null</code> if parameter was not found.
45      */
46     public Parameter findParameterByAlias(final String alias) {
47
48         for (final Parameter parameter : parameters)
49             if (parameter.matchesAlias(alias))
50                 return parameter;
51
52         return null;
53     }
54
55     /**
56      * @param args commandline arguments
57      * @return <code>true</code> if no errors were found. <code>false</code>
58      * otherwise.
59      */
60     public boolean parse(final String[] args) {
61
62         Parameter currentParameter = null;
63
64         for (final String argument : args) {
65
66             final Parameter parameterForAlias = findParameterByAlias(argument);
67             if (parameterForAlias == null) {
68                 if (currentParameter == null) {
69                     System.out.println("Unknown commandline parameter: "
70                             + argument);
71                     return false;
72                 }
73
74                 if (!currentParameter.addArgument(argument))
75                     return false;
76
77             } else {
78                 if (currentParameter != null)
79                     if (!currentParameter.noMoreArguments())
80                         return false;
81
82                 parameterForAlias.setSpecified(true);
83                 currentParameter = parameterForAlias;
84             }
85
86         }
87
88         return checkMandatoryArgumentsPresent();
89     }
90
91     public void showHelp() {
92         System.out.println("Available commandline arguments:");
93         for (final Parameter parameter : parameters)
94             System.out.println(parameter.getHelp());
95     }
96
97 }