From a686ce2f11f2f29584352b3d8bc08b616a042dd2 Mon Sep 17 00:00:00 2001 From: Andrzej Jarmoniuk Date: Tue, 24 Jan 2023 21:16:44 +0100 Subject: [PATCH] Issue #74: Add display-extension-updates --- pom.xml | 1 + versions-common/pom.xml | 5 + .../versions/api/DefaultVersionsHelper.java | 24 ++-- .../mojo/versions/api/VersionsHelper.java | 24 ++-- .../versions/filtering/DependencyFilter.java | 24 ++-- .../versions/utils/CoreExtensionUtils.java | 8 +- .../versions/utils/DependencyBuilder.java | 28 ++--- .../utils/CoreExtensionUtilsTest.java | 4 +- .../child/.mvn/extensions.xml | 8 ++ .../child/pom.xml | 31 +++++ .../invoker.properties | 5 + .../it-display-extension-updates-004/pom.xml | 29 +++++ .../verify.groovy | 10 ++ .../versions/DisplayExtensionUpdatesMojo.java | 102 ++++++++++++--- .../DisplayExtensionUpdatesMojoTest.java | 35 +++++- versions-model-core-extensions/pom.xml | 63 ++++++++++ .../src/main/mdo/core-extensions.mdo | 118 ++++++++++++++++++ .../mojo/versions/utils/MockUtils.java | 28 ++--- 18 files changed, 444 insertions(+), 103 deletions(-) create mode 100644 versions-maven-plugin/src/it/it-display-extension-updates-004/child/.mvn/extensions.xml create mode 100644 versions-maven-plugin/src/it/it-display-extension-updates-004/child/pom.xml create mode 100644 versions-maven-plugin/src/it/it-display-extension-updates-004/invoker.properties create mode 100644 versions-maven-plugin/src/it/it-display-extension-updates-004/pom.xml create mode 100644 versions-maven-plugin/src/it/it-display-extension-updates-004/verify.groovy create mode 100644 versions-model-core-extensions/pom.xml create mode 100644 versions-model-core-extensions/src/main/mdo/core-extensions.mdo diff --git a/pom.xml b/pom.xml index d9a2750a02..b26e7bf063 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,7 @@ versions-maven-plugin versions-model-report versions-model + versions-model-core-extensions versions-test diff --git a/versions-common/pom.xml b/versions-common/pom.xml index a65e215b0e..f6e1188af0 100644 --- a/versions-common/pom.xml +++ b/versions-common/pom.xml @@ -23,6 +23,11 @@ versions-model ${project.version} + + org.codehaus.mojo.versions + versions-model-core-extensions + ${project.version} + org.apache.maven diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java b/versions-common/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java index f94a1ca164..9a75757bf4 100644 --- a/versions-common/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java +++ b/versions-common/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java @@ -1,22 +1,18 @@ package org.codehaus.mojo.versions.api; /* - * 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 + * Copyright MojoHaus and Contributors + * 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 + * 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. + * 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.BufferedInputStream; diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java b/versions-common/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java index 102f0a6b3a..0c3e2347e0 100644 --- a/versions-common/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java +++ b/versions-common/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java @@ -1,22 +1,18 @@ package org.codehaus.mojo.versions.api; /* - * 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 + * Copyright MojoHaus and Contributors + * 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 + * 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. + * 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; diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/filtering/DependencyFilter.java b/versions-common/src/main/java/org/codehaus/mojo/versions/filtering/DependencyFilter.java index 6b6475dc5b..d2808a0a76 100644 --- a/versions-common/src/main/java/org/codehaus/mojo/versions/filtering/DependencyFilter.java +++ b/versions-common/src/main/java/org/codehaus/mojo/versions/filtering/DependencyFilter.java @@ -1,22 +1,18 @@ package org.codehaus.mojo.versions.filtering; /* - * 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 + * Copyright MojoHaus and Contributors + * 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 + * 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. + * 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; diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/utils/CoreExtensionUtils.java b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/CoreExtensionUtils.java index 62638fac85..94525b2277 100644 --- a/versions-common/src/main/java/org/codehaus/mojo/versions/utils/CoreExtensionUtils.java +++ b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/CoreExtensionUtils.java @@ -25,8 +25,8 @@ import java.util.stream.Stream; import org.apache.maven.cli.internal.extension.model.io.xpp3.CoreExtensionsXpp3Reader; -import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Extension; +import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; /** @@ -40,14 +40,14 @@ public final class CoreExtensionUtils { * Reads the core extensions (not build extensions) configured for the given project * from the {@code ${project}/.mvn/extensions.xml} file. * - * @param session {@link MavenSession} instance + * @param project {@link MavenProject} instance * @return stream of core extensions defined in the {@code ${project}/.mvn/extensions.xml} file * @throws IOException thrown if a file I/O operation fails * @throws XmlPullParserException thrown if the file cannot be parsed * @since 2.15.0 */ - public static Stream getCoreExtensions(MavenSession session) throws IOException, XmlPullParserException { - Path extensionsFile = session.getCurrentProject().getBasedir().toPath().resolve(".mvn/extensions.xml"); + public static Stream getCoreExtensions(MavenProject project) throws IOException, XmlPullParserException { + Path extensionsFile = project.getBasedir().toPath().resolve(".mvn/extensions.xml"); if (!Files.isRegularFile(extensionsFile)) { return Stream.empty(); } diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/utils/DependencyBuilder.java b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/DependencyBuilder.java index c5daba94c3..6574f4b557 100644 --- a/versions-common/src/main/java/org/codehaus/mojo/versions/utils/DependencyBuilder.java +++ b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/DependencyBuilder.java @@ -1,24 +1,20 @@ +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 + * Copyright MojoHaus and Contributors + * 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 + * 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. + * 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.codehaus.mojo.versions.utils; - import java.util.Optional; import org.apache.maven.model.Dependency; diff --git a/versions-common/src/test/java/org/codehaus/mojo/versions/utils/CoreExtensionUtilsTest.java b/versions-common/src/test/java/org/codehaus/mojo/versions/utils/CoreExtensionUtilsTest.java index f0500f15dc..90aaeec527 100644 --- a/versions-common/src/test/java/org/codehaus/mojo/versions/utils/CoreExtensionUtilsTest.java +++ b/versions-common/src/test/java/org/codehaus/mojo/versions/utils/CoreExtensionUtilsTest.java @@ -48,7 +48,7 @@ public void testNoExtensions() throws XmlPullParserException, IOException { new File("src/test/resources/org/codehaus/mojo/versions/utils/core-extensions/no-extensions")); MavenSession session = mock(MavenSession.class); when(session.getCurrentProject()).thenReturn(project); - assertThat(CoreExtensionUtils.getCoreExtensions(session).findAny(), is(Optional.empty())); + assertThat(CoreExtensionUtils.getCoreExtensions(project).findAny(), is(Optional.empty())); } @Test @@ -59,7 +59,7 @@ public void testExtensionsFound() throws XmlPullParserException, IOException { MavenSession session = mock(MavenSession.class); when(session.getCurrentProject()).thenReturn(project); Set extensions = - CoreExtensionUtils.getCoreExtensions(session).collect(Collectors.toSet()); + CoreExtensionUtils.getCoreExtensions(project).collect(Collectors.toSet()); assertThat( extensions, hasItems( diff --git a/versions-maven-plugin/src/it/it-display-extension-updates-004/child/.mvn/extensions.xml b/versions-maven-plugin/src/it/it-display-extension-updates-004/child/.mvn/extensions.xml new file mode 100644 index 0000000000..4a58d492bd --- /dev/null +++ b/versions-maven-plugin/src/it/it-display-extension-updates-004/child/.mvn/extensions.xml @@ -0,0 +1,8 @@ + + + localhost + dummy-impl + 1.0 + + \ No newline at end of file diff --git a/versions-maven-plugin/src/it/it-display-extension-updates-004/child/pom.xml b/versions-maven-plugin/src/it/it-display-extension-updates-004/child/pom.xml new file mode 100644 index 0000000000..ff98b042b1 --- /dev/null +++ b/versions-maven-plugin/src/it/it-display-extension-updates-004/child/pom.xml @@ -0,0 +1,31 @@ + + 4.0.0 + + + localhost + it-display-extension-updates-004 + 1.0 + + + child + 1.0 + + pom + + + 1.0 + + + + + + localhost + dummy-maven-plugin + ${dummyMavenPluginVersion} + + + + + diff --git a/versions-maven-plugin/src/it/it-display-extension-updates-004/invoker.properties b/versions-maven-plugin/src/it/it-display-extension-updates-004/invoker.properties new file mode 100644 index 0000000000..bb83305ac1 --- /dev/null +++ b/versions-maven-plugin/src/it/it-display-extension-updates-004/invoker.properties @@ -0,0 +1,5 @@ +invoker.goals.1 = ${project.groupId}:${project.artifactId}:${project.version}:display-extension-updates +invoker.mavenOpts.1 = -Dversions.outputFile=./output1.txt -DoutputEncoding=UTF-8 + +invoker.goals.2 = ${project.groupId}:${project.artifactId}:${project.version}:display-extension-updates +invoker.mavenOpts.2 = -DinterpolateProperties=false -Dversions.outputFile=./output2.txt -DoutputEncoding=UTF-8 diff --git a/versions-maven-plugin/src/it/it-display-extension-updates-004/pom.xml b/versions-maven-plugin/src/it/it-display-extension-updates-004/pom.xml new file mode 100644 index 0000000000..8e3cd5c1fa --- /dev/null +++ b/versions-maven-plugin/src/it/it-display-extension-updates-004/pom.xml @@ -0,0 +1,29 @@ + + 4.0.0 + localhost + it-display-extension-updates-004 + 1.0 + pom + + + child + + + + 1.0 + 2.0 + + + + + + localhost + dummy-api + ${dummyApiVersion} + + + + + diff --git a/versions-maven-plugin/src/it/it-display-extension-updates-004/verify.groovy b/versions-maven-plugin/src/it/it-display-extension-updates-004/verify.groovy new file mode 100644 index 0000000000..1fcf0ac43a --- /dev/null +++ b/versions-maven-plugin/src/it/it-display-extension-updates-004/verify.groovy @@ -0,0 +1,10 @@ +def parentOutput = new File( basedir, "output1.txt").text +assert parentOutput =~ /\Qlocalhost:dummy-maven-plugin\E\s*\.*\s*\Q1.0\E\s+->\s+\Q3.1\E/ +assert parentOutput =~ /\Qlocalhost:dummy-api\E\s*\.*\s*\Q1.0\E\s+->\s+\Q3.0\E/ + +def childOutput = new File( basedir, "child/output1.txt") +assert !childOutput.exists() + +def parentOutput2 = new File( basedir, "output2.txt").text +assert parentOutput2 =~ /\Qlocalhost:dummy-maven-plugin\E\s*\.*\s*\Q\u0024{dummyMavenPluginVersion}\E\s+->\s+\Q3.1\E/ +assert parentOutput2 =~ /\Qlocalhost:dummy-api\E\s*\.*\s*\Q\u0024{dummyApiVersion}\E\s+->\s+\Q3.0\E/ diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojo.java index c73f5d1ec0..1c9b51a183 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojo.java @@ -1,30 +1,30 @@ 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 + * Copyright MojoHaus and Contributors + * 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 + * 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. + * 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 javax.inject.Inject; import java.io.IOException; +import java.nio.file.Files; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -32,8 +32,10 @@ import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.model.Build; import org.apache.maven.model.Dependency; import org.apache.maven.model.Extension; +import org.apache.maven.model.Model; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Mojo; @@ -41,6 +43,7 @@ import org.apache.maven.repository.RepositorySystem; import org.apache.maven.wagon.Wagon; import org.codehaus.mojo.versions.api.ArtifactVersions; +import org.codehaus.mojo.versions.api.PomHelper; import org.codehaus.mojo.versions.api.Segment; import org.codehaus.mojo.versions.api.VersionRetrievalException; import org.codehaus.mojo.versions.api.recording.ChangeRecorder; @@ -49,6 +52,8 @@ import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader; import org.codehaus.mojo.versions.utils.CoreExtensionUtils; import org.codehaus.mojo.versions.utils.DependencyBuilder; +import org.codehaus.mojo.versions.utils.ExtensionBuilder; +import org.codehaus.mojo.versions.utils.ModelNode; import org.codehaus.mojo.versions.utils.SegmentUtils; import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; @@ -57,13 +62,12 @@ import static org.codehaus.mojo.versions.api.Segment.MAJOR; /** - * Displays all build extensions that have newer versions available. - * Does not check the core extensions. + * Displays all build and core extensions that have newer versions available. * * @author Andrzej Jarmoniuk * @since 2.15.0 */ -@Mojo(name = "display-extension-updates", threadSafe = true) +@Mojo(name = "display-extension-updates", aggregator = true, threadSafe = true) public class DisplayExtensionUpdatesMojo extends AbstractVersionsDisplayMojo { // ------------------------------ FIELDS ------------------------------ @@ -149,6 +153,15 @@ public class DisplayExtensionUpdatesMojo extends AbstractVersionsDisplayMojo { @Parameter(property = "processBuildExtensions", defaultValue = "true") private boolean processBuildExtensions = true; + /** + * If set to {@code false}, the plugin will not interpolate property values when looking for versions + * to be changed, but will instead operate on raw model. + * + * @since 2.15.0 + */ + @Parameter(property = "interpolateProperties", defaultValue = "true") + protected boolean interpolateProperties = true; + /** * Whether to show additional information such as extensions that do not need updating. Defaults to false. * @@ -183,12 +196,48 @@ public void execute() throws MojoExecutionException, MojoFailureException { try { Stream extensions; if (processCoreExtensions) { - extensions = CoreExtensionUtils.getCoreExtensions(session); + extensions = CoreExtensionUtils.getCoreExtensions(project); } else { extensions = Stream.empty(); } if (processBuildExtensions) { - extensions = Stream.concat(extensions, session.getCurrentProject().getBuildExtensions().stream()); + if (!interpolateProperties) { + extensions = Stream.concat( + extensions, + PomHelper.getChildModels(session.getCurrentProject(), getLog()).values().stream() + .map(Model::getBuild) + .filter(Objects::nonNull) + .map(Build::getExtensions) + .map(List::stream) + .reduce(Stream::concat) + .orElse(Stream.empty())); + } else { + List rawModels = getRawModels(); + for (ModelNode node : rawModels) { + if (node.getModel() == null) { + // unlikely + continue; + } + Map properties = new HashMap<>(); + for (ModelNode p = node; p != null; p = p.getParent().orElse(null)) { + p.getModel() + .getProperties() + .forEach((key, value) -> + properties.putIfAbsent(String.valueOf(key), String.valueOf(value))); + } + extensions = Stream.concat( + extensions, + Optional.ofNullable(node.getModel().getBuild()) + .map(Build::getExtensions) + .orElse(Collections.emptyList()) + .stream() + .map(e -> ExtensionBuilder.newBuilder() + .withGroupId(PomHelper.evaluate(e.getGroupId(), properties)) + .withArtifactId(PomHelper.evaluate(e.getArtifactId(), properties)) + .withVersion(PomHelper.evaluate(e.getVersion(), properties)) + .build())); + } + } } dependencies = extensions @@ -215,6 +264,21 @@ public void execute() throws MojoExecutionException, MojoFailureException { } } + private List getRawModels() throws MojoFailureException { + List rawModels; + try { + ModifiedPomXMLEventReader pomReader = newModifiedPomXER( + new StringBuilder( + new String(Files.readAllBytes(getProject().getFile().toPath()))), + getProject().getFile().toPath().toString()); + ModelNode rootNode = new ModelNode(PomHelper.getRawModel(pomReader), pomReader); + rawModels = PomHelper.getRawModelTree(rootNode, getLog()); + } catch (IOException e) { + throw new MojoFailureException(e.getMessage(), e); + } + return rawModels; + } + private Optional calculateUpdateScope() { return of(SegmentUtils.determineUnchangedSegment( allowMajorUpdates, allowMinorUpdates, allowIncrementalUpdates, getLog()) diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojoTest.java index 6e6b6ab7c1..2b8aec9134 100644 --- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojoTest.java +++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/DisplayExtensionUpdatesMojoTest.java @@ -27,10 +27,13 @@ import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.project.MavenProject; +import org.codehaus.mojo.versions.api.PomHelper; import org.codehaus.mojo.versions.utils.ExtensionBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.MockedStatic; import static java.util.Collections.emptyList; import static java.util.Collections.singleton; @@ -42,6 +45,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.empty; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mockStatic; /** * Basic tests for {@linkplain DisplayExtensionUpdatesMojo}. @@ -73,6 +78,8 @@ public void setUp() throws IllegalAccessException, IOException { mojo.outputFile = tempPath.toFile(); mojo.outputEncoding = "UTF-8"; setVariableValueToObject(mojo, "processCoreExtensions", false); + // turning interpolateExtensions off so that we don't need to bother with the model tree + mojo.interpolateProperties = false; mojo.setPluginContext(new HashMap() { { @@ -93,7 +100,12 @@ public void testNoBuildExists() throws MojoExecutionException, MojoFailureException, IllegalAccessException, IOException { setVariableValueToObject(mojo, "extensionIncludes", singletonList("*")); setVariableValueToObject(mojo, "extensionExcludes", emptyList()); - mojo.execute(); + try (MockedStatic pomHelper = mockStatic(PomHelper.class)) { + pomHelper + .when(() -> PomHelper.getChildModels(ArgumentMatchers.any(MavenProject.class), any())) + .then(i -> Collections.singletonMap(null, ((MavenProject) i.getArgument(0)).getModel())); + mojo.execute(); + } } @Test @@ -110,7 +122,12 @@ public void testIncludesMakesSetEmpty() .withArtifactId("artifactA") .withVersion("1.0.0") .build())); - mojo.execute(); + try (MockedStatic pomHelper = mockStatic(PomHelper.class)) { + pomHelper + .when(() -> PomHelper.getChildModels(ArgumentMatchers.any(MavenProject.class), any())) + .then(i -> Collections.singletonMap(null, ((MavenProject) i.getArgument(0)).getModel())); + mojo.execute(); + } assertThat(Files.readAllLines(tempPath), empty()); } @@ -129,7 +146,12 @@ public void testIncludesMakesSetNonEmpty() .withArtifactId("artifactA") .withVersion("1.0.0") .build())); - mojo.execute(); + try (MockedStatic pomHelper = mockStatic(PomHelper.class)) { + pomHelper + .when(() -> PomHelper.getChildModels(ArgumentMatchers.any(MavenProject.class), any())) + .then(i -> Collections.singletonMap(null, ((MavenProject) i.getArgument(0)).getModel())); + mojo.execute(); + } assertThat( String.join("", Files.readAllLines(tempPath)), @@ -150,7 +172,12 @@ public void testIncludesExcludesMakesSetEmpty() .withArtifactId("artifactA") .withVersion("1.0.0") .build())); - mojo.execute(); + try (MockedStatic pomHelper = mockStatic(PomHelper.class)) { + pomHelper + .when(() -> PomHelper.getChildModels(ArgumentMatchers.any(MavenProject.class), any())) + .then(i -> Collections.singletonMap(null, ((MavenProject) i.getArgument(0)).getModel())); + mojo.execute(); + } assertThat(Files.readAllLines(tempPath), empty()); } diff --git a/versions-model-core-extensions/pom.xml b/versions-model-core-extensions/pom.xml new file mode 100644 index 0000000000..3acd01a6f4 --- /dev/null +++ b/versions-model-core-extensions/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + org.codehaus.mojo.versions + versions + 2.15.0-SNAPSHOT + + + versions-model-core-extensions + Versions Model Core Extensions + Model classes and parser for Core Extensions + + + + org.codehaus.plexus + plexus-utils + + + + + + + org.codehaus.modello + modello-maven-plugin + + + src/main/mdo/core-extensions.mdo + + 1.1.0 + + + + generate-java-classes + + xpp3-reader + java + + generate-sources + + + generate-site-doc + + xdoc + + pre-site + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + true + + + + + + + + diff --git a/versions-model-core-extensions/src/main/mdo/core-extensions.mdo b/versions-model-core-extensions/src/main/mdo/core-extensions.mdo new file mode 100644 index 0000000000..32ee24e244 --- /dev/null +++ b/versions-model-core-extensions/src/main/mdo/core-extensions.mdo @@ -0,0 +1,118 @@ + + + + + + + core-extensions + CoreExtensions + This is a reference for the Core Extensions descriptor.

+

The default location for the Core Extensions descriptor file is ${maven.projectBasedir}/.mvn/extensions.xml

+ ]]>
+ + + + package + org.apache.maven.cli.internal.extension.model + + + + + + CoreExtensions + Extensions to load. + 1.0.0+ + + + extensions + A set of build extensions to use from this project. + 1.0.0+ + + CoreExtension + * + + + + + + CoreExtension + Describes a build extension to utilise. + 1.0.0+ + + + groupId + The group ID of the extension's artifact. + 1.0.0+ + true + String + + + artifactId + The artifact ID of the extension. + 1.0.0+ + true + String + + + version + The version of the extension. + 1.0.0+ + true + String + + + classLoadingStrategy + The class loading strategy: 'self-first' (the default), 'parent-first' (loads classes from the parent, then from the extension) or 'plugin' (follows the rules from extensions defined as plugins). + 1.1.0+ + self-first + false + String + + + + + 1.0.0+ + + ::}, never {@code null}. + */ + public String getId() + { + StringBuilder id = new StringBuilder( 128 ); + + id.append( ( getGroupId() == null ) ? "[unknown-group-id]" : getGroupId() ); + id.append( ":" ); + id.append( ( getArtifactId() == null ) ? "[unknown-artifact-id]" : getArtifactId() ); + id.append( ":" ); + id.append( ( getVersion() == null ) ? "[unknown-version]" : getVersion() ); + + return id.toString(); + } + ]]> + + + + + +
diff --git a/versions-test/src/main/java/org/codehaus/mojo/versions/utils/MockUtils.java b/versions-test/src/main/java/org/codehaus/mojo/versions/utils/MockUtils.java index f604c6f903..e08b9322ab 100644 --- a/versions-test/src/main/java/org/codehaus/mojo/versions/utils/MockUtils.java +++ b/versions-test/src/main/java/org/codehaus/mojo/versions/utils/MockUtils.java @@ -1,24 +1,20 @@ +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 + * Copyright MojoHaus and Contributors + * 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 + * 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. + * 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.codehaus.mojo.versions.utils; - import java.io.File; import java.util.ArrayList; import java.util.Arrays;