1 package fr.ifremer.quadrige3.batch.shape.action;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
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
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
107 Path tempDir = Paths.get(config.getTempDirectory().getAbsolutePath(), "import_" + System.currentTimeMillis());
108 Files.createDirectories(tempDir);
109
110
111 ImportShapeServiceImpl service = new ImportShapeServiceImpl();
112 try {
113
114
115 inputFiles.forEach(file -> {
116 log.info(t("quadrige3.batch.shape.process.start", file));
117
118 Path fileToImport = moveFileToDirectory(file, tempDir);
119 service.importFromFile(file, fileToImport);
120 });
121
122 } finally {
123
124
125 Path outputPath = Paths.get(outputDir.getAbsolutePath());
126 Files.list(tempDir).filter(Files::isRegularFile).forEach(file -> moveFileToDirectory(file, outputPath));
127
128
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 }