/**
* Copyright 2011-2017 Asakusa Framework Team.
*
* 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 com.asakusafw.testdriver;
import java.io.IOException;
import java.text.MessageFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.asakusafw.testdriver.core.DataModelDefinition;
import com.asakusafw.testdriver.core.DataModelReflection;
import com.asakusafw.testdriver.core.DataModelSourceFactory;
import com.asakusafw.testdriver.core.TestDataToolProvider;
/**
* An abstract super class of test driver inputs.
* @since 0.2.0
* @version 0.6.0
* @param <T> the data model type
*/
public abstract class DriverInputBase<T> extends DriverElementBase {
private static final Logger LOG = LoggerFactory.getLogger(DriverInputBase.class);
private final Class<?> callerClass;
private final TestDataToolProvider testTools;
private final String name;
private final Class<T> modelType;
private DataModelSourceFactory source;
/**
* Creates a new instance.
* @param callerClass the current context class
* @param testTools the test data tools
* @param name the original input name
* @param modelType the data model type
* @since 0.6.0
*/
protected DriverInputBase(Class<?> callerClass, TestDataToolProvider testTools, String name, Class<T> modelType) {
if (callerClass == null) {
throw new IllegalArgumentException("callerClass must not be null"); //$NON-NLS-1$
}
if (testTools == null) {
throw new IllegalArgumentException("testTools must not be null"); //$NON-NLS-1$
}
if (name == null) {
throw new IllegalArgumentException("name must not be null"); //$NON-NLS-1$
}
if (modelType == null) {
throw new IllegalArgumentException("modelType must not be null"); //$NON-NLS-1$
}
this.callerClass = callerClass;
this.testTools = testTools;
this.name = name;
this.modelType = modelType;
}
@Override
protected final Class<?> getCallerClass() {
return callerClass;
}
@Override
protected final TestDataToolProvider getTestTools() {
return testTools;
}
/**
* Returns the name of this port.
* @return the name
*/
public final String getName() {
return name;
}
/**
* Returns the data type of this port.
* @return the data type
*/
public final Class<T> getModelType() {
return modelType;
}
/**
* Returns the data source for this input.
* @return the source, or {@code null} if not defined
* @since 0.2.3
*/
public DataModelSourceFactory getSource() {
return source;
}
/**
* Sets the data source for this input.
* @param source the source, or {@code null} to reset it
* @since 0.6.0
*/
protected final void setSource(DataModelSourceFactory source) {
if (LOG.isDebugEnabled()) {
LOG.debug("Prepare: name={}, model={}, source={}", new Object[] { //$NON-NLS-1$
getName(),
getModelType().getName(),
source,
});
}
this.source = source;
}
/**
* Converts an data model object collection into {@link DataModelSourceFactory} which provides data models.
* This implementation immediately converts data model objects into equivalent {@link DataModelReflection}s.
* @param sourceObjects the original data model objects
* @return the {@link DataModelSourceFactory}
* @since 0.6.0
*/
protected final DataModelSourceFactory toDataModelSourceFactory(Iterable<? extends T> sourceObjects) {
if (sourceObjects == null) {
throw new IllegalArgumentException("sourceObjects must not be null"); //$NON-NLS-1$
}
DataModelDefinition<T> definition = getDataModelDefinition();
return toDataModelSourceFactory(definition, sourceObjects);
}
/**
* Returns the data model definition for this port.
* @return the data model definition
*/
public final DataModelDefinition<T> getDataModelDefinition() {
try {
TestDataToolProvider tools = getTestTools();
return tools.toDataModelDefinition(modelType);
} catch (IOException e) {
throw new IllegalStateException(MessageFormat.format(
Messages.getString("DriverInputBase.errorInvalidDataModel"), //$NON-NLS-1$
name,
modelType.getName()), e);
}
}
}