Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -295,17 +295,45 @@ protected Map<String, String> populateUserProperties(LocalContext context) throw

protected List<CoreExtension> readCoreExtensionsDescriptor(LocalContext context)
throws ParserException, IOException {
ArrayList<CoreExtension> extensions = new ArrayList<>();
String installationExtensionsFile = context.userProperties.get(Constants.MAVEN_INSTALLATION_EXTENSIONS);
extensions.addAll(readCoreExtensionsDescriptorFromFile(
ArrayList<CoreExtension> installationExtensions = new ArrayList<>(readCoreExtensionsDescriptorFromFile(
context.installationDirectory.resolve(installationExtensionsFile)));

String userExtensionsFile = context.userProperties.get(Constants.MAVEN_USER_EXTENSIONS);
ArrayList<CoreExtension> userExtensions = new ArrayList<>(
readCoreExtensionsDescriptorFromFile(context.userHomeDirectory.resolve(userExtensionsFile)));

String projectExtensionsFile = context.userProperties.get(Constants.MAVEN_PROJECT_EXTENSIONS);
extensions.addAll(readCoreExtensionsDescriptorFromFile(context.cwd.resolve(projectExtensionsFile)));
ArrayList<CoreExtension> projectExtensions =
new ArrayList<>(readCoreExtensionsDescriptorFromFile(context.cwd.resolve(projectExtensionsFile)));

String userExtensionsFile = context.userProperties.get(Constants.MAVEN_USER_EXTENSIONS);
extensions.addAll(readCoreExtensionsDescriptorFromFile(context.userHomeDirectory.resolve(userExtensionsFile)));
// merge these 3 but check for GA uniqueness; we don't want to load up same extension w/ different Vs
HashMap<String, String> gas = new HashMap<>();
ArrayList<String> conflicts = new ArrayList<>();

ArrayList<CoreExtension> coreExtensions =
new ArrayList<>(installationExtensions.size() + userExtensions.size() + projectExtensions.size());
coreExtensions.addAll(mergeExtensions(installationExtensions, installationExtensionsFile, gas, conflicts));
coreExtensions.addAll(mergeExtensions(userExtensions, userExtensionsFile, gas, conflicts));
coreExtensions.addAll(mergeExtensions(projectExtensions, projectExtensionsFile, gas, conflicts));

if (!conflicts.isEmpty()) {
throw new ParserException("Extension conflicts: " + String.join("; ", conflicts));
}

return coreExtensions;
}

private List<CoreExtension> mergeExtensions(
List<CoreExtension> extensions, String extensionsSource, Map<String, String> gas, List<String> conflicts) {
for (CoreExtension extension : extensions) {
String ga = extension.getGroupId() + ":" + extension.getArtifactId();
if (gas.containsKey(ga)) {
conflicts.add(ga + " from " + extensionsSource + " already specified in " + gas.get(ga));
} else {
gas.put(ga, extensionsSource);
}
}
return extensions;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@
package org.apache.maven.cling.invoker.mvn;

import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;

import com.google.common.jimfs.Configuration;
import com.google.common.jimfs.Jimfs;
import org.apache.maven.api.cli.Invoker;
import org.apache.maven.api.cli.Parser;
import org.apache.maven.api.cli.ParserException;
import org.apache.maven.cling.invoker.ProtoLookup;
import org.codehaus.plexus.classworlds.ClassWorld;
import org.junit.jupiter.api.Disabled;
Expand All @@ -34,6 +36,8 @@
import org.junit.jupiter.api.io.CleanupMode;
import org.junit.jupiter.api.io.TempDir;

import static org.junit.jupiter.api.Assertions.assertThrows;

/**
* Local UT.
*/
Expand All @@ -59,6 +63,35 @@ void defaultFs(
invoke(cwd, userHome, Arrays.asList("clean", "verify"));
}

@Test
void conflictingExtensions(
@TempDir(cleanup = CleanupMode.ON_SUCCESS) Path cwd,
@TempDir(cleanup = CleanupMode.ON_SUCCESS) Path userHome)
throws Exception {
String extensionsXml =
"""
<?xml version="1.0" encoding="UTF-8"?>
<extensions>
<extension>
<groupId>eu.maveniverse.maven.mimir</groupId>
<artifactId>extension3</artifactId>
<version>0.3.4</version>
</extension>
</extensions>
""";
Path dotMvn = cwd.resolve(".mvn");
Files.createDirectories(dotMvn);
Path projectExtensions = dotMvn.resolve("extensions.xml");
Files.writeString(projectExtensions, extensionsXml);

Path userConf = userHome.resolve(".m2");
Files.createDirectories(userConf);
Path userExtensions = userConf.resolve("extensions.xml");
Files.writeString(userExtensions, extensionsXml);

assertThrows(ParserException.class, () -> invoke(cwd, userHome, Arrays.asList("clean", "verify")));
}

@Disabled("Until we move off fully from File")
@Test
void jimFs() throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ protected void invoke(Path cwd, Path userHome, Collection<String> goals) throws
.resolve("maven.properties")),
"${maven.home}/conf/maven.properties must be a file");

Files.createDirectory(cwd.resolve(".mvn"));
Files.createDirectories(cwd.resolve(".mvn"));
Path pom = cwd.resolve("pom.xml").toAbsolutePath();
Files.writeString(pom, POM_STRING);
Path appJava = cwd.resolve("src/main/java/org/apache/maven/samples/sample/App.java");
Expand Down
Loading