/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.test.runner;
import static java.util.stream.Collectors.toList;
import static org.apache.commons.lang.builder.ToStringStyle.SHORT_PREFIX_STYLE;
import static org.mule.test.runner.utils.AnnotationUtils.getAnnotationAttributeFromHierarchy;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
/**
* Configuration for {@link ArtifactClassLoaderRunner}.
*
* @since 4.0
*/
public class RunnerConfiguration {
private static final String PROVIDED_EXCLUSIONS = "providedExclusions";
private static final String PROVIDED_INCLUSIONS = "providedInclusions";
private static final String TEST_EXCLUSIONS = "testExclusions";
private static final String TEST_INCLUSIONS = "testInclusions";
private static final String EXPORT_PLUGIN_CLASSES = "exportPluginClasses";
private static final String SHARED_RUNTIME_LIBS = "sharedRuntimeLibs";
private List<String> providedExclusions;
private List<String> testExclusions;
private List<String> testInclusions;
private List<Class> exportPluginClasses;
private List<String> sharedRuntimeLibs;
private String loadedFromTestClass;
private RunnerConfiguration(Class loadedFromTestClass) {
this.loadedFromTestClass = loadedFromTestClass.getName();
}
public List<Class> getExportPluginClasses() {
return exportPluginClasses;
}
public List<String> getProvidedExclusions() {
return providedExclusions;
}
public List<String> getSharedRuntimeLibs() {
return sharedRuntimeLibs;
}
public List<String> getTestExclusions() {
return testExclusions;
}
public List<String> getTestInclusions() {
return testInclusions;
}
/**
* Creates an instance of the the configuration by reading the class annotated with {@link ArtifactClassLoaderRunnerConfig}.
*
* @param klass Test {@link Class} annotated
* @return a {@link RunnerConfiguration}
*/
public static RunnerConfiguration readConfiguration(Class klass) {
RunnerConfiguration runnerConfiguration = new RunnerConfiguration(klass);
Class testClass = klass;
runnerConfiguration.providedExclusions = readAttribute(PROVIDED_EXCLUSIONS, testClass);
runnerConfiguration.testExclusions = readAttribute(TEST_EXCLUSIONS, testClass);
runnerConfiguration.testInclusions = readAttribute(TEST_INCLUSIONS, testClass);
runnerConfiguration.exportPluginClasses = readAttribute(EXPORT_PLUGIN_CLASSES, testClass);
runnerConfiguration.sharedRuntimeLibs = readAttribute(SHARED_RUNTIME_LIBS, testClass);
return runnerConfiguration;
}
/**
* Reads the attribute from the klass annotated and does a flatMap with the list of values.
*
* @param name attribute/method name of the annotation {@link ArtifactClassLoaderRunnerConfig} to be obtained
* @param klass {@link Class} from where the annotated attribute will be read
* @param <E> generic type
* @return {@link List} of values
*/
private static <E> List<E> readAttribute(String name, Class<?> klass) {
List<E[]> valuesList =
getAnnotationAttributeFromHierarchy(klass, ArtifactClassLoaderRunnerConfig.class,
name);
return valuesList.stream().flatMap(Arrays::stream).distinct().collect(toList());
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
RunnerConfiguration that = (RunnerConfiguration) o;
if (!providedExclusions.equals(that.providedExclusions)) {
return false;
}
if (!testExclusions.equals(that.testExclusions)) {
return false;
}
if (!testInclusions.equals(that.testInclusions)) {
return false;
}
if (!exportPluginClasses.equals(that.exportPluginClasses)) {
return false;
}
return sharedRuntimeLibs.equals(that.sharedRuntimeLibs);
}
@Override
public int hashCode() {
int result = providedExclusions.hashCode();
result = 31 * result + testExclusions.hashCode();
result = 31 * result + testInclusions.hashCode();
result = 31 * result + exportPluginClasses.hashCode();
result = 31 * result + sharedRuntimeLibs.hashCode();
return result;
}
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this, SHORT_PREFIX_STYLE);
}
}