From e73286e4bac9a894a31c0a7e8409f98de22a875a Mon Sep 17 00:00:00 2001 From: Swell <5782559+sultan@users.noreply.github.com> Date: Tue, 18 Oct 2022 11:34:52 +0200 Subject: [PATCH] Refactoring Reports classes --- .../AbstractVersionsReportRenderer.java | 311 ++++++++---------- .../DependencyUpdatesReportRenderer.java | 1 + .../PluginUpdatesReportRenderer.java | 169 ++-------- .../PropertyUpdatesReportRenderer.java | 285 +++++----------- .../reporting/VersionsReportRendererBase.java | 83 +++++ 5 files changed, 323 insertions(+), 526 deletions(-) diff --git a/src/main/java/org/codehaus/mojo/versions/reporting/AbstractVersionsReportRenderer.java b/src/main/java/org/codehaus/mojo/versions/reporting/AbstractVersionsReportRenderer.java index 2193ddef18..b08d3a7b67 100644 --- a/src/main/java/org/codehaus/mojo/versions/reporting/AbstractVersionsReportRenderer.java +++ b/src/main/java/org/codehaus/mojo/versions/reporting/AbstractVersionsReportRenderer.java @@ -19,7 +19,6 @@ * under the License. */ -import java.util.Arrays; import java.util.Locale; import java.util.Map; @@ -58,12 +57,15 @@ public abstract class AbstractVersionsReportRenderer extends VersionsReportRe */ protected T model; - protected ArtifactVersionsCache newestUpdateCache + protected final ArtifactVersionsCache newestUpdateCache = new ArtifactVersionsCache( AbstractVersionDetails::getNewestUpdate ); - protected ArtifactVersionsCache allUpdatesCache + protected final ArtifactVersionsCache allUpdatesCache = new ArtifactVersionsCache( AbstractVersionDetails::getAllUpdates ); + protected final SinkEventAttributes headerAttributes + = new SinkEventAttributeSet( SinkEventAttributes.WIDTH, "30%" ); + /** * Constructor to be called by the dependency injection framework * @param i18n i18n object to be injected @@ -143,18 +145,17 @@ protected void renderOverviewTableRow( Q stats ) renderStatRow( "report.overview.numNewerMajorAvailable", stats.getMajor(), false ); } + /** + * Renders one table row for the given statistics. + * @param textKey the key of the text to be rendered. + * @param statCount the number of artifacts with the given stat. + * @param forceSuccessIcon if true, the success icon will be rendered regardless. + */ protected void renderStatRow( String textKey, int statCount, boolean forceSuccessIcon ) { sink.tableRow(); sink.tableCell(); - if ( statCount == 0 || forceSuccessIcon ) - { - renderSuccessIcon(); - } - else - { - renderWarningIcon(); - } + renderIcon( statCount == 0 || forceSuccessIcon ); sink.tableCell_(); sink.tableCell(); sink.text( getText( textKey ) ); @@ -165,6 +166,22 @@ protected void renderStatRow( String textKey, int statCount, boolean forceSucces sink.tableRow_(); } + /** + * Renders the success or warning icon. + * @param success if true, the success icon will be rendered, otherwise the warning icon will be rendered. + */ + protected void renderIcon( boolean success ) + { + if ( success ) + { + renderSuccessIcon(); + } + else + { + renderWarningIcon(); + } + } + /** * Computes the {@linkplain OverviewStats} object needed to render the summary table row * @param concrete {@linkplain OverviewStats} class @@ -211,101 +228,107 @@ protected void renderSummaryTableHeader( boolean hasScope, boolean hasType ) "report.latestIncremental", "report.latestMinor", "report.latestMajor" ); } - protected void renderSummaryTableRow( Dependency artifact, ArtifactVersions details, - boolean includeScope ) + protected void renderSummaryTableRow( Dependency artifact, ArtifactVersions details, boolean includeScope ) { ArtifactVersion[] allUpdates = allUpdatesCache.get( details, empty() ); boolean upToDate = allUpdates == null || allUpdates.length == 0; sink.tableRow(); + sink.tableCell(); - if ( upToDate ) - { - renderSuccessIcon(); - } - else - { - renderWarningIcon(); - } - sink.tableCell_(); - sink.tableCell(); - sink.text( artifact.getGroupId() ); - sink.tableCell_(); - sink.tableCell(); - sink.text( artifact.getArtifactId() ); - sink.tableCell_(); - sink.tableCell(); - sink.text( artifact.getVersion() ); + renderIcon( upToDate ); sink.tableCell_(); + + renderCells( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion() ); if ( includeScope ) { - sink.tableCell(); - sink.text( artifact.getScope() ); - sink.tableCell_(); + renderCell( artifact.getScope() ); } - sink.tableCell(); - sink.text( artifact.getClassifier() ); - sink.tableCell_(); - sink.tableCell(); - sink.text( artifact.getType() ); - sink.tableCell_(); + renderCells( artifact.getClassifier(), artifact.getType() ); + renderNewestVersions( details ); - sink.tableCell(); - if ( newestUpdateCache.get( details, of( SUBINCREMENTAL ) ) != null ) - { - safeBold(); - sink.text( newestUpdateCache.get( details, of( SUBINCREMENTAL ) ).toString() ); - safeBold_(); - } - sink.tableCell_(); + sink.tableRow_(); + } - sink.tableCell(); - if ( newestUpdateCache.get( details, of( INCREMENTAL ) ) != null ) + /** + * Renders the newest versions for the given artifact. + * @param details the artifact for which to render the newest versions. + */ + protected void renderNewestVersions( AbstractVersionDetails details ) + { + renderBoldCell( newestUpdateCache.get( details, of( SUBINCREMENTAL ) ) ); + renderBoldCell( newestUpdateCache.get( details, of( INCREMENTAL ) ) ); + renderBoldCell( newestUpdateCache.get( details, of( MINOR ) ) ); + renderBoldCell( newestUpdateCache.get( details, of( MAJOR ) ) ); + } + + protected void renderDependencyDetailTable( Dependency artifact, ArtifactVersions details, boolean includeScope ) + { + ArtifactVersion[] allUpdates = allUpdatesCache.get( details, empty() ); + boolean upToDate = allUpdates == null || allUpdates.length == 0; + + sink.table(); + sink.tableRows( new int[] { Sink.JUSTIFY_RIGHT, Sink.JUSTIFY_LEFT }, false ); + + renderTwoCellsRow( "report.status", () -> renderStatus( details ) ); + renderTwoCellsRow( "report.groupId", artifact.getGroupId() ); + renderTwoCellsRow( "report.artifactId", artifact.getArtifactId() ); + renderTwoCellsRow( "report.currentVersion", artifact.getVersion() ); + if ( includeScope ) { - safeBold(); - sink.text( newestUpdateCache.get( details, of( INCREMENTAL ) ).toString() ); - safeBold_(); + renderTwoCellsRow( "report.scope", artifact.getScope() ); } - sink.tableCell_(); - - sink.tableCell(); - if ( newestUpdateCache.get( details, of( MINOR ) ) != null ) + renderTwoCellsRow( "report.classifier", artifact.getClassifier() ); + renderTwoCellsRow( "report.type", artifact.getType() ); + if ( !upToDate ) { - safeBold(); - sink.text( newestUpdateCache.get( details, of( MINOR ) ).toString() ); - safeBold_(); + renderTwoCellsRow( "report.updateVersions", () -> renderVersions( allUpdates, details ) ); } - sink.tableCell_(); + sink.tableRows_(); + sink.table_(); + } + + /** + * Renders a row of two cells, the first cell being an header and the second cell being a non-header cell. + * @param textKey the key of the text to be rendered. + * @param textValue the value of the text to be rendered. + */ + protected void renderTwoCellsRow( String textKey, String textValue ) + { + sink.tableRow(); + sink.tableHeaderCell( headerAttributes ); + sink.text( getText( textKey ) ); + sink.tableHeaderCell_(); sink.tableCell(); - if ( newestUpdateCache.get( details, of( MAJOR ) ) != null ) - { - safeBold(); - sink.text( newestUpdateCache.get( details, of( MAJOR ) ).toString() ); - safeBold_(); - } + sink.text( textValue ); sink.tableCell_(); - sink.tableRow_(); } - @SuppressWarnings( "checkstyle:MethodLength" ) - protected void renderDependencyDetailTable( Dependency artifact, ArtifactVersions details, boolean includeScope ) + /** + * Renders a row of two cells, the first cell being an header and the second cell being a non-header cell. + * @param textKey the key of the text to be rendered. + * @param runnable the runnable to be executed to render the second cell content. + */ + protected void renderTwoCellsRow( String textKey, Runnable runnable ) { - ArtifactVersion[] allUpdates = allUpdatesCache.get( details, empty() ); - boolean upToDate = allUpdates == null || allUpdates.length == 0; - - final SinkEventAttributes headerAttributes = new SinkEventAttributeSet(); - headerAttributes.addAttribute( SinkEventAttributes.WIDTH, "70%" ); - final SinkEventAttributes cellAttributes = new SinkEventAttributeSet(); - headerAttributes.addAttribute( SinkEventAttributes.WIDTH, "30%" ); - sink.table(); - sink.tableRows( new int[] { Sink.JUSTIFY_RIGHT, Sink.JUSTIFY_LEFT }, false ); sink.tableRow(); sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.status" ) ); + sink.text( getText( textKey ) ); sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); + sink.tableCell(); + runnable.run(); + sink.tableCell_(); + sink.tableRow_(); + } + + /** + * Renders the status of the given artifact. + * @param details the artifact for which to render the status. + */ + protected void renderStatus( AbstractVersionDetails details ) + { if ( newestUpdateCache.get( details, of( SUBINCREMENTAL ) ) != null ) { renderWarningIcon(); @@ -336,111 +359,44 @@ else if ( newestUpdateCache.get( details, of( MAJOR ) ) != null ) sink.nonBreakingSpace(); sink.text( getText( "report.noUpdatesAvailable" ) ); } - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.groupId" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( artifact.getGroupId() ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.artifactId" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( artifact.getArtifactId() ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.currentVersion" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( artifact.getVersion() ); - sink.tableCell_(); - sink.tableRow_(); - if ( includeScope ) - { - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.scope" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( artifact.getScope() ); - sink.tableCell_(); - sink.tableRow_(); - } - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.classifier" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( artifact.getClassifier() ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.type" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( artifact.getType() ); - sink.tableCell_(); - sink.tableRow_(); - if ( !upToDate ) + } + + /** + * Renders the list of versions of the given artifact. + * @param allUpdates the list of all updates available for the given artifact. + * @param details the artifact for which to render the versions. + */ + protected void renderVersions( ArtifactVersion[] allUpdates, ArtifactVersions details ) + { + for ( int i = 0; i < allUpdates.length; i++ ) { - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.updateVersions" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - for ( int i = 0; i < allUpdates.length; i++ ) + if ( i > 0 ) + { + sink.lineBreak(); + } + String label = getLabel( allUpdates[i], details ); + if ( label != null ) + { + safeBold(); + } + sink.text( allUpdates[i].toString() ); + if ( label != null ) { - if ( i > 0 ) - { - sink.lineBreak(); - } - String label = getLabel( allUpdates[i], details ); - if ( label != null ) - { - safeBold(); - } - sink.text( allUpdates[i].toString() ); - if ( label != null ) - { - safeBold_(); - sink.nonBreakingSpace(); - safeItalic(); - sink.text( label ); - safeItalic_(); - } + safeBold_(); + sink.nonBreakingSpace(); + safeItalic(); + sink.text( label ); + safeItalic_(); } - sink.tableCell_(); - sink.tableRow_(); } - sink.tableRows_(); - sink.table_(); } /** - * Renders a table header containing elements denoted by the given keys - * @param keys variable argument list containing keys of the property file to retrieve the - * headers from + * Returns a text label to describe if the given version is a major, minor, incremental or subincremental update. + * @param version the version to describe. + * @param details the artifact for which to render the versions. + * @return a text label to describe if the given version is a major, minor, incremental or subincremental update. */ - protected void renderTableHeaderCells( String... keys ) - { - Arrays.stream( keys ) - .map( this::getText ) - .forEachOrdered( str -> - { - sink.tableHeaderCell(); - sink.text( str ); - sink.tableHeaderCell_(); - } ); - } - protected String getLabel( ArtifactVersion version, AbstractVersionDetails details ) { @@ -466,4 +422,5 @@ protected String getLabel( ArtifactVersion version, AbstractVersionDetails detai return null; } + } diff --git a/src/main/java/org/codehaus/mojo/versions/reporting/DependencyUpdatesReportRenderer.java b/src/main/java/org/codehaus/mojo/versions/reporting/DependencyUpdatesReportRenderer.java index 2d8948280a..8072e31192 100644 --- a/src/main/java/org/codehaus/mojo/versions/reporting/DependencyUpdatesReportRenderer.java +++ b/src/main/java/org/codehaus/mojo/versions/reporting/DependencyUpdatesReportRenderer.java @@ -98,4 +98,5 @@ protected void renderDependencyDetail( Dependency artifact, ArtifactVersions det renderDependencyDetailTable( artifact, details, true ); sink.section2_(); } + } diff --git a/src/main/java/org/codehaus/mojo/versions/reporting/PluginUpdatesReportRenderer.java b/src/main/java/org/codehaus/mojo/versions/reporting/PluginUpdatesReportRenderer.java index 6d0713cd41..d134c6fed9 100644 --- a/src/main/java/org/codehaus/mojo/versions/reporting/PluginUpdatesReportRenderer.java +++ b/src/main/java/org/codehaus/mojo/versions/reporting/PluginUpdatesReportRenderer.java @@ -26,10 +26,9 @@ import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.doxia.sink.Sink; -import org.apache.maven.doxia.sink.SinkEventAttributes; -import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet; import org.apache.maven.model.Dependency; import org.codehaus.mojo.versions.PluginUpdatesDetails; +import org.codehaus.mojo.versions.api.AbstractVersionDetails; import org.codehaus.mojo.versions.api.ArtifactVersions; import org.codehaus.mojo.versions.reporting.model.PluginUpdatesModel; import org.codehaus.plexus.i18n.I18N; @@ -46,7 +45,6 @@ */ public class PluginUpdatesReportRenderer extends AbstractVersionsReportRenderer { - public PluginUpdatesReportRenderer( I18N i18n, Sink sink, Locale locale, String bundleName, PluginUpdatesModel model ) { @@ -152,85 +150,22 @@ protected void renderSummaryTableRow( Dependency artifact, PluginUpdatesDetails boolean upToDate = !details.isUpdateAvailable(); sink.tableRow(); - sink.tableCell(); - if ( upToDate ) - { - renderSuccessIcon(); - } - else - { - renderWarningIcon(); - } - sink.tableCell_(); - sink.tableCell(); - sink.text( artifact.getGroupId() ); - sink.tableCell_(); - sink.tableCell(); - sink.text( artifact.getArtifactId() ); - sink.tableCell_(); - sink.tableCell(); - if ( !details.isArtifactUpdateAvailable() ) - { - safeBold(); - } - sink.text( artifact.getVersion() ); - if ( !details.isArtifactUpdateAvailable() ) - { - safeBold_(); - } - sink.tableCell_(); sink.tableCell(); - if ( newestUpdateCache.get( details, of( SUBINCREMENTAL ) ) != null ) - { - safeBold(); - sink.text( newestUpdateCache.get( details, of( SUBINCREMENTAL ) ).toString() ); - safeBold_(); - } + renderIcon( upToDate ); sink.tableCell_(); - sink.tableCell(); - if ( newestUpdateCache.get( details, of( INCREMENTAL ) ) != null ) - { - safeBold(); - sink.text( newestUpdateCache.get( details, of( INCREMENTAL ) ).toString() ); - safeBold_(); - } - sink.tableCell_(); + renderCells( artifact.getGroupId(), artifact.getArtifactId() ); + renderBoldCell( upToDate, artifact.getVersion() ); + renderNewestVersions( details ); sink.tableCell(); - if ( newestUpdateCache.get( details, of( MINOR ) ) != null ) - { - safeBold(); - sink.text( newestUpdateCache.get( details, of( MINOR ) ).toString() ); - safeBold_(); - } - sink.tableCell_(); - - sink.tableCell(); - if ( newestUpdateCache.get( details, of( MAJOR ) ) != null ) - { - safeBold(); - sink.text( newestUpdateCache.get( details, of( MAJOR ) ).toString() ); - safeBold_(); - } - sink.tableCell_(); - - sink.tableCell(); - if ( details.isDependencyUpdateAvailable() ) - { - renderWarningIcon(); - } - else - { - renderSuccessIcon(); - } + renderIcon( !details.isDependencyUpdateAvailable() ); sink.tableCell_(); sink.tableRow_(); } - @SuppressWarnings( "checkstyle:MethodLength" ) private void renderPluginDetail( Dependency artifact, PluginUpdatesDetails details ) { sink.section2(); @@ -260,21 +195,32 @@ private void renderPluginDetail( Dependency artifact, PluginUpdatesDetails detai private void renderPluginDetailTable( PluginUpdatesDetails details ) { - // warning: using caches here may break plugin report + // warning: using caches here might break plugin report ArtifactVersion[] allUpdates = details.getAllUpdates( empty() ); boolean upToDate = allUpdates == null || allUpdates.length == 0; - final SinkEventAttributes headerAttributes = new SinkEventAttributeSet(); - headerAttributes.addAttribute( SinkEventAttributes.WIDTH, "70%" ); - final SinkEventAttributes cellAttributes = new SinkEventAttributeSet(); - headerAttributes.addAttribute( SinkEventAttributes.WIDTH, "30%" ); sink.table(); sink.tableRows( new int[] { Sink.JUSTIFY_RIGHT, Sink.JUSTIFY_LEFT }, false ); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.status" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); + + renderTwoCellsRow( "report.status", () -> renderStatus( details ) ); + renderTwoCellsRow( "report.groupId", details.getGroupId() ); + renderTwoCellsRow( "report.artifactId", details.getArtifactId() ); + renderTwoCellsRow( "report.currentVersion", details.getVersion() ); + if ( !upToDate ) + { + renderTwoCellsRow( "report.updateVersions", () -> renderVersions( allUpdates, details ) ); + } + + sink.tableRows_(); + sink.table_(); + } + + /** + * {@inheritDoc} + */ + protected void renderStatus( AbstractVersionDetails details ) + { + // warning: using caches here may break plugin report if ( details.getNewestUpdate( of( SUBINCREMENTAL ) ) != null ) { renderWarningIcon(); @@ -305,65 +251,6 @@ else if ( details.getNewestUpdate( of( MAJOR ) ) != null ) sink.nonBreakingSpace(); sink.text( getText( "report.noUpdatesAvailable" ) ); } - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.groupId" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( details.getGroupId() ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.artifactId" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( details.getArtifactId() ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.currentVersion" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( details.getVersion() ); - sink.tableCell_(); - sink.tableRow_(); - if ( !upToDate ) - { - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.updateVersions" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - for ( int i = 0; i < allUpdates.length; i++ ) - { - if ( i > 0 ) - { - sink.lineBreak(); - } - String label = getLabel( allUpdates[i], details ); - if ( label != null ) - { - safeBold(); - } - sink.text( allUpdates[i].toString() ); - if ( label != null ) - { - safeBold_(); - sink.nonBreakingSpace(); - safeItalic(); - sink.text( label ); - safeItalic_(); - } - } - sink.tableCell_(); - sink.tableRow_(); - } - sink.tableRows_(); - sink.table_(); } -} +} diff --git a/src/main/java/org/codehaus/mojo/versions/reporting/PropertyUpdatesReportRenderer.java b/src/main/java/org/codehaus/mojo/versions/reporting/PropertyUpdatesReportRenderer.java index ddb7287e82..04a667010d 100644 --- a/src/main/java/org/codehaus/mojo/versions/reporting/PropertyUpdatesReportRenderer.java +++ b/src/main/java/org/codehaus/mojo/versions/reporting/PropertyUpdatesReportRenderer.java @@ -29,8 +29,6 @@ import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.doxia.sink.Sink; -import org.apache.maven.doxia.sink.SinkEventAttributes; -import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet; import org.codehaus.mojo.versions.Property; import org.codehaus.mojo.versions.api.ArtifactAssociation; import org.codehaus.mojo.versions.api.PropertyVersions; @@ -120,125 +118,56 @@ private void renderPropertySummaryTableRow( Property property, PropertyVersions boolean upToDate = allUpdates == null || allUpdates.length == 0; sink.tableRow(); - sink.tableCell(); - if ( upToDate ) - { - renderSuccessIcon(); - } - else - { - renderWarningIcon(); - } - sink.tableCell_(); - sink.tableCell(); - sink.text( "${" + property.getName() + "}" ); - sink.tableCell_(); - sink.tableCell(); - sink.text( details.getCurrentVersion().toString() ); - sink.tableCell_(); sink.tableCell(); - if ( newestUpdateCache.get( details, of( SUBINCREMENTAL ) ) != null ) - { - safeBold(); - sink.text( newestUpdateCache.get( details, of( SUBINCREMENTAL ) ).toString() ); - safeBold_(); - } + renderIcon( upToDate ); sink.tableCell_(); - sink.tableCell(); - if ( newestUpdateCache.get( details, of( INCREMENTAL ) ) != null ) - { - safeBold(); - sink.text( newestUpdateCache.get( details, of( INCREMENTAL ) ).toString() ); - safeBold_(); - } - sink.tableCell_(); - - sink.tableCell(); - if ( newestUpdateCache.get( details, of( MINOR ) ) != null ) - { - safeBold(); - sink.text( newestUpdateCache.get( details, of( MINOR ) ).toString() ); - safeBold_(); - } - sink.tableCell_(); - - sink.tableCell(); - if ( newestUpdateCache.get( details, of( MAJOR ) ) != null ) - { - safeBold(); - sink.text( newestUpdateCache.get( details, of( MAJOR ) ).toString() ); - safeBold_(); - } - sink.tableCell_(); + renderCells( "${" + property.getName() + "}", details.getCurrentVersion() ); + renderNewestVersions( details ); sink.tableRow_(); } - @SuppressWarnings( "checkstyle:MethodLength" ) protected void renderPropertyDetailTable( Property property, PropertyVersions details ) { ArtifactVersion[] allUpdates = allUpdatesCache.get( details, empty() ); boolean upToDate = allUpdates == null || allUpdates.length == 0; - final SinkEventAttributes headerAttributes = new SinkEventAttributeSet(); - headerAttributes.addAttribute( SinkEventAttributes.WIDTH, "70%" ); - final SinkEventAttributes cellAttributes = new SinkEventAttributeSet(); - headerAttributes.addAttribute( SinkEventAttributes.WIDTH, "30%" ); sink.table(); sink.tableRows( new int[] { Sink.JUSTIFY_RIGHT, Sink.JUSTIFY_LEFT }, false ); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.status" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - if ( newestUpdateCache.get( details, of( SUBINCREMENTAL ) ) != null ) - { - renderWarningIcon(); - sink.nonBreakingSpace(); - sink.text( getText( "report.otherUpdatesAvailable" ) ); - } - else if ( newestUpdateCache.get( details, of( INCREMENTAL ) ) != null ) - { - renderWarningIcon(); - sink.nonBreakingSpace(); - sink.text( getText( "report.incrementalUpdatesAvailable" ) ); - } - else if ( newestUpdateCache.get( details, of( MINOR ) ) != null ) - { - renderWarningIcon(); - sink.nonBreakingSpace(); - sink.text( getText( "report.minorUpdatesAvailable" ) ); - } - else if ( newestUpdateCache.get( details, of( MAJOR ) ) != null ) - { - renderWarningIcon(); - sink.nonBreakingSpace(); - sink.text( getText( "report.majorUpdatesAvailable" ) ); - } - else + + renderTwoCellsRow( "report.status", () -> renderStatus( details ) ); + renderTwoCellsRow( "report.property", "${" + property.getName() + "}" ); + renderTwoCellsRow( "report.associations", () -> renderAssociations( details ) ); + renderTwoCellsRow( "report.currentVersion", details.getCurrentVersion().toString() ); + if ( !upToDate ) { - renderSuccessIcon(); - sink.nonBreakingSpace(); - sink.text( getText( "report.noUpdatesAvailable" ) ); + renderTwoCellsRow( "report.updateVersions", () -> renderVersions( allUpdates, details, property ) ); } - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.property" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( "${" + property.getName() + "}" ); - sink.tableCell_(); - sink.tableRow_(); + renderTwoCellsRow( "report.versionRange", + StringUtils.isEmpty( property.getVersion() ) ? "[,)" : property.getVersion() ); + renderTwoCellsRow( "report.autoLinkDependencies", property.isAutoLinkDependencies() ); + renderTwoCellsRow( "report.banSnapshots", property.isBanSnapshots() ); + renderTwoCellsRow( "report.searchReactor", property.isSearchReactor() ); + renderTwoCellsRow( "report.preferReactor", property.isPreferReactor() ); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.associations" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); + sink.tableRows_(); + sink.table_(); + } + + /** + * Renders a row of two cells, the first cell being an header and the second cell being a non-header cell. + * @param textKey the key of the text to be rendered in the header cell. + * @param b a yes/no value to be rendered in the non-header cell. + */ + private void renderTwoCellsRow( String textKey, boolean b ) + { + renderTwoCellsRow( textKey, getText( b ? "report.yes" : "report.no" ) ); + } + + private void renderAssociations( PropertyVersions details ) + { ArtifactAssociation[] associations = details.getAssociations(); for ( int i = 0; i < associations.length; i++ ) { @@ -248,136 +177,76 @@ else if ( newestUpdateCache.get( details, of( MAJOR ) ) != null ) } sink.text( ArtifactUtils.versionlessKey( associations[i].getArtifact() ) ); } - sink.tableCell_(); - sink.tableRow_(); + } - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.currentVersion" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( details.getCurrentVersion().toString() ); - sink.tableCell_(); - sink.tableRow_(); - if ( !upToDate ) + /** + * Renders the list of versions that are available for the property. + * @param allUpdates the list of all updates available for the property. + * @param details the detailed versions for the property. + * @param property the property. + */ + private void renderVersions( ArtifactVersion[] allUpdates, PropertyVersions details, Property property ) + { + Set rangeVersions = getVersionsInRange( property, details, allUpdates ); + boolean someNotAllowed = false; + for ( int i = 0; i < allUpdates.length; i++ ) { - Set rangeVersions = getVersionsInRange( property, details, allUpdates ); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.updateVersions" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - boolean someNotAllowed = false; - for ( int i = 0; i < allUpdates.length; i++ ) + if ( i > 0 ) { - if ( i > 0 ) - { - sink.lineBreak(); - } - boolean allowed = ( rangeVersions.contains( allUpdates[i].toString() ) ); - String label = getLabel( allUpdates[i], details ); - if ( !allowed ) - { - sink.text( "* " ); - someNotAllowed = true; - } - if ( allowed && label != null ) - { - safeBold(); - } - sink.text( allUpdates[i].toString() ); - if ( label != null ) - { - if ( allowed ) - { - safeBold_(); - } - sink.nonBreakingSpace(); - safeItalic(); - sink.text( label ); - safeItalic_(); - } + sink.lineBreak(); } - if ( someNotAllowed ) + boolean allowed = ( rangeVersions.contains( allUpdates[i].toString() ) ); + String label = getLabel( allUpdates[i], details ); + if ( !allowed ) { - sink.lineBreak(); - sink.lineBreak(); sink.text( "* " ); + someNotAllowed = true; + } + if ( allowed && label != null ) + { + safeBold(); + } + sink.text( allUpdates[i].toString() ); + if ( label != null ) + { + if ( allowed ) + { + safeBold_(); + } + sink.nonBreakingSpace(); safeItalic(); - sink.text( getText( "report.excludedVersion" ) ); + sink.text( label ); safeItalic_(); } - sink.tableCell_(); - sink.tableRow_(); } - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.versionRange" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( StringUtils.isEmpty( property.getVersion() ) ? "[,)" : property.getVersion() ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.autoLinkDependencies" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( property.isAutoLinkDependencies() ? getText( "report.yes" ) : getText( "report.no" ) ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.banSnapshots" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( property.isBanSnapshots() ? getText( "report.yes" ) : getText( "report.no" ) ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.searchReactor" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( property.isSearchReactor() ? getText( "report.yes" ) : getText( "report.no" ) ); - sink.tableCell_(); - sink.tableRow_(); - sink.tableRow(); - sink.tableHeaderCell( headerAttributes ); - sink.text( getText( "report.preferReactor" ) ); - sink.tableHeaderCell_(); - sink.tableCell( cellAttributes ); - sink.text( property.isPreferReactor() ? getText( "report.yes" ) : getText( "report.no" ) ); - sink.tableCell_(); - sink.tableRow_(); - - sink.tableRows_(); - sink.table_(); + if ( someNotAllowed ) + { + sink.lineBreak(); + sink.lineBreak(); + sink.text( "* " ); + safeItalic(); + sink.text( getText( "report.excludedVersion" ) ); + safeItalic_(); + } } - @SuppressWarnings( "checkstyle:MethodLength" ) protected Set getVersionsInRange( Property property, PropertyVersions versions, ArtifactVersion[] artifactVersions ) { - VersionRange range; Set rangeVersions = new HashSet<>(); - ArtifactVersion[] tmp; + ArtifactVersion[] tmp = artifactVersions; if ( property.getVersion() != null ) { try { - range = VersionRange.createFromVersionSpec( property.getVersion() ); + VersionRange range = VersionRange.createFromVersionSpec( property.getVersion() ); tmp = versions.getAllUpdates( range ); } - catch ( InvalidVersionSpecificationException e ) + catch ( InvalidVersionSpecificationException ignored ) { - tmp = artifactVersions; + // ignored } } - else - { - tmp = artifactVersions; - } for ( ArtifactVersion artifactVersion : tmp ) { rangeVersions.add( artifactVersion.toString() ); diff --git a/src/main/java/org/codehaus/mojo/versions/reporting/VersionsReportRendererBase.java b/src/main/java/org/codehaus/mojo/versions/reporting/VersionsReportRendererBase.java index 589cfa8a80..82472b4eec 100644 --- a/src/main/java/org/codehaus/mojo/versions/reporting/VersionsReportRendererBase.java +++ b/src/main/java/org/codehaus/mojo/versions/reporting/VersionsReportRendererBase.java @@ -20,6 +20,7 @@ * under the License. */ +import java.util.Arrays; import java.util.Locale; import org.apache.maven.artifact.versioning.ArtifactVersion; @@ -142,4 +143,86 @@ protected void safeItalic_() } } + /** + * Renders a table header containing elements denoted by the given keys + * @param keys variable argument list containing keys of the property file to retrieve the + * headers from + */ + protected void renderTableHeaderCells( String... keys ) + { + Arrays.stream( keys ) + .map( this::getText ) + .forEachOrdered( str -> + { + sink.tableHeaderCell(); + sink.text( str ); + sink.tableHeaderCell_(); + } ); + } + + /** + * Renders a bold table cell containing the given text. + * @param object the text to be rendered, or null for an empty cell. + */ + protected void renderBoldCell( Object object ) + { + renderBoldCell( true, object ); + } + /** + * Renders a table cell containing the given text. + * @param object the text to be rendered, or null for an empty cell. + */ + protected void renderCell( Object object ) + { + renderBoldCell( false, object ); + } + /** + * Renders multiple cells containing the given texts. + * @param objects the texts to be rendered, null for empty cells. + */ + protected void renderCells( Object... objects ) + { + for ( Object object : objects ) + { + renderBoldCell( false, object ); + } + } + + /** + * Renders a bold table cell containing the given text. + * @param bold true to render the cell in bold, false otherwise. + * @param object the text to be rendered, or null for an empty cell. + */ + protected void renderBoldCell( boolean bold, Object object ) + { + sink.tableCell(); + renderBoldText( bold, object ); + sink.tableCell_(); + } + + /** + * Renders a bold text. + * @param bold true to render the text in bold, false otherwise. + * @param object the text to be rendered, or null for an empty cell. + */ + protected void renderBoldText( boolean bold, Object object ) + { + if ( object != null ) + { + String text = object.toString(); + if ( !text.isEmpty() ) + { + if ( bold ) + { + safeBold(); + } + sink.text( text ); + if ( bold ) + { + safeBold_(); + } + } + } + } + }