/*
* Copyright Technophobia Ltd 2012
*
* This file is part of Substeps.
*
* Substeps is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Substeps is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Substeps. If not, see <http://www.gnu.org/licenses/>.
*/
package com.technophobia.substeps.runner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import org.junit.Assert;
import com.technophobia.substeps.model.SubSteps.StepImplementations;
/**
* Wraps an ExecutionConfig providing extra functionality for core
*
* @author rbarefield
*/
public class ExecutionConfigWrapper extends ExecutionConfigDecorator {
private static final long serialVersionUID = -6096151962497826502L;
public ExecutionConfigWrapper(final SubstepsExecutionConfig executionConfig) {
super(executionConfig);
}
public void initProperties() {
if (getStepImplementationClasses() == null) {
setStepImplementationClasses(getClassesFromConfig(getStepImplementationClassNames()));
}
if (getSystemProperties() != null) {
// TODO - don't want to serialise the logger - read resolve ?
// log.debug
System.out.println("Configuring system properties [" + getSystemProperties().size() + "] for execution");
final Properties existing = System.getProperties();
getSystemProperties().putAll(existing);
System.setProperties(getSystemProperties());
}
determineInitialisationClasses();
// log.debug
System.out.println(printParameters());
}
private List<Class<?>> getClassesFromConfig(final String[] config) {
List<Class<?>> stepImplementationClassList = null;
for (final String className : config) {
if (stepImplementationClassList == null) {
stepImplementationClassList = new ArrayList<Class<?>>();
}
Class<?> implClass;
try {
implClass = Class.forName(className);
stepImplementationClassList.add(implClass);
} catch (final ClassNotFoundException e) {
Assert.fail("ClassNotFoundException: " + e.getMessage());
}
}
return stepImplementationClassList;
}
private String printParameters() {
return "ExecutionConfig [description=" + getDescription() + ", tags=" + getTags() + ", nonFatalTags="
+ getNonFatalTags() + ", featureFile=" + getFeatureFile() + ", subStepsFileName="
+ getSubStepsFileName() + ", strict=" + isStrict() + ", fastFailParseErrors=" + isFastFailParseErrors()
+ ", nonStrictKeywordPrecedence=" + Arrays.toString(getNonStrictKeywordPrecedence())
+ ", stepImplementationClassNames=" + Arrays.toString(getStepImplementationClassNames())
+ ", initialisationClass=" + Arrays.toString(getInitialisationClass()) + ", stepImplementationClasses="
+ getStepImplementationClasses() + ", initialisationClasses="
+ Arrays.toString(getInitialisationClasses()) + ", executionListeners="
+ Arrays.toString(getExecutionListeners()) + "]";
}
public List<Class<? extends IExecutionListener>> getExecutionListenerClasses() {
final List<Class<? extends IExecutionListener>> notifierClassList = new ArrayList<Class<? extends IExecutionListener>>();
final String[] classList = getExecutionListeners();
if (classList != null) {
for (final String className : classList) {
try {
final Class<?> implClass = Class.forName(className);
if (IExecutionListener.class.isAssignableFrom(implClass)) {
notifierClassList.add((Class<? extends IExecutionListener>) implClass);
} else {
Assert.fail("Execution Listener does not extend com.technophobia.substeps.runner.INotifier");
}
} catch (final ClassNotFoundException e) {
Assert.fail("ClassNotFoundException: " + e.getMessage());
}
}
}
return notifierClassList;
}
public Class<?>[] determineInitialisationClasses() {
List<Class<?>> initialisationClassList = null;
if (getStepImplementationClasses() != null) {
initialisationClassList = new ArrayList<Class<?>>();
final InitialisationClassSorter orderer = new InitialisationClassSorter();
for (final Class<?> c : getStepImplementationClasses()) {
final StepImplementations annotation = c.getAnnotation(StepImplementations.class);
if (annotation != null) {
final Class<?>[] initClasses = annotation.requiredInitialisationClasses();
if (initClasses != null) {
orderer.addOrderedInitialisationClasses(initClasses);
}
}
}
initialisationClassList = orderer.getOrderedList();
}
if (initialisationClassList == null && getInitialisationClass() != null) {
initialisationClassList = getClassesFromConfig(getInitialisationClass());
}
if (initialisationClassList != null) {
setInitialisationClasses(initialisationClassList.toArray(new Class<?>[] {}));
}
return getInitialisationClasses();
}
}