package de.flapdoodle.embed.process.store;
import de.flapdoodle.embed.process.config.store.FileSet;
import de.flapdoodle.embed.process.config.store.IDownloadConfig;
import de.flapdoodle.embed.process.config.store.IPackageResolver;
import de.flapdoodle.embed.process.distribution.ArchiveType;
import de.flapdoodle.embed.process.distribution.Distribution;
import de.flapdoodle.embed.process.extract.ExtractedFileSets;
import de.flapdoodle.embed.process.extract.Extractors;
import de.flapdoodle.embed.process.extract.IExtractedFileSet;
import de.flapdoodle.embed.process.extract.IExtractor;
import de.flapdoodle.embed.process.extract.ITempNaming;
import de.flapdoodle.embed.process.io.directories.IDirectory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
/**
* @author Ilya Sadykov
* Hacky ArtifactStore. Just to override the default FilesToExtract with PostgresFilesToExtract
*/
public class PostgresArtifactStore implements IMutableArtifactStore {
private static final Logger LOGGER = LoggerFactory.getLogger(PostgresArtifactStore.class);
private IDownloadConfig downloadConfig;
private IDirectory tempDirFactory;
private ITempNaming executableNaming;
private IDownloader downloader;
PostgresArtifactStore(IDownloadConfig downloadConfig, IDirectory tempDirFactory, ITempNaming executableNaming, IDownloader downloader) {
this.downloadConfig = downloadConfig;
this.tempDirFactory = tempDirFactory;
this.executableNaming = executableNaming;
this.downloader = downloader;
}
public IDirectory getTempDir() {
return tempDirFactory;
}
@Override
public void removeFileSet(Distribution distribution, IExtractedFileSet all) {
try {
ExtractedFileSets.delete(all);
} catch (IllegalArgumentException e) {
LOGGER.error("Failed to remove file set", e);
}
}
@Override
public boolean checkDistribution(Distribution distribution) throws IOException {
if (!LocalArtifactStore.checkArtifact(downloadConfig, distribution)) {
return LocalArtifactStore.store(downloadConfig, distribution, downloader.download(downloadConfig, distribution));
}
return true;
}
public IDownloadConfig getDownloadConfig() {
return downloadConfig;
}
@Override
public void setDownloadConfig(IDownloadConfig downloadConfig) {
this.downloadConfig = downloadConfig;
}
@Override
public IExtractedFileSet extractFileSet(Distribution distribution) throws IOException {
IPackageResolver packageResolver = downloadConfig.getPackageResolver();
File artifact = getArtifact(downloadConfig, distribution);
final ArchiveType archiveType = packageResolver.getArchiveType(distribution);
IExtractor extractor = Extractors.getExtractor(archiveType);
try {
final FileSet fileSet = packageResolver.getFileSet(distribution);
return extractor.extract(downloadConfig, artifact,
new PostgresFilesToExtract(tempDirFactory, executableNaming, fileSet));
} catch (Exception e) {
LOGGER.error("Failed to extract file set:", e);
return new EmptyFileSet();
}
}
private File getArtifact(IDownloadConfig runtime, Distribution distribution) {
File dir = createOrGetBaseDir(runtime);
File artifactFile = new File(dir, runtime.getPackageResolver().getPath(distribution));
if ((artifactFile.exists()) && (artifactFile.isFile()))
return artifactFile;
return null;
}
private File createOrGetBaseDir(IDownloadConfig runtime) {
File dir = runtime.getArtifactStorePath().asFile();
createOrCheckDir(dir);
return dir;
}
private void createOrCheckDir(File dir) {
if (!dir.exists() && !dir.mkdirs()) {
throw new IllegalArgumentException("Could NOT create Directory " + dir);
}
if (!dir.isDirectory())
throw new IllegalArgumentException("" + dir + " is not a Directory");
}
}