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 java.util.Optional; 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 Group implements HasId, HasName, HasExtensions, HasMetrics { @XmlElement(required = true) private final String name; @XmlInverseReference(mappedBy="groups") private final Language language; @XmlElement(required = true) private final String description; @XmlElement(name = "featureSet") @XmlElementWrapper(name= "featureSets") private final List<FeatureSet> featureSets = 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 Group addMetric(MetricType metricType) { metrics.add(new Metric(metricType, getId())); return this; } public Group() { this("", new Language(), ""); } public Group(String name, Language language, String description) { this.name = Objects.requireNonNull(name); this.language = Objects.requireNonNull(language); this.description = Objects.requireNonNull(description); this.id = String.join(HasId.SEPARATOR, language.getId(), name); this.language.addGroup(this); } 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; Group group = (Group) o; return Objects.equals(getId(), group.getId()); } @Override public int hashCode() { return Objects.hash(getId()); } void addFeatureSet(FeatureSet featureSet) { if(featureSets.stream().anyMatch(fs -> fs.getId().equals(featureSet.getId()))) { return; } this.featureSets.add(featureSet); } public FeatureSet getOrCreate(String name) { Optional<FeatureSet> featureSetOptional = featureSets.stream().filter(fs -> fs.getName().equals(name)).findFirst(); if(featureSetOptional.isPresent()) { return featureSetOptional.get(); } else { return new FeatureSet(this, name); } } public List<FeatureSet> getFeatureSets() { return featureSets; } public Language getLanguage() { return language; } public String getDescription() { return description; } public List<Metric> getMetrics() { return metrics; } @Override public Map<String, String> getExtensions() { return extensions; } @Override public Group addExtension(String key, String value) { extensions.put(key, value); return this; } @Override public String toString() { return getId(); } }