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.codedata;
18  
19  import java.io.File;
20  import java.io.FileInputStream;
21  import java.io.FileOutputStream;
22  import java.io.IOException;
23  import java.io.InputStream;
24  import java.io.OutputStream;
25  import org.sw4j.tool.barcode.random.config.CodeType;
26  import org.sw4j.tool.barcode.random.config.Config;
27  import org.sw4j.tool.barcode.random.config.EncodingConfig;
28  
29  /**
30   * <p>
31   * This is a concrete implementation of the {@link CodeData} interface that handles files for input and output.
32   * </p>
33   * <p>
34   * <em>This class is not thread safe.</em>
35   * </p>
36   * @author Uwe Plonus &lt;u.plonus@gmail.com&gt;
37   */
38  public class FileCodeData implements CodeData {
39  
40      /**
41       * <p>
42       * The configuration with the data for the input and output files.
43       * </p>
44       */
45      private final Config config;
46  
47      /**
48       * <p>
49       * Create a new {@code FileCodeData} with the given configuration.
50       * </p>
51       * @param config the configuration (files and folders) to use for the input and output data.
52       */
53      public FileCodeData(final Config config) {
54          this.config = config;
55      }
56  
57      /**
58       * <p>
59       * Create a new {@code FileInputStream} for the input file given in the configuration. The {@code InputStream} must
60       * be closed by the caller.
61       * </p>
62       * @return a new {@code FileInputStream} for reading the input data.
63       * @throws IOException if the creation of the {@code FileInputStream} fails.
64       */
65      @Override
66      public InputStream getInput() throws IOException {
67          return new FileInputStream(config.getInput().getName());
68      }
69  
70      /**
71       * <p>
72       * Create a new {@code FileOutputStream} for writing the csv output file. If the folder for the output file does not
73       * exists then it will be created.
74       * </p>
75       * @return a new {@code FileOutputStream} for writing the csv data.
76       * @throws IOException if the creation of the {@code FileOutputStream} or the folder fails.
77       */
78      @Override
79      public OutputStream getOutput() throws IOException {
80          File folder = createOutputFolder();
81          return new FileOutputStream(new File(folder, config.getOutput().getFile().getName()));
82      }
83  
84      /**
85       * <p>
86       * Create a new {@code FileOutputStream} for writing a barcode. If the folder for the output file does not exists
87       * then it will be created.
88       * </p>
89       * <p>
90       * This method may be called from different threads as long as the parameters are different.
91       * </p>
92       * @param type the type to write.
93       * @param format the encoding format to write.
94       * @param ident the ident of the data.
95       * @param suffix the suffix of the file to write.
96       * @return a new {@code FileOutputStream} for writing the barcode data.
97       * @throws IOException if the creation of the {@code FileOutputStream} or the folder fails.
98       */
99      @Override
100     public OutputStream getOutputForIdent(final CodeType type, final EncodingConfig format, final String ident,
101             final String suffix)
102             throws IOException {
103         File folder = createOutputFolder();
104         // TODO Check file name for encoding
105         return new FileOutputStream(new File(folder,
106                 String.format("%s-%s-%s.%s", type.getType(), format.getType(), ident, suffix)));
107     }
108 
109     /**
110      * <p>
111      * Create the output folder if it does not already exists.
112      * </p>
113      * @return the output folder.
114      * @throws IOException if the folder cannot be created.
115      */
116     private File createOutputFolder() throws IOException {
117         File folder = new File(config.getOutput().getFolder());
118         if (!folder.exists() && !folder.mkdirs()) {
119             throw new IOException(
120                     String.format("Cannot create output folder '%s'.", folder.getAbsoluteFile()));
121         }
122         return folder;
123     }
124 
125 }