From 360dee860110c4b0f62c23fe206abe91aa880ac9 Mon Sep 17 00:00:00 2001 From: Simon Harrer Date: Tue, 7 Mar 2017 14:55:00 +0100 Subject: [PATCH] Fix bug in merging pebl serializations that would cause duplicated ids. --- .../src/main/java/loader/PEBLMergerMain.java | 89 +++++++++++++------ .../pebl/benchmark/feature/Capability.java | 7 +- .../java/pebl/benchmark/feature/Feature.java | 7 +- .../pebl/benchmark/feature/FeatureSet.java | 7 +- .../java/pebl/benchmark/feature/Group.java | 12 +-- .../pebl/benchmark/feature/HasMetrics.java | 11 +++ .../java/pebl/benchmark/feature/Language.java | 7 +- .../java/pebl/benchmark/feature/Metric.java | 5 ++ .../pebl/benchmark/feature/MetricType.java | 11 +-- .../main/java/pebl/benchmark/test/Test.java | 13 +-- .../main/java/pebl/result/engine/Engine.java | 3 +- .../java/pebl/result/test/TestResult.java | 5 ++ pebl/src/main/java/pebl/xsd/PEBL.java | 60 +++++++++++++ .../builder/PEBLPerformanceResultsAdder.java | 2 +- 14 files changed, 187 insertions(+), 52 deletions(-) create mode 100644 pebl/src/main/java/pebl/benchmark/feature/HasMetrics.java diff --git a/loader/src/main/java/loader/PEBLMergerMain.java b/loader/src/main/java/loader/PEBLMergerMain.java index 0e2f6244..55fe0406 100644 --- a/loader/src/main/java/loader/PEBLMergerMain.java +++ b/loader/src/main/java/loader/PEBLMergerMain.java @@ -16,7 +16,9 @@ import pebl.benchmark.feature.FeatureSet; import pebl.benchmark.feature.Group; import pebl.benchmark.feature.Language; +import pebl.benchmark.test.Test; import pebl.builder.Aggregator; +import pebl.result.Measurement; import pebl.result.test.TestResult; import pebl.xsd.PEBL; @@ -47,45 +49,53 @@ private static void merge(PEBL peblSource, PEBL peblTarget, Path newRelativeData // add metric types if not yet available System.out.println("MERGING metric types"); List metricTypeIds = peblTarget.benchmark.metricTypes.stream().map(HasId::getId).collect(Collectors.toList()); - peblSource.benchmark.metricTypes.stream().filter(e -> !metricTypeIds.contains(e.getId())).forEach(e -> peblTarget.benchmark.metricTypes.add(e)); + peblSource.benchmark.metricTypes.stream().filter(e -> !metricTypeIds.contains(e.getId())).forEach(e -> { + System.out.println("Adding metric type " + e.getId()); + peblTarget.benchmark.metricTypes.add(e); + }); // apply metrics System.out.println("MERGING feature tree"); peblSource.benchmark.capabilities.forEach(c -> { - final Optional capabilityOptional = peblTarget.benchmark.capabilities.stream().filter(x -> x.getId().equals(c.getId())).findFirst(); + final Optional targetCapabilityOptional = peblTarget.benchmark.capabilities.stream().filter(x -> x.getId().equals(c.getId())).findFirst(); - if(!capabilityOptional.isPresent()) { + if(!targetCapabilityOptional.isPresent()) { + System.out.println("Adding capability " + c.getId()); peblTarget.benchmark.capabilities.add(c); } else { - final Capability capability = capabilityOptional.get(); + final Capability targetCapability = targetCapabilityOptional.get(); c.getLanguages().forEach(l -> { - final Optional languageOptional = capability.getLanguages().stream().filter(x -> x.getId().equals(c.getId())).findFirst(); + final Optional languageOptional = targetCapability.getLanguages().stream().filter(x -> x.getId().equals(l.getId())).findFirst(); if(!languageOptional.isPresent()) { - capability.getLanguages().add(l); + System.out.println("Adding language " + l.getId()); + targetCapability.getLanguages().add(l); } else { final Language language = languageOptional.get(); l.getGroups().forEach(g -> { - final Optional groupOptional = language.getGroups().stream().filter(x -> x.getId().equals(c.getId())).findFirst(); + final Optional groupOptional = language.getGroups().stream().filter(x -> x.getId().equals(g.getId())).findFirst(); if(!groupOptional.isPresent()) { + System.out.println("Adding new group " + g.getId()); language.getGroups().add(g); } else { final Group group = groupOptional.get(); g.getFeatureSets().forEach(fs -> { - final Optional featureSetOptional = group.getFeatureSets().stream().filter(x -> x.getId().equals(c.getId())).findFirst(); + final Optional featureSetOptional = group.getFeatureSets().stream().filter(x -> x.getId().equals(fs.getId())).findFirst(); if(!featureSetOptional.isPresent()) { + System.out.println("Adding new feature set " + fs.getId()); group.getFeatureSets().add(fs); } else { final FeatureSet featureSet = featureSetOptional.get(); fs.getFeatures().forEach(f -> { - final Optional featureOptional = featureSet.getFeatures().stream().filter(x -> x.getId().equals(c.getId())).findFirst(); + final Optional featureOptional = featureSet.getFeatures().stream().filter(x -> x.getId().equals(f.getId())).findFirst(); if(!featureOptional.isPresent()) { + System.out.println("Adding new feature " + f.getId()); featureSet.getFeatures().add(f); } }); @@ -100,40 +110,67 @@ private static void merge(PEBL peblSource, PEBL peblTarget, Path newRelativeData // add tests if not yet available System.out.println("MERGING tests"); + mergeTests(peblSource, peblTarget, newRelativeDataFolder); + + // add engines if not yet available + System.out.println("MERGING engines"); + mergeEngines(peblSource, peblTarget); + + // add test results if not yet available + System.out.println("MERGING test results"); + mergeTestResults(peblSource, peblTarget, newRelativeDataFolder); + } + + private static void mergeTests(PEBL peblSource, PEBL peblTarget, Path newRelativeDataFolder) { List testIds = peblTarget.benchmark.tests.stream().map(HasId::getId).collect(Collectors.toList()); peblSource.benchmark.tests.stream().filter(e -> !testIds.contains(e.getId())).forEach(e -> { final List files = e.getFiles().stream().map(newRelativeDataFolder::relativize).collect(Collectors.toList()); - e.getFiles().clear(); - e.getFiles().addAll(files); - - e.setProcess(newRelativeDataFolder.relativize(e.getProcess())); - peblTarget.benchmark.tests.add(e); + peblTarget.benchmark.tests.add(new Test( + newRelativeDataFolder.relativize(e.getProcess()), + e.getTestCases(), + peblTarget.getFeature(e.getFeature().getId()), + files, + e.getDescription(), + e.getTestPartners(), + e.getExtensions() + )); }); + } - // add engines if not yet available - System.out.println("MERGING engines"); + private static void mergeEngines(PEBL peblSource, PEBL peblTarget) { List engineIds = peblTarget.result.engines.stream().map(HasId::getId).collect(Collectors.toList()); - peblSource.result.engines.stream().filter(e -> !engineIds.contains(e.getId())).forEach(e -> peblTarget.result.engines.add(e)); + peblSource.result.engines.stream().filter(e -> !engineIds.contains(e.getId())).forEach(e -> { + peblTarget.result.engines.add(e); + }); + } - // add test results if not yet available - System.out.println("MERGING test results"); + private static void mergeTestResults(PEBL peblSource, PEBL peblTarget, Path newRelativeDataFolder) { List testResultIds = peblTarget.result.testResults.stream().map(HasId::getId).collect(Collectors.toList()); peblSource.result.testResults.forEach(e -> { - final List files = e.getFiles().stream().map(newRelativeDataFolder::relativize).collect(Collectors.toList()); - e.getFiles().clear(); - e.getFiles().addAll(files); + final List files = e.getFiles().stream().map(newRelativeDataFolder::relativize).collect(Collectors.toList()); final List logFiles = e.getLogs().stream().map(newRelativeDataFolder::relativize).collect(Collectors.toList()); - e.getLogs().clear(); - e.getLogs().addAll(logFiles); + Test test = peblTarget.getTest(e.getTest().getId()); + TestResult newTestResult = new TestResult( + test, + peblTarget.getEngine(e.getEngine().getId()), + e.getTool(), + logFiles, + e.getDeploymentPackage(), + files, + e.getMeasurements().stream().map(m -> new Measurement(peblTarget.getMetric(m.getMetric().getId()), m.getValue())).collect(Collectors.toList()), + e.getExtensions(), + e.getTestCaseResults() + ); + final Optional testResultOptional = peblTarget.result.testResults.stream().filter(tr -> tr.getId().equals(e.getId())).findAny(); if(testResultOptional.isPresent()) { final int index = peblTarget.result.testResults.indexOf(testResultOptional.get()); - peblTarget.result.testResults.set(index, e); + peblTarget.result.testResults.set(index, newTestResult); } else { - peblTarget.result.testResults.add(e); + peblTarget.result.testResults.add(newTestResult); } }); } diff --git a/pebl/src/main/java/pebl/benchmark/feature/Capability.java b/pebl/src/main/java/pebl/benchmark/feature/Capability.java index 7791f83b..39f94f9c 100644 --- a/pebl/src/main/java/pebl/benchmark/feature/Capability.java +++ b/pebl/src/main/java/pebl/benchmark/feature/Capability.java @@ -21,7 +21,7 @@ import pebl.MapAdapter; @XmlAccessorType(XmlAccessType.NONE) -public class Capability implements HasId, HasName, HasExtensions { +public class Capability implements HasId, HasName, HasExtensions, HasMetrics { @XmlElement(required = true) private final String name; @@ -119,4 +119,9 @@ public Capability addExtension(String key, String value) { return this; } + + @Override + public String toString() { + return getId(); + } } diff --git a/pebl/src/main/java/pebl/benchmark/feature/Feature.java b/pebl/src/main/java/pebl/benchmark/feature/Feature.java index 186e2465..bd047e50 100644 --- a/pebl/src/main/java/pebl/benchmark/feature/Feature.java +++ b/pebl/src/main/java/pebl/benchmark/feature/Feature.java @@ -21,7 +21,7 @@ import pebl.MapAdapter; @XmlAccessorType(XmlAccessType.NONE) -public class Feature implements HasId, HasName, HasExtensions { +public class Feature implements HasId, HasName, HasExtensions, HasMetrics { @XmlInverseReference(mappedBy="features") private final FeatureSet featureSet; @@ -114,4 +114,9 @@ public Map getExtensions() { return this; } + + @Override + public String toString() { + return getId(); + } } diff --git a/pebl/src/main/java/pebl/benchmark/feature/FeatureSet.java b/pebl/src/main/java/pebl/benchmark/feature/FeatureSet.java index 6ab57595..6b0728fa 100644 --- a/pebl/src/main/java/pebl/benchmark/feature/FeatureSet.java +++ b/pebl/src/main/java/pebl/benchmark/feature/FeatureSet.java @@ -21,7 +21,7 @@ import pebl.MapAdapter; @XmlAccessorType(XmlAccessType.NONE) -public class FeatureSet implements HasId, HasName, HasExtensions { +public class FeatureSet implements HasId, HasName, HasExtensions, HasMetrics { @XmlInverseReference(mappedBy="featureSets") private final Group group; @@ -127,4 +127,9 @@ public FeatureSet addExtension(String key, String value) { return this; } + + @Override + public String toString() { + return getId(); + } } diff --git a/pebl/src/main/java/pebl/benchmark/feature/Group.java b/pebl/src/main/java/pebl/benchmark/feature/Group.java index 9772e39e..aa39f9fc 100644 --- a/pebl/src/main/java/pebl/benchmark/feature/Group.java +++ b/pebl/src/main/java/pebl/benchmark/feature/Group.java @@ -22,7 +22,7 @@ import pebl.MapAdapter; @XmlAccessorType(XmlAccessType.NONE) -public class Group implements HasId, HasName, HasExtensions { +public class Group implements HasId, HasName, HasExtensions, HasMetrics { @XmlElement(required = true) private final String name; @@ -72,11 +72,6 @@ public String getId() { return id; } - @Override - public String toString() { - return "Group " + getId(); - } - @Override public String getName() { return name; @@ -140,4 +135,9 @@ public Group addExtension(String key, String value) { return this; } + + @Override + public String toString() { + return getId(); + } } diff --git a/pebl/src/main/java/pebl/benchmark/feature/HasMetrics.java b/pebl/src/main/java/pebl/benchmark/feature/HasMetrics.java new file mode 100644 index 00000000..475c2bab --- /dev/null +++ b/pebl/src/main/java/pebl/benchmark/feature/HasMetrics.java @@ -0,0 +1,11 @@ +package pebl.benchmark.feature; + +import java.util.List; + +import pebl.HasId; + +public interface HasMetrics { + + List getMetrics(); + +} diff --git a/pebl/src/main/java/pebl/benchmark/feature/Language.java b/pebl/src/main/java/pebl/benchmark/feature/Language.java index 16a9718a..1c57c494 100644 --- a/pebl/src/main/java/pebl/benchmark/feature/Language.java +++ b/pebl/src/main/java/pebl/benchmark/feature/Language.java @@ -21,7 +21,7 @@ import pebl.MapAdapter; @XmlAccessorType(XmlAccessType.NONE) -public class Language implements HasId, HasName, HasExtensions { +public class Language implements HasId, HasName, HasExtensions, HasMetrics { @XmlInverseReference(mappedBy="languages") private final Capability capability; @@ -115,4 +115,9 @@ public Language addExtension(String key, String value) { return this; } + + @Override + public String toString() { + return getId(); + } } diff --git a/pebl/src/main/java/pebl/benchmark/feature/Metric.java b/pebl/src/main/java/pebl/benchmark/feature/Metric.java index ea5ee95f..b39c7293 100644 --- a/pebl/src/main/java/pebl/benchmark/feature/Metric.java +++ b/pebl/src/main/java/pebl/benchmark/feature/Metric.java @@ -37,4 +37,9 @@ public String getId() { public MetricType getMetricType() { return metricType; } + + @Override + public String toString() { + return getId(); + } } diff --git a/pebl/src/main/java/pebl/benchmark/feature/MetricType.java b/pebl/src/main/java/pebl/benchmark/feature/MetricType.java index 799e6c07..4cdbe2a2 100644 --- a/pebl/src/main/java/pebl/benchmark/feature/MetricType.java +++ b/pebl/src/main/java/pebl/benchmark/feature/MetricType.java @@ -67,13 +67,8 @@ public String getUnit() { return unit; } - @Override public String toString() { - final StringBuffer sb = new StringBuffer("MetricType{"); - sb.append("dataType=").append(dataType); - sb.append(", id='").append(id).append('\''); - sb.append(", description='").append(description).append('\''); - sb.append(", unit='").append(unit).append('\''); - sb.append('}'); - return sb.toString(); + @Override + public String toString() { + return getId(); } } diff --git a/pebl/src/main/java/pebl/benchmark/test/Test.java b/pebl/src/main/java/pebl/benchmark/test/Test.java index 67e050e6..7c3325fe 100644 --- a/pebl/src/main/java/pebl/benchmark/test/Test.java +++ b/pebl/src/main/java/pebl/benchmark/test/Test.java @@ -29,11 +29,12 @@ import pebl.MapAdapter; import pebl.benchmark.feature.Feature; import pebl.benchmark.feature.FeatureDimension; +import pebl.benchmark.feature.HasMetrics; import pebl.benchmark.feature.Metric; import pebl.benchmark.feature.MetricType; @XmlAccessorType(XmlAccessType.NONE) -public class Test implements Comparable, HasName, HasId, FeatureDimension, HasExtensions { +public class Test implements Comparable, HasName, HasId, FeatureDimension, HasExtensions, HasMetrics { @XmlIDREF @XmlAttribute(required = true) @@ -167,11 +168,6 @@ public String getProcessLanguage() { return getLanguage().getName(); } - @Override - public String toString() { - return getName(); - } - public boolean equals(Object o) { if (o == this) { return true; @@ -256,5 +252,10 @@ public List getMetrics() { public void setProcess(Path process) { this.process = process; } + + @Override + public String toString() { + return getId(); + } } diff --git a/pebl/src/main/java/pebl/result/engine/Engine.java b/pebl/src/main/java/pebl/result/engine/Engine.java index a6e2d4ed..7d34f8a9 100644 --- a/pebl/src/main/java/pebl/result/engine/Engine.java +++ b/pebl/src/main/java/pebl/result/engine/Engine.java @@ -63,8 +63,9 @@ public Engine(String language, String name, String version, List configu this.configuration = requireNonNull(values); } + @Override public String toString() { - return getNormalizedId(); + return getId(); } private String getNormalizedId() { diff --git a/pebl/src/main/java/pebl/result/test/TestResult.java b/pebl/src/main/java/pebl/result/test/TestResult.java index 9a48ffe0..5b8fdfb8 100644 --- a/pebl/src/main/java/pebl/result/test/TestResult.java +++ b/pebl/src/main/java/pebl/result/test/TestResult.java @@ -136,4 +136,9 @@ public List getTestCaseResults() { public String getId() { return getEngine().getId() + HasId.SEPARATOR + getTest().getId(); } + + @Override + public String toString() { + return getId(); + } } diff --git a/pebl/src/main/java/pebl/xsd/PEBL.java b/pebl/src/main/java/pebl/xsd/PEBL.java index f394f9b2..ae69061b 100644 --- a/pebl/src/main/java/pebl/xsd/PEBL.java +++ b/pebl/src/main/java/pebl/xsd/PEBL.java @@ -3,11 +3,13 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Optional; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.xml.bind.JAXB; import javax.xml.bind.JAXBContext; @@ -21,6 +23,9 @@ import org.eclipse.persistence.jaxb.MarshallerProperties; import org.eclipse.persistence.jaxb.UnmarshallerProperties; import pebl.benchmark.feature.Capability; +import pebl.benchmark.feature.Feature; +import pebl.benchmark.feature.HasMetrics; +import pebl.benchmark.feature.Metric; import pebl.benchmark.feature.MetricType; import pebl.benchmark.test.Test; import pebl.result.engine.Engine; @@ -204,4 +209,59 @@ public static class Result { @XmlElement(required = true) public Result result = new Result(); + public Engine getEngine(String id) { + return this.result.engines.stream() + .filter(e -> e.getId().equals(id)) + .findFirst() + .orElseThrow(() -> new IllegalStateException(id)); + } + + public Test getTest(String id) { + return this.benchmark.tests.stream().filter(e -> e.getId().equals(id)).findFirst() + .orElseThrow(() -> new IllegalStateException(id)); + } + + public Capability getCapability(String id) { + return this.benchmark.capabilities.stream().filter(e -> e.getId().equals(id)).findFirst() + .orElseThrow(() -> new IllegalStateException(id)); + } + + public MetricType getMetricType(String id) { + return this.benchmark.metricTypes.stream() + .filter(e -> e.getId().equals(id)).findFirst() + .orElseThrow(() -> new IllegalStateException(id)); + } + + public Metric getMetric(String id) { + List list = new LinkedList<>(); + this.benchmark.capabilities.stream() + .peek(list::add) + .flatMap(c -> c.getLanguages().stream()) + .peek(list::add) + .flatMap(l -> l.getGroups().stream()) + .peek(list::add) + .flatMap(g -> g.getFeatureSets().stream()) + .peek(list::add) + .flatMap(fs -> fs.getFeatures().stream()) + .peek(list::add) + .count(); + this.benchmark.tests.forEach(list::add); + + return list.stream() + .flatMap(e -> e.getMetrics().stream()) + .filter(m -> m.getId().equals(id)) + .findFirst() + .orElseThrow(() -> new IllegalStateException(id)); + } + + public Feature getFeature(String id) { + return this.benchmark.capabilities.stream() + .flatMap(c -> c.getLanguages().stream()) + .flatMap(l -> l.getGroups().stream()) + .flatMap(g -> g.getFeatureSets().stream()) + .flatMap(fs -> fs.getFeatures().stream()) + .filter(e -> e.getId().equals(id)).findFirst() + .orElseThrow(() -> new IllegalStateException(id)); + } + } diff --git a/src/main/groovy/pebl/builder/PEBLPerformanceResultsAdder.java b/src/main/groovy/pebl/builder/PEBLPerformanceResultsAdder.java index 601ef439..8c03ed59 100644 --- a/src/main/groovy/pebl/builder/PEBLPerformanceResultsAdder.java +++ b/src/main/groovy/pebl/builder/PEBLPerformanceResultsAdder.java @@ -27,7 +27,7 @@ public static void addPerformanceResults(PEBL pebl) { final String benchFlow = "BenchFlow__1"; // results - final Engine camunda__7_4_0 = pebl.result.engines.stream().filter(e -> e.getId().equals("camunda__7_4_0")).findFirst().orElseThrow(() -> new IllegalStateException("camunda 7.4.0 must be available")); + final Engine camunda__7_4_0 = pebl.getEngine("camunda__7_4_0"); final TestResult testResultCamunda = new TestResult(test, camunda__7_4_0, benchFlow, Collections.emptyList(),