/*
* 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.impl.client.container;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.jboss.arquillian.container.spi.Container;
import org.jboss.arquillian.container.spi.client.deployment.DeploymentDescription;
/**
* OperationResult
*
* @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a>
* @version $Revision: $
*/
public class ContainerOperationResult<T> {
private List<Operation<T>> operations;
public ContainerOperationResult() {
operations = new ArrayList<Operation<T>>();
}
public static Operation<Void> setupSuccess(Container container) {
return new GenericOperation<Void>(Type.SETUP, container);
}
public static Operation<Void> setupFailure(Container container, Throwable exception) {
return new GenericOperation<Void>(Type.SETUP, container, exception);
}
public static Operation<Void> startSuccess(Container container) {
return new GenericOperation<Void>(Type.START, container);
}
public static Operation<Void> startFailure(Container container, Throwable exception) {
return new GenericOperation<Void>(Type.START, container, exception);
}
public static Operation<Void> stopSuccess(Container container) {
return new GenericOperation<Void>(Type.STOP, container);
}
public static Operation<Void> stopFailure(Container container, Throwable exception) {
return new GenericOperation<Void>(Type.STOP, container, exception);
}
public static Operation<DeploymentDescription> deploySuccess(Container container, DeploymentDescription deployment) {
return new GenericOperation<DeploymentDescription>(Type.DEPLOY, container, deployment);
}
public static Operation<DeploymentDescription> deployFailure(Container container, DeploymentDescription deployment,
Throwable exception) {
return new GenericOperation<DeploymentDescription>(Type.DEPLOY, container, exception, deployment);
}
public static Operation<DeploymentDescription> unDeploySuccess(Container container,
DeploymentDescription deployment) {
return new GenericOperation<DeploymentDescription>(Type.UNDEPLOY, container, deployment);
}
public static Operation<DeploymentDescription> unDeployFailure(Container container, DeploymentDescription deployment,
Throwable exception) {
return new GenericOperation<DeploymentDescription>(Type.UNDEPLOY, container, exception, deployment);
}
void add(Operation<T> operation) {
operations.add(operation);
}
public List<Operation<T>> getOperations() {
return Collections.unmodifiableList(operations);
}
public boolean hasFailure() {
for (Operation<T> operation : operations) {
if (operation.hasFailed()) {
return true;
}
}
return false;
}
public enum Type {
SETUP, START, STOP, DEPLOY, UNDEPLOY
}
public interface Operation<T> {
Type getType();
Container getContainer();
boolean hasFailed();
Throwable getFailure();
T getObject();
}
public static class GenericOperation<X> implements Operation<X> {
private Type type;
private Container contianer;
private Throwable exception;
private X object;
public GenericOperation(Type type, Container contianer) {
this(type, contianer, null, null);
}
public GenericOperation(Type type, Container contianer, X object) {
this(type, contianer, null, object);
}
public GenericOperation(Type type, Container contianer, Throwable exception) {
this(type, contianer, exception, null);
}
public GenericOperation(Type type, Container contianer, Throwable exception, X object) {
this.type = type;
this.contianer = contianer;
this.exception = exception;
this.object = object;
}
/* (non-Javadoc)
* @see org.jboss.arquillian.impl.container.ContainerOperationResult.Operation#getContainer()
*/
public Container getContainer() {
return contianer;
}
/* (non-Javadoc)
* @see org.jboss.arquillian.impl.container.ContainerOperationResult.Operation#hasFailed()
*/
public boolean hasFailed() {
return getFailure() != null;
}
/* (non-Javadoc)
* @see org.jboss.arquillian.impl.container.ContainerOperationResult.Operation#getFailure()
*/
public Throwable getFailure() {
return exception;
}
/* (non-Javadoc)
* @see org.jboss.arquillian.impl.container.ContainerOperationResult.Operation#getObject()
*/
public X getObject() {
return object;
}
/* (non-Javadoc)
* @see org.jboss.arquillian.impl.container.ContainerOperationResult.Operation#getType()
*/
public Type getType() {
return type;
}
}
}