package pebl.benchmark.feature;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;
import pebl.HasExtensions;
import pebl.HasId;
import pebl.HasName;
import pebl.MapAdapter;
@XmlAccessorType(XmlAccessType.NONE)
public class Feature implements HasId, HasName, HasExtensions, HasMetrics {
@XmlInverseReference(mappedBy="features")
private final FeatureSet featureSet;
@XmlElement(required = true)
private final String name;
@XmlElement(required = true)
private final String description;
@XmlID
@XmlAttribute(required = true)
private final String id;
@XmlElement(name="metric")
@XmlElementWrapper(name="metrics")
private final List<Metric> metrics = new LinkedList<>();
@XmlJavaTypeAdapter(MapAdapter.class)
private final Map<String, String> extensions = new HashMap<>();
public Feature addMetric(MetricType metricType) {
metrics.add(new Metric(metricType, getId()));
return this;
}
public Feature() {
this(new FeatureSet(), "");
}
public Feature(FeatureSet featureSet, String name) {
this(featureSet, name, "");
}
public Feature(FeatureSet featureSet, String name, String description) {
this.featureSet = Objects.requireNonNull(featureSet);
this.name = Objects.requireNonNull(name);
this.description = Objects.requireNonNull(description);
this.id = String.join(HasId.SEPARATOR, featureSet.getId(), name);
this.featureSet.addFeature(this);
}
@Override
public String getId() {
return id;
}
@Override
public String getName() {
return name;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Feature feature = (Feature) o;
return Objects.equals(getId(), feature.getId());
}
@Override
public int hashCode() {
return Objects.hash(getId());
}
public String getDescription() {
return description;
}
public FeatureSet getFeatureSet() {
return featureSet;
}
public List<Metric> getMetrics() {
return metrics;
}
@Override
public Map<String, String> getExtensions() {
return extensions;
}
@Override public Feature addExtension(String key, String value) {
extensions.put(key, value);
return this;
}
@Override
public String toString() {
return getId();
}
}