package org.richfaces.arquillian.container.installation;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.apache.commons.io.FileUtils;
import org.jboss.arquillian.core.api.annotation.Observes;
import org.jboss.arquillian.core.spi.Validate;
import org.jboss.shrinkwrap.resolver.api.maven.Maven;
import org.richfaces.arquillian.configuration.FundamentalTestConfiguration;
import org.richfaces.arquillian.configuration.FundamentalTestConfigurationContext;
/**
* Installs the container distribution and configuration before it will be started
*/
public class ContainerInstaller {
private Logger log = Logger.getLogger(ContainerInstaller.class.getName());
private FundamentalTestConfiguration configuration = FundamentalTestConfigurationContext.getProxy();
public void unpackContainerDistribution(@Observes InstallContainer event) {
Validate.notNull(configuration, "fundamental test configuration is not setup");
String distribution = configuration.getContainerDistribution();
if (distribution == null || distribution.isEmpty()) {
return;
}
File containerHome = new File(configuration.getContainerHome());
Validate.notNull(containerHome, "container home must be set");
if (containerHome.exists()) {
log.info(String.format("The container is already installed in '%s'", containerHome));
return;
}
File unpackDestination = containerHome.getParentFile();
InputStream inputStream;
try {
URL distributionUrl = new URL(distribution);
log.info(String.format("The container distribution will be resolved from URL '%s'", distribution));
inputStream = distributionUrl.openStream();
} catch (MalformedURLException e) {
log.info(String.format("The container distribution will be resolved from Maven artifact '%s'", distribution));
inputStream = Maven.resolver().resolve(distribution).withoutTransitivity().asSingleInputStream();
} catch (IOException e) {
throw new IllegalStateException("Failed to resolve the container distribution", e);
}
unzip(inputStream, unpackDestination, false);
log.info(String.format("The container distribution '%s' was installed into '%s'", distribution,
unpackDestination.getAbsolutePath()));
if (!containerHome.exists()) {
throw new IllegalStateException(String.format(
"The container distribution was unpacked but the containerHome (%s) still doesn't exist", containerHome));
}
configuration.setContainerInstalledFromDistribution(true);
}
public void unpackContainerConfigurationFiles(@Observes ConfigureContainer event) {
Validate.notNull(configuration, "fundamental test configuration is not setup");
String configurationFiles = configuration.getContainerConfiguration();
if (configurationFiles == null || configurationFiles.isEmpty()) {
return;
}
Validate.notNull(configuration.getContainerHome(), "container home must be set");
File containerHome = new File(configuration.getContainerHome());
InputStream artifactStream = Maven.resolver().resolve(configurationFiles).withClassPathResolution(false).withoutTransitivity().asSingleInputStream();
unzip(artifactStream, containerHome, true);
log.info(String.format("The container configuration '%s' was unpacked into '%s'", configurationFiles,
containerHome.getAbsolutePath()));
}
public void uninstallContainer(@Observes UninstallContainer event) {
Validate.notNull(configuration, "fundamental test configuration is not setup");
if (configuration.containerShouldBeUninstalled()) {
File containerHome = new File(configuration.getContainerHome());
log.info(String.format("The container will be uninstalled from '%s'", containerHome.getAbsolutePath()));
if (containerHome.exists()) {
FileUtils.deleteQuietly(containerHome);
}
}
}
private void unzip(InputStream inputStream, File destination, boolean overwrite) {
try {
byte[] buf = new byte[1024];
ZipInputStream zipinputstream = null;
ZipEntry zipentry;
zipinputstream = new ZipInputStream(inputStream);
zipentry = zipinputstream.getNextEntry();
while (zipentry != null) {
int n;
FileOutputStream fileoutputstream;
File newFile = new File(destination, zipentry.getName());
if (zipentry.isDirectory()) {
newFile.mkdirs();
zipentry = zipinputstream.getNextEntry();
continue;
}
if (newFile.exists() && overwrite) {
log.info("Overwriting " + newFile);
newFile.delete();
}
fileoutputstream = new FileOutputStream(newFile);
while ((n = zipinputstream.read(buf, 0, 1024)) > -1) {
fileoutputstream.write(buf, 0, n);
}
fileoutputstream.close();
zipinputstream.closeEntry();
zipentry = zipinputstream.getNextEntry();
}
zipinputstream.close();
} catch (Exception e) {
throw new IllegalStateException("Can't unzip input stream", e);
}
}
}