/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.model.endpoint.impl;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDefinition;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDefinitionConstants;
import de.rcenvironment.core.component.model.endpoint.api.EndpointMetaDataDefinition;
import de.rcenvironment.core.component.model.endpoint.api.InitialDynamicEndpointDefinition;
import de.rcenvironment.core.datamodel.api.DataType;
import de.rcenvironment.core.datamodel.api.EndpointCharacter;
import de.rcenvironment.core.datamodel.api.EndpointType;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* Provides information about a single endpoint.
*
* @author Doreen Seider
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class EndpointDefinitionImpl extends EndpointGroupDefinitionImpl implements Serializable, EndpointDefinition {
private static final String KEY_CHARACTER = "character";
private static final String KEY_DATATYPE = "datatype";
private static final String READ_ONLY_NAME = "readOnlyName";
private static final String KEY_READ_ONLY = "readOnly";
private static final String KEY_DATATYPES = "dataTypes";
private static final String KEY_DEFAULT_DATATYPE = "defaultDataType";
private static final String KEY_INPUT_HANDLING_OPTIONS = "inputHandlingOptions";
private static final String KEY_DEFAULT_INPUT_HANDLING = "defaultInputHandling";
private static final String KEY_EXECUTION_CONSTRAINT_OPTIONS = "inputExecutionConstraintOptions";
private static final String KEY_DEFAULT_EXECUTION_CONSTRAINT = "defaultInputExecutionConstraint";
private static final String KEY_METADATA = "metaData";
private static final String KEY_INITIAL_ENDPOINTS = "initialEndpoints";
private static final long serialVersionUID = -3853446362359127472L;
private Map<String, Object> rawEndpointDefinition;
private Map<String, Object> rawEndpointDefinitionExtension = new HashMap<>();
private EndpointType endpointType;
@JsonIgnore
private Map<String, Object> definition;
@JsonIgnore
private Map<String, Object> endpointDefinitionExtension;
@JsonIgnore
private List<DataType> dataTypes;
@JsonIgnore
private List<InputDatumHandling> inputDatumHandlings;
@JsonIgnore
private List<InputExecutionContraint> inputExecutionContraints;
@JsonIgnore
private EndpointMetaDataDefinitionImpl metaDataDefinition;
@JsonIgnore
private List<InitialDynamicEndpointDefinitionImpl> initialEndpointDefinitions;
@JsonIgnore
@Override
public boolean isStatic() {
return getName() != null;
}
@JsonIgnore
@Override
public boolean isReadOnly() {
return definition.containsKey(KEY_READ_ONLY) && Boolean.parseBoolean((String) definition.get(KEY_READ_ONLY));
}
@JsonIgnore
@Override
public boolean isNameReadOnly() {
return isStatic() || definition.containsKey(READ_ONLY_NAME) && Boolean.parseBoolean((String) definition.get(READ_ONLY_NAME));
}
@JsonIgnore
@Override
public List<DataType> getPossibleDataTypes() {
return Collections.unmodifiableList(dataTypes);
}
@JsonIgnore
@Override
public DataType getDefaultDataType() {
return DataType.valueOf((String) definition.get(KEY_DEFAULT_DATATYPE));
}
@JsonIgnore
@Override
public List<InputDatumHandling> getInputDatumOptions() {
return Collections.unmodifiableList(inputDatumHandlings);
}
@JsonIgnore
@Override
public InputDatumHandling getDefaultInputDatumHandling() {
if (definition.containsKey(KEY_DEFAULT_INPUT_HANDLING)) {
return InputDatumHandling.valueOf((String) definition.get(KEY_DEFAULT_INPUT_HANDLING));
} else {
return getInputDatumOptions().get(0);
}
}
@JsonIgnore
@Override
public List<InputExecutionContraint> getInputExecutionConstraintOptions() {
return Collections.unmodifiableList(inputExecutionContraints);
}
@JsonIgnore
@Override
public InputExecutionContraint getDefaultInputExecutionConstraint() {
if (definition.containsKey(KEY_DEFAULT_EXECUTION_CONSTRAINT)) {
return InputExecutionContraint.valueOf((String) definition.get(KEY_DEFAULT_EXECUTION_CONSTRAINT));
} else {
return getInputExecutionConstraintOptions().get(0);
}
}
@JsonIgnore
@Override
public EndpointMetaDataDefinition getMetaDataDefinition() {
return metaDataDefinition;
}
@JsonIgnore
@Override
public EndpointCharacter getEndpointCharacter() {
if (definition.containsKey(KEY_CHARACTER)) {
return EndpointCharacter.fromEndpointDefinitionValue((String) definition.get(KEY_CHARACTER));
} else {
return EndpointCharacter.SAME_LOOP;
}
}
@JsonIgnore
@Override
public List<InitialDynamicEndpointDefinition> getInitialDynamicEndpointDefinitions() {
return new ArrayList<InitialDynamicEndpointDefinition>(initialEndpointDefinitions);
}
@Override
public EndpointType getEndpointType() {
return endpointType;
}
public Map<String, Object> getRawEndpointDefinition() {
return rawEndpointDefinition;
}
public Map<String, Object> getRawEndpointDefinitionExtension() {
return rawEndpointDefinitionExtension;
}
public void setEndpointType(EndpointType type) {
this.endpointType = type;
}
/**
* Initializes fields with raw endpoint information.
*
* @param rawEndpointDefinition raw endpoint information
*/
@SuppressWarnings("unchecked")
public void setRawEndpointDefinition(Map<String, Object> rawEndpointDefinition) {
this.rawEndpointDefinition = rawEndpointDefinition;
this.rawEndpointGroupDefinition = rawEndpointDefinition;
this.definition = new HashMap<String, Object>(rawEndpointDefinition);
this.dataTypes = new ArrayList<DataType>();
for (String dataType : (List<String>) definition.get(KEY_DATATYPES)) {
dataTypes.add(DataType.valueOf(dataType));
}
Collections.sort(dataTypes);
this.inputDatumHandlings = new ArrayList<InputDatumHandling>();
if (definition.containsKey(KEY_INPUT_HANDLING_OPTIONS)) {
for (String inputDatumHandling : (List<String>) definition.get(KEY_INPUT_HANDLING_OPTIONS)) {
inputDatumHandlings.add(InputDatumHandling.valueOf(inputDatumHandling));
}
} else {
inputDatumHandlings.add(InputDatumHandling.Single);
}
this.inputExecutionContraints = new ArrayList<InputExecutionContraint>();
if (definition.containsKey(KEY_EXECUTION_CONSTRAINT_OPTIONS)) {
for (String inputExecutionContraint : (List<String>) definition.get(KEY_EXECUTION_CONSTRAINT_OPTIONS)) {
inputExecutionContraints.add(InputExecutionContraint.valueOf(inputExecutionContraint));
}
} else {
inputExecutionContraints.add(InputExecutionContraint.Required);
}
Map<String, Map<String, Object>> metaData = (Map<String, Map<String, Object>>) definition.get(KEY_METADATA);
if (metaData == null) {
metaData = new HashMap<String, Map<String, Object>>();
}
this.metaDataDefinition = new EndpointMetaDataDefinitionImpl();
metaDataDefinition.setRawMetaData(metaData);
definition.remove(KEY_METADATA);
// sanity checks
if (!dataTypes.contains(getDefaultDataType())) {
throw new IllegalArgumentException(StringUtils.format("Declared default data type '%s' not in declared list of allowed data "
+ "types '%s'", getDefaultDataType(), dataTypes));
}
if (!inputDatumHandlings.contains(getDefaultInputDatumHandling())) {
throw new IllegalArgumentException(StringUtils.format("Declared default input handling option '%s' not in declared list of "
+ "allowed input handling options '%s'", getDefaultInputDatumHandling(), inputDatumHandlings));
}
if (!inputExecutionContraints.contains(getDefaultInputExecutionConstraint())) {
throw new IllegalArgumentException(StringUtils.format("Declared default input execution constraint option '%s' not in "
+ "declared list of allowed input execution constraint options '%s'", getDefaultInputExecutionConstraint(),
inputExecutionContraints));
}
initialEndpointDefinitions = new ArrayList<InitialDynamicEndpointDefinitionImpl>();
List<Map<String, Object>> rawInitialEndpoints = (List<Map<String, Object>>) definition.get(KEY_INITIAL_ENDPOINTS);
if (rawInitialEndpoints != null) {
for (Map<String, Object> defaultEndpoint : rawInitialEndpoints) {
DataType dataType = getDefaultDataType();
if (defaultEndpoint.containsKey(KEY_DATATYPE)) {
dataType = DataType.valueOf((String) defaultEndpoint.get(KEY_DATATYPE));
}
initialEndpointDefinitions.add(new InitialDynamicEndpointDefinitionImpl((String) defaultEndpoint.get(
EndpointDefinitionConstants.KEY_NAME), dataType));
}
}
}
/**
* Initializes fields with raw endpoint information.
*
* @param rawEndpointDefinitionExtension raw extended endpoint information
*/
@SuppressWarnings("unchecked")
public void setRawEndpointDefinitionExtension(Map<String, Object> rawEndpointDefinitionExtension) {
this.rawEndpointDefinitionExtension = rawEndpointDefinitionExtension;
this.endpointDefinitionExtension = new HashMap<String, Object>(rawEndpointDefinitionExtension);
Map<String, Map<String, Object>> metaData = (Map<String, Map<String, Object>>) endpointDefinitionExtension.get(KEY_METADATA);
if (metaData == null) {
metaData = new HashMap<String, Map<String, Object>>();
}
metaDataDefinition.setRawMetaDataExtensions(metaData);
}
}