package loader;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.xml.bind.JAXBException;
import org.xml.sax.SAXException;
import pebl.HasId;
import pebl.benchmark.feature.Capability;
import pebl.benchmark.feature.Feature;
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;
public class PEBLMergerMain {
public static void main(String[] args) throws IOException, JAXBException, SAXException {
Path peblSourcePath = Paths.get(args[0]);
Path peblTargetPath = Paths.get(args[1]);
System.out.println("Merging " + peblSourcePath + " into " + peblTargetPath);
PEBL peblSource = PEBL.from(peblSourcePath);
PEBL peblTarget = PEBL.from(peblTargetPath);
merge(peblSource, peblTarget, peblTargetPath.toAbsolutePath().getParent());
PEBLStoreFilesAlongMain.copyFilesRelative(peblTarget, peblTargetPath);
PEBLBpmnPngImageAdderMain.createBpmnPngs(peblTarget, peblTargetPath);
new Aggregator().computeFeatureResults(peblTarget);
peblTarget.writeTo(peblTargetPath.getParent());
}
private static void merge(PEBL peblSource, PEBL peblTarget, Path newRelativeDataFolder) {
// Algorithm: add elements whose id was not yet there
// add metric types if not yet available
System.out.println("MERGING metric types");
List<String> metricTypeIds = peblTarget.benchmark.metricTypes.stream().map(HasId::getId).collect(Collectors.toList());
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<Capability> targetCapabilityOptional = peblTarget.benchmark.capabilities.stream().filter(x -> x.getId().equals(c.getId())).findFirst();
if(!targetCapabilityOptional.isPresent()) {
System.out.println("Adding capability " + c.getId());
peblTarget.benchmark.capabilities.add(c);
} else {
final Capability targetCapability = targetCapabilityOptional.get();
c.getLanguages().forEach(l -> {
final Optional<Language> languageOptional = targetCapability.getLanguages().stream().filter(x -> x.getId().equals(l.getId())).findFirst();
if(!languageOptional.isPresent()) {
System.out.println("Adding language " + l.getId());
targetCapability.getLanguages().add(l);
} else {
final Language language = languageOptional.get();
l.getGroups().forEach(g -> {
final Optional<Group> 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<FeatureSet> 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<Feature> 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);
}
});
}
});
}
});
}
});
}
});
// 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<String> 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<Path> files = e.getFiles().stream().map(newRelativeDataFolder::relativize).collect(Collectors.toList());
peblTarget.benchmark.tests.add(new Test(
newRelativeDataFolder.relativize(e.getProcess()),
e.getTestCases(),
peblTarget.getFeature(e.getFeature().getId()),
files,
e.getDescription(),
e.getTestPartners(),
e.getExtensions()
));
});
}
private static void mergeEngines(PEBL peblSource, PEBL peblTarget) {
List<String> 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);
});
}
private static void mergeTestResults(PEBL peblSource, PEBL peblTarget, Path newRelativeDataFolder) {
List<String> testResultIds = peblTarget.result.testResults.stream().map(HasId::getId).collect(Collectors.toList());
peblSource.result.testResults.forEach(e -> {
final List<Path> files = e.getFiles().stream().map(newRelativeDataFolder::relativize).collect(Collectors.toList());
final List<Path> logFiles = e.getLogs().stream().map(newRelativeDataFolder::relativize).collect(Collectors.toList());
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<TestResult> 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, newTestResult);
} else {
peblTarget.result.testResults.add(newTestResult);
}
});
}
}