summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGary Wu <gary.i.wu@huawei.com>2017-08-29 14:21:06 -0700
committerGary Wu <gary.i.wu@huawei.com>2017-08-29 14:31:22 -0700
commitbe096d395b595fcb7ef50204978904a538ed32a0 (patch)
treea6f6ddb61c300c57091796c351f23f726d540580
parentc0b040c4542c2d9260dd3d10ba32bb7179bd0120 (diff)
Maven plugin to check dependency versions
Initial draft of a custom maven plugin to check dependency versions against the version manifest. Change-Id: If009461f6ecbcd86e5a43004a1c5a421ec02ccca Issue-id: INT-124 Signed-off-by: Gary Wu <gary.i.wu@huawei.com>
-rw-r--r--oparent/pom.xml517
-rw-r--r--pom.xml1
-rw-r--r--version-check-maven-plugin/pom.xml74
-rw-r--r--version-check-maven-plugin/src/main/java/org/onap/oparent/versioncheck/VersionCheckMojo.java121
4 files changed, 465 insertions, 248 deletions
diff --git a/oparent/pom.xml b/oparent/pom.xml
index 9cde98f..09c1d35 100644
--- a/oparent/pom.xml
+++ b/oparent/pom.xml
@@ -42,244 +42,244 @@
<sonar.exclusions>**/gen/**,**/generated-sources/**,**/yang-gen**,**/pax/**</sonar.exclusions>
<!-- If following file exist, auto-generation of swagger.json will be done -->
<swagger-properties>${basedir}/src/main/resources/swagger.properties</swagger-properties>
-
<!-- If following file exist, auto-generation of sdk will be done -->
<swagger-json>${basedir}/src/main/resources/swagger.json</swagger-json>
</properties>
-
+ <dependencies>
+ <dependency>
+ <groupId>org.onap.oparent</groupId>
+ <artifactId>version-check-maven-plugin</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
<profiles>
- <profile>
- <id>generate-json</id>
- <activation>
- <file>
- <exists>${swagger-properties}</exists>
- </file>
- <property>
- <name>swagger-sdk.generate-json</name>
- </property>
- </activation>
- <build>
- <plugins>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>properties-maven-plugin</artifactId>
- <version>1.0.0</version>
- <executions>
- <execution>
- <phase>initialize</phase>
- <goals>
- <goal>read-project-properties</goal>
- </goals>
- <configuration>
- <files>
- <file>${basedir}/src/main/resources/swagger.properties</file>
- </files>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>com.github.kongchen</groupId>
- <artifactId>swagger-maven-plugin</artifactId>
- <version>3.1.4</version>
- <configuration>
- <apiSources>
- <apiSource>
- <locations>${api-rest-package}</locations>
- <schemes>http,https</schemes>
- <host>${api-host-ip}:${api-host-port}</host>
- <basePath>${api-base-path}</basePath>
- <info>
- <title>${api-title}</title>
- <version>${api-version}</version>
- <description>${api-description}</description>
- <license>
- <name>${api-license}</name>
- </license>
- </info>
- <swaggerDirectory>${basedir}/src/main/resources</swaggerDirectory>
- </apiSource>
- </apiSources>
- </configuration>
- <executions>
- <execution>
- <phase>compile</phase>
- <goals>
- <goal>generate</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-install-plugin</artifactId>
- <version>2.3.1</version>
- <executions>
- <execution>
- <id>install-file-id</id>
- <phase>install</phase>
- <goals>
- <goal>install-file</goal>
- </goals>
- <configuration>
- <file>${basedir}/src/main/resources/swagger.json</file>
- <groupId>${project.groupId}</groupId>
- <artifactId>${project.artifactId}-swagger-schema</artifactId>
- <version>${project.version}</version>
- <packaging>json</packaging>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </profile>
- <profile>
- <id>generate-sdk</id>
- <activation>
- <file>
- <exists>${swagger-json}</exists>
- </file>
- <property>
- <name>swagger-sdk.generate-java-sdk</name>
- </property>
- </activation>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-antrun-plugin</artifactId>
- <version>1.8</version>
- <executions>
- <execution>
- <phase>initialize</phase>
- <id>ant-create-script</id>
- <configuration>
- <exportAntProperties>true</exportAntProperties>
- <tasks>
-
- <taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="maven.plugin.classpath" />
- <condition property="is_windows" value="true">
- <os family="windows"/>
- </condition>
- <condition property="isLinux" value="true">
- <os family="unix" />
- </condition>
- <if>
- <equals arg1="${is_windows}" arg2="true" />
- <then>
- <property name="swagger.sdk.script.file" value="generated-source-script.bat"/>
- <echo file="${project.build.directory}${file.separator}generated-source-script.bat"
- append="true" message="cd ${project.build.directory}${file.separator}generated-sources${line.separator}" />
- <echo file="${project.build.directory}${file.separator}generated-source-script.bat"
- append="true" message="mvn clean install -Dmaven.test.skip=true${line.separator}" />
- </then>
- <else>
- <property name="swagger.sdk.script.file" value="generated-source-script.sh"/>
- <echo file="${project.build.directory}${file.separator}generated-source-script.sh"
- append="true" message="cd ${project.build.directory}${file.separator}generated-sources${line.separator}" />
- <echo file="${project.build.directory}${file.separator}generated-source-script.sh"
- append="true" message="mvn clean install -Dmaven.test.skip=true${line.separator}" />
- <chmod file="${project.build.directory}${file.separator}generated-source-script.sh" perm="755"/>
- </else>
- </if>
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
- </executions>
- <dependencies>
- <dependency>
- <groupId>ant-contrib</groupId>
- <artifactId>ant-contrib</artifactId>
- <version>1.0b3</version>
- <exclusions>
- <exclusion>
- <artifactId>ant</artifactId>
- <groupId>ant</groupId>
- </exclusion>
- </exclusions>
- </dependency>
- </dependencies>
- </plugin>
- <plugin>
- <groupId>io.swagger</groupId>
- <artifactId>swagger-codegen-maven-plugin</artifactId>
- <version>2.2.1</version>
- <executions>
- <execution>
- <goals>
- <goal>generate</goal>
- </goals>
- <configuration>
- <inputSpec>${basedir}/src/main/resources/swagger.json</inputSpec>
- <output>${project.build.directory}/generated-sources</output>
- <language>java</language>
- <configOptions>
- <dateLibrary>joda</dateLibrary>
- </configOptions>
- <library>jersey2</library>
- <groupId>${project.groupId}</groupId>
- <artifactId>${project.artifactId}-java-sdk</artifactId>
- <artifactVersion>${project.version}</artifactVersion>
- <modelPackage>${project.groupId}.${project.artifactId}.client.model</modelPackage>
- <apiPackage>${project.groupId}.${project.artifactId}.client.api</apiPackage>
- <invokerPackage>${project.groupId}.${project.artifactId}.client.invoker</invokerPackage>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <artifactId>exec-maven-plugin</artifactId>
- <groupId>org.codehaus.mojo</groupId>
- <version>1.5.0</version>
- <executions>
- <execution>
- <id>swagger-generate-sources</id>
- <phase>generate-sources</phase>
- <goals>
- <goal>exec</goal>
- </goals>
- <configuration>
- <executable>${project.build.directory}${file.separator}${swagger.sdk.script.file}</executable>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-clean-plugin</artifactId>
- <version>3.0.0</version>
- <executions>
- <execution>
- <id>clean-generated-files</id>
- <phase>generate-sources</phase>
- <goals>
- <goal>clean</goal>
- </goals>
- <configuration>
- <filesets>
- <fileset>
- <directory>${project.build.directory}/generated-sources</directory>
- </fileset>
- </filesets>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
+ <profile>
+ <id>generate-json</id>
+ <activation>
+ <file>
+ <exists>${swagger-properties}</exists>
+ </file>
+ <property>
+ <name>swagger-sdk.generate-json</name>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>properties-maven-plugin</artifactId>
+ <version>1.0.0</version>
+ <executions>
+ <execution>
+ <phase>initialize</phase>
+ <goals>
+ <goal>read-project-properties</goal>
+ </goals>
+ <configuration>
+ <files>
+ <file>${basedir}/src/main/resources/swagger.properties</file>
+ </files>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>com.github.kongchen</groupId>
+ <artifactId>swagger-maven-plugin</artifactId>
+ <version>3.1.4</version>
+ <configuration>
+ <apiSources>
+ <apiSource>
+ <locations>${api-rest-package}</locations>
+ <schemes>http,https</schemes>
+ <host>${api-host-ip}:${api-host-port}</host>
+ <basePath>${api-base-path}</basePath>
+ <info>
+ <title>${api-title}</title>
+ <version>${api-version}</version>
+ <description>${api-description}</description>
+ <license>
+ <name>${api-license}</name>
+ </license>
+ </info>
+ <swaggerDirectory>${basedir}/src/main/resources</swaggerDirectory>
+ </apiSource>
+ </apiSources>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>compile</phase>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-install-plugin</artifactId>
+ <version>2.3.1</version>
+ <executions>
+ <execution>
+ <id>install-file-id</id>
+ <phase>install</phase>
+ <goals>
+ <goal>install-file</goal>
+ </goals>
+ <configuration>
+ <file>${basedir}/src/main/resources/swagger.json</file>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>${project.artifactId}-swagger-schema</artifactId>
+ <version>${project.version}</version>
+ <packaging>json</packaging>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>generate-sdk</id>
+ <activation>
+ <file>
+ <exists>${swagger-json}</exists>
+ </file>
+ <property>
+ <name>swagger-sdk.generate-java-sdk</name>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.8</version>
+ <executions>
+ <execution>
+ <phase>initialize</phase>
+ <id>ant-create-script</id>
+ <configuration>
+ <exportAntProperties>true</exportAntProperties>
+ <tasks>
+ <taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="maven.plugin.classpath"/>
+ <condition property="is_windows" value="true">
+ <os family="windows"/>
+ </condition>
+ <condition property="isLinux" value="true">
+ <os family="unix"/>
+ </condition>
+ <if>
+ <equals arg1="${is_windows}" arg2="true"/>
+ <then>
+ <property name="swagger.sdk.script.file" value="generated-source-script.bat"/>
+ <echo file="${project.build.directory}${file.separator}generated-source-script.bat" append="true" message="cd ${project.build.directory}${file.separator}generated-sources${line.separator}"/>
+ <echo file="${project.build.directory}${file.separator}generated-source-script.bat" append="true" message="mvn clean install -Dmaven.test.skip=true${line.separator}"/>
+ </then>
+ <else>
+ <property name="swagger.sdk.script.file" value="generated-source-script.sh"/>
+ <echo file="${project.build.directory}${file.separator}generated-source-script.sh" append="true" message="cd ${project.build.directory}${file.separator}generated-sources${line.separator}"/>
+ <echo file="${project.build.directory}${file.separator}generated-source-script.sh" append="true" message="mvn clean install -Dmaven.test.skip=true${line.separator}"/>
+ <chmod file="${project.build.directory}${file.separator}generated-source-script.sh" perm="755"/>
+ </else>
+ </if>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
<dependencies>
- <dependency>
- <groupId>org.onap.msb.swagger-sdk</groupId>
- <artifactId>swagger-sdk</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- </dependency>
+ <dependency>
+ <groupId>ant-contrib</groupId>
+ <artifactId>ant-contrib</artifactId>
+ <version>1.0b3</version>
+ <exclusions>
+ <exclusion>
+ <artifactId>ant</artifactId>
+ <groupId>ant</groupId>
+ </exclusion>
+ </exclusions>
+ </dependency>
</dependencies>
- </profile>
- </profiles>
+ </plugin>
+ <plugin>
+ <groupId>io.swagger</groupId>
+ <artifactId>swagger-codegen-maven-plugin</artifactId>
+ <version>2.2.1</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ <configuration>
+ <inputSpec>${basedir}/src/main/resources/swagger.json</inputSpec>
+ <output>${project.build.directory}/generated-sources</output>
+ <language>java</language>
+ <configOptions>
+ <dateLibrary>joda</dateLibrary>
+ </configOptions>
+ <library>jersey2</library>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>${project.artifactId}-java-sdk</artifactId>
+ <artifactVersion>${project.version}</artifactVersion>
+ <modelPackage>${project.groupId}.${project.artifactId}.client.model</modelPackage>
+ <apiPackage>${project.groupId}.${project.artifactId}.client.api</apiPackage>
+ <invokerPackage>${project.groupId}.${project.artifactId}.client.invoker</invokerPackage>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>exec-maven-plugin</artifactId>
+ <groupId>org.codehaus.mojo</groupId>
+ <version>1.5.0</version>
+ <executions>
+ <execution>
+ <id>swagger-generate-sources</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ <configuration>
+ <executable>${project.build.directory}${file.separator}${swagger.sdk.script.file}</executable>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-clean-plugin</artifactId>
+ <version>3.0.0</version>
+ <executions>
+ <execution>
+ <id>clean-generated-files</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>clean</goal>
+ </goals>
+ <configuration>
+ <filesets>
+ <fileset>
+ <directory>${project.build.directory}/generated-sources</directory>
+ </fileset>
+ </filesets>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>org.onap.msb.swagger-sdk</groupId>
+ <artifactId>swagger-sdk</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+ </profile>
+ </profiles>
<build>
<pluginManagement>
<plugins>
@@ -320,19 +320,19 @@
</goals>
<phase>process-sources</phase>
<configuration>
- <!-- Use Google Java Style Guide:
+ <!-- Use Google Java Style Guide:
https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml
with minor changes -->
- <configLocation>onap-checkstyle/onap-java-style.xml</configLocation>
- <!-- <sourceDirectory> is needed so that checkstyle ignores the generated sources directory -->
- <sourceDirectory>${project.build.sourceDirectory}/src/main/java</sourceDirectory>
- <includeResources>true</includeResources>
- <includeTestSourceDirectory>true</includeTestSourceDirectory>
- <includeTestResources>true</includeTestResources>
- <excludes>
+ <configLocation>onap-checkstyle/onap-java-style.xml</configLocation>
+ <!-- <sourceDirectory> is needed so that checkstyle ignores the generated sources directory -->
+ <sourceDirectory>${project.build.sourceDirectory}/src/main/java</sourceDirectory>
+ <includeResources>true</includeResources>
+ <includeTestSourceDirectory>true</includeTestSourceDirectory>
+ <includeTestResources>true</includeTestResources>
+ <excludes>
</excludes>
- <failsOnError>false</failsOnError>
- <consoleOutput>true</consoleOutput>
+ <failsOnError>false</failsOnError>
+ <consoleOutput>true</consoleOutput>
</configuration>
</execution>
</executions>
@@ -458,12 +458,29 @@
</execution>
</executions>
</plugin>
- <!-- https://mvnrepository.com/artifact/org.sonarsource.scanner.maven/sonar-maven-plugin -->
- <plugin>
- <groupId>org.sonarsource.scanner.maven</groupId>
- <artifactId>sonar-maven-plugin</artifactId>
- <version>3.3.0.603</version>
- </plugin>
+ <!-- https://mvnrepository.com/artifact/org.sonarsource.scanner.maven/sonar-maven-plugin -->
+ <plugin>
+ <groupId>org.sonarsource.scanner.maven</groupId>
+ <artifactId>sonar-maven-plugin</artifactId>
+ <version>3.3.0.603</version>
+ </plugin>
+ <plugin>
+ <groupId>org.onap.oparent</groupId>
+ <artifactId>version-check-maven-plugin</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <executions>
+ <execution>
+ <id>version-check</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>version-check</goal>
+ </goals>
+ <configuration>
+ <manifestUri>https://git.onap.org/oparent/plain/versions/src/main/resources/onap-versions/onap-version-manifest.csv</manifestUri>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</pluginManagement>
<plugins>
@@ -488,6 +505,10 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
+ <plugin>
+ <groupId>org.onap.oparent</groupId>
+ <artifactId>version-check-maven-plugin</artifactId>
+ </plugin>
</plugins>
</build>
</project>
diff --git a/pom.xml b/pom.xml
index 7ac034e..1bd4a4f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,6 +27,7 @@
<module>checkstyle</module>
<module>license</module>
<module>oparent</module>
+ <module>version-check-maven-plugin</module>
</modules>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
diff --git a/version-check-maven-plugin/pom.xml b/version-check-maven-plugin/pom.xml
new file mode 100644
index 0000000..57f905b
--- /dev/null
+++ b/version-check-maven-plugin/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.onap.oparent</groupId>
+ <artifactId>version</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <relativePath>..</relativePath>
+ </parent>
+ <artifactId>version-check-maven-plugin</artifactId>
+ <packaging>maven-plugin</packaging>
+ <name>version-check-maven-plugin Maven Plugin</name>
+ <url>https://www.onap.org</url>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <mavenVersion>3.2.3</mavenVersion>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-plugin-api</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.plugin-tools</groupId>
+ <artifactId>maven-plugin-annotations</artifactId>
+ <version>3.2</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-utils</artifactId>
+ <version>3.0.8</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-core</artifactId>
+ <version>${mavenVersion}</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-csv -->
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-csv</artifactId>
+ <version>1.4</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-plugin-plugin</artifactId>
+ <version>3.2</version>
+ <configuration>
+ <goalPrefix>version-check</goalPrefix>
+ <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
+ </configuration>
+ <executions>
+ <execution>
+ <id>mojo-descriptor</id>
+ <goals>
+ <goal>descriptor</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>help-goal</id>
+ <goals>
+ <goal>helpmojo</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/version-check-maven-plugin/src/main/java/org/onap/oparent/versioncheck/VersionCheckMojo.java b/version-check-maven-plugin/src/main/java/org/onap/oparent/versioncheck/VersionCheckMojo.java
new file mode 100644
index 0000000..0bb94f2
--- /dev/null
+++ b/version-check-maven-plugin/src/main/java/org/onap/oparent/versioncheck/VersionCheckMojo.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2017 Huawei Technologies, Ltd. and others.
+ *
+ * Licensed 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.
+ */
+
+package org.onap.oparent.versioncheck;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVRecord;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.MavenProject;
+
+@Mojo(name = "version-check", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
+public class VersionCheckMojo extends AbstractMojo {
+
+ /**
+ * The Maven Project.
+ *
+ * @since 1.0-alpha-1
+ */
+ @Parameter(defaultValue = "${project}", required = true, readonly = true)
+ protected MavenProject project;
+
+ /**
+ * Location of the file.
+ */
+ @Parameter(property = "manifestUri", required = true)
+ private URI manifestUri;
+
+ public void execute() throws MojoExecutionException {
+ final Log log = getLog();
+
+ log.info("Checking version manifest " + manifestUri);
+
+ Map<String, String> expectedVersions = new HashMap<>();
+
+ try (InputStreamReader in = new InputStreamReader(manifestUri.toURL().openStream(),
+ StandardCharsets.ISO_8859_1)) {
+ Iterable<CSVRecord> records = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(in);
+ for (CSVRecord record : records) {
+ String groupId = record.get("groupId");
+ String artifactId = record.get("artifactId");
+ String version = record.get("version");
+ log.debug("Expected version: " + groupId + ":" + artifactId + ":" + version);
+ expectedVersions.put(groupId + ":" + artifactId, version);
+ }
+ } catch (MalformedURLException e) {
+ log.error(e);
+ throw new MojoExecutionException(e.getMessage());
+ } catch (IOException e) {
+ log.error(e);
+ throw new MojoExecutionException(e.getMessage());
+ }
+
+ Map<String, String> actualVersions = new HashMap<>();
+ MavenProject parent = project.getParent();
+ if (parent != null) {
+ log.debug("Parent: " + parent);
+ actualVersions.put(parent.getGroupId() + ":" + parent.getArtifactId(), parent.getVersion());
+ } else {
+ log.debug("No parent");
+ }
+
+ for (Dependency dep : project.getDependencies()) {
+ log.debug("Dependency: " + dep.toString());
+ actualVersions.put(dep.getGroupId() + ":" + dep.getArtifactId(), dep.getVersion());
+ }
+
+ Set<String> mismatches = new TreeSet<>();
+ for (Entry<String, String> expected : expectedVersions.entrySet()) {
+ String artifact = expected.getKey();
+ String expectedVersion = expectedVersions.get(artifact);
+ String actualVersion = actualVersions.get(artifact);
+ if (actualVersion != null && !actualVersion.equals(expectedVersion)) {
+ mismatches.add(artifact);
+ }
+ }
+
+ if (mismatches.isEmpty()) {
+ log.debug("No version mismatches found");
+ } else {
+ log.warn("The following dependencies should be updated to match the version manifest:");
+ for (String artifact : mismatches) {
+ String expectedVersion = expectedVersions.get(artifact);
+ String actualVersion = actualVersions.get(artifact);
+ if (actualVersion != null && !actualVersion.equals(expectedVersion)) {
+ log.warn(" " + artifact + " " + actualVersion + " -> " + expectedVersion);
+ }
+ }
+ }
+
+ }
+}