/*
* JBoss, Home of Professional Open Source
* Copyright 2010 Red Hat Inc. and/or its affiliates and other contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.arquillian.container.spi.client.deployment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.jboss.arquillian.container.spi.client.protocol.ProtocolDescription;
import org.jboss.shrinkwrap.api.Archive;
/**
* @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a>
* @version $Revision: $
*/
public class DeploymentScenario {
private final List<Deployment> deployments;
public DeploymentScenario() {
this.deployments = new ArrayList<Deployment>();
}
public DeploymentScenario addDeployment(DeploymentDescription deployment) {
Validate.notNull(deployment, "Deployment must be specified");
validateNotSameNameAndTypeOfDeployment(deployment);
validateNotSameArchiveAndSameTarget(deployment);
this.deployments.add(new Deployment(deployment));
return this;
}
public Set<TargetDescription> targets() {
Set<TargetDescription> targets = new HashSet<TargetDescription>();
for (Deployment dep : deployments) {
targets.add(dep.getDescription().getTarget());
}
return targets;
}
public Set<ProtocolDescription> protocols() {
Set<ProtocolDescription> protocols = new HashSet<ProtocolDescription>();
for (Deployment dep : deployments) {
protocols.add(dep.getDescription().getProtocol());
}
return protocols;
}
/**
* Get a {@link DeploymentDescription} with a specific name if it exists.
*
* @param target
* The name of the {@link DeploymentDescription}
*
* @return Defined Deployment or null if not found.
*/
public Deployment deployment(DeploymentTargetDescription target) {
Validate.notNull(target, "Target must be specified");
if (DeploymentTargetDescription.DEFAULT.equals(target)) {
return findDefaultDeployment();
}
return findMatchingDeployment(target);
}
public List<Deployment> managedDeploymentsInDeployOrder() {
List<Deployment> managedDeployment = new ArrayList<Deployment>();
for (Deployment deployment : deployments) {
DeploymentDescription desc = deployment.getDescription();
if (desc.managed()) {
managedDeployment.add(deployment);
}
}
Collections.sort(managedDeployment, new Comparator<Deployment>() {
public int compare(Deployment o1, Deployment o2) {
return new Integer(o1.getDescription().getOrder()).compareTo(o2.getDescription().getOrder());
}
});
return Collections.unmodifiableList(managedDeployment);
}
public List<Deployment> deployedDeploymentsInUnDeployOrder() {
List<Deployment> managedDeployment = new ArrayList<Deployment>();
for (Deployment deployment : deployments) {
DeploymentDescription desc = deployment.getDescription();
if (desc.managed() || deployment.isDeployed()) {
managedDeployment.add(deployment);
}
}
Collections.sort(managedDeployment, new Comparator<Deployment>() {
public int compare(Deployment o1, Deployment o2) {
return new Integer(o2.getDescription().getOrder()).compareTo(o1.getDescription().getOrder());
}
});
return Collections.unmodifiableList(managedDeployment);
}
/**
* Get all {@link DeploymentDescription} defined to be deployed during Test startup for a specific {@link
* TargetDescription} ordered.
*
* @param target
* The Target to filter on
*
* @return A List of found {@link DeploymentDescription}. Will return a empty list if none are found.
*/
public List<Deployment> startupDeploymentsFor(TargetDescription target) {
Validate.notNull(target, "Target must be specified");
List<Deployment> startupDeployments = new ArrayList<Deployment>();
for (Deployment deployment : deployments) {
DeploymentDescription desc = deployment.getDescription();
if (desc.managed() && target.equals(desc.getTarget())) {
startupDeployments.add(deployment);
}
}
// sort them by order
Collections.sort(startupDeployments, new Comparator<Deployment>() {
public int compare(Deployment o1, Deployment o2) {
return new Integer(o1.getDescription().getOrder()).compareTo(o2.getDescription().getOrder());
}
});
return Collections.unmodifiableList(startupDeployments);
}
public List<Deployment> deploymentsInError() {
List<Deployment> result = new ArrayList<Deployment>();
for (Deployment dep : this.deployments) {
if (dep.hasDeploymentError()) {
result.add(dep);
}
}
return result;
}
public List<Deployment> deployedDeployments() {
List<Deployment> result = new ArrayList<Deployment>();
for (Deployment dep : this.deployments) {
if (dep.isDeployed()) {
result.add(dep);
}
}
return result;
}
/**
* @return the deployments
*/
public List<Deployment> deployments() {
return Collections.unmodifiableList(deployments);
}
/**
* @return
*/
private Deployment findDefaultDeployment() {
if (deployments.size() == 1) {
return deployments.get(0);
} else if (deployments.size() > 1) {
// if there are only one Archive deployment, default to it
List<Deployment> archiveDeployments = archiveDeployments(deployments);
if (archiveDeployments.size() == 1) {
return archiveDeployments.get(0);
}
// if there is only one managed deployment, default to it
List<Deployment> managedDeployments = managedDeployments(deployments);
if (managedDeployments.size() == 1) {
return managedDeployments.get(0);
}
// if there are only one DEFAULT deployment, default to it, else default to the DEFAULT Archive
List<Deployment> defaultDeployments = defaultDeployments(deployments);
if (defaultDeployments.size() == 1) {
return defaultDeployments.get(0);
} else if (defaultDeployments.size() > 1) {
List<Deployment> defaultArchiveDeployments = archiveDeployments(defaultDeployments);
return defaultArchiveDeployments.get(0);
}
}
return null;
}
/**
* Filters the List of Deployments and returns the ones that are Managed deployments.
*
* @param deployments
* List to filter
*
* @return Filtered list
*/
private List<Deployment> managedDeployments(List<Deployment> deployments) {
List<Deployment> managed = new ArrayList<Deployment>();
for (Deployment deployment : deployments) {
if (deployment.getDescription().managed()) {
managed.add(deployment);
}
}
return managed;
}
/**
* Filters the List of Deployments and returns the ones that are DEFAULT deployments.
*
* @param deployments
* List to filter
*
* @return Filtered list
*/
private List<Deployment> defaultDeployments(List<Deployment> deployments) {
List<Deployment> defaults = new ArrayList<Deployment>();
for (Deployment deployment : deployments) {
if (deployment.getDescription().getName().equals(DeploymentTargetDescription.DEFAULT.getName())) {
defaults.add(deployment);
}
}
return defaults;
}
/**
* Filters the List of Deployments and returns the ones that are Archive deployments.
*
* @param deployments
* List to filter
*
* @return Filtered list
*/
private List<Deployment> archiveDeployments(List<Deployment> deployments) {
List<Deployment> archives = new ArrayList<Deployment>();
for (Deployment deployment : deployments) {
if (deployment.getDescription().isArchiveDeployment()) {
archives.add(deployment);
}
}
return archives;
}
/**
* Validation, names except DEFAULT should be unique. See constructor
*/
private Deployment findMatchingDeployment(DeploymentTargetDescription target) {
List<Deployment> matching = findMatchingDeployments(target);
if (matching.size() == 0) {
return null;
}
if (matching.size() == 1) {
return matching.get(0);
}
// if multiple Deployment of different Type, we get the Archive Deployment
return archiveDeployments(matching).get(0);
}
private List<Deployment> findMatchingDeployments(DeploymentTargetDescription target) {
List<Deployment> matching = new ArrayList<Deployment>();
for (Deployment deployment : deployments) {
if (deployment.getDescription().getName().equals(target.getName())) {
matching.add(deployment);
}
}
return matching;
}
/**
* Validate that a deployment of same type is not already added
*/
private void validateNotSameNameAndTypeOfDeployment(DeploymentDescription deployment) {
for (Deployment existing : deployments) {
if (existing.getDescription().getName().equals(deployment.getName())) {
if (
(existing.getDescription().isArchiveDeployment() && deployment.isArchiveDeployment()) ||
(existing.getDescription().isDescriptorDeployment() && deployment.isDescriptorDeployment())) {
throw new IllegalArgumentException("Can not add multiple " +
Archive.class.getName() + " deployments with the same name: " + deployment.getName());
}
}
}
}
/**
* Validate that a deployment with a archive of the same name does not have the same taget
*/
private void validateNotSameArchiveAndSameTarget(DeploymentDescription deployment) {
if (!deployment.isArchiveDeployment()) {
return;
}
for (Deployment existing : archiveDeployments(deployments)) {
if (existing.getDescription().getArchive().getName().equals(deployment.getArchive().getName())) {
if (existing.getDescription().getTarget().equals(deployment.getTarget())) {
throw new IllegalArgumentException("Can not add multiple "
+
Archive.class.getName()
+ " archive deployments with the same archive name "
+ deployment.getName()
+
" that target the same target "
+ deployment.getTarget());
}
}
}
}
}