/*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.arquillian.installobservers;
import org.apache.maven.model.BuildBase;
import org.apache.maven.model.Model;
import org.apache.maven.model.Profile;
import org.jboss.forge.arquillian.ContainerInstallEvent;
import org.jboss.forge.arquillian.DependencyUtil;
import org.jboss.forge.arquillian.ProfileBuilder;
import org.jboss.forge.arquillian.container.Container;
import org.jboss.forge.maven.MavenCoreFacet;
import org.jboss.forge.maven.plugins.ConfigurationBuilder;
import org.jboss.forge.maven.plugins.ExecutionBuilder;
import org.jboss.forge.maven.plugins.MavenPluginAdapter;
import org.jboss.forge.maven.plugins.MavenPluginBuilder;
import org.jboss.forge.project.Project;
import org.jboss.forge.project.dependencies.DependencyBuilder;
import org.jboss.forge.project.facets.DependencyFacet;
import org.jboss.forge.shell.Shell;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import java.util.List;
/**
* @Author Paul Bakker - paul.bakker.nl@gmail.com
*/
public class DownloadServerObserver
{
@Inject
Project project;
@Inject
Shell shell;
public void install(@Observes ContainerInstallEvent event)
{
if (event.getContainer().getDownload() != null)
{
boolean installContainer = shell.promptBoolean("Do you want Arquillian to install the container?", false);
if (installContainer)
{
installContainer(event.getContainer());
}
}
}
private void installContainer(Container container)
{
MavenCoreFacet mavenCoreFacet = project.getFacet(MavenCoreFacet.class);
DependencyFacet dependencyFacet = project.getFacet(DependencyFacet.class);
Model pom = mavenCoreFacet.getPOM();
Profile containerProfile = ProfileBuilder.findProfileById(container.getProfileId(), pom);
if (containerProfile == null)
{
containerProfile = ProfileBuilder.findProfileById(container.getId(), pom);
}
if (containerProfile == null)
{
throw new RuntimeException("Container profile with id " + container.getId() + " or "
+ container.getProfileId() + " not found");
}
List<org.jboss.forge.project.dependencies.Dependency> asDependencies = dependencyFacet
.resolveAvailableVersions(DependencyBuilder.create()
.setGroupId(container.getDownload().getGroupId())
.setArtifactId(container.getDownload().getArtifactId()));
org.jboss.forge.project.dependencies.Dependency asVersion = shell.promptChoiceTyped(
"Which version of the container do you want to install?", asDependencies,
DependencyUtil.getLatestNonSnapshotVersion(asDependencies));
ConfigurationBuilder configuration = ConfigurationBuilder.create();
configuration.createConfigurationElement("artifactItems")
.createConfigurationElement("artifactItem")
.addChild("groupId").setText(container.getDownload().getGroupId()).getParentElement()
.addChild("artifactId").setText(container.getDownload().getArtifactId()).getParentElement()
.addChild("version").setText(asVersion.getVersion()).getParentElement()
.addChild("type").setText("zip").getParentElement()
.addChild("overWrite").setText("false").getParentElement()
.addChild("outputDirectory")
.setText(shell.prompt("Where do you want to install the container?", String.class, container.getId()));
MavenPluginBuilder pluginBuilder = MavenPluginBuilder
.create()
.setDependency(DependencyBuilder.create("org.apache.maven.plugins:maven-dependency-plugin"))
.addExecution(
ExecutionBuilder.create().setId("unpack").setPhase("process-test-classes").addGoal("unpack")
.setConfig(configuration));
BuildBase build = containerProfile.getBuild();
if (build == null)
{
build = new BuildBase();
}
build.addPlugin(new MavenPluginAdapter(pluginBuilder));
containerProfile.setBuild(build);
pom.removeProfile(containerProfile);
pom.addProfile(containerProfile);
mavenCoreFacet.setPOM(pom);
}
}