org.arquillian.cube.kubernetes.impl.resolve.ShrinkwrapResolver Maven / Gradle / Ivy
The newest version!
package org.arquillian.cube.kubernetes.impl.resolve;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import org.arquillian.cube.impl.util.IOUtil;
import org.arquillian.cube.kubernetes.api.DependencyResolver;
import org.arquillian.cube.kubernetes.api.Session;
import org.jboss.shrinkwrap.resolver.api.maven.Maven;
import static org.arquillian.cube.kubernetes.api.Configuration.DEFAULT_CONFIG_FILE_NAME;
public class ShrinkwrapResolver implements DependencyResolver {
public static final String JAR = "jar";
public static final String JSON_SUFFIX = ".json";
public static final String DEFAULT_PATH_TO_POM = "pom.xml";
private final String pathToPomFile;
private final boolean rethrowExceptions;
public ShrinkwrapResolver() {
this(DEFAULT_PATH_TO_POM, false);
}
//Mostly needed for testing
public ShrinkwrapResolver(String pathToPomFile, boolean rethrowExceptions) {
this.pathToPomFile = pathToPomFile;
this.rethrowExceptions = rethrowExceptions;
}
public List resolve(Session session) throws IOException {
List dependencies = new ArrayList<>();
try {
File[] files = Maven.resolver()
.loadPomFromFile(pathToPomFile)
.importTestDependencies()
.resolve()
.withoutTransitivity()
.asFile();
for (File f : files) {
if (f.getName().endsWith(JAR) && hasKubernetesJson(f)) {
Path dir = Files.createTempDirectory(session.getId());
try (FileInputStream fis = new FileInputStream(f); JarInputStream jis = new JarInputStream(fis)) {
IOUtil.unzip(new FileInputStream(f), dir.toFile());
File jsonPath = dir.resolve(DEFAULT_CONFIG_FILE_NAME).toFile();
if (jsonPath.exists()) {
dependencies.add(jsonPath.toURI().toURL());
}
}
} else if (f.getName().endsWith(JSON_SUFFIX)) {
dependencies.add(f.toURI().toURL());
}
}
} catch (Exception e) {
if (rethrowExceptions) {
throw e;
} else {
session.getLogger().warn("Skipping maven project dependencies. Caused by:" + e.getMessage());
}
}
return dependencies;
}
private boolean hasKubernetesJson(File f) throws IOException {
return hasResource(f, DEFAULT_CONFIG_FILE_NAME);
}
private boolean hasResource(File f, String name) throws IOException {
try (FileInputStream fis = new FileInputStream(f); JarInputStream jis = new JarInputStream(fis)) {
for (JarEntry entry = jis.getNextJarEntry(); entry != null; entry = jis.getNextJarEntry()) {
if (entry.getName().equals(name)) {
return true;
}
}
}
return false;
}
@Override
public DependencyResolver toImmutable() {
return this;
}
}