diff --git a/pom.xml b/pom.xml
index 27e525abfa..f40b44df50 100644
--- a/pom.xml
+++ b/pom.xml
@@ -313,7 +313,7 @@
modello-maven-plugin
- generate-sources
+ generate-rule
generate-sources
@@ -323,6 +323,29 @@
java
+
+
+ src/main/mdo/rule.mdo
+
+ 2.0.0
+
+
+
+ generate-reporting
+ generate-sources
+
+
+ xpp3-writer
+
+ java
+
+
+
+ src/main/mdo/dependency-updates-report.mdo
+ src/main/mdo/plugin-updates-report.mdo
+
+ 2.0.0
+
site-doc
@@ -345,6 +368,8 @@
src/main/mdo/rule.mdo
+ src/main/mdo/dependency-updates-report.mdo
+ src/main/mdo/plugin-updates-report.mdo
2.0.0
@@ -392,6 +417,8 @@
org.codehaus.mojo.versions.model,
org.codehaus.mojo.versions.model.io.xpp3
+ org.codehaus.mojo.versions.reporting.model,
+ org.codehaus.mojo.versions.reporting.model.io.xpp3,
diff --git a/src/it/it-dependency-updates-report-issue-755/invoker.properties b/src/it/it-dependency-updates-report-issue-755/invoker.properties
new file mode 100644
index 0000000000..09f3f7db01
--- /dev/null
+++ b/src/it/it-dependency-updates-report-issue-755/invoker.properties
@@ -0,0 +1,2 @@
+invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:dependency-updates-report
+invoker.mavenOpts = -DdependencyUpdatesReportFormats=xml
diff --git a/src/it/it-dependency-updates-report-issue-755/pom.xml b/src/it/it-dependency-updates-report-issue-755/pom.xml
new file mode 100644
index 0000000000..c75353ed03
--- /dev/null
+++ b/src/it/it-dependency-updates-report-issue-755/pom.xml
@@ -0,0 +1,16 @@
+
+ 4.0.0
+ localhost
+ dummy-artifact
+ 1.0.0-SNAPSHOT
+
+
+
+ localhost
+ dummy-api
+ 1.0
+
+
+
+
diff --git a/src/it/it-dependency-updates-report-issue-755/verify.groovy b/src/it/it-dependency-updates-report-issue-755/verify.groovy
new file mode 100644
index 0000000000..fc9b89d5c7
--- /dev/null
+++ b/src/it/it-dependency-updates-report-issue-755/verify.groovy
@@ -0,0 +1,5 @@
+report = new File( basedir, "target/dependency-updates-report.xml" ).text.replaceAll( '\\s*', '' )
+
+assert report.contains( '1.0.1' )
+assert report.contains( '1.1' )
+assert report.contains( '2.0' )
diff --git a/src/it/it-plugin-updates-report-issue-755/invoker.properties b/src/it/it-plugin-updates-report-issue-755/invoker.properties
new file mode 100644
index 0000000000..5faa3b4b61
--- /dev/null
+++ b/src/it/it-plugin-updates-report-issue-755/invoker.properties
@@ -0,0 +1,2 @@
+invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:plugin-updates-report
+invoker.mavenOpts = -DpluginUpdatesReportFormats=xml
diff --git a/src/it/it-plugin-updates-report-issue-755/pom.xml b/src/it/it-plugin-updates-report-issue-755/pom.xml
new file mode 100644
index 0000000000..6df231194c
--- /dev/null
+++ b/src/it/it-plugin-updates-report-issue-755/pom.xml
@@ -0,0 +1,18 @@
+
+ 4.0.0
+ localhost
+ dummy-artifact
+ 1.0.0-SNAPSHOT
+
+
+
+
+ localhost
+ dummy-maven-plugin
+ 1.0
+
+
+
+
+
diff --git a/src/it/it-plugin-updates-report-issue-755/verify.groovy b/src/it/it-plugin-updates-report-issue-755/verify.groovy
new file mode 100644
index 0000000000..f68411a704
--- /dev/null
+++ b/src/it/it-plugin-updates-report-issue-755/verify.groovy
@@ -0,0 +1,5 @@
+report = new File( basedir, "target/plugin-updates-report.xml" ).text.replaceAll( '\\s*', '' )
+
+assert report.contains( '3.0.0' )
+assert report.contains( '2.3' )
+assert report.contains( '2.2.2' )
diff --git a/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojo.java b/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojo.java
index 8f40fa0f85..6cda7845a4 100644
--- a/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojo.java
+++ b/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojo.java
@@ -21,7 +21,10 @@
import javax.inject.Inject;
-import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@@ -39,10 +42,10 @@
import org.apache.maven.reporting.MavenReportException;
import org.apache.maven.repository.RepositorySystem;
import org.codehaus.mojo.versions.api.ArtifactVersions;
-import org.codehaus.mojo.versions.xml.DependencyUpdatesXmlRenderer;
import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
import org.codehaus.mojo.versions.reporting.model.DependencyUpdatesModel;
import org.codehaus.mojo.versions.utils.DependencyComparator;
+import org.codehaus.mojo.versions.xml.DependencyUpdatesXmlReportRenderer;
import org.codehaus.plexus.i18n.I18N;
import static java.util.Collections.emptyMap;
@@ -205,27 +208,28 @@ && getProject().getOriginalModel().getDependencyManagement().getDependencies() !
for ( String format : formats )
{
+ DependencyUpdatesModel model =
+ new DependencyUpdatesModel( dependencyUpdates, dependencyManagementUpdates );
if ( "html".equals( format ) )
{
- rendererFactory.createReportRenderer( getOutputName(), sink, locale,
- new DependencyUpdatesModel( dependencyUpdates, dependencyManagementUpdates ) )
- .render();
+ rendererFactory.createReportRenderer( getOutputName(), sink, locale, model ).render();
}
else if ( "xml".equals( format ) )
{
- File outputDir = new File( getProject().getBuild().getDirectory() );
- if ( !outputDir.exists() )
+ Path outputDir = Paths.get( getProject().getBuild().getDirectory() );
+ if ( !Files.exists( outputDir ) )
{
- if ( !outputDir.mkdirs() )
+ try
{
- throw new MavenReportException( "Could not create output directory" );
+ Files.createDirectories( outputDir );
+ }
+ catch ( IOException e )
+ {
+ throw new MavenReportException( "Could not create the output directory" );
}
}
- String outputFile = outputDir.getAbsolutePath() + File.separator + getOutputName() + ".xml";
- DependencyUpdatesXmlRenderer xmlGenerator =
- new DependencyUpdatesXmlRenderer( dependencyUpdates, dependencyManagementUpdates,
- outputFile );
- xmlGenerator.render();
+ Path outputFile = outputDir.resolve( getOutputName() + ".xml" );
+ new DependencyUpdatesXmlReportRenderer( model, outputFile ).render();
}
}
}
diff --git a/src/main/java/org/codehaus/mojo/versions/PluginUpdatesReportMojo.java b/src/main/java/org/codehaus/mojo/versions/PluginUpdatesReportMojo.java
index 32503ec04a..1b47c0f7c4 100644
--- a/src/main/java/org/codehaus/mojo/versions/PluginUpdatesReportMojo.java
+++ b/src/main/java/org/codehaus/mojo/versions/PluginUpdatesReportMojo.java
@@ -21,7 +21,10 @@
import javax.inject.Inject;
-import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@@ -38,10 +41,10 @@
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.reporting.MavenReportException;
import org.apache.maven.repository.RepositorySystem;
-import org.codehaus.mojo.versions.xml.PluginUpdatesXmlRenderer;
import org.codehaus.mojo.versions.reporting.ReportRendererFactory;
import org.codehaus.mojo.versions.reporting.model.PluginUpdatesModel;
import org.codehaus.mojo.versions.utils.PluginComparator;
+import org.codehaus.mojo.versions.xml.PluginUpdatesXmlReportRenderer;
import org.codehaus.plexus.i18n.I18N;
import static org.codehaus.mojo.versions.utils.MiscUtils.filter;
@@ -166,28 +169,29 @@ protected void doGenerateReport( Locale locale, Sink sink ) throws MavenReportEx
plugin -> plugin.getVersions().length > 1 );
}
+ PluginUpdatesModel model = new PluginUpdatesModel( pluginUpdates, pluginManagementUpdates );
for ( String format : formats )
{
if ( "html".equals( format ) )
{
- rendererFactory.createReportRenderer( getOutputName(), getSink(), locale,
- new PluginUpdatesModel( pluginUpdates, pluginManagementUpdates ) )
- .render();
+ rendererFactory.createReportRenderer( getOutputName(), getSink(), locale, model ).render();
}
else if ( "xml".equals( format ) )
{
- File outputDir = new File( getProject().getBuild().getDirectory() );
- if ( !outputDir.exists() )
+ Path outputDir = Paths.get( getProject().getBuild().getDirectory() );
+ if ( !Files.exists( outputDir ) )
{
- if ( !outputDir.mkdirs() )
+ try
{
- throw new MavenReportException( "Could not create output directory" );
+ Files.createDirectories( outputDir );
+ }
+ catch ( IOException e )
+ {
+ throw new MavenReportException( "Could not create the output directory" );
}
}
- String outputFile = outputDir.getAbsolutePath() + File.separator + getOutputName() + ".xml";
- PluginUpdatesXmlRenderer xmlGenerator =
- new PluginUpdatesXmlRenderer( pluginUpdates, pluginManagementUpdates, outputFile );
- xmlGenerator.render();
+ Path outputFile = outputDir.resolve( getOutputName() + ".xml" );
+ new PluginUpdatesXmlReportRenderer( model, outputFile ).render();
}
}
}
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 8c1f3d42ec..c26c7ca785 100644
--- a/src/main/java/org/codehaus/mojo/versions/reporting/DependencyUpdatesReportRenderer.java
+++ b/src/main/java/org/codehaus/mojo/versions/reporting/DependencyUpdatesReportRenderer.java
@@ -29,12 +29,6 @@
import org.codehaus.mojo.versions.reporting.model.DependencyUpdatesModel;
import org.codehaus.plexus.i18n.I18N;
-import static java.util.Optional.of;
-import static org.codehaus.mojo.versions.api.Segment.INCREMENTAL;
-import static org.codehaus.mojo.versions.api.Segment.MAJOR;
-import static org.codehaus.mojo.versions.api.Segment.MINOR;
-import static org.codehaus.mojo.versions.api.Segment.SUBINCREMENTAL;
-
/**
* @param type of the model
* @since 1.0-beta-1
@@ -92,31 +86,7 @@ protected void renderTable( String titleKey, Map c
@Override
protected OverviewStats computeOverviewStats()
{
- OverviewStats stats = new OverviewStats();
- model.getAllUpdates().values().forEach( details ->
- {
- if ( oldestUpdateCache.get( details, of( SUBINCREMENTAL ) ) != null )
- {
- stats.incrementAny();
- }
- else if ( oldestUpdateCache.get( details, of( INCREMENTAL ) ) != null )
- {
- stats.incrementIncremental();
- }
- else if ( oldestUpdateCache.get( details, of( MINOR ) ) != null )
- {
- stats.incrementMinor();
- }
- else if ( oldestUpdateCache.get( details, of( MAJOR ) ) != null )
- {
- stats.incrementMajor();
- }
- else
- {
- stats.incrementUpToDate();
- }
- } );
- return stats;
+ return OverviewStats.fromUpdates( model.getAllUpdates().values(), oldestUpdateCache );
}
protected void renderDependencyDetail( Dependency artifact, ArtifactVersions details )
diff --git a/src/main/java/org/codehaus/mojo/versions/reporting/OverviewStats.java b/src/main/java/org/codehaus/mojo/versions/reporting/OverviewStats.java
index 4cff6950a7..bde72a9218 100644
--- a/src/main/java/org/codehaus/mojo/versions/reporting/OverviewStats.java
+++ b/src/main/java/org/codehaus/mojo/versions/reporting/OverviewStats.java
@@ -20,12 +20,26 @@
* under the License.
*/
+import java.util.Collection;
+import java.util.Optional;
+
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.codehaus.mojo.versions.api.ArtifactVersions;
+import org.codehaus.mojo.versions.api.ArtifactVersionsCache;
+import org.codehaus.mojo.versions.api.Segment;
+
+import static java.util.Optional.of;
+import static org.codehaus.mojo.versions.api.Segment.INCREMENTAL;
+import static org.codehaus.mojo.versions.api.Segment.MAJOR;
+import static org.codehaus.mojo.versions.api.Segment.MINOR;
+import static org.codehaus.mojo.versions.api.Segment.SUBINCREMENTAL;
+
/**
* Represents summary stats
*
* @author Andrzej Jarmoniuk
*/
-class OverviewStats
+public class OverviewStats
{
private int major;
@@ -37,6 +51,55 @@ class OverviewStats
private int upToDate;
+ /**
+ * Creates a {@linkplain OverviewStats} instance based on the collection of version updates in
+ * the argument
+ *
+ * @param updates collection of all version updates, typically from
+ * {@linkplain org.codehaus.mojo.versions.reporting.model.DependencyUpdatesModel#getAllUpdates()}
+ * @param cache if not null, cache to retrieve the version information, initialised with
+ * the {@link ArtifactVersions#getOldestUpdate(Optional)} update information
+ * @param subclass of {@linkplain OverviewStats}
+ * @param subclass of {@linkplain ArtifactVersions}
+ * @return instance of the {@linkplain OverviewStats}
+ */
+ public static T fromUpdates( Collection updates,
+ ArtifactVersionsCache cache )
+ {
+ OverviewStats stats = new OverviewStats();
+ updates.forEach( details ->
+ {
+ if ( getOldestUpdate( cache, details, of( SUBINCREMENTAL ) ) != null )
+ {
+ stats.incrementAny();
+ }
+ else if ( getOldestUpdate( cache, details, of( INCREMENTAL ) ) != null )
+ {
+ stats.incrementIncremental();
+ }
+ else if ( getOldestUpdate( cache, details, of( MINOR ) ) != null )
+ {
+ stats.incrementMinor();
+ }
+ else if ( getOldestUpdate( cache, details, of( MAJOR ) ) != null )
+ {
+ stats.incrementMajor();
+ }
+ else
+ {
+ stats.incrementUpToDate();
+ }
+ } );
+ return (T) stats;
+ }
+
+ protected static ArtifactVersion getOldestUpdate( ArtifactVersionsCache cache,
+ V details,
+ Optional segment )
+ {
+ return cache != null ? cache.get( details, segment ) : details.getOldestUpdate( segment );
+ }
+
public int getMajor()
{
return major;
diff --git a/src/main/java/org/codehaus/mojo/versions/reporting/PluginOverviewStats.java b/src/main/java/org/codehaus/mojo/versions/reporting/PluginOverviewStats.java
new file mode 100644
index 0000000000..5275c17e4f
--- /dev/null
+++ b/src/main/java/org/codehaus/mojo/versions/reporting/PluginOverviewStats.java
@@ -0,0 +1,96 @@
+package org.codehaus.mojo.versions.reporting;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.Collection;
+import java.util.Optional;
+
+import org.codehaus.mojo.versions.PluginUpdatesDetails;
+import org.codehaus.mojo.versions.api.ArtifactVersions;
+import org.codehaus.mojo.versions.api.ArtifactVersionsCache;
+import org.codehaus.mojo.versions.reporting.model.PluginUpdatesModel;
+
+import static java.util.Optional.of;
+import static org.codehaus.mojo.versions.api.Segment.INCREMENTAL;
+import static org.codehaus.mojo.versions.api.Segment.MAJOR;
+import static org.codehaus.mojo.versions.api.Segment.MINOR;
+import static org.codehaus.mojo.versions.api.Segment.SUBINCREMENTAL;
+
+public class PluginOverviewStats extends OverviewStats
+{
+ /**
+ * Extension of the {@linkplain OverviewStats} adding dependency stats
+ */
+ private int dependencies;
+
+ public int getDependencies()
+ {
+ return dependencies;
+ }
+
+ public void incrementDependencies()
+ {
+ dependencies++;
+ }
+
+ /**
+ * Creates a {@linkplain PluginOverviewStats} instance based on the collection of version updates in
+ * the argument
+ *
+ * @param updates collection of all version updates, typically from {@linkplain PluginUpdatesModel#getAllUpdates()}
+ * @param cache if not null, cache to retrieve the version information, initialised with
+ * the {@link ArtifactVersions#getOldestUpdate(Optional)} update information
+ * @param always equal to {@linkplain PluginOverviewStats}
+ * @param always equal to {@linkplain org.codehaus.mojo.versions.PluginUpdatesDetails}
+ * @return instance of the {@linkplain PluginOverviewStats}, initialised with the update information
+ */
+ public static T fromUpdates( Collection updates,
+ ArtifactVersionsCache cache )
+ {
+ PluginOverviewStats stats = new PluginOverviewStats();
+ updates.forEach( details ->
+ {
+ if ( getOldestUpdate( cache, details, of( SUBINCREMENTAL ) ) != null )
+ {
+ stats.incrementAny();
+ }
+ else if ( getOldestUpdate( cache, details, of( INCREMENTAL ) ) != null )
+ {
+ stats.incrementIncremental();
+ }
+ else if ( getOldestUpdate( cache, details, of( MINOR ) ) != null )
+ {
+ stats.incrementMinor();
+ }
+ else if ( getOldestUpdate( cache, details, of( MAJOR ) ) != null )
+ {
+ stats.incrementMajor();
+ }
+ else
+ {
+ stats.incrementUpToDate();
+ }
+ if ( ( ( PluginUpdatesDetails ) details ).isDependencyUpdateAvailable() )
+ {
+ stats.incrementDependencies();
+ }
+ } );
+ return (T) stats;
+ }
+}
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 1df2288bed..e1327dd56e 100644
--- a/src/main/java/org/codehaus/mojo/versions/reporting/PluginUpdatesReportRenderer.java
+++ b/src/main/java/org/codehaus/mojo/versions/reporting/PluginUpdatesReportRenderer.java
@@ -127,59 +127,13 @@ protected void renderSummaryTable( Map content
sink.table_();
}
- /**
- * Extension of the {@linkplain OverviewStats} adding dependency stats
- */
- static class PluginOverviewStats extends OverviewStats
- {
- private int dependencies;
-
- public int getDependencies()
- {
- return dependencies;
- }
-
- public void incrementDependencies()
- {
- dependencies++;
- }
- }
-
/**
* {@inheritDoc}
*/
@Override
protected PluginOverviewStats computeOverviewStats()
{
- PluginOverviewStats stats = new PluginOverviewStats();
- model.getAllUpdates().values().forEach( details ->
- {
- if ( oldestUpdateCache.get( details, of( SUBINCREMENTAL ) ) != null )
- {
- stats.incrementAny();
- }
- else if ( oldestUpdateCache.get( details, of( INCREMENTAL ) ) != null )
- {
- stats.incrementIncremental();
- }
- else if ( oldestUpdateCache.get( details, of( MINOR ) ) != null )
- {
- stats.incrementMinor();
- }
- else if ( oldestUpdateCache.get( details, of( MAJOR ) ) != null )
- {
- stats.incrementMajor();
- }
- else
- {
- stats.incrementUpToDate();
- }
- if ( details.isDependencyUpdateAvailable() )
- {
- stats.incrementDependencies();
- }
- } );
- return stats;
+ return PluginOverviewStats.fromUpdates( model.getAllUpdates().values(), oldestUpdateCache );
}
@Override
diff --git a/src/main/java/org/codehaus/mojo/versions/xml/DependencyUpdatesXmlRenderer.java b/src/main/java/org/codehaus/mojo/versions/xml/DependencyUpdatesXmlRenderer.java
deleted file mode 100644
index 6b890c7b52..0000000000
--- a/src/main/java/org/codehaus/mojo/versions/xml/DependencyUpdatesXmlRenderer.java
+++ /dev/null
@@ -1,292 +0,0 @@
-package org.codehaus.mojo.versions.xml;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Optional;
-import java.util.TreeMap;
-
-import org.apache.maven.artifact.versioning.ArtifactVersion;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.reporting.MavenReportException;
-import org.codehaus.mojo.versions.api.ArtifactVersions;
-import org.codehaus.mojo.versions.api.Segment;
-import org.codehaus.mojo.versions.utils.DependencyComparator;
-
-import static java.util.Optional.empty;
-import static java.util.Optional.of;
-import static org.codehaus.mojo.versions.api.Segment.INCREMENTAL;
-import static org.codehaus.mojo.versions.api.Segment.MAJOR;
-import static org.codehaus.mojo.versions.api.Segment.MINOR;
-import static org.codehaus.mojo.versions.api.Segment.SUBINCREMENTAL;
-
-/**
- * XML renderer for DependencyUpdatesReport creates an xml file in target directory and writes report about available
- * dependency/dependency management updates.
- *
- * @author Illia Dubinin
- * @since 2.4
- */
-public class DependencyUpdatesXmlRenderer
-{
-
- private static final String GROUP_ID = "groupId";
-
- private static final String ARTIFACT_ID = "artifactId";
-
- private static final String SCOPE = "scope";
-
- private static final String CLASSIFIER = "classifier";
-
- private static final String TYPE = "type";
-
- private static final String CURRENT_VERSION = "currentVersion";
-
- private static final String NEXT_VERSION = "nextVersion";
-
- private static final String STATUS = "status";
-
- private static final String OPEN_TAG = "<";
-
- private static final String CLOSE_TAG = ">";
-
- private static final String OPEN_CLOSING_TAG = "";
-
- private static final String NL = "\n";
-
- private static final String TAB = "\t";
-
- private final Map dependencyUpdates;
-
- private final Map dependencyManagementUpdates;
-
- private final String outputFileName;
-
- public DependencyUpdatesXmlRenderer( Map dependencyUpdates,
- Map dependencyManagementUpdates,
- String outputFileName )
- {
- this.dependencyUpdates = dependencyUpdates;
- this.dependencyManagementUpdates = dependencyManagementUpdates;
- this.outputFileName = outputFileName;
- }
-
- /**
- * Makes report file with given name in target directory.
- *
- * @throws MavenReportException if something went wrong
- */
- public void render()
- throws MavenReportException
- {
- StringBuilder sb = new StringBuilder();
- sb.append( "" ).append( NL );
- Map allUpdates = new TreeMap<>( DependencyComparator.INSTANCE );
- allUpdates.putAll( dependencyManagementUpdates );
- allUpdates.putAll( dependencyUpdates );
- sb.append( getSummaryBlock( allUpdates.values() ) );
- sb.append( getDependencyInfoBlock( dependencyManagementUpdates, "dependencyManagements",
- "dependencyManagement" ) );
- sb.append( getDependencyInfoBlock( dependencyUpdates, "dependencies", "dependency" ) );
- sb.append( "" ).append( NL );
- PrintWriter pw;
- try
- {
- pw = new PrintWriter( outputFileName, "UTF8" );
- pw.print( sb );
- pw.close();
- }
- catch ( IOException e )
- {
- throw new MavenReportException( "Cannot create xml report.", e );
- }
- }
-
- /**
- * Method wraps value in xml tag. In ex: to wrap foo in tag bar you have to pass foo as value and bar as tag. As a
- * result you will get: <bar>foo</bar>
- *
- * @param value - string to wrap
- * @param tag - name of tag
- * @return value wrapped in xml tag
- */
-
- public static String wrapElement( String value, String tag )
- {
- return OPEN_TAG + tag + CLOSE_TAG + value + OPEN_CLOSING_TAG + tag + CLOSE_TAG;
- }
-
- /**
- * Returns summary of dependency analysis result in xml format: current version, next available, next incremental,
- * next minor and next major versions.
- *
- * @param allUpdates all dependencies versions
- * @return summary in xml format
- */
- public static String getSummaryBlock( Collection extends ArtifactVersions> allUpdates )
- {
- int numInc = 0;
- int numMin = 0;
- int numMaj = 0;
- int numAny = 0;
- int numCur = 0;
- for ( ArtifactVersions details : allUpdates )
- {
- if ( details.getOldestUpdate( of( SUBINCREMENTAL ) ) != null )
- {
- numAny++;
- }
- else if ( details.getOldestUpdate( of( INCREMENTAL ) ) != null )
- {
- numInc++;
- }
- else if ( details.getOldestUpdate( of( MINOR ) ) != null )
- {
- numMin++;
- }
- else if ( details.getOldestUpdate( of( MAJOR ) ) != null )
- {
- numMaj++;
- }
- else
- {
- numCur++;
- }
- }
-
- String result = "\t%n" + "\t\t%d%n"
- + "\t\t%d%n"
- + "\t\t%d%n"
- + "\t\t%d%n" + "\t\t%d%n"
- + "\t%n";
-
- return String.format( result, numCur, numAny, numInc, numMin, numMaj );
- }
-
- /**
- * Returns xml report for current dependency state with following info: current version, next available version,
- * next incremental/minor/major if available and status ('incremental available', 'minor available', 'major
- * available' or 'no new available')
- *
- * @param versions version info for dependency
- * @return xml reports about current possible updates.
- */
- public static String getVersionsBlocks( ArtifactVersions versions )
- {
- StringBuilder sBuilder = new StringBuilder();
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( wrapElement( versions.isCurrentVersionDefined()
- ? versions.getCurrentVersion().toString() : versions.getArtifact().getVersionRange().toString(),
- CURRENT_VERSION ) ).append( NL );
- ArtifactVersion nextVersion = versions.getOldestUpdate( empty() );
- if ( nextVersion != null )
- {
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( wrapElement( nextVersion.toString(),
- NEXT_VERSION ) ).append( NL );
-
- String incrementalsBlock = getVersionsInScopeBlock( versions, of( INCREMENTAL ) );
- sBuilder.append( incrementalsBlock );
- String minorsBlock = getVersionsInScopeBlock( versions, of( MINOR ) );
- sBuilder.append( minorsBlock );
- String majorsBlock = getVersionsInScopeBlock( versions, of( MAJOR ) );
- sBuilder.append( majorsBlock );
-
- String status = null;
- if ( incrementalsBlock.length() > 0 )
- {
- status = "incremental available";
- }
- else if ( minorsBlock.length() > 0 )
- {
- status = "minor available";
- }
- else if ( majorsBlock.length() > 0 )
- {
- status = "major available";
- }
-
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( wrapElement( status, STATUS ) ).append( NL );
- }
- else
- {
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( wrapElement( "no new available",
- STATUS ) ).append( NL );
- }
-
- return sBuilder.toString();
- }
-
- private static String getDependencyInfoBlock( Map dependencyUpdates, String blockName,
- String subblockName )
- {
- StringBuilder sBuilder = new StringBuilder();
- sBuilder.append( TAB ).append( OPEN_TAG ).append( blockName ).append( CLOSE_TAG ).append( NL );
- dependencyUpdates.forEach( ( dep, value ) ->
- {
- sBuilder.append( TAB ).append( TAB ).append( OPEN_TAG ).append( subblockName ).append( CLOSE_TAG )
- .append( NL );
-
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( wrapElement( dep.getGroupId(),
- GROUP_ID ) ).append( NL );
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( wrapElement( dep.getArtifactId(),
- ARTIFACT_ID ) ).append( NL );
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( wrapElement( dep.getScope(),
- SCOPE ) ).append( NL );
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( wrapElement( dep.getClassifier(),
- CLASSIFIER ) ).append( NL );
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( wrapElement( dep.getType(),
- TYPE ) ).append( NL );
-
- sBuilder.append( getVersionsBlocks( value ) );
-
- sBuilder.append( TAB ).append( TAB ).append( OPEN_CLOSING_TAG ).append( subblockName ).append( CLOSE_TAG )
- .append( NL );
- } );
- sBuilder.append( TAB ).append( OPEN_CLOSING_TAG ).append( blockName ).append( CLOSE_TAG ).append( NL );
- return sBuilder.toString();
- }
-
- private static String getVersionsInScopeBlock( ArtifactVersions av, Optional scope )
- {
- String versionsTag = scope.map( s -> s.name().toLowerCase() + "s" ).orElse( "any" );
- StringBuilder sBuilder = new StringBuilder();
-
- ArtifactVersion nextVersion = av.getOldestUpdate( scope );
- if ( nextVersion != null )
- {
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( OPEN_TAG ).append( versionsTag )
- .append( CLOSE_TAG ).append( NL );
- ArtifactVersion[] versions = av.getAllUpdates( scope );
- for ( ArtifactVersion version : versions )
- {
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( TAB )
- .append( wrapElement( version.toString(),
- scope.toString().toLowerCase() ) ).append( NL );
- }
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( OPEN_CLOSING_TAG ).append( versionsTag )
- .append( CLOSE_TAG ).append( NL );
- }
-
- return sBuilder.toString();
- }
-
-}
diff --git a/src/main/java/org/codehaus/mojo/versions/xml/DependencyUpdatesXmlReportRenderer.java b/src/main/java/org/codehaus/mojo/versions/xml/DependencyUpdatesXmlReportRenderer.java
new file mode 100644
index 0000000000..25dfb3dcbc
--- /dev/null
+++ b/src/main/java/org/codehaus/mojo/versions/xml/DependencyUpdatesXmlReportRenderer.java
@@ -0,0 +1,146 @@
+package org.codehaus.mojo.versions.xml;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.model.Dependency;
+import org.codehaus.mojo.versions.api.AbstractVersionDetails;
+import org.codehaus.mojo.versions.api.ArtifactVersions;
+import org.codehaus.mojo.versions.api.ArtifactVersionsCache;
+import org.codehaus.mojo.versions.api.ReportRenderer;
+import org.codehaus.mojo.versions.api.Segment;
+import org.codehaus.mojo.versions.reporting.OverviewStats;
+import org.codehaus.mojo.versions.reporting.model.DependencyInfo;
+import org.codehaus.mojo.versions.reporting.model.DependencyReportSummary;
+import org.codehaus.mojo.versions.reporting.model.DependencyUpdatesModel;
+import org.codehaus.mojo.versions.reporting.model.DependencyUpdatesReport;
+import org.codehaus.mojo.versions.reporting.model.io.xpp3.DependencyUpdatesReportXpp3Writer;
+
+import static java.util.Optional.empty;
+import static java.util.Optional.of;
+import static java.util.Optional.ofNullable;
+import static org.codehaus.mojo.versions.api.Segment.INCREMENTAL;
+import static org.codehaus.mojo.versions.api.Segment.MAJOR;
+import static org.codehaus.mojo.versions.api.Segment.MINOR;
+
+/**
+ * XML renderer for DependencyUpdatesReport creates an xml file in target directory and writes report about available
+ * dependency/dependency management updates.
+ *
+ * @author Illia Dubinin
+ * @since 2.4
+ */
+public class DependencyUpdatesXmlReportRenderer implements ReportRenderer
+{
+ private final DependencyUpdatesModel model;
+ private final Path outputFile;
+ private final ArtifactVersionsCache oldestUpdateCache
+ = new ArtifactVersionsCache( AbstractVersionDetails::getOldestUpdate );
+ /**
+ * Creates a new instance
+ * @param model object containing the updates model
+ * @param outputFile output file for the report
+ */
+ public DependencyUpdatesXmlReportRenderer( DependencyUpdatesModel model, Path outputFile )
+ {
+ this.model = model;
+ this.outputFile = outputFile;
+ }
+
+ /**
+ * Creates an XML report
+ */
+ @Override
+ public void render()
+ {
+ try ( BufferedWriter writer = Files.newBufferedWriter( outputFile,
+ StandardCharsets.UTF_8 ) )
+ {
+ new DependencyUpdatesReportXpp3Writer().write( writer, new DependencyUpdatesReport()
+ {{
+ setSummary( new DependencyReportSummary()
+ {{
+ OverviewStats overviewStats = OverviewStats.fromUpdates( model.getAllUpdates().values(),
+ oldestUpdateCache );
+ setUsingLastVersion( String.valueOf( overviewStats.getUpToDate() ) );
+ setNextVersionAvailable( String.valueOf( overviewStats.getAny() ) );
+ setNextIncrementalAvailable( String.valueOf( overviewStats.getIncremental() ) );
+ setNextMinorAvailable( String.valueOf( overviewStats.getMinor() ) );
+ setNextMajorAvailable( String.valueOf( overviewStats.getMajor() ) );
+ }} );
+ setDependencyManagements( createDependencyInfo( model.getArtifactManagementUpdates() ) );
+ setDependencies( createDependencyInfo( model.getArtifactUpdates() ) );
+ }} );
+ }
+ catch ( IOException e )
+ {
+ throw new RuntimeException( e );
+ }
+ }
+
+ private static void setSection( ArtifactVersions versions, Segment segment, Consumer> setterFunction )
+ {
+ ofNullable( versions.getAllUpdates( of( segment ) ) )
+ .map( v -> Arrays.stream( v )
+ .map( ArtifactVersion::toString )
+ .collect( Collectors.toList() ) )
+ .ifPresent( setterFunction );
+ }
+
+ private static List createDependencyInfo( Map versions )
+ {
+ return versions.entrySet().stream().map( e ->
+ new DependencyInfo()
+ {{
+ setGroupId( e.getKey().getGroupId() );
+ setArtifactId( e.getKey().getArtifactId() );
+ setCurrentVersion( e.getKey().getVersion() );
+ setScope( e.getKey().getScope() );
+ setType( e.getKey().getType() );
+ setClassifier( e.getKey().getClassifier() );
+
+ ofNullable( e.getValue().getOldestUpdate( empty() ) )
+ .map( ArtifactVersion::toString ).ifPresent( this::setNextVersion );
+
+ setSection( e.getValue(), INCREMENTAL, this::setIncrementals );
+ setSection( e.getValue(), MINOR, this::setMinors );
+ setSection( e.getValue(), MAJOR, this::setMajors );
+
+ setStatus( getNextVersion() == null
+ ? "no new available"
+ : getIncrementals() != null
+ ? "incremental available"
+ : getMinors() != null
+ ? "minor available"
+ : "major available" );
+ }} ).collect( Collectors.toList() );
+ }
+}
diff --git a/src/main/java/org/codehaus/mojo/versions/xml/PluginUpdatesXmlRenderer.java b/src/main/java/org/codehaus/mojo/versions/xml/PluginUpdatesXmlRenderer.java
deleted file mode 100644
index 7459323b31..0000000000
--- a/src/main/java/org/codehaus/mojo/versions/xml/PluginUpdatesXmlRenderer.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.codehaus.mojo.versions.xml;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.apache.maven.model.Plugin;
-import org.apache.maven.reporting.MavenReportException;
-import org.codehaus.mojo.versions.PluginUpdatesDetails;
-import org.codehaus.mojo.versions.utils.PluginComparator;
-
-import static org.codehaus.mojo.versions.xml.DependencyUpdatesXmlRenderer.getVersionsBlocks;
-import static org.codehaus.mojo.versions.xml.DependencyUpdatesXmlRenderer.wrapElement;
-
-/**
- * XML renderer for PluginUpdatesReport creates an xml file in target directory and writes report about available
- * plugin/plugin management updates.
- *
- * @author Illia Dubinin
- * @since 2.4
- */
-public class PluginUpdatesXmlRenderer
-{
-
- private static final String GROUP_ID = "groupId";
-
- private static final String ARTIFACT_ID = "artifactId";
-
- private static final String OPEN_TAG = "<";
-
- private static final String CLOSE_TAG = ">";
-
- private static final String OPEN_CLOSING_TAG = "";
-
- private static final String NL = "\n";
-
- private static final String TAB = "\t";
-
- private Map pluginUpdates;
-
- private Map pluginManagementUpdates;
-
- private String outputFileName;
-
- public PluginUpdatesXmlRenderer( Map pluginUpdates,
- Map pluginManagementUpdates, String outputFileName )
- {
- this.pluginUpdates = pluginUpdates;
- this.pluginManagementUpdates = pluginManagementUpdates;
- this.outputFileName = outputFileName;
- }
-
- /**
- * Makes report file with given name in target directory.
- *
- * @throws MavenReportException if something went wrong
- */
- public void render()
- throws MavenReportException
- {
- StringBuilder sb = new StringBuilder();
- sb.append( "" ).append( NL );
- Map allUpdates = new TreeMap<>( PluginComparator.INSTANCE );
- allUpdates.putAll( pluginManagementUpdates );
- allUpdates.putAll( pluginUpdates );
- sb.append( getSummaryBlock( allUpdates ) );
- sb.append( getPluginsInfoBlock( pluginManagementUpdates, "pluginManagements", "pluginManagement" ) );
- sb.append( getPluginsInfoBlock( pluginUpdates, "plugins", "plugin" ) );
- sb.append( "" ).append( NL );
- PrintWriter pw;
- try
- {
- pw = new PrintWriter( outputFileName, "UTF8" );
- pw.print( sb );
- pw.close();
- }
- catch ( IOException e )
- {
- throw new MavenReportException( "Cannot create xml report.", e );
- }
- }
-
- private static String getSummaryBlock( Map allUpdates )
- {
- return DependencyUpdatesXmlRenderer.getSummaryBlock( allUpdates.values() );
- }
-
- private static String getPluginsInfoBlock( Map pluginUpdates, String blockName,
- String subblockName )
- {
- StringBuilder sBuilder = new StringBuilder();
- sBuilder.append( TAB ).append( OPEN_TAG ).append( blockName ).append( CLOSE_TAG ).append( NL );
- pluginUpdates.forEach( ( plugin, value ) ->
- {
- sBuilder.append( TAB ).append( TAB ).append( OPEN_TAG ).append( subblockName ).append( CLOSE_TAG )
- .append( NL );
-
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( wrapElement( plugin.getGroupId(),
- GROUP_ID ) ).append( NL );
- sBuilder.append( TAB ).append( TAB ).append( TAB ).append( wrapElement( plugin.getArtifactId(),
- ARTIFACT_ID ) ).append( NL );
-
- sBuilder.append( getVersionsBlocks( value ) );
-
- sBuilder.append( TAB ).append( TAB ).append( OPEN_CLOSING_TAG ).append( subblockName ).append( CLOSE_TAG )
- .append( NL );
- } );
- sBuilder.append( TAB ).append( OPEN_CLOSING_TAG ).append( blockName ).append( CLOSE_TAG ).append( NL );
- return sBuilder.toString();
- }
-
-}
diff --git a/src/main/java/org/codehaus/mojo/versions/xml/PluginUpdatesXmlReportRenderer.java b/src/main/java/org/codehaus/mojo/versions/xml/PluginUpdatesXmlReportRenderer.java
new file mode 100644
index 0000000000..1f4d668028
--- /dev/null
+++ b/src/main/java/org/codehaus/mojo/versions/xml/PluginUpdatesXmlReportRenderer.java
@@ -0,0 +1,148 @@
+package org.codehaus.mojo.versions.xml;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+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.api.ArtifactVersionsCache;
+import org.codehaus.mojo.versions.api.ReportRenderer;
+import org.codehaus.mojo.versions.api.Segment;
+import org.codehaus.mojo.versions.reporting.PluginOverviewStats;
+import org.codehaus.mojo.versions.reporting.model.PluginInfo;
+import org.codehaus.mojo.versions.reporting.model.PluginReportSummary;
+import org.codehaus.mojo.versions.reporting.model.PluginUpdatesModel;
+import org.codehaus.mojo.versions.reporting.model.PluginUpdatesReport;
+import org.codehaus.mojo.versions.reporting.model.io.xpp3.PluginUpdatesReportXpp3Writer;
+
+import static java.util.Optional.empty;
+import static java.util.Optional.of;
+import static java.util.Optional.ofNullable;
+import static org.codehaus.mojo.versions.api.Segment.INCREMENTAL;
+import static org.codehaus.mojo.versions.api.Segment.MAJOR;
+import static org.codehaus.mojo.versions.api.Segment.MINOR;
+
+/**
+ * XML renderer for DependencyUpdatesReport creates an xml file in target directory and writes report about available
+ * dependency/dependency management updates.
+ *
+ * @author Illia Dubinin
+ * @since 2.4
+ */
+public class PluginUpdatesXmlReportRenderer implements ReportRenderer
+{
+ private final PluginUpdatesModel model;
+ private final Path outputFile;
+ private final ArtifactVersionsCache oldestUpdateCache
+ = new ArtifactVersionsCache( AbstractVersionDetails::getOldestUpdate );
+ /**
+ * Creates a new instance
+ * @param model object containing the updates model
+ * @param outputFile output file for the report
+ */
+ public PluginUpdatesXmlReportRenderer( PluginUpdatesModel model, Path outputFile )
+ {
+ this.model = model;
+ this.outputFile = outputFile;
+ }
+
+ /**
+ * Creates an XML report
+ */
+ @Override
+ public void render()
+ {
+ try ( BufferedWriter writer = Files.newBufferedWriter( outputFile,
+ StandardCharsets.UTF_8 ) )
+ {
+ new PluginUpdatesReportXpp3Writer().write( writer, new PluginUpdatesReport()
+ {{
+ setSummary( new PluginReportSummary()
+ {{
+ PluginOverviewStats overviewStats = PluginOverviewStats.fromUpdates(
+ model.getAllUpdates().values(), oldestUpdateCache );
+ setUsingLastVersion( String.valueOf( overviewStats.getUpToDate() ) );
+ setNextVersionAvailable( String.valueOf( overviewStats.getAny() ) );
+ setNextIncrementalAvailable( String.valueOf( overviewStats.getIncremental() ) );
+ setNextMinorAvailable( String.valueOf( overviewStats.getMinor() ) );
+ setNextMajorAvailable( String.valueOf( overviewStats.getMajor() ) );
+ setDependencyUpdates( String.valueOf( overviewStats.getDependencies() ) );
+ }} );
+ setPluginManagements( createPluginInfo( model.getArtifactManagementUpdates() ) );
+ setPlugins( createPluginInfo( model.getArtifactUpdates() ) );
+ }} );
+ }
+ catch ( IOException e )
+ {
+ throw new RuntimeException( e );
+ }
+ }
+
+ private static void setSection( ArtifactVersions versions, Segment segment, Consumer> setterFunction )
+ {
+ ofNullable( versions.getAllUpdates( of( segment ) ) )
+ .map( v -> Arrays.stream( v )
+ .map( ArtifactVersion::toString )
+ .collect( Collectors.toList() ) )
+ .ifPresent( setterFunction );
+ }
+
+ private static List createPluginInfo( Map versions )
+ {
+ return versions.entrySet().stream().map( e ->
+ new PluginInfo()
+ {{
+ setGroupId( e.getKey().getGroupId() );
+ setArtifactId( e.getKey().getArtifactId() );
+ setCurrentVersion( e.getKey().getVersion() );
+ setScope( e.getKey().getScope() );
+ setType( e.getKey().getType() );
+ setClassifier( e.getKey().getClassifier() );
+
+ ofNullable( e.getValue().getOldestUpdate( empty() ) )
+ .map( ArtifactVersion::toString ).ifPresent( this::setNextVersion );
+
+ setSection( e.getValue(), INCREMENTAL, this::setIncrementals );
+ setSection( e.getValue(), MINOR, this::setMinors );
+ setSection( e.getValue(), MAJOR, this::setMajors );
+
+ setStatus( getNextVersion() == null
+ ? "no new available"
+ : getIncrementals() != null
+ ? "incremental available"
+ : getMinors() != null
+ ? "minor available"
+ : "major available" );
+ }} ).collect( Collectors.toList() );
+ }
+}
diff --git a/src/main/mdo/dependency-updates-report.mdo b/src/main/mdo/dependency-updates-report.mdo
new file mode 100644
index 0000000000..28b723ee5a
--- /dev/null
+++ b/src/main/mdo/dependency-updates-report.mdo
@@ -0,0 +1,177 @@
+
+
+
+
+
+ dependency-updates-report
+ DependencyUpdatesReport
+
+ XML version of the Dependency Updates Report
+
+
+
+
+ package
+ org.codehaus.mojo.versions.reporting.model
+
+
+
+
+ namespace
+
+
+
+
+
+ DependencyUpdatesReport
+
+
+ summary
+ true
+
+ DependencyReportSummary
+ 1
+
+
+
+ dependencyManagements
+
+ DependencyInfo
+ *
+
+
+
+ dependencies
+
+ DependencyInfo
+ *
+
+
+
+
+
+
+ DependencyReportSummary
+
+
+ usingLastVersion
+ true
+ String
+
+
+ nextVersionAvailable
+ true
+ String
+
+
+ nextIncrementalAvailable
+ 1.0.0+
+ true
+ String
+
+
+ nextMinorAvailable
+ true
+ String
+
+
+ nextMajorAvailable
+ true
+ String
+
+
+
+
+
+ DependencyInfo
+
+
+ groupId
+ true
+ String
+
+
+ artifactId
+ true
+ String
+
+
+ scope
+ true
+ String
+
+
+ classifier
+ String
+
+
+ type
+ true
+ String
+
+
+ currentVersion
+ String
+
+
+ nextVersion
+ String
+
+
+ any
+
+ String
+ *
+
+
+
+ incrementals
+
+ String
+ *
+
+
+
+ minors
+
+ String
+ *
+
+
+
+ majors
+
+ String
+ *
+
+
+
+ status
+ true
+ String
+
+
+
+
+
+
diff --git a/src/main/mdo/plugin-updates-report.mdo b/src/main/mdo/plugin-updates-report.mdo
new file mode 100644
index 0000000000..25c7fa428c
--- /dev/null
+++ b/src/main/mdo/plugin-updates-report.mdo
@@ -0,0 +1,182 @@
+
+
+
+
+
+ plugin-updates-report
+ PluginUpdatesReport
+
+ XML version of the Plugin Updates Report
+
+
+
+
+ package
+ org.codehaus.mojo.versions.reporting.model
+
+
+
+
+ namespace
+
+
+
+
+
+ PluginUpdatesReport
+
+
+ summary
+ true
+
+ PluginReportSummary
+ 1
+
+
+
+ pluginManagements
+
+ PluginInfo
+ *
+
+
+
+ plugins
+
+ PluginInfo
+ *
+
+
+
+
+
+
+ PluginReportSummary
+
+
+ usingLastVersion
+ true
+ String
+
+
+ nextVersionAvailable
+ true
+ String
+
+
+ nextIncrementalAvailable
+ 1.0.0+
+ true
+ String
+
+
+ nextMinorAvailable
+ true
+ String
+
+
+ nextMajorAvailable
+ true
+ String
+
+
+ dependencyUpdates
+ true
+ String
+
+
+
+
+
+ PluginInfo
+
+
+ groupId
+ true
+ String
+
+
+ artifactId
+ true
+ String
+
+
+ scope
+ true
+ String
+
+
+ classifier
+ String
+
+
+ type
+ true
+ String
+
+
+ currentVersion
+ String
+
+
+ nextVersion
+ String
+
+
+ any
+
+ String
+ *
+
+
+
+ incrementals
+
+ String
+ *
+
+
+
+ minors
+
+ String
+ *
+
+
+
+ majors
+
+ String
+ *
+
+
+
+ status
+ true
+ String
+
+
+
+
+
+
diff --git a/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesXmlRendererTest.java b/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesXmlRendererTest.java
index 69889a7e91..1d8994aa80 100644
--- a/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesXmlRendererTest.java
+++ b/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesXmlRendererTest.java
@@ -19,49 +19,86 @@
* under the License.
*/
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
-import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
-import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
-import org.apache.maven.artifact.versioning.VersionRange;
import org.codehaus.mojo.versions.api.ArtifactVersions;
-import org.codehaus.mojo.versions.xml.DependencyUpdatesXmlRenderer;
-import org.hamcrest.core.Is;
+import org.codehaus.mojo.versions.ordering.MavenVersionComparator;
+import org.codehaus.mojo.versions.reporting.model.DependencyUpdatesModel;
+import org.codehaus.mojo.versions.utils.DependencyBuilder;
+import org.codehaus.mojo.versions.xml.DependencyUpdatesXmlReportRenderer;
+import org.junit.After;
+import org.junit.Before;
import org.junit.Test;
+import static java.util.Collections.emptyMap;
+import static java.util.Collections.singletonMap;
+import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.core.IsNull.nullValue;
/**
- * Basic tests for {@linkplain DependencyUpdatesXmlRenderer}.
+ * Basic tests for {@linkplain DependencyUpdatesXmlReportRenderer}.
*
* @author Andrzej Jarmoniuk
*/
public class DependencyUpdatesXmlRendererTest
{
- @Test
- public void testGetVersionsBlocks() throws InvalidVersionSpecificationException
+ private Path tempFile;
+
+ @Before
+ public void setUp() throws IOException
+ {
+ tempFile = Files.createTempFile( "xml-dependency-report", "" );
+ }
+
+ @After
+ public void tearDown() throws IOException
{
- List versions =
- versionsOf( "1.0.0.1", "1.0.0.2", "2.121.2.1", "2.100.0.1", "3.1.0.1", "1.1.1" );
- final Artifact artifact =
- new DefaultArtifact( "group", "artifact", VersionRange.createFromVersionSpec( "[1.0,3.0]" ), "foo",
- "bar", "jar", null );
- ArtifactVersions artifactVersions = new ArtifactVersions( artifact, versions, null );
- assertThat( artifactVersions.getCurrentVersion(), nullValue() );
- assertThat( artifactVersions.isCurrentVersionDefined(), Is.is( false ) );
- String versionsBlocks = DependencyUpdatesXmlRenderer.getVersionsBlocks( artifactVersions );
- assertThat( versionsBlocks, containsString( "[1.0,3.0]" ) );
+ if ( tempFile != null && Files.exists( tempFile ) )
+ {
+ Files.delete( tempFile );
+ }
}
- private static List versionsOf( String... versions )
+ @Test
+ public void testReportGeneration() throws IOException
{
- return Arrays.stream( versions ).map( DefaultArtifactVersion::new ).collect( Collectors.toList() );
+ new DependencyUpdatesXmlReportRenderer( new DependencyUpdatesModel(
+ singletonMap( DependencyBuilder.newBuilder()
+ .withGroupId( "default-group" )
+ .withArtifactId( "artifactA" )
+ .withVersion( "1.0.0" )
+ .build(), new ArtifactVersions(
+ new DefaultArtifact( "default-group", "artifactA",
+ "1.0.0", SCOPE_COMPILE, "jar", "default",
+ null ),
+ Arrays.asList(
+ new DefaultArtifactVersion( "1.0.0" ),
+ new DefaultArtifactVersion( "1.0.1" ),
+ new DefaultArtifactVersion( "1.1.0" ),
+ new DefaultArtifactVersion( "2.0.0" )
+ ),
+ new MavenVersionComparator() ) ),
+ emptyMap() ), tempFile ).render();
+ String output = String.join( "", Files.readAllLines( tempFile ) )
+ .replaceAll( ">\\s*<", "><" );
+
+ assertThat( output, containsString( "0" ) );
+ assertThat( output, containsString( "0" ) );
+ assertThat( output, containsString( "1" ) );
+ assertThat( output, containsString( "0" ) );
+ assertThat( output, containsString( "0" ) );
+
+ assertThat( output, containsString( "1.0.0" ) );
+ assertThat( output, containsString( "1.0.1" ) );
+ assertThat( output, containsString( "1.0.1" ) );
+ assertThat( output, containsString( "1.1.0" ) );
+ assertThat( output, containsString( "2.0.0" ) );
+ assertThat( output, containsString( "incremental available" ) );
}
}
diff --git a/src/test/java/org/codehaus/mojo/versions/PluginUpdatesXmlRendererTest.java b/src/test/java/org/codehaus/mojo/versions/PluginUpdatesXmlRendererTest.java
new file mode 100644
index 0000000000..5d653ae5e7
--- /dev/null
+++ b/src/test/java/org/codehaus/mojo/versions/PluginUpdatesXmlRendererTest.java
@@ -0,0 +1,128 @@
+package org.codehaus.mojo.versions;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+import org.apache.maven.model.Plugin;
+import org.codehaus.mojo.versions.api.ArtifactVersions;
+import org.codehaus.mojo.versions.ordering.MavenVersionComparator;
+import org.codehaus.mojo.versions.reporting.model.PluginUpdatesModel;
+import org.codehaus.mojo.versions.utils.DependencyBuilder;
+import org.codehaus.mojo.versions.xml.DependencyUpdatesXmlReportRenderer;
+import org.codehaus.mojo.versions.xml.PluginUpdatesXmlReportRenderer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static java.util.Collections.emptyMap;
+import static java.util.Collections.singletonMap;
+import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+
+/**
+ * Basic tests for {@linkplain DependencyUpdatesXmlReportRenderer}.
+ *
+ * @author Andrzej Jarmoniuk
+ */
+public class PluginUpdatesXmlRendererTest
+{
+ private Path tempFile;
+
+ @Before
+ public void setUp() throws IOException
+ {
+ tempFile = Files.createTempFile( "xml-plugin-report", "" );
+ }
+
+ @After
+ public void tearDown() throws IOException
+ {
+ if ( tempFile != null && Files.exists( tempFile ) )
+ {
+ Files.delete( tempFile );
+ }
+ }
+
+ @Test
+ public void testReportGeneration() throws IOException
+ {
+ PluginUpdatesModel pluginUpdates = new PluginUpdatesModel(
+ singletonMap(
+ pluginOf( "default-group", "artifactA", "1.0.0" ),
+ new PluginUpdatesDetails(
+ new ArtifactVersions(
+ artifactOf( "default-group", "artifactA", "1.0.0" ),
+ Stream.of( "1.0.0", "1.0.1", "1.1.0", "2.0.0" )
+ .map( DefaultArtifactVersion::new )
+ .collect( Collectors.toList() ),
+ new MavenVersionComparator() ),
+ singletonMap( DependencyBuilder.dependencyWith( "default-group", "artifactB",
+ "1.0.0" ),
+ new ArtifactVersions(
+ artifactOf( "default-group", "artifactB", "1.0.0" ),
+ Stream.of( "1.0.0", "1.0.1-SNAPSHOT", "1.1.0-rc1", "2.0.0" )
+ .map( DefaultArtifactVersion::new )
+ .collect( Collectors.toList() ),
+ new MavenVersionComparator() ) ), false ) ),
+ emptyMap() );
+ new PluginUpdatesXmlReportRenderer( pluginUpdates, tempFile ).render();
+
+ String output = String.join( "", Files.readAllLines( tempFile ) )
+ .replaceAll( ">\\s*<", "><" );
+
+ assertThat( output, containsString( "0" ) );
+ assertThat( output, containsString( "0" ) );
+ assertThat( output, containsString( "1" ) );
+ assertThat( output, containsString( "0" ) );
+ assertThat( output, containsString( "0" ) );
+ assertThat( output, containsString( "1" ) );
+
+ assertThat( output, containsString( "1.0.0" ) );
+ assertThat( output, containsString( "1.0.1" ) );
+ assertThat( output, containsString( "1.0.1" ) );
+ assertThat( output, containsString( "1.1.0" ) );
+ assertThat( output, containsString( "2.0.0" ) );
+ assertThat( output, containsString( "incremental available" ) );
+ }
+
+ private static DefaultArtifact artifactOf( String groupId, String artifactId, String version )
+ {
+ return new DefaultArtifact( groupId, artifactId, version, SCOPE_COMPILE, "jar", "default",
+ null );
+ }
+
+ private static Plugin pluginOf( String groupId, String artifactId, String version )
+ {
+ return new Plugin()
+ {{
+ setGroupId( groupId );
+ setArtifactId( artifactId );
+ setVersion( version );
+ }};
+ }
+}
diff --git a/src/test/java/org/codehaus/mojo/versions/utils/TestUtils.java b/src/test/java/org/codehaus/mojo/versions/utils/TestUtils.java
new file mode 100644
index 0000000000..6e45c91b97
--- /dev/null
+++ b/src/test/java/org/codehaus/mojo/versions/utils/TestUtils.java
@@ -0,0 +1,74 @@
+package org.codehaus.mojo.versions.utils;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+
+import static java.nio.file.FileVisitResult.CONTINUE;
+import static org.apache.commons.text.CaseUtils.toCamelCase;
+
+/**
+ * Auxiliary test utilities
+ */
+public class TestUtils
+{
+ /**
+ * Creates a temporary directory with the given name
+ * @param name name of the directory to create
+ * @return {@linkplain Path} object pointing to the directory
+ * @throws IOException should the I/O operation fail
+ */
+ public static Path createTempDir( String name ) throws IOException
+ {
+ return Files.createTempDirectory( toCamelCase( name, false ) );
+ }
+
+ /**
+ * Deletes the given directory together with all its contents
+ * @param dir directory to delete
+ * @throws IOException should an I/O operation fail
+ */
+ public static void tearDownTempDir( Path dir ) throws IOException
+ {
+ if ( dir != null && Files.exists( dir ) )
+ {
+ Files.walkFileTree( dir, new SimpleFileVisitor()
+ {
+ @Override
+ public FileVisitResult visitFile( Path file, BasicFileAttributes attrs ) throws IOException
+ {
+ Files.delete( file );
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory( Path dir, IOException exc ) throws IOException
+ {
+ Files.delete( dir );
+ return CONTINUE;
+ }
+ } );
+ }
+ }
+}