/**
* Copyright (c) 1997, 2015 by ProSyst Software GmbH and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.automation.type;
import java.util.Collections;
import java.util.Set;
import org.eclipse.smarthome.automation.Module;
import org.eclipse.smarthome.automation.Rule;
/**
* This class defines meta-information properties, used by the Rule Engine when creating connections between modules.
* {@link Output}s are the exit point of a {@link Module}. They are used as data source for {@link Input}s of other
* {@link Module}s.
* <p>
* The meta-information contains:
* <ul>
* <li>name (mandatory) - unique ID in the scope of the {@link Module}</li>
* <li>type (mandatory) - the type of the output data. The value of this meta-info property could be any string that
* makes sense for the user, like a fully qualified name of a Java class, or a general description like "temperature",
* for example. The type is used to determine which {@link Input} can be connected to this {@link Output}</li>
* <li>label (optional) - short id (one word) of the Output.</li>
* <li>description (optional) - user friendly description of the {@link Output}</li>
* <li>default value (optional) - the string representation of the default value of the {@link Output}.</li>
* <li>reference (optional) - reference to data source. It defines what part of complex data (i.e. JavaBean,
* java.lang.Map etc.) has to be used as value of this output.
* </ul>
* <p>
* An {@link Output} can be connected to more than one {@link Input} with a compatible data type.<br>
*
* @author Yordan Mihaylov - Initial Contribution
* @author Ana Dimova - Initial Contribution
* @author Vasil Ilchev - Initial Contribution
*/
public class Output {
/**
* is an unique name of the {@code Output} in scope of the {@link Module}.
*/
private String name;
/**
* This field specifies the type of the output data. The value could be any string that makes sense for the user,
* like a fully qualified name of a Java class, or a general description like "temperature", for example. The type
* is used to determine which {@link Input} can be connected to this {@link Output}.
*/
private String type;
/**
* This field is associated with the {@code Output}. The tags add additional restrictions to connections between
* {@link Input}s and {@link Output}s. The {@link Input}'s tags must be subset of the {@code Output}'s tags to
* succeed the connection.</br>
* For example: When we want to connect {@link Input} to {@code Output} and both have
* same java.lang.double data type. The the output has assign "temperature" and "celsius" tags then the input must
* have at least one of these output's tags (i.e. "temperature") to connect this input to the selected
* {@code Output}.
*/
private Set<String> tags;
/**
* This field keeps a single word description of the {@code Output}.
*/
private String label;
/**
* This field keeps the user friendly description of the {@code Output}.
*/
private String description;
/**
* The value of this field refers to the data source. It defines what part of complex data should be used as source
* of this {@code Output}.
*/
private String reference;
/**
* The string representation of the default value of the {@link Output}. The value of this field is used when there
* is no runtime value for this {@code Output}. It must be compatible with the type of the {@link Output}.
*/
private String defaultValue;
/**
* Default constructor for deserialization e.g. by Gson.
*/
protected Output() {
}
/**
* Constructs an {@code Output} instance with the specified name and output data type.
*
* @param name a unique name of the {@code Output}.
* @param type the type of the output data.
* @throws IllegalArgumentException If one of the name or type parameters is null.
*/
public Output(String name, String type) {
this(name, type, null, null, null, null, null);
}
/**
* Constructs an {@code Output} instance with the specified parameters.
*
* @param name a unique name of the {@code Output}.
* @param type the type of the output data.
* @param label a single word description of the {@code Output}.
* @param description is an user friendly description of the {@code Output}.
* @param tags are associated with the {@code Output}. The tags add additional restrictions to connections between
* {@link Input}s and {@link Output}s. The {@link Input}'s tags must be subset of the {@code Output}'s
* tags to succeed the connection.<br>
* For example: When we want to connect {@link Input} to
* {@code Output} and both have same java.lang.double data type. The the output has assign "temperature"
* and "celsius" tags then the input must have at least one of these output's tags (i.e. "temperature")
* to connect this input to the selected {@code Output}.
* @param reference refers to the data source. It defines what part of complex data should be used as source of
* this {@code Output}.
* @param defaultValue takes place when there is no runtime value for this {@code Output}. Type of the default value
* must be the type of the {@code Output}.
* @throws IllegalArgumentException If one of the name or type parameters is null.
*/
public Output(String name, String type, String label, String description, Set<String> tags, String reference,
String defaultValue) {
if (name == null) {
throw new IllegalArgumentException("The name of the output must not be NULL!");
}
if (type == null) {
throw new IllegalArgumentException("The type of the output must not be NULL!");
}
this.name = name;
this.type = type;
this.label = label;
this.description = description;
this.tags = tags;
this.reference = reference;
this.defaultValue = defaultValue;
}
/**
* This method is used for getting the name of {@code Output}. It must be unique in
* scope of {@link Rule}.
*
* @return name is an unique identifier of the {@code Output}.
*/
public String getName() {
return name;
}
/**
* This method is used to get the type of the {@code Output}. It can be any string that makes sense for the user,
* like a fully qualified name of a Java class, or a general description like "temperature", for example.
*
* @return the type of the output data.
*/
public String getType() {
return type;
}
/**
* This method is used for getting the short description of the {@code Output}.
* Usually the label should be a single word description.
*
* @return label of the Output.
*/
public String getLabel() {
return label;
}
/**
* This method is used for getting the long description of the {@code Output}.
*
* @return user friendly description of the {@code Output}.
*/
public String getDescription() {
return description;
}
/**
* This method is used for getting the reference to data source. It defines what part of complex data (i.e.
* JavaBean, java.lang.Map etc.) has to be used as a value of this {@code Output}. For example, in the
* {@code Output} data - java.lang.Map, the reference points to the property that has to be used as an output value.
*
* @return a reference to data source.
*/
public String getReference() {
return reference;
}
/**
* This method is used for getting the tags of the {@code Output}. The tags add additional restrictions to
* connections between {@link Input}s and {@code Output}s. The input tags must be subset of the output tags to
* succeed the connection.<br>
* For example: When we want to connect {@link Input} to {@code Output} and they both
* have same data type - java.lang.double and the {@link Output} has assign "temperature" and "celsius" tags, then
* the {@link Input} must have at least one of these {@code Output}'s tags (i.e. "temperature") to connect this
* {@link Input} to the selected {@code Output}.
*
* @return the tags, associated with this {@link Input}.
*/
public Set<String> getTags() {
return tags != null ? tags : Collections.<String> emptySet();
}
/**
* This method is used to get the string representation of the default value of the {@code Output}. It is used when
* there is no runtime value for this {@code Output}. It must be compatible with the type of the {@link Output}.
*
* @return the string representation of the default value of this {@code Output}.
*/
public String getDefaultValue() {
return defaultValue;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Output " + name;
}
}