From fbde45cbce15d046373a22a2f20700c0813d99be Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sat, 4 Aug 2018 14:33:56 +0200 Subject: [PATCH 1/5] Set location when reading items from specobject file --- .../importer/SpecificationListBuilder.java | 2 +- .../handler/SingleSpecObjectsHandlerBuilder.java | 12 ++++++------ .../handler/SpecObjectsHandlerBuilder.java | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/itsallcode/openfasttrace/importer/SpecificationListBuilder.java b/src/main/java/org/itsallcode/openfasttrace/importer/SpecificationListBuilder.java index 057084230..71a97256e 100644 --- a/src/main/java/org/itsallcode/openfasttrace/importer/SpecificationListBuilder.java +++ b/src/main/java/org/itsallcode/openfasttrace/importer/SpecificationListBuilder.java @@ -168,7 +168,7 @@ public void setTitle(final String title) @Override public void setLocation(final String path, final int line) { - this.location = Location.create(path, line); + this.setLocation(Location.create(path, line)); } @Override diff --git a/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SingleSpecObjectsHandlerBuilder.java b/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SingleSpecObjectsHandlerBuilder.java index d2d32da81..0fb888869 100644 --- a/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SingleSpecObjectsHandlerBuilder.java +++ b/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SingleSpecObjectsHandlerBuilder.java @@ -104,6 +104,12 @@ private void rememberSourceFile(final String fileName) setContainedLocationIfComplete(); } + private void rememberSourceLine(final int line) + { + this.containedLine = line; + setContainedLocationIfComplete(); + } + private void setContainedLocationIfComplete() { if (this.containedFileName != null && this.containedLine >= 1) @@ -111,10 +117,4 @@ private void setContainedLocationIfComplete() this.locationBuilder.path(this.containedFileName).line(this.containedLine); } } - - private void rememberSourceLine(final int line) - { - this.containedLine = line; - setContainedLocationIfComplete(); - } } diff --git a/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecObjectsHandlerBuilder.java b/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecObjectsHandlerBuilder.java index 568b1e783..c877b8937 100644 --- a/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecObjectsHandlerBuilder.java +++ b/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecObjectsHandlerBuilder.java @@ -71,6 +71,7 @@ private void handleStartElement(final TreeElement elem) private void handleEndElement() { this.listener.setId(this.idBuilder.build()); + this.listener.setLocation(this.locationBuilder.build()); this.listener.endSpecificationItem(); this.listener.setLocation(this.locationBuilder.build()); this.idBuilder = null; From 8fbb02b0ab78dff49806af16e5b55c7331199fe6 Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sat, 4 Aug 2018 14:35:25 +0200 Subject: [PATCH 2/5] Log warning when importing invalid artifact names --- .../itsallcode/openfasttrace/core/SpecificationItemId.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/org/itsallcode/openfasttrace/core/SpecificationItemId.java b/src/main/java/org/itsallcode/openfasttrace/core/SpecificationItemId.java index 126ad7775..b0878abf8 100644 --- a/src/main/java/org/itsallcode/openfasttrace/core/SpecificationItemId.java +++ b/src/main/java/org/itsallcode/openfasttrace/core/SpecificationItemId.java @@ -1,5 +1,7 @@ package org.itsallcode.openfasttrace.core; +import java.util.logging.Logger; + /*- * #%L \* OpenFastTrace @@ -35,6 +37,8 @@ // [impl->dsn~specification-item-id~1] public class SpecificationItemId implements Comparable { + private static final Logger LOG = Logger.getLogger(SpecificationItemId.class.getName()); + public static final String UNKONWN_ARTIFACT_TYPE = "unkonwn"; public static final String ITEM_REVISION_PATTERN = "(\\d+)"; public static final String ITEM_NAME_PATTERN = "(\\p{Alpha}[\\w-]*(?:\\.\\p{Alpha}[\\w-]*)*)"; @@ -350,6 +354,9 @@ private void inferArtifactType() } else { + LOG.warning(() -> "Name '" + this.name + "' does not match legacy name pattern '" + + LEGACY_NAME_PATTERN + "': using artifact type '" + UNKONWN_ARTIFACT_TYPE + + "'."); this.artifactType = UNKONWN_ARTIFACT_TYPE; } } From 560b8662acc6f244897869531b1297db56342cae Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sat, 4 Aug 2018 14:36:38 +0200 Subject: [PATCH 3/5] Update specobject exporter to add artifact type prefix to linksto item name --- .../org/itsallcode/openfasttrace/core/SpecificationItem.java | 1 - .../openfasttrace/exporter/specobject/SpecobjectExporter.java | 2 +- .../exporter/specobject/TestSpecobjectExporter.java | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/itsallcode/openfasttrace/core/SpecificationItem.java b/src/main/java/org/itsallcode/openfasttrace/core/SpecificationItem.java index 2e55bf412..42fcf0beb 100644 --- a/src/main/java/org/itsallcode/openfasttrace/core/SpecificationItem.java +++ b/src/main/java/org/itsallcode/openfasttrace/core/SpecificationItem.java @@ -46,7 +46,6 @@ public class SpecificationItem private SpecificationItem(final Builder builder) { - super(); this.id = builder.id; this.title = builder.title; this.description = builder.description; diff --git a/src/main/java/org/itsallcode/openfasttrace/exporter/specobject/SpecobjectExporter.java b/src/main/java/org/itsallcode/openfasttrace/exporter/specobject/SpecobjectExporter.java index f9a48401c..a2f77e3ac 100644 --- a/src/main/java/org/itsallcode/openfasttrace/exporter/specobject/SpecobjectExporter.java +++ b/src/main/java/org/itsallcode/openfasttrace/exporter/specobject/SpecobjectExporter.java @@ -199,7 +199,7 @@ private void writeCoveredIds(final List coveredIds) for (final SpecificationItemId coveredId : coveredIds) { this.writer.writeStartElement("provcov"); - writeElement("linksto", coveredId.getName()); + writeElement("linksto", coveredId.getArtifactType() + ":" + coveredId.getName()); writeElement("dstversion", coveredId.getRevision()); this.writer.writeEndElement(); } diff --git a/src/test/java/org/itsallcode/openfasttrace/exporter/specobject/TestSpecobjectExporter.java b/src/test/java/org/itsallcode/openfasttrace/exporter/specobject/TestSpecobjectExporter.java index 660a2dfeb..2505fb692 100644 --- a/src/test/java/org/itsallcode/openfasttrace/exporter/specobject/TestSpecobjectExporter.java +++ b/src/test/java/org/itsallcode/openfasttrace/exporter/specobject/TestSpecobjectExporter.java @@ -100,7 +100,7 @@ public void testExportSpecObjectWithOptionalElements() throws IOException, XMLSt + " \n" // + " \n" // + " \n" // - + " covered\n" // + + " feat:covered\n" // + " 1\n" // + " \n" // + " \n" // From 556c1cdfea1ffaa3c4ab918355b9aa51c95d09d2 Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sat, 4 Aug 2018 14:39:06 +0200 Subject: [PATCH 4/5] Add integration test for tracing specobject files --- .../importer/input/StreamInput.java | 16 +++ .../TestSpecobjectImportExport.java | 103 ++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 src/test/java/org/itsallcode/openfasttrace/importer/specobject/TestSpecobjectImportExport.java diff --git a/src/test/java/org/itsallcode/openfasttrace/importer/input/StreamInput.java b/src/test/java/org/itsallcode/openfasttrace/importer/input/StreamInput.java index f30aed760..7cbddc463 100644 --- a/src/test/java/org/itsallcode/openfasttrace/importer/input/StreamInput.java +++ b/src/test/java/org/itsallcode/openfasttrace/importer/input/StreamInput.java @@ -23,6 +23,7 @@ */ import java.io.BufferedReader; +import java.io.StringReader; import java.nio.file.Path; public class StreamInput implements InputFile @@ -36,6 +37,21 @@ private StreamInput(final Path path, final BufferedReader reader) this.reader = reader; } + /** + * Create an {@link InputFile} for a given file content. This is useful for + * tests to avoid using real files. + * + * @param path + * a dummy path. + * @param content + * the file content. + * @return an {@link InputFile}. + */ + public static InputFile forContent(final Path path, final String content) + { + return forReader(path, new BufferedReader(new StringReader(content))); + } + /** * Create an {@link InputFile} for a {@link BufferedReader}. This is useful * for tests to avoid using real files. diff --git a/src/test/java/org/itsallcode/openfasttrace/importer/specobject/TestSpecobjectImportExport.java b/src/test/java/org/itsallcode/openfasttrace/importer/specobject/TestSpecobjectImportExport.java new file mode 100644 index 000000000..305e2b61c --- /dev/null +++ b/src/test/java/org/itsallcode/openfasttrace/importer/specobject/TestSpecobjectImportExport.java @@ -0,0 +1,103 @@ +package org.itsallcode.openfasttrace.importer.specobject; + +/*- + * #%L + * OpenFastTrace + * %% + * Copyright (C) 2016 - 2018 itsallcode.org + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * . + * #L% + */ + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; + +import java.nio.file.Paths; +import java.util.List; + +import org.itsallcode.openfasttrace.core.*; +import org.itsallcode.openfasttrace.importer.Importer; +import org.itsallcode.openfasttrace.importer.SpecificationListBuilder; +import org.itsallcode.openfasttrace.importer.input.InputFile; +import org.itsallcode.openfasttrace.importer.input.StreamInput; +import org.junit.Test; + +import com.github.hamstercommunity.matcher.auto.AutoMatcher; + +public class TestSpecobjectImportExport +{ + @Test + public void testTraceContent() + { + final String content = "\n" + "\n" + + " \n" + " \n" + + " exampleB-3454416016\n" + + " approved\n" + " 0\n" + + " source.java\n" + + " 1\n" + " \n" + + " \n" + + " dsn:exampleB\n" + + " 1\n" + + " \n" + " \n" + + " \n" + " \n" + "\n" + + " \n" + " \n" + + " exampleB\n" + " approved\n" + + " 1\n" + + " spec.md\n" + + " 2\n" + + " Example requirement\n" + + " \n" + " utest\n" + + " impl\n" + " \n" + + " \n" + " \n" + ""; + + final Trace trace = trace(content); + assertThat(trace.getItems(), hasSize(2)); + assertThat(trace.getDefectItems(), hasSize(2)); + + final LinkedSpecificationItem tag = trace.getItems().get(0); + final LinkedSpecificationItem req = trace.getItems().get(1); + + final SpecificationItem expectedTag = new SpecificationItem.Builder() + .id("impl", "exampleB-3454416016", 0).location("source.java", 1) + .status(ItemStatus.APPROVED).addCoveredId("dsn", "exampleB", 1).build(); + final SpecificationItem expectedReq = new SpecificationItem.Builder() + .id("dsn", "exampleB", 1).location("spec.md", 2).description("Example requirement") + .addNeedsArtifactType("utest").addNeedsArtifactType("impl").build(); + + assertThat(tag.getItem(), AutoMatcher.equalTo(expectedTag)); + assertThat(req.getItem(), AutoMatcher.equalTo(expectedReq)); + } + + private Trace trace(final String content) + { + return trace(parse(content)); + } + + private Trace trace(final List items) + { + final List linkedItems = new Linker(items).link(); + return new Tracer().trace(linkedItems); + } + + private List parse(final String content) + { + final SpecificationListBuilder listener = SpecificationListBuilder.create(); + final InputFile input = StreamInput.forContent(Paths.get("dummy.xml"), content); + final Importer importer = new SpecobjectImporterFactory().createImporter(input, listener); + importer.runImport(); + return listener.build(); + } +} From fd5c585d5da6e3b9507f5b09f7486308b72aca4b Mon Sep 17 00:00:00 2001 From: kaklakariada Date: Sat, 4 Aug 2018 17:53:17 +0200 Subject: [PATCH 5/5] Fix failing tests --- .../handler/SpecObjectsHandlerBuilder.java | 1 - .../TestSpecobjectImportExport.java | 38 ++++++++++++------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecObjectsHandlerBuilder.java b/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecObjectsHandlerBuilder.java index c877b8937..a56977255 100644 --- a/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecObjectsHandlerBuilder.java +++ b/src/main/java/org/itsallcode/openfasttrace/importer/specobject/handler/SpecObjectsHandlerBuilder.java @@ -73,7 +73,6 @@ private void handleEndElement() this.listener.setId(this.idBuilder.build()); this.listener.setLocation(this.locationBuilder.build()); this.listener.endSpecificationItem(); - this.listener.setLocation(this.locationBuilder.build()); this.idBuilder = null; this.locationBuilder = null; } diff --git a/src/test/java/org/itsallcode/openfasttrace/importer/specobject/TestSpecobjectImportExport.java b/src/test/java/org/itsallcode/openfasttrace/importer/specobject/TestSpecobjectImportExport.java index 305e2b61c..62cd53c44 100644 --- a/src/test/java/org/itsallcode/openfasttrace/importer/specobject/TestSpecobjectImportExport.java +++ b/src/test/java/org/itsallcode/openfasttrace/importer/specobject/TestSpecobjectImportExport.java @@ -42,26 +42,38 @@ public class TestSpecobjectImportExport @Test public void testTraceContent() { - final String content = "\n" + "\n" - + " \n" + " \n" + final String content = "\n" // + + "\n" // + + " \n" // + + " \n" // + " exampleB-3454416016\n" - + " approved\n" + " 0\n" - + " source.java\n" - + " 1\n" + " \n" - + " \n" + + " approved\n" // + + " 0\n" // + + " source.java\n" // + + " 1\n" // + + " \n" // + + " \n" // + " dsn:exampleB\n" + " 1\n" - + " \n" + " \n" - + " \n" + " \n" + "\n" - + " \n" + " \n" - + " exampleB\n" + " approved\n" + + " \n" // + + " \n" // + + " \n" // + + " \n" // + + " \n" // + + " \n" // + + " exampleB\n" // + + " approved\n" // + " 1\n" + " spec.md\n" + " 2\n" + " Example requirement\n" - + " \n" + " utest\n" - + " impl\n" + " \n" - + " \n" + " \n" + ""; + + " \n" // + + " utest\n" + + " impl\n" // + + " \n" // + + " \n" // + + " \n" // + + ""; final Trace trace = trace(content); assertThat(trace.getItems(), hasSize(2));