View Javadoc
1   /*
2    * Copyright (C) 2019 sw4j.org
3    *
4    * This program is free software: you can redistribute it and/or modify
5    * it under the terms of the GNU General Public License as published by
6    * the Free Software Foundation, either version 3 of the License, or
7    * (at your option) any later version.
8    *
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.
13   *
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/>.
16   */
17  package org.sw4j.tool.barcode.random.config;
18  
19  import com.fasterxml.jackson.annotation.JsonCreator;
20  import com.fasterxml.jackson.annotation.JsonProperty;
21  import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
22  import java.io.File;
23  import java.io.IOException;
24  
25  /**
26   * <p>
27   * The top level class for configuring the whole application. This class includes the configuration for the input file,
28   * the output file(s) and the random number generation and presentation.
29   * </p>
30   * <p>
31   * To create a new instance programmatically use the {@link org.sw4j.tool.barcode.random.config.Config.Builder Builder}
32   * which can be obtained by the method {@link #builder()}.
33   * </p>
34   * <p>
35   * This class is immutable.
36   * </p>
37   * @author Uwe Plonus &lt;u.plonus@gmail.com&gt;
38   */
39  public class Config {
40  
41      /**
42       * <p>
43       * The configuration for the input file.
44       * </p>
45       */
46      private final FileConfig input;
47  
48      /**
49       * <p>
50       * The configuration for the output file(s).
51       * </p>
52       */
53      private final OutputConfig output;
54  
55      /**
56       * <p>
57       * The configuration for the random number generation and presentation.
58       * </p>
59       */
60      private final GenerationConfig random;
61  
62      /**
63       * <p>
64       * The configuration for the predefined presentation.
65       * </p>
66       */
67      private final GenerationConfig predefined;
68  
69      /**
70       * <p>
71       * Create a new {@code Config} with the given part configurations.
72       * </p>
73       * <p>
74       * This constructor is annotated so that a YAML or JSON parsed with jackson fasterxml can create an instance
75       * directly.
76       * </p>
77       * @param input the input file configuration.
78       * @param output the output file(s) configuration.
79       * @param random the random generation and presentation configuration.
80       * @param predefined the predefined presentation configuration.
81       * @throws IllegalArgumentException if either {@code input}, {@code output} or {@code random} is {@code null}.
82       */
83      @JsonCreator
84      public Config(
85              @JsonProperty("input") final FileConfig input,
86              @JsonProperty("output") final OutputConfig output,
87              @JsonProperty("random") final GenerationConfig random,
88              @JsonProperty("predefined") final GenerationConfig predefined) {
89          if (input == null) {
90              throw new IllegalArgumentException(String.format("%s: Missing input", getClass().getSimpleName()));
91          }
92          if (output == null) {
93              throw new IllegalArgumentException(String.format("%s: Missing output", getClass().getSimpleName()));
94          }
95          if (random == null && predefined == null) {
96              throw new IllegalArgumentException(String.format("%s: Missing random or predefined",
97                      getClass().getSimpleName()));
98          }
99          this.input = input;
100         this.output = output;
101         this.random = random;
102         this.predefined = predefined;
103     }
104 
105     /**
106      * <p>
107      * Return the input file configuration.
108      * </p>
109      * @return the input file configuration.
110      */
111     public FileConfig getInput() {
112         return input;
113     }
114 
115     /**
116      * <p>
117      * Return the output file(s) configuration.
118      * </p>
119      * @return the output file(s) configuration.
120      */
121     public OutputConfig getOutput() {
122         return output;
123     }
124 
125     /**
126      * <p>
127      * Return the random generation and presentation configuration.
128      * </p>
129      * @return the random generation and presentation configuration.
130      */
131     public GenerationConfig getRandom() {
132         return random;
133     }
134 
135     /**
136      * <p>
137      * Return the predefined presentation configuration.
138      * </p>
139      * @return the predefined presentation configuration.
140      */
141     public GenerationConfig getPredefined() {
142         return predefined;
143     }
144 
145     /**
146      * <p>
147      * A factory method to create a configuration from a YAML file.
148      * </p>
149      * @param configFile the YAML file to read.
150      * @return the parsed configuration.
151      * @throws IOException if the reading of the file fails.
152      */
153     public static Config readYamlConfig(final File configFile) throws IOException {
154         YAMLMapper mapper = new YAMLMapper();
155         return mapper.readValue(configFile, Config.class);
156     }
157 
158     /**
159      * <p>
160      * Return a {@link org.sw4j.tool.barcode.random.config.Config.Builder Builder} that can be used to build a config.
161      * </p>
162      * @return a {@link org.sw4j.tool.barcode.random.config.Config.Builder Builder}.
163      */
164     public static Builder builder() {
165         return new Builder();
166     }
167 
168 
169     /**
170      * <p>
171      * This class is a Builder to build a {@link org.sw4j.tool.barcode.random.config.Config Config} programmatically.
172      * All methods to set the values are fluent to ease the building of a configuration.
173      * </p>
174      * <p>
175      * This class is not thread save.
176      * </p>
177      * @author Uwe Plonus &lt;u.plonus@gmail.com&gt;
178      */
179     public static class Builder {
180 
181         /**
182          * <p>
183          * The input file configuration.
184          * </p>
185          */
186         private FileConfig input;
187 
188         /**
189          * <p>
190          * The output file(s) configuration.
191          * </p>
192          */
193         private OutputConfig output;
194 
195         /**
196          * <p>
197          * The random number generation and presentation configuration.
198          * </p>
199          */
200         private GenerationConfig random;
201 
202         /**
203          * <p>
204          * The predefined presentation configuration.
205          * </p>
206          */
207         private GenerationConfig predefined;
208 
209         /**
210          * <p>
211          * Create a new {@code Builder}.
212          * </p>
213          */
214         public Builder() {
215         }
216 
217         /**
218          * <p>
219          * Set the input file configuration.
220          * </p>
221          * @param input the input file configuration.
222          * @return the builder for a fluent interface.
223          */
224         public Builder setInput(final FileConfig input) {
225             this.input = input;
226             return this;
227         }
228 
229         /**
230          * <p>
231          * Set the output file(s) configuration.
232          * </p>
233          * @param output the output file(s) configuration.
234          * @return the builder for a fluent interface.
235          */
236         public Builder setOutput(final OutputConfig output) {
237             this.output = output;
238             return this;
239         }
240 
241         /**
242          * <p>
243          * Set the random generation and presentation configuration.
244          * </p>
245          * @param random the random generation and presentation configuration.
246          * @return the builder for a fluent interface.
247          */
248         public Builder setRandom(final GenerationConfig random) {
249             this.random = random;
250             return this;
251         }
252 
253         /**
254          * <p>
255          * Build a new {@link org.sw4j.tool.barcode.random.config.Config Config} with the parameters set.
256          * </p>
257          * @return the new created {@link org.sw4j.tool.barcode.random.config.Config Config}.
258          * @throws IllegalArgumentException if either {@code input}, {@code output} or either {@code random} or
259          *  {@code predefined} is {@code null}.
260          */
261         public Config build() {
262             return new Config(input, output, random, predefined);
263         }
264 
265     }
266 
267 }