package org.jboss.windup.arquillian;
import org.jboss.arquillian.container.spi.client.deployment.DeploymentDescription;
import org.jboss.arquillian.test.spi.TestClass;
import org.jboss.forge.arquillian.archive.AddonDeploymentArchive;
import org.jboss.forge.arquillian.spi.AddonDeploymentScenarioEnhancer;
import org.jboss.forge.furnace.addons.AddonId;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* Deployment service that deploys the rexster addon everytime debugging is on.
*
* @author <a href="mailto:mbriskar@gmail.com">Matej Briškár</a>
*/
public class WindupFurnaceAddonDeploymentEnhancer implements AddonDeploymentScenarioEnhancer
{
@Override public List<DeploymentDescription> enhance(TestClass testClass, List<DeploymentDescription> deployments)
{
if(Boolean.getBoolean("maven.surefire.debug")) {
String version = getWindupVersion(deployments);
if(version != null) {
AddonId id = AddonId.from("org.jboss.windup.rexster:windup-rexster", version);
AddonDeploymentArchive archive = ShrinkWrap.create(AddonDeploymentArchive.class).setAddonId(id);
archive.setDeploymentTimeoutUnit(TimeUnit.MILLISECONDS);
archive.setDeploymentTimeoutQuantity(10000);
DeploymentDescription deploymentDescription = new DeploymentDescription(id.toCoordinates(), archive);
deploymentDescription.shouldBeTestable(false);
deployments.add(deploymentDescription);
}
}
return deployments;
}
/**
* Take the windup-config version and if not found, take the most frequent version of windup addons.
* @param deployments
* @return
*/
private String getWindupVersion(List<DeploymentDescription> deployments) {
Map<String,Integer> versionOccurences = new HashMap<>();
for (DeploymentDescription deployment : deployments)
{
if(deployment.toString().contains("windup")) {
String version = deployment.toString().split(",")[1];
if(deployment.toString().contains("windup-config")) {
return version;
}
if(versionOccurences.containsKey(deployment.toString().split(",")[1])) {
versionOccurences.put(version,versionOccurences.get(version) +1);
} else {
versionOccurences.put(version,1);
}
}
}
Map.Entry<String, Integer> maxEntry = null;
for (Map.Entry<String, Integer> stringIntegerEntry : versionOccurences.entrySet())
{
if(maxEntry == null || stringIntegerEntry.getValue() > maxEntry.getValue()) {
maxEntry = stringIntegerEntry;
}
}
return maxEntry == null ? null : maxEntry.getKey();
}
}