package pebl.result.engine; import java.util.Collections; 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.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; import static java.util.Objects.requireNonNull; @XmlAccessorType(XmlAccessType.NONE) public final class Engine implements HasId, HasName, HasExtensions { public static final String DELIMITER = "--"; @XmlElement(required = true) private final String name; @XmlElement(required = true) private final String version; @XmlElement(required = true) @XmlList private final List<String> configuration; @XmlElement(required = true) private final String language; @XmlJavaTypeAdapter(MapAdapter.class) private final Map<String, String> extensions; public Engine() { this("", "", ""); } public Engine(String language, String name, String version) { this(language, name, version, Collections.emptyList()); } public Engine(String language, String name, String version, List<String> configuration) { this.language = language; this.name = requireNonNull(name); this.version = requireNonNull(version); this.extensions = new HashMap<>(); List<String> values = new LinkedList<>(); values.addAll(configuration); this.configuration = requireNonNull(values); } @Override public String toString() { return getId(); } private String getNormalizedId() { return getIdentifier().replaceAll(DELIMITER, "__").replaceAll("\\.", "_"); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Engine engine = (Engine) o; return Objects.equals(toString(), engine.toString()); } public String getLanguage() { return language; } @Override public int hashCode() { return Objects.hashCode(toString()); } private String getIdentifier() { List<String> values = new LinkedList<>(); values.add(name); values.add(version); values.addAll(configuration); return String.join(DELIMITER, values); } public String getName() { return name; } public String getVersion() { return version; } public List<String> getConfiguration() { return Collections.unmodifiableList(configuration); } @Override @XmlAttribute(required = true) @XmlID public String getId() { return getNormalizedId(); } @Override public Map<String, String> getExtensions() { return extensions; } @Override public Engine addExtension(String key, String value) { extensions.put(key, value); return this; } }