From 344782035921aba8ac9c5f9c86f2a5f51e0f2f74 Mon Sep 17 00:00:00 2001 From: Ryan McNally Date: Fri, 7 Jun 2024 10:20:31 +0100 Subject: [PATCH] automated bom --- bom/pom.xml | 86 ++++++++++-------- .../com/mastercard/test/flow/doc/BomTest.java | 87 +++++++++++++++++++ .../com/mastercard/test/flow/doc/PomData.java | 38 +++++++- .../test/flow/doc/ReadmeInterlinkTest.java | 2 +- message/message-core/pom.xml | 1 + message/pom.xml | 12 +-- 6 files changed, 175 insertions(+), 51 deletions(-) create mode 100644 doc/src/test/java/com/mastercard/test/flow/doc/BomTest.java diff --git a/bom/pom.xml b/bom/pom.xml index 91771d9630..deecb3d0ff 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -12,121 +12,131 @@ - - ${project.groupId} + com.mastercard.test.flow api ${project.version} - ${project.groupId} - builder + com.mastercard.test.flow + assert-core ${project.version} - ${project.groupId} - message-core + com.mastercard.test.flow + assert-filter ${project.version} - ${project.groupId} - message-text + com.mastercard.test.flow + assert-junit4 ${project.version} - ${project.groupId} - message-json + com.mastercard.test.flow + assert-junit5 ${project.version} - ${project.groupId} - message-http + com.mastercard.test.flow + builder ${project.version} - ${project.groupId} - message-sql + com.mastercard.test.flow + coppice ${project.version} - ${project.groupId} - message-web + com.mastercard.test.flow + duct ${project.version} - ${project.groupId} - message-xml + com.mastercard.test.flow + message-core ${project.version} - ${project.groupId} - model + com.mastercard.test.flow + message-http ${project.version} - ${project.groupId} - validation-core + com.mastercard.test.flow + message-json ${project.version} - ${project.groupId} - validation-junit4 + com.mastercard.test.flow + message-sql ${project.version} - ${project.groupId} - validation-junit5 + com.mastercard.test.flow + message-text ${project.version} - ${project.groupId} - coppice + com.mastercard.test.flow + message-web ${project.version} - ${project.groupId} - report-core + com.mastercard.test.flow + message-xml ${project.version} - ${project.groupId} - assert-filter + com.mastercard.test.flow + model ${project.version} - ${project.groupId} - assert-core + com.mastercard.test.flow + report-core ${project.version} - ${project.groupId} - assert-junit4 + com.mastercard.test.flow + report-ng ${project.version} - ${project.groupId} - assert-junit5 + com.mastercard.test.flow + validation-core ${project.version} + + com.mastercard.test.flow + validation-junit4 + ${project.version} + + + + com.mastercard.test.flow + validation-junit5 + ${project.version} + diff --git a/doc/src/test/java/com/mastercard/test/flow/doc/BomTest.java b/doc/src/test/java/com/mastercard/test/flow/doc/BomTest.java new file mode 100644 index 0000000000..3fc5c34a54 --- /dev/null +++ b/doc/src/test/java/com/mastercard/test/flow/doc/BomTest.java @@ -0,0 +1,87 @@ +package com.mastercard.test.flow.doc; + +import static java.util.stream.Collectors.joining; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import com.mastercard.test.flow.doc.PomData.DepData; + +/** + * Ensures that our Bill of Materials pom contains all of the artifacts in this + * project + */ +class BomTest { + + @Test + void check() { + PomData root = new PomData( null, Paths.get( "..", "pom.xml" ) ); + + PomData bom = root.modules() + .filter( m -> "bom".equals( m.artifactId() ) ) + .findAny() + .orElseThrow( () -> new IllegalStateException( "Failed to find bom" ) ); + + List artifacts = collectArtifacts( root, new ArrayList<>() ); + + // these are not releasable artifacts, so no point in managing them + artifacts.removeIf( pom -> pom.groupId().endsWith( "example" ) + || "aggregator".equals( pom.artifactId() ) + || "doc".equals( pom.artifactId() ) ); + // no self-reference please + artifacts.remove( bom ); + + String expected = artifacts.stream() + .sorted( Comparator.comparing( PomData::artifactId ) ) + .map( artifact -> String.format( "" + + "\t\t\t\n" + + "\t\t\t\t%s\n" + + "\t\t\t\t%s\n" + + "\t\t\t\t%s\n" + + "\t\t\t", + artifact.groupId(), artifact.artifactId(), artifact.version() ) ) + .collect( joining( + "\n\n", + "" + + "\t\n" + + "\t\t\n", + "" + + "\n" + + "\t\t\n" + + "\t" ) ); + + String actual = bom.dependencyManagement() + .sorted( Comparator.comparing( DepData::artifactId ) ) + .map( dep -> String.format( "" + + "\t\t\t\n" + + "\t\t\t\t%s\n" + + "\t\t\t\t%s\n" + + "\t\t\t\t%s\n" + + "\t\t\t", + dep.groupId(), dep.artifactId(), dep.version() ) ) + .collect( joining( + "\n\n", + "" + + "\t\n" + + "\t\t\n", + "" + + "\n" + + "\t\t\n" + + "\t" ) ); + + assertEquals( expected, actual ); + } + + private static List collectArtifacts( PomData pom, List modules ) { + if( "jar".equals( pom.packaging() ) ) { + modules.add( pom ); + } + pom.modules().forEach( child -> collectArtifacts( child, modules ) ); + return modules; + } +} diff --git a/doc/src/test/java/com/mastercard/test/flow/doc/PomData.java b/doc/src/test/java/com/mastercard/test/flow/doc/PomData.java index a6e79d1c4d..bc6a352351 100644 --- a/doc/src/test/java/com/mastercard/test/flow/doc/PomData.java +++ b/doc/src/test/java/com/mastercard/test/flow/doc/PomData.java @@ -30,11 +30,13 @@ class PomData { private final Path dirPath; private final String groupId; private final String artifactId; + private final String version; private final String packaging; private final String name; private final String description; private final List modules; private final List dependencies; + private final List dependencyManagement; /** * @param parent The parent pom, or null @@ -54,6 +56,9 @@ class PomData { groupId = Optional.ofNullable( xpath.evaluate( "/project/groupId", doc ) ) .filter( s -> !s.isEmpty() ) .orElseGet( () -> parent.groupId() ); + version = Optional.of( xpath.evaluate( "/project/version", doc ) ) + .filter( s -> !s.isEmpty() ) + .orElse( "${project.version}" ); packaging = xpath.evaluate( "/project/packaging", doc ); name = xpath.evaluate( "/project/name", doc ); description = xpath.evaluate( "/project/description", doc ); @@ -75,6 +80,14 @@ class PomData { for( int i = 0; i < dnl.getLength(); i++ ) { dependencies.add( new DepData( xpath, dnl.item( i ), this ) ); } + + dependencyManagement = new ArrayList<>(); + NodeList dpnl = (NodeList) xpath.evaluate( + "/project/dependencyManagement/dependencies/dependency", doc, + XPathConstants.NODESET ); + for( int i = 0; i < dpnl.getLength(); i++ ) { + dependencyManagement.add( new DepData( xpath, dpnl.item( i ), this ) ); + } } catch( ParserConfigurationException | SAXException @@ -112,10 +125,17 @@ public String groupId() { return groupId; } + /** + * @return The project's version string + */ + public String version() { + return version; + } + /** * @return The project's packaging value */ - public String getPackaging() { + public String packaging() { return packaging; } @@ -140,6 +160,13 @@ public Stream dependencies() { return dependencies.stream(); } + /** + * @return managed dependencies + */ + public Stream dependencyManagement() { + return dependencyManagement.stream(); + } + /** * @return Project name */ @@ -175,6 +202,7 @@ public String toString() { public static class DepData { private final String groupId; private final String artifactId; + private final String version; private final String scope; private final boolean optional; @@ -193,6 +221,7 @@ public static class DepData { groupId = gd; } artifactId = xpath.evaluate( "artifactId", n ); + version = xpath.evaluate( "version", n ); scope = Optional.ofNullable( xpath.evaluate( "scope", n ) ) .filter( s -> !s.isEmpty() ) .orElse( "compile" ); @@ -215,6 +244,13 @@ public String artifactId() { return artifactId; } + /** + * @return The dependency version string + */ + public String version() { + return version; + } + /** * @return commbined group and artifact IDs */ diff --git a/doc/src/test/java/com/mastercard/test/flow/doc/ReadmeInterlinkTest.java b/doc/src/test/java/com/mastercard/test/flow/doc/ReadmeInterlinkTest.java index a9ed70d761..b9e424decc 100644 --- a/doc/src/test/java/com/mastercard/test/flow/doc/ReadmeInterlinkTest.java +++ b/doc/src/test/java/com/mastercard/test/flow/doc/ReadmeInterlinkTest.java @@ -80,7 +80,7 @@ private static String parentLink( PomData pom ) { .collect( toSet() ); private static String javadocBadge( PomData pom ) { - if( "jar".equals( pom.getPackaging() ) && !NO_JAVADOC.contains( pom.artifactId() ) ) { + if( "jar".equals( pom.packaging() ) && !NO_JAVADOC.contains( pom.artifactId() ) ) { return String.format( "" + "[" + "![javadoc](https://javadoc.io/badge2/%s/%s/javadoc.svg)" diff --git a/message/message-core/pom.xml b/message/message-core/pom.xml index 16c1975b0c..813d6e3caf 100644 --- a/message/message-core/pom.xml +++ b/message/message-core/pom.xml @@ -14,6 +14,7 @@ ${project.groupId} api + ${project.version} diff --git a/message/pom.xml b/message/pom.xml index 5832368e8e..1745063124 100644 --- a/message/pom.xml +++ b/message/pom.xml @@ -20,20 +20,10 @@ message-xml - - - - ${project.groupId} - api - ${project.version} - - - - - + net.revelc.code.formatter