/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.utils.common.endpoint;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
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.EndpointDescriptionsManager;
import de.rcenvironment.core.component.model.endpoint.api.EndpointMetaDataConstants.Visibility;
import de.rcenvironment.core.component.model.endpoint.api.EndpointMetaDataDefinition;
import de.rcenvironment.core.component.workflow.model.spi.ComponentInstanceProperties;
import de.rcenvironment.core.datamodel.api.EndpointType;
/**
* Utility methods for Endpoints and endpoint meta data.
*
* @author Sascha Zur
*/
public final class EndpointHelper {
@Deprecated
private EndpointHelper() {}
private static List<String> getMetadataGUINames(Visibility visibility, EndpointType endpointType,
List<String> dynEndpointIdsToConsider, List<String> statEndpointNamesToConsider, ComponentInstanceProperties compInstProps) {
Set<String> resultList = new LinkedHashSet<String>();
Set<EndpointDefinition> dynamicEndpointDefinitions = null;
Set<EndpointDefinition> staticEndpointDefinitions = null;
if (compInstProps != null) {
EndpointDescriptionsManager endpointManager = getEndpointDescriptionsManager(endpointType, compInstProps);
dynamicEndpointDefinitions = endpointManager.getDynamicEndpointDefinitions(dynEndpointIdsToConsider);
staticEndpointDefinitions = endpointManager.getStaticEndpointDefinitions(statEndpointNamesToConsider);
Map<String, Map<Integer, String>> staticGroups = new TreeMap<String, Map<Integer, String>>();
for (EndpointDefinition currentDefinition : staticEndpointDefinitions) {
EndpointMetaDataDefinition metaDataDefinition = currentDefinition.getMetaDataDefinition();
for (String metaDatumKey : metaDataDefinition.getMetaDataKeys()) {
if (metaDataDefinition.getVisibility(metaDatumKey).equals(visibility)
&& checkConfigurationFilter(metaDataDefinition.getGuiVisibilityFilter(metaDatumKey),
compInstProps.getConfigurationDescription())) {
Map<Integer, String> sortedKeyMap = null;
if (staticGroups.get(metaDataDefinition.getGuiGroup(metaDatumKey)) != null) {
sortedKeyMap = staticGroups.get(metaDataDefinition.getGuiGroup(metaDatumKey));
} else {
sortedKeyMap = new TreeMap<Integer, String>();
staticGroups.put(metaDataDefinition.getGuiGroup(metaDatumKey), sortedKeyMap);
}
sortedKeyMap.put(metaDataDefinition.getGuiPosition(metaDatumKey), metaDataDefinition.getGuiName(metaDatumKey));
}
}
}
for (Map<Integer, String> groups : staticGroups.values()) {
for (String key : groups.values()) {
resultList.add(key);
}
}
Map<String, Map<Integer, String>> dynamicGroups = new TreeMap<String, Map<Integer, String>>();
for (EndpointDefinition dynamicDescription : dynamicEndpointDefinitions) {
if (dynamicDescription == null) {
continue;
}
EndpointMetaDataDefinition metaDataDefinition = dynamicDescription.getMetaDataDefinition();
for (String metaDatumKey : dynamicDescription.getMetaDataDefinition().getMetaDataKeys()) {
if (dynamicDescription.getMetaDataDefinition().getVisibility(metaDatumKey).equals(visibility)
&& checkConfigurationFilter(metaDataDefinition.getGuiVisibilityFilter(metaDatumKey),
compInstProps.getConfigurationDescription())) {
Map<Integer, String> sortedKeyMap = null;
if (dynamicGroups.get(metaDataDefinition.getGuiGroup(metaDatumKey)) != null) {
sortedKeyMap = dynamicGroups.get(metaDataDefinition.getGuiGroup(metaDatumKey));
} else {
sortedKeyMap = new TreeMap<Integer, String>();
dynamicGroups.put(metaDataDefinition.getGuiGroup(metaDatumKey), sortedKeyMap);
}
sortedKeyMap.put(metaDataDefinition.getGuiPosition(metaDatumKey), metaDataDefinition.getGuiName(metaDatumKey));
}
}
}
for (Map<Integer, String> groups : dynamicGroups.values()) {
for (String key : groups.values()) {
resultList.add(key);
}
}
}
return new LinkedList<String>(resultList);
}
/**
* @param endpointType {@link EndpointType} to consider
* @param compInstProps {@link ComponentInstanceProperties} to consider
* @return {@link List} with names of all static {@link EndpointDefinition}s
*/
public static List<String> getAllStaticEndpointNames(EndpointType endpointType, ComponentInstanceProperties compInstProps) {
List<String> endpointNames = new ArrayList<>();
EndpointDescriptionsManager endpointManager = getEndpointDescriptionsManager(endpointType, compInstProps);
for (EndpointDefinition endpointDef : endpointManager.getStaticEndpointDefinitions()) {
endpointNames.add(endpointDef.getName());
}
Collections.sort(endpointNames);
return endpointNames;
}
/**
* @param endpointType {@link EndpointType} to consider
* @param compInstProps {@link ComponentInstanceProperties} to consider
* @return {@link List} with identifiers of all dynamic {@link EndpointDefinition}s
*/
public static List<String> getAllDynamicEndpointIds(EndpointType endpointType, ComponentInstanceProperties compInstProps) {
List<String> endpointIds = new ArrayList<>();
EndpointDescriptionsManager endpointManager = getEndpointDescriptionsManager(endpointType, compInstProps);
for (EndpointDefinition endpointDef : endpointManager.getDynamicEndpointDefinitions()) {
endpointIds.add(endpointDef.getIdentifier());
}
return endpointIds;
}
private static EndpointDescriptionsManager getEndpointDescriptionsManager(EndpointType endpointType,
ComponentInstanceProperties compInstProps) {
EndpointDescriptionsManager endpointManager;
if (endpointType == EndpointType.INPUT) {
endpointManager = compInstProps.getInputDescriptionsManager();
} else {
endpointManager = compInstProps.getOutputDescriptionsManager();
}
return endpointManager;
}
private static boolean checkConfigurationFilter(Map<String, List<String>> filter,
ConfigurationDescription configurationDescription) {
if (filter != null && !filter.isEmpty()) {
for (String filterKey : filter.keySet()) {
for (String filterValues : filter.get(filterKey)) {
if (filterKey.startsWith("configuration:")) {
String newFilterKey = filterKey.split(":")[1];
if (configurationDescription.getConfigurationValue(newFilterKey) != null
&& configurationDescription.getConfigurationValue(newFilterKey).equals(filterValues)) {
return true;
}
}
}
}
return false;
}
return true;
}
/**
* Checks whether the given filter is active or not.
*
* @param filter to check the data
* @param metaDataValues the current values for checking the filter
* @param configDesc configuration values to check
* @return true, if the filter is active, false else.
*/
public static boolean checkMetadataFilter(Map<String, List<String>> filter, Map<String, String> metaDataValues,
ConfigurationDescription configDesc) {
if (filter != null && !filter.isEmpty()) {
boolean result = true;
for (String filterKey : filter.keySet()) {
for (String filterValues : filter.get(filterKey)) {
if (filterKey.startsWith("configuration:")) {
String newFilterKey = filterKey.split(":")[1];
if (!(configDesc.getConfigurationValue(newFilterKey) != null
&& configDesc.getConfigurationValue(newFilterKey).equals(filterValues))) {
result = false;
}
} else {
if (!(metaDataValues.get(filterKey) != null && metaDataValues.get(filterKey).equals(filterValues))) {
result = false;
}
}
}
}
return result;
}
return true;
}
/**
* @param endpointType if the inputs or outputs shall be filtered
* @param dynEndpointIdsToConsider identifiers of dynamic endpoints to consider
* @param statEndpointNamesToConsider identifiers of static endpoints to consider
* @param configuration to filter from
* @return List of all meta data GUI names which shall be shown in the in-/output table.
*/
public static List<String> getMetaDataNamesForTable(EndpointType endpointType,
List<String> dynEndpointIdsToConsider, List<String> statEndpointNamesToConsider, ComponentInstanceProperties configuration) {
return getMetadataGUINames(Visibility.shown, endpointType, dynEndpointIdsToConsider, statEndpointNamesToConsider, configuration);
}
}