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.XmlList;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import pebl.HasExtensions;
import pebl.HasId;
import pebl.HasName;
import pebl.MapAdapter;
@XmlAccessorType(XmlAccessType.NONE)
public class Capability implements HasId, HasName, HasExtensions, HasMetrics {
@XmlElement(required = true)
private final String name;
@XmlElement(name="language")
@XmlElementWrapper(name= "languages")
private final List<Language> languages = new LinkedList<>();
@XmlElement(name="metric")
@XmlElementWrapper(name="metrics")
private final List<Metric> metrics = new LinkedList<>();
@XmlElement(name="characteristics")
@XmlList
private final List<Characteristic> characteristics = new LinkedList<>();
@XmlJavaTypeAdapter(MapAdapter.class)
private final Map<String, String> extensions = new HashMap<>();
public Capability addMetric(MetricType metricType) {
metrics.add(new Metric(metricType, getId()));
return this;
}
public List<Metric> getMetrics() {
return metrics;
}
public List<Characteristic> getCharacteristics() {
return characteristics;
}
public Capability addCharacteristic(Characteristic c) {
characteristics.add(c);
return this;
}
@XmlID
@XmlAttribute(required = true)
private final String id;
public Capability() {
this("");
}
public Capability(String name) {
this.name = Objects.requireNonNull(name);
this.id = name;
}
@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;
Capability construct = (Capability) o;
return Objects.equals(getId(), construct.getId());
}
@Override
public int hashCode() {
return Objects.hash(getId());
}
void addLanguage(Language language) {
this.languages.add(language);
}
public List<Language> getLanguages() {
return languages;
}
@Override
public Map<String, String> getExtensions() {
return extensions;
}
@Override
public Capability addExtension(String key, String value) {
extensions.put(key, value);
return this;
}
@Override
public String toString() {
return getId();
}
}