package org.lucares.pdbui; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; import java.util.Enumeration; import java.util.Optional; import java.util.concurrent.ArrayBlockingQueue; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.lucares.pdb.api.StringCompressor; import org.lucares.pdb.datastore.Entries; import org.lucares.pdb.datastore.RuntimeTimeoutException; import org.lucares.performance.db.PerformanceDb; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class FileDropZipHandler implements FileDropFileTypeHandler { private final PerformanceDb performanceDb; private final FileDropConfigProvider configProvider; private final StringCompressor stringCompressor; @Autowired public FileDropZipHandler(final PerformanceDb performanceDb, final FileDropConfigProvider configProvider, final StringCompressor stringCompressor) { super(); this.performanceDb = performanceDb; this.configProvider = configProvider; this.stringCompressor = stringCompressor; } @Override public boolean isHandle(final Path file) { return file.getFileName().toString().endsWith(".zip"); } @Override public void handle(final Path file) throws IOException, RuntimeTimeoutException, InterruptedException { final ZipFile zipFile = new ZipFile(file.toFile()); final Enumeration entries = zipFile.entries(); while (entries.hasMoreElements()) { final ZipEntry entry = entries.nextElement(); // System.out.println(entry.getName() + " isDir: " + entry.isDirectory()); if (entry.isDirectory()) { continue; } final Optional csvSettings = configProvider.provideCsvReaderSettings(entry.getName()); if (csvSettings.isPresent()) { final ArrayBlockingQueue queue = performanceDb.getQueue(); final CsvReaderSettings csvReaderSettings = csvSettings.get(); final CsvToEntryTransformer csvToEntryTransformer = CsvToEntryTransformerFactory .createCsvToEntryTransformer(queue, csvReaderSettings, stringCompressor); try (final InputStream inputStream = new BufferedInputStream(zipFile.getInputStream(entry), 1024 * 1024)) { csvToEntryTransformer.readCSV(inputStream); } } } } }