/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.model.testutils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import de.rcenvironment.core.component.api.ComponentConstants;
import de.rcenvironment.core.component.model.api.ComponentDescription;
import de.rcenvironment.core.component.model.configuration.api.ConfigurationDescription;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDefinition;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescriptionsManager;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDefinition.InputExecutionContraint;
import de.rcenvironment.core.datamodel.api.DataType;
/**
*
* Utility Class for tests regarding validators.
*
* @author Jascha Riedel
*/
public class ComponentDescriptionMockCreater {
private static final String IS_CONNECTED = "is_connected";
private static final String DYNAMIC_ENDPOINT_IDENTIFIER = "dynamic_endpoint_0eb99b7eff1d";
private final List<String> inputNames;
private final List<DataType> inputDataTypes;
private final List<Map<String, String>> inputsMetaData;
private final List<String> outputNames;
private final List<DataType> outputDataTypes;
private final List<Map<String, String>> outputsMetaData;
private final Map<String, String> configurationMap;
public ComponentDescriptionMockCreater() {
inputNames = new ArrayList<>();
inputDataTypes = new ArrayList<>();
inputsMetaData = new ArrayList<>();
outputNames = new ArrayList<>();
outputDataTypes = new ArrayList<>();
outputsMetaData = new ArrayList<>();
configurationMap = new HashMap<>();
}
/**
*
* Adds a simulated Input.
*
* @param name of the input
* @param dataType of the input
* @param metaData of the input
* @param executionConstraint of that input
* @param isConnected whether the input is connected or not.
*/
public void addSimulatedInput(String name, DataType dataType, Map<String, String> metaData,
EndpointDefinition.InputExecutionContraint executionConstraint, boolean isConnected) {
inputNames.add(name);
inputDataTypes.add(dataType);
inputsMetaData.add(metaData);
inputsMetaData.get(inputsMetaData.size() - 1).put(IS_CONNECTED, Boolean.toString(isConnected));
inputsMetaData.get(inputsMetaData.size() - 1).put(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT,
executionConstraint.toString());
}
/**
*
*
* @param inputName where the meta data should be added.
* @param key of the meta data value
* @param value the meta data
*/
public void addMetaDataToInput(String inputName, String key, String value) {
int index = inputNames.indexOf(inputName);
if (index >= 0) {
inputsMetaData.get(index).put(key, value);
}
}
/**
*
* Adds a simulated Output.
*
* @param name of the output
* @param dataType of the output
* @param metaData of the output
* @param isConnected whether the output is connected or not
*/
public void addSimulatedOutput(String name, DataType dataType, Map<String, String> metaData, boolean isConnected) {
outputNames.add(name);
outputDataTypes.add(dataType);
outputsMetaData.add(metaData);
outputsMetaData.get(outputsMetaData.size() - 1).put(IS_CONNECTED, Boolean.toString(isConnected));
}
/**
*
* Adds a simulated Output.
*
* @param name of the output
* @param dataType of the output
* @param metaData of the output
* @param isConnected whether the output is connected or not
* @param dynamicEndpointIdentifier of the endpoint
*/
public void addSimulatedOutput(String name, DataType dataType, Map<String, String> metaData, boolean isConnected,
String dynamicEndpointIdentifier) {
outputNames.add(name);
outputDataTypes.add(dataType);
outputsMetaData.add(metaData);
outputsMetaData.get(outputsMetaData.size() - 1).put(IS_CONNECTED, Boolean.toString(isConnected));
outputsMetaData.get(outputsMetaData.size() - 1).put(DYNAMIC_ENDPOINT_IDENTIFIER, dynamicEndpointIdentifier);
}
/**
*
*
* @param outputName where the meta data should be added.
* @param key of the meta data value
* @param value the meta data
*/
public void addMetaDataToOutput(String outputName, String key, String value) {
int index = inputNames.indexOf(outputName);
if (index >= 0) {
outputsMetaData.get(index).put(key, value);
}
}
/**
*
* Adds a configuration value.
*
* @param property of the configuration value.
* @param value of the property.
*/
public void addConfigurationValue(String property, String value) {
configurationMap.put(property, value);
}
/**
*
* Creates a componentDescription Mock for the current configuration provided.
*
* @return a {@link ComponentDescription} usable for validator tests.
*/
public ComponentDescription createComponentDescriptionMock() {
ComponentDescription componentDescription;
componentDescription = EasyMock.createNiceMock(ComponentDescription.class);
addConfigurationMock(componentDescription);
EasyMock.expect(componentDescription.getInputDescriptionsManager())
.andStubReturn(createIOManagerMock(inputNames, inputDataTypes, inputsMetaData));
EasyMock.expect(componentDescription.getOutputDescriptionsManager())
.andStubReturn(createIOManagerMock(outputNames, outputDataTypes, outputsMetaData));
EasyMock.replay(componentDescription);
return componentDescription;
}
private void addConfigurationMock(ComponentDescription componentDescription) {
ConfigurationDescription configurationDescription = EasyMock.createStrictMock(ConfigurationDescription.class);
EasyMock.expect(configurationDescription.getConfigurationValue(EasyMock.anyObject(String.class))).andAnswer(new IAnswer<String>() {
@Override
public String answer() throws Throwable {
return configurationMap.get(EasyMock.getCurrentArguments()[0]);
}
}).anyTimes();
EasyMock.expect(componentDescription.getConfigurationDescription()).andReturn(configurationDescription).anyTimes();
EasyMock.replay(configurationDescription);
}
private EndpointDescriptionsManager createIOManagerMock(List<String> names,
List<DataType> dataTypes, final List<Map<String, String>> metaDatas) {
Set<EndpointDescription> endpointDescriptions = new HashSet<EndpointDescription>();
for (int index = 0; index < names.size(); index++) {
final int i = index;
EndpointDefinition endpointDefinition = EasyMock.createStrictMock(EndpointDefinition.class);
if (metaDatas.get(i).containsKey(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT)) {
EasyMock.expect(endpointDefinition.getDefaultInputExecutionConstraint())
.andStubReturn(
InputExecutionContraint
.valueOf(metaDatas.get(i).get(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT)));
}
EndpointDescription endpointDescription = EasyMock.createStrictMock(EndpointDescription.class);
EasyMock.expect(endpointDescription.getMetaDataValue(EasyMock.anyObject(String.class))).andStubAnswer(new IAnswer<String>() {
@Override
public String answer() throws Throwable {
return metaDatas.get(i).get(EasyMock.getCurrentArguments()[0]);
}
});
EasyMock.expect(endpointDescription.getEndpointDefinition()).andStubReturn(endpointDefinition);
EasyMock.expect(endpointDescription.getDataType()).andStubReturn(dataTypes.get(i));
EasyMock.expect(endpointDescription.isConnected()).andStubReturn(Boolean.valueOf(metaDatas.get(i).get(IS_CONNECTED)));
EasyMock.expect(endpointDescription.getMetaData()).andStubReturn(metaDatas.get(i));
EasyMock.expect(endpointDescription.getName()).andStubReturn(names.get(i));
EasyMock.expect(endpointDescription.getDynamicEndpointIdentifier())
.andStubReturn(metaDatas.get(i).get(DYNAMIC_ENDPOINT_IDENTIFIER));
endpointDescriptions.add(endpointDescription);
EasyMock.replay(endpointDefinition, endpointDescription);
}
EndpointDescriptionsManager ioManager = EasyMock.createStrictMock(EndpointDescriptionsManager.class);
EasyMock.expect(ioManager.getEndpointDescriptions()).andStubReturn(endpointDescriptions);
EasyMock.replay(ioManager);
return ioManager;
}
}