/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* 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.keycloak.testsuite.arquillian.containers;
import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor;
import org.jboss.arquillian.config.descriptor.api.ContainerDef;
import org.jboss.arquillian.config.descriptor.api.GroupDef;
import org.jboss.arquillian.container.spi.ContainerRegistry;
import org.jboss.arquillian.container.spi.client.container.DeployableContainer;
import org.jboss.arquillian.core.api.Injector;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.InstanceProducer;
import org.jboss.arquillian.core.api.annotation.ApplicationScoped;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.core.api.annotation.Observes;
import org.jboss.arquillian.core.spi.ServiceLoader;
import org.jboss.arquillian.core.spi.Validate;
import org.jboss.logging.Logger;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import static org.keycloak.testsuite.arquillian.containers.SecurityActions.isClassPresent;
import static org.keycloak.testsuite.arquillian.containers.SecurityActions.loadClass;
/**
* Registers all container adapters.
*
* @author Dominik Pospisil <dpospisi@redhat.com>
* @author Stefan Miklosovic <smikloso@redhat.com>
* @author Tomas Kyjovsky <tkyjovsk@redhat.com>
* @author Vlasta Ramik <vramik@redhat.com>
*/
public class RegistryCreator {
protected final Logger log = Logger.getLogger(this.getClass());
@Inject
@ApplicationScoped
private InstanceProducer<ContainerRegistry> registry;
@Inject
private Instance<Injector> injector;
@Inject
private Instance<ServiceLoader> loader;
public void createRegistry(@Observes ArquillianDescriptor event) {
ContainerRegistry reg = new Registry(injector.get());
ServiceLoader serviceLoader = loader.get();
log.info("arquillian.xml: " + System.getProperty("arquillian.xml"));
@SuppressWarnings("rawtypes")
Collection<DeployableContainer> containers = serviceLoader.all(DeployableContainer.class);
if (containers.isEmpty()) {
throw new IllegalStateException("There are not any container adapters on the classpath");
}
createRegistry(event.getContainers(), containers, reg, serviceLoader);
for (GroupDef group : event.getGroups()) {
createRegistry(group.getGroupContainers(), containers, reg, serviceLoader);
}
registry.set(reg);
}
private void createRegistry(List<ContainerDef> containerDefs, Collection<DeployableContainer> containers, ContainerRegistry reg, ServiceLoader serviceLoader) {
for (ContainerDef container : containerDefs) {
if (isCreatingContainer(container, containers)) {
if (isEnabled(container)) {
log.info("Registering container: " + container.getContainerName());
reg.create(container, serviceLoader);
} else {
log.info("Container is disabled: " + container.getContainerName());
}
}
}
}
private static final String ENABLED = "enabled";
private boolean isEnabled(ContainerDef containerDef) {
Map<String, String> props = containerDef.getContainerProperties();
return !props.containsKey(ENABLED)
|| (props.containsKey(ENABLED) && props.get(ENABLED).equals("true"));
}
@SuppressWarnings("rawtypes")
private boolean isCreatingContainer(ContainerDef containerDef, Collection<DeployableContainer> containers) {
if (hasAdapterImplClassProperty(containerDef)) {
if (isClassPresent(getAdapterImplClassValue(containerDef))) {
return DeployableContainer.class.isAssignableFrom(
loadClass(getAdapterImplClassValue(containerDef)));
}
}
return false;
}
public static boolean hasAdapterImplClassProperty(ContainerDef containerDef) {
for (Map.Entry<String, String> entry : containerDef.getContainerProperties().entrySet()) {
if (entry.getKey().equals(ADAPTER_IMPL_CONFIG_STRING)) {
return true;
}
}
return false;
}
public static String getAdapterImplClassValue(ContainerDef containerDef) {
return containerDef.getContainerProperties().get(ADAPTER_IMPL_CONFIG_STRING).trim();
}
public static final String ADAPTER_IMPL_CONFIG_STRING = "adapterImplClass";
@SuppressWarnings("rawtypes")
public static DeployableContainer<?> getContainerAdapter(String adapterImplClass, Collection<DeployableContainer> containers) {
Validate.notNullOrEmpty(adapterImplClass, "The value of " + ADAPTER_IMPL_CONFIG_STRING + " can not be a null object "
+ "nor an empty string!");
Class<?> foundAdapter;
if (isClassPresent(adapterImplClass)) {
foundAdapter = loadClass(adapterImplClass);
} else {
return null;
}
for (DeployableContainer<?> container : containers) {
if (foundAdapter.isInstance(container)) {
return container;
}
}
return null;
}
}