diff --git a/.vscode/settings.json b/.vscode/settings.json
index 4f07762..11fdda4 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -21,5 +21,5 @@
"-Djava.util.logging.config.file=src/test/resources/logging.properties"
]
},
- "asciidoc.antora.enableAntoraSupport": false
+ "asciidoc.antora.showEnableAntoraPrompt": false
}
diff --git a/README.md b/README.md
index 16518ee..868d4fa 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@ _[Place a screenshot of a tracing report generated using this plugin here]_
## Project Information
[](https://github.com/itsallcode/openfasttrace-asciidoc-plugin/actions/workflows/build.yml)
-[](https://search.maven.org/artifact/org.itsallcode/openfasttrace-asciidoc-plugin)
+[](https://central.sonatype.com/artifact/org.itsallcode/openfasttrace-asciidoc-plugin)
Sonarcloud status:
@@ -64,7 +64,7 @@ For more detailed information on how to use OpenFastTrack with AsciiDoc Plugin,
The OpenFastTrace AsciiDoc Plugin is supplied as a Java Archive (JAR) which can be obtained from:
-* [Maven Central](#)
+* [Maven Central](https://central.sonatype.com/artifact/org.itsallcode/openfasttrace-asciidoc-plugin)
* [GitHub](https://github.com/itsallcode/openfasttrace-asciidoc-plugin/releases)
More details about adding the plugin to an existing establishment are outlined in the [developer guide](doc/developer_guide.md).
diff --git a/doc/changes/changes_0.3.2.md b/doc/changes/changes_0.3.2.md
index 837151e..8008c45 100644
--- a/doc/changes/changes_0.3.2.md
+++ b/doc/changes/changes_0.3.2.md
@@ -9,3 +9,4 @@ We upgraded the OFT dependency to version 4.8.0.
## Refactoring
* Updated OFT to 4.8.0
+* Updated asciidoctorj dependency to 3.0.1
diff --git a/doc/developer_guide.md b/doc/developer_guide.md
index 0ca0452..a535fe5 100644
--- a/doc/developer_guide.md
+++ b/doc/developer_guide.md
@@ -39,7 +39,7 @@ The list below shows all build time dependencies in alphabetical order. Note tha
| Dependency | Purpose | License |
| ---------------------------------------------------------------------------- | --------------------------------------- | ----------------------------- |
| [Hamcrest Auto Matcher](https://github.com/itsallcode/hamcrest-auto-matcher) | Speed-up for building Hamcrest matchers | GNU General Public License V3 |
-| [JUnit](https://junit.org/junit5) | Unit testing framework | Eclipse Public License 1.0 |
+| [JUnit](https://docs.junit.org/current/user-guide/) | Unit testing framework | Eclipse Public License 1.0 |
| [Mockito](https://github.com/mockito/mockito) | Mocking framework | MIT License |
### Runtime Dependencies
diff --git a/pom.xml b/pom.xml
index c6de7ce..af9dfcf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,7 @@
4.8.0
0.8.14
- 3.0.0
+ 3.0.1
itsallcode
https://sonarcloud.io
${git.commit.time}
diff --git a/src/main/java/org/itsallcode/openfasttrace/importer/asciidoc/AsciiDocImporter.java b/src/main/java/org/itsallcode/openfasttrace/importer/asciidoc/AsciiDocImporter.java
index 7d8fd8d..59d3d02 100644
--- a/src/main/java/org/itsallcode/openfasttrace/importer/asciidoc/AsciiDocImporter.java
+++ b/src/main/java/org/itsallcode/openfasttrace/importer/asciidoc/AsciiDocImporter.java
@@ -26,13 +26,12 @@ class AsciiDocImporter implements Importer
private static final String CONTENT_MODEL_SIMPLE = "simple";
- private static final String KEY_ROLE = "role";
+ private static final String NODE_NAME_PARAGRAPH = "paragraph";
- private static final String ROLE_COMMENT = ":comment";
- private static final String ROLE_DESCRIPTION = ":description";
- private static final String ROLE_RATIONALE = ":rationale";
-
- private static final String ROLE_NAME_SPECITEM = "specitem";
+ private static final String ROLE_COMMENT = "comment";
+ private static final String ROLE_DESCRIPTION = "description";
+ private static final String ROLE_RATIONALE = "rationale";
+ private static final String ROLE_SPECITEM = "specitem";
private static final Logger LOG = Logger.getLogger(AsciiDocImporter.class.getName());
@@ -79,6 +78,8 @@ private Location getLocation(final StructuralNode block)
private Optional getStringContent(final StructuralNode node)
{
+ LOG.finest(() -> "getting content for node [content model: %s, name: %s, location: %s]"
+ .formatted(node.getContentModel(), node.getNodeName(), getLocation(node)));
switch (node.getContentModel())
{
case CONTENT_MODEL_SIMPLE:
@@ -139,38 +140,52 @@ private void processSpecificationItemTags(final StructuralNode block)
// [impl->dsn~adoc-specification-item-description~1]
private void processSpecificationItemDescription(final StructuralNode block)
{
- final Optional descriptionBlock = block.findBy(Map.of(KEY_ROLE, ROLE_DESCRIPTION)).stream()
+ final Optional descriptionBlock = block.getBlocks().stream()
+ .filter(node -> !ROLE_RATIONALE.equals(node.getRole()))
+ .filter(node -> !ROLE_COMMENT.equals(node.getRole()))
+ .filter(node -> ROLE_DESCRIPTION.equals(node.getRole())
+ || NODE_NAME_PARAGRAPH.equals(node.getNodeName()))
.findFirst();
- descriptionBlock
- .or(() -> block.getBlocks().stream()
- .filter(node -> !"rationale".equals(node.getRole()) && !"comment".equals(node.getRole()))
- .findFirst())
- .flatMap(this::getStringContent)
- .ifPresent(listener::appendDescription);
+
+ descriptionBlock.flatMap(this::getStringContent)
+ .ifPresent(description -> {
+ LOG.finest(() -> "adding description to spec item: %s".formatted(description));
+ listener.appendDescription(description);
+ });
}
// [impl->dsn~adoc-specification-item-rationale~1]
private void processSpecificationItemRationale(final StructuralNode block)
{
- block.findBy(Map.of(KEY_ROLE, ROLE_RATIONALE)).stream().findFirst()
+ block.getBlocks().stream()
+ .filter(node -> ROLE_RATIONALE.equals(node.getRole()))
+ .findFirst()
.flatMap(this::getStringContent)
- .ifPresent(listener::appendRationale);
+ .ifPresent(rationale -> {
+ LOG.finest(() -> "adding rationale to spec item: %s".formatted(rationale));
+ listener.appendRationale(rationale);
+ });
}
// [impl->dsn~adoc-specification-item-comment~1]
private void processSpecificationItemComment(final StructuralNode block)
{
- block.findBy(Map.of(KEY_ROLE, ROLE_COMMENT)).stream().findFirst()
+ block.getBlocks().stream()
+ .filter(node -> ROLE_COMMENT.equals(node.getRole()))
+ .findFirst()
.flatMap(this::getStringContent)
- .ifPresent(listener::appendComment);
+ .ifPresent(comment -> {
+ LOG.finest(() -> "adding comment to spec item: %s".formatted(comment));
+ listener.appendComment(comment);
+ });
}
private void processSpecificationItemBlock(final String sid, final StructuralNode block)
{
final SpecificationItemId specItemId = new SpecificationItemId.Builder(sid).build();
final Location location = getLocation(block);
- LOG.fine(() -> String.format("adding specification item [ID: %s, location: %s]", specItemId,
- location));
+ LOG.fine(() -> String.format("adding specification item [ID: %s, block name: %s, location: %s]", specItemId,
+ block.getNodeName(), location));
this.listener.beginSpecificationItem();
this.listener.setId(specItemId);
@@ -220,8 +235,8 @@ private void processForwardingBlock(final String skippedType, final StructuralNo
// [impl->dsn~adoc-artifact-forwarding-notation~1]
private void processSpecificationItem(final StructuralNode block)
{
- LOG.fine(() -> String.format("found specitem block [id: %s]",
- block.getId()));
+ LOG.fine(() -> String.format("found specitem block [id: %s, name: %s]",
+ block.getId(), block.getNodeName()));
Optional.ofNullable(block.getAttribute(ATTRIBUTE_OFT_SID))
.filter(String.class::isInstance)
@@ -248,7 +263,7 @@ private void processDocument(final Document document)
private void processBlock(final StructuralNode block)
{
- if (block.hasRole(ROLE_NAME_SPECITEM))
+ if (block.hasRole(ROLE_SPECITEM))
{
processSpecificationItem(block);
}
@@ -280,7 +295,7 @@ private void processTable(final Table table)
private Document parseAsciiDoc()
{
final Options options = Options.builder().sourcemap(true).build();
- try (final Asciidoctor asciidoctor = Asciidoctor.Factory.create())
+ try (Asciidoctor asciidoctor = Asciidoctor.Factory.create())
{
if (this.file != null)
{
diff --git a/src/test/java/org/itsallcode/openfasttrace/importer/asciidoc/AsciiDocImporterTest.java b/src/test/java/org/itsallcode/openfasttrace/importer/asciidoc/AsciiDocImporterTest.java
index 8400825..956abac 100644
--- a/src/test/java/org/itsallcode/openfasttrace/importer/asciidoc/AsciiDocImporterTest.java
+++ b/src/test/java/org/itsallcode/openfasttrace/importer/asciidoc/AsciiDocImporterTest.java
@@ -65,7 +65,7 @@ void testImporterIgnoresSpecItemWithoutId(final String content)
@ValueSource(strings =
{
"""
- # Spec
+ # Spec 1
[.specitem, oft-sid="dsn~detail-design~1", oft-depends="dsn~grand-design~1, arch~general-constraints~1", oft-needs="impl, utest", oft-covers="req~first-requirement~1, req~second-requirement~1", oft-tags="Priority1, OtherComponent"]
## A Requirement
@@ -79,7 +79,7 @@ void testImporterIgnoresSpecItemWithoutId(final String content)
A comment
""",
"""
- # Spec
+ # Spec 2
[.specitem, oft-sid="dsn~detail-design~1", oft-depends="dsn~grand-design~1, arch~general-constraints~1", oft-needs="impl, utest", oft-covers="req~first-requirement~1, req~second-requirement~1", oft-tags="Priority1, OtherComponent"]
## A Requirement
@@ -94,7 +94,7 @@ void testImporterIgnoresSpecItemWithoutId(final String content)
A comment
""",
"""
- # Spec
+ # Spec 3
.A Requirement
[.specitem, oft-sid="dsn~detail-design~1", oft-depends="dsn~grand-design~1, arch~general-constraints~1", oft-needs="impl, utest", oft-covers="req~first-requirement~1, req~second-requirement~1", oft-tags="Priority1, OtherComponent"]
@@ -110,7 +110,7 @@ void testImporterIgnoresSpecItemWithoutId(final String content)
====
""",
"""
- # Spec
+ # Spec 4
.A Requirement
[.specitem, oft-sid="dsn~detail-design~1", oft-depends="dsn~grand-design~1, arch~general-constraints~1", oft-needs="impl, utest", oft-covers="req~first-requirement~1, req~second-requirement~1", oft-tags="Priority1, OtherComponent"]