/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.model.impl;
import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.codec.digest.DigestUtils;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import de.rcenvironment.core.component.api.ComponentConstants;
import de.rcenvironment.core.component.model.api.ComponentColor;
import de.rcenvironment.core.component.model.api.ComponentInterface;
import de.rcenvironment.core.component.model.api.ComponentShape;
import de.rcenvironment.core.component.model.api.ComponentSize;
import de.rcenvironment.core.component.model.configuration.api.ConfigurationDefinition;
import de.rcenvironment.core.component.model.configuration.api.ConfigurationExtensionDefinition;
import de.rcenvironment.core.component.model.configuration.impl.ConfigurationDefinitionImpl;
import de.rcenvironment.core.component.model.configuration.impl.ConfigurationExtensionDefinitionImpl;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDefinitionsProvider;
import de.rcenvironment.core.component.model.endpoint.impl.EndpointDefinitionsProviderImpl;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* A writable {@link ComponentInterface} implementation.
*
* @author Robert Mischke
* @author Doreen Seider
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class ComponentInterfaceImpl implements ComponentInterface, Serializable {
private static final long serialVersionUID = 778538723444342052L;
private String displayName;
private String groupName;
private byte[] icon16;
private byte[] icon24;
private byte[] icon32;
private ComponentSize size;
private ComponentColor color;
private ComponentShape shape;
// Note: temporary field for migration; will probably change for 5.0
private String identifier;
// Note: temporary field for migration; will probably change for 5.0
private String version;
private List<String> identifiers;
private EndpointDefinitionsProviderImpl inputDefinitionsProvider;
private EndpointDefinitionsProviderImpl outputDefinitionsProvider;
private ConfigurationDefinitionImpl configurationDefinition;
private Set<ConfigurationExtensionDefinitionImpl> configurationExtensionDefinitions =
new HashSet<ConfigurationExtensionDefinitionImpl>();
private boolean localExecutionOnly = false;
private boolean performLazyDisposal = false;
private boolean isDeprecated = false;
private boolean canHandleNotAValueDataTypes = false;
private boolean isLoopDriver = false;
private String documentationHash = "";
private String iconHash;
@Override
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
@Override
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
@Override
public byte[] getIcon16() {
return icon16;
}
/**
* Sets the new icon and updates the icon hash.
*
* @param icon16 The new icon.
*/
public void setIcon16(byte[] icon16) {
this.icon16 = icon16;
updateIconHash();
}
@Override
public byte[] getIcon24() {
return icon24;
}
/**
* Sets the new icon and updates the icon hash.
*
* @param icon24 The new icon.
*/
public void setIcon24(byte[] icon24) {
this.icon24 = icon24;
updateIconHash();
}
@Override
public byte[] getIcon32() {
return icon32;
}
@Override
public String getDocumentationHash() {
return documentationHash;
}
/**
* Sets the new icon and updates the icon hash.
*
* @param icon32 The new icon.
*/
public void setIcon32(byte[] icon32) {
this.icon32 = icon32;
updateIconHash();
}
public void setDocumentationHash(String docuHash) {
this.documentationHash = docuHash;
}
@Override
public ComponentSize getSize() {
return size;
}
public void setSize(ComponentSize size) {
this.size = size;
}
@Override
public ComponentColor getColor() {
return color;
}
public void setColor(ComponentColor color) {
this.color = color;
}
@Override
public ComponentShape getShape() {
return shape;
}
public void setShape(ComponentShape shape) {
this.shape = shape;
}
@Override
public String getIdentifier() {
if (version != null && !identifier.endsWith(ComponentConstants.ID_SEPARATOR + version)) {
return identifier + ComponentConstants.ID_SEPARATOR + version;
}
return identifier;
}
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
@Override
public List<String> getIdentifiers() {
List<String> resultIdentifiers = new ArrayList<>();
for (String id : identifiers) {
if (version != null && !id.endsWith(ComponentConstants.ID_SEPARATOR + version)) {
resultIdentifiers.add(id + ComponentConstants.ID_SEPARATOR + version);
} else {
resultIdentifiers.add(id);
}
}
return resultIdentifiers;
}
public void setIdentifiers(List<String> identifiers) {
this.identifiers = identifiers;
}
@Override
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
@Override
public EndpointDefinitionsProvider getInputDefinitionsProvider() {
return inputDefinitionsProvider;
}
public void setInputDefinitionsProvider(EndpointDefinitionsProviderImpl inputDefinitionsProvider) {
this.inputDefinitionsProvider = inputDefinitionsProvider;
}
@Override
public EndpointDefinitionsProvider getOutputDefinitionsProvider() {
return outputDefinitionsProvider;
}
public void setOutputDefinitionsProvider(EndpointDefinitionsProviderImpl outputDefinitionsProvider) {
this.outputDefinitionsProvider = outputDefinitionsProvider;
}
@Override
public ConfigurationDefinition getConfigurationDefinition() {
return configurationDefinition;
}
public void setConfigurationDefinition(ConfigurationDefinitionImpl configurationDefinition) {
this.configurationDefinition = configurationDefinition;
}
@Override
public Set<ConfigurationExtensionDefinition> getConfigurationExtensionDefinitions() {
return new HashSet<ConfigurationExtensionDefinition>(configurationExtensionDefinitions);
}
public void setConfigurationExtensionDefinitions(Set<ConfigurationExtensionDefinitionImpl> configurationExtensionDefinitions) {
this.configurationExtensionDefinitions = configurationExtensionDefinitions;
}
@Override
public boolean getLocalExecutionOnly() {
return localExecutionOnly;
}
public void setLocalExecutionOnly(boolean localExecutionOnly) {
this.localExecutionOnly = localExecutionOnly;
}
@Override
public boolean getPerformLazyDisposal() {
return performLazyDisposal;
}
public void setPerformLazyDisposal(boolean performLazyDisposal) {
this.performLazyDisposal = performLazyDisposal;
}
@Override
public boolean getIsDeprecated() {
return isDeprecated;
}
public void setIsDeprecated(boolean isDeprecated) {
this.isDeprecated = isDeprecated;
}
@Override
public boolean getCanHandleNotAValueDataTypes() {
return canHandleNotAValueDataTypes;
}
public void setCanHandleNotAValueDataTypes(boolean canHandleNotAValueDataTypes) {
this.canHandleNotAValueDataTypes = canHandleNotAValueDataTypes;
}
@Override
public boolean getIsLoopDriver() {
return isLoopDriver;
}
public void setIsLoopDriver(boolean isLoopDriver) {
this.isLoopDriver = isLoopDriver;
}
@Override
public String toString() {
return StringUtils.format("ComponentInterface(id=%s)", getIdentifier());
}
private void updateIconHash() {
// concatenate all icons into a single byte array
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
for (byte[] iconX : new byte[][] { icon16, icon24, icon32 }) {
if (iconX != null) {
// call the write method with specified range as it overrides OutputStream's implementation and does not throw an
// IOException in contrast to the simple write method.
outputStream.write(iconX, 0, iconX.length);
}
}
// calculate and set the MD5 hash of the concatenated icons
byte[] concatenated = outputStream.toByteArray();
this.iconHash = DigestUtils.md5Hex(concatenated);
}
@Override
public String getIconHash() {
return iconHash;
}
}