View Javadoc
1   package fr.ifremer.quadrige3.batch.shape.action;
2   
3   /*-
4    * #%L
5    * Quadrige3 Batch :: Shape import/export
6    * %%
7    * Copyright (C) 2017 - 2018 Ifremer
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU Affero General Public License as published by
11   * the Free Software Foundation, either version 3 of the License, or
12   * (at your option) any later version.
13   *
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   *
19   * You should have received a copy of the GNU Affero General Public License
20   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21   * #L%
22   */
23  
24  import fr.ifremer.quadrige3.batch.shape.config.ShapeConfigurationOption;
25  import fr.ifremer.quadrige3.batch.shape.service.ImportShapeServiceImpl;
26  import fr.ifremer.quadrige3.core.action.ActionUtils;
27  import fr.ifremer.quadrige3.core.config.QuadrigeConfiguration;
28  import fr.ifremer.quadrige3.core.dao.technical.Daos;
29  import fr.ifremer.quadrige3.core.exception.QuadrigeTechnicalException;
30  import org.apache.commons.collections.CollectionUtils;
31  import org.apache.commons.io.FilenameUtils;
32  import org.apache.commons.logging.Log;
33  import org.apache.commons.logging.LogFactory;
34  
35  import java.io.File;
36  import java.io.IOException;
37  import java.nio.file.*;
38  import java.util.List;
39  import java.util.stream.Collectors;
40  
41  import static org.nuiton.i18n.I18n.t;
42  
43  public class ImportShapeAction {
44  
45      private static final Log log = LogFactory.getLog(ExportShapeAction.class);
46  
47      public void doAction() throws Exception {
48  
49          QuadrigeConfiguration config = QuadrigeConfiguration.getInstance();
50          List<String> args = config.getApplicationConfig().getUnparsed();
51          File inputDir = null;
52          File outputDir = null;
53  
54          // Check connection
55          ActionUtils.logConnectionProperties();
56          boolean isValidConnection = Daos.isValidConnectionProperties(config.getJdbcDriver(),
57                  config.getJdbcURL(),
58                  config.getJdbcUsername(),
59                  config.getJdbcPassword());
60  
61          if (!isValidConnection) {
62              log.error(t("quadrige3.batches.server.connection.failed"));
63              return;
64          }
65  
66          if (CollectionUtils.size(args) == 0) {
67              inputDir = config.getApplicationConfig().getOptionAsFile(ShapeConfigurationOption.INPUT_SHAPES_DIRECTORY.getKey());
68              outputDir = config.getApplicationConfig().getOptionAsFile(ShapeConfigurationOption.OUTPUT_SHAPES_DIRECTORY.getKey());
69          } else if (CollectionUtils.size(args) == 2) {
70              inputDir = new File(args.get(0));
71              outputDir = new File(args.get(1));
72          }
73  
74          if (inputDir == null) {
75              log.error(t("quadrige3.batch.shape.error.directory.input.null"));
76              return;
77          }
78          if (!inputDir.exists()) {
79              log.error(t("quadrige3.batch.shape.error.directory.input.notExists", inputDir.getAbsolutePath()));
80              return;
81          }
82          if (!inputDir.isDirectory()) {
83              log.error(t("quadrige3.batch.shape.error.directory.input.invalid", inputDir.getAbsolutePath()));
84              return;
85          }
86  
87          if (outputDir == null) {
88              log.error(t("quadrige3.batch.shape.error.directory.output.null"));
89              return;
90          }
91          if (!outputDir.exists() && !outputDir.mkdirs()) {
92              log.error(t("quadrige3.batch.shape.error.directory.output.notCreated", outputDir.getAbsolutePath()));
93              return;
94          }
95  
96          // list files to import
97          List<Path> inputFiles = Files.list(Paths.get(inputDir.getAbsolutePath()))
98                  .filter(this::isZipFile)
99                  .collect(Collectors.toList());
100 
101         if (CollectionUtils.isEmpty(inputFiles)) {
102             log.info(t("quadrige3.batch.shape.error.directory.input.empty"));
103             return;
104         }
105 
106         // move all zip files to import into a temp directory
107         Path tempDir = Paths.get(config.getTempDirectory().getAbsolutePath(), "import_" + System.currentTimeMillis());
108         Files.createDirectories(tempDir);
109 
110         // loop into temp directory and call service for each file
111         ImportShapeServiceImpl service = new ImportShapeServiceImpl();
112         try {
113 
114             // execute validation & import
115             inputFiles.forEach(file -> {
116                 log.info(t("quadrige3.batch.shape.process.start", file));
117                 // move to temp directory
118                 Path fileToImport = moveFileToDirectory(file, tempDir);
119                 service.importFromFile(file, fileToImport);
120             });
121 
122         } finally {
123 
124             // move all files in temp directory to output
125             Path outputPath = Paths.get(outputDir.getAbsolutePath());
126             Files.list(tempDir).filter(Files::isRegularFile).forEach(file -> moveFileToDirectory(file, outputPath));
127 
128             // delete temp directory
129             try {
130                 Files.delete(tempDir);
131             } catch (DirectoryNotEmptyException ignored) {
132             }
133 
134         }
135 
136         log.info(t("quadrige3.batch.shape.process.end"));
137     }
138 
139     private boolean isZipFile(Path file) {
140         return Files.isRegularFile(file) && FilenameUtils.isExtension(file.getFileName().toString().toLowerCase(), "zip");
141     }
142 
143     private static Path moveFileToDirectory(Path inputFile, Path outputDir) {
144         try {
145             Path outputFile = outputDir.resolve(inputFile.getFileName());
146             Files.move(inputFile, outputFile, StandardCopyOption.REPLACE_EXISTING);
147             return outputFile;
148         } catch (IOException e) {
149             throw new QuadrigeTechnicalException(t("quadrige3.batch.shape.error.file.move", inputFile, outputDir), e);
150         }
151     }
152 
153 }