/* * Copyright 2016 Red Hat, Inc. * * 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.wildfly.arquillian.domain; import java.lang.reflect.Method; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import org.jboss.arquillian.container.spi.client.deployment.DeploymentDescription; import org.jboss.arquillian.container.spi.event.container.BeforeDeploy; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.core.api.annotation.Observes; import org.jboss.arquillian.test.spi.TestClass; import org.jboss.arquillian.test.spi.event.suite.AfterClass; import org.jboss.arquillian.test.spi.event.suite.BeforeClass; import org.jboss.shrinkwrap.api.Archive; import org.wildfly.arquillian.domain.api.TargetsServerGroup; import org.wildfly.arquillian.domain.api.TargetsServerGroups; /** * Watches for events to determine the target server group(s) for deployments. * <p> * Note that if any other Arquillian extensions also wrap the * {@linkplain DeploymentDescription#getTestableArchive() testable archive} this maybe break deployments. * </p> * * @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a> */ public class ServerGroupDeploymentObserver { private final Map<String, Set<String>> serverGroupTargets = new HashMap<>(); public synchronized void setTargetServerGroups(@Observes BeforeDeploy event) { final String deploymentName = event.getDeployment().getName(); if (serverGroupTargets.containsKey(deploymentName)) { final DeploymentDescription deploymentDescription = event.getDeployment(); final Archive<?> delegate = deploymentDescription.getArchive(); // Note that this breaks if anything else replaces this archive deploymentDescription.setTestableArchive(new ServerGroupArchive<>(delegate, Collections.unmodifiableSet(serverGroupTargets.get(deploymentName)))); } } public synchronized void findTargetServerGroups(@Observes(precedence = 100) BeforeClass event) { final TestClass testClass = event.getTestClass(); final Method[] methods = testClass.getMethods(Deployment.class); for (Method method : methods) { if (method.isAnnotationPresent(TargetsServerGroups.class)) { final Deployment deployment = method.getAnnotation(Deployment.class); for (TargetsServerGroup target : method.getAnnotation(TargetsServerGroups.class).value()) { add(deployment.name(), target.value()); } } else if (method.isAnnotationPresent(TargetsServerGroup.class)) { final Deployment deployment = method.getAnnotation(Deployment.class); final TargetsServerGroup target = method.getAnnotation(TargetsServerGroup.class); add(deployment.name(), target.value()); } } } public synchronized void removeTargertServerGroups(@Observes AfterClass event) { final TestClass testClass = event.getTestClass(); final Method[] methods = testClass.getMethods(Deployment.class); for (Method method : methods) { final Deployment deployment = method.getAnnotation(Deployment.class); serverGroupTargets.remove(deployment.name()); } } private void add(final String deploymentName, final String serverGroup) { Set<String> serverGroups = serverGroupTargets.get(deploymentName); if (serverGroups == null) { serverGroups = new LinkedHashSet<>(); serverGroupTargets.put(deploymentName, serverGroups); } serverGroups.add(serverGroup); } }