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 FeatureSet implements HasId, HasName, HasExtensions, HasMetrics {
@XmlInverseReference(mappedBy="featureSets")
private final Group group;
@XmlElement(required = true)
private final String name;
@XmlElement(required = true)
private final String description;
@XmlElement(name = "feature")
@XmlElementWrapper(name= "features")
private final List<Feature> features = new LinkedList<>();
@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 FeatureSet addMetric(MetricType metricType) {
metrics.add(new Metric(metricType, getId()));
return this;
}
public FeatureSet() {
this(new Group(), "");
}
public FeatureSet(Group group, String name) {
this(group, name, "");
}
public FeatureSet(Group group, String name, String description) {
this.group = Objects.requireNonNull(group);
this.name = Objects.requireNonNull(name);
this.description = Objects.requireNonNull(description);
this.group.addFeatureSet(this);
this.id = String.join(HasId.SEPARATOR, group.getId(), name);
}
public List<Feature> getFeatures() {
return features;
}
void addFeature(Feature feature) {
this.features.add(feature);
}
@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;
FeatureSet featureSet = (FeatureSet) o;
return Objects.equals(getId(), featureSet.getId());
}
@Override
public int hashCode() {
return Objects.hash(getId());
}
public Group getGroup() {
return group;
}
public String getDescription() {
return description;
}
public List<Metric> getMetrics() {
return metrics;
}
@Override
public Map<String, String> getExtensions() {
return extensions;
}
@Override
public FeatureSet addExtension(String key, String value) {
extensions.put(key, value);
return this;
}
@Override
public String toString() {
return getId();
}
}