[MNG-7924] Better control over and better integration with Resolver (#1299)

Integrate better and obtain better control over Resolver. These changes did stem from "JPMS module experiment" and are considered improvement but does not implement any functionality related to JPMS module support.

Changes:
* Maven4 should stop "disconnected coexistence" of two type systems (ArtifactHandlers and Resolver ArtifactTypeRegistry), it should unify them.
* Maven4 Core should provide generic and extensible means to introduce new artifact types (fully in extension, and extension should get extended data via "roundtrip" in core/resolver)

---

https://issues.apache.org/jira/browse/MNG-7924
This commit is contained in:
Tamas Cservenak 2023-11-27 20:18:14 +01:00 committed by GitHub
parent e89b6fd53f
commit eee037e676
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 896 additions and 477 deletions

View File

@ -30,6 +30,14 @@ public interface Dependency extends Artifact {
@Nonnull
Type getType();
/**
* The dependency properties.
*
* @return the dependency properties, never {@code null}
*/
@Nonnull
DependencyProperties getDependencyProperties();
@Nonnull
Scope getScope();

View File

@ -0,0 +1,59 @@
/*
* 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.
*/
package org.apache.maven.api;
import java.util.Map;
import org.apache.maven.api.annotations.Experimental;
import org.apache.maven.api.annotations.Immutable;
import org.apache.maven.api.annotations.Nonnull;
/**
* Dependency properties supported by Maven Core.
*
* @since 4.0.0
*/
@Experimental
@Immutable
public interface DependencyProperties {
/**
* Boolean flag telling that dependency contains all of its dependencies. Value of this key should be parsed with
* {@link Boolean#parseBoolean(String)} to obtain value.
* <p>
* <em>Important: this flag must be kept in sync with resolver! (as is used during collection)</em>
*/
String FLAG_INCLUDES_DEPENDENCIES = "includesDependencies";
/**
* Boolean flag telling that dependency is meant to be placed on class path. Value of this key should be parsed with
* {@link Boolean#parseBoolean(String)} to obtain value.
*/
String FLAG_CLASS_PATH_CONSTITUENT = "classPathConstituent";
/**
* Returns immutable "map view" of all the properties.
*/
@Nonnull
Map<String, String> asMap();
/**
* Returns {@code true} if given flag is {@code true}.
*/
boolean checkFlag(@Nonnull String flag);
}

View File

@ -20,6 +20,8 @@
import org.apache.maven.api.annotations.Experimental;
import org.apache.maven.api.annotations.Immutable;
import org.apache.maven.api.annotations.Nonnull;
import org.apache.maven.api.annotations.Nullable;
import org.apache.maven.api.model.Dependency;
/**
@ -51,15 +53,17 @@ public interface Type {
* Returns the dependency type id.
* The id uniquely identifies this <i>dependency type</i>.
*
* @return the id of this type
* @return the id of this type, never {@code null}.
*/
@Nonnull
String getId();
/**
* Get the file extension of artifacts of this type.
*
* @return the file extension
* @return the file extension, never {@code null}.
*/
@Nonnull
String getExtension();
/**
@ -67,17 +71,20 @@ public interface Type {
* The default classifier can be overridden when specifying
* the {@link Dependency#getClassifier()}.
*
* @return the default classifier
* @return the default classifier, or {@code null}.
*/
@Nullable
String getClassifier();
/**
* Specifies if the artifact contains java classes and should be
* added to the classpath.
*
* @return if the artifact should be added to the classpath
* @return if the artifact should be added to the class path
*/
boolean isAddedToClasspath();
default boolean isAddedToClassPath() {
return getDependencyProperties().checkFlag(DependencyProperties.FLAG_CLASS_PATH_CONSTITUENT);
}
/**
* Specifies if the artifact already embeds its own dependencies.
@ -86,5 +93,15 @@ public interface Type {
*
* @return if the artifact's dependencies are included in the artifact
*/
boolean isIncludesDependencies();
default boolean isIncludesDependencies() {
return getDependencyProperties().checkFlag(DependencyProperties.FLAG_INCLUDES_DEPENDENCIES);
}
/**
* Gets the default properties associated with this dependency type.
*
* @return the default properties, never {@code null}.
*/
@Nonnull
DependencyProperties getDependencyProperties();
}

View File

@ -26,47 +26,61 @@
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.maven.api.Type;
import org.apache.maven.api.services.TypeRegistry;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.eventspy.AbstractEventSpy;
import org.apache.maven.execution.ExecutionEvent;
import static java.util.Objects.requireNonNull;
/**
*/
@Named
@Singleton
public class DefaultArtifactHandlerManager implements ArtifactHandlerManager {
public class DefaultArtifactHandlerManager extends AbstractEventSpy implements ArtifactHandlerManager {
private final TypeRegistry typeRegistry;
private final Map<String, ArtifactHandler> artifactHandlers;
private final Map<String, ArtifactHandler> allHandlers = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, ArtifactHandler> allHandlers;
@Inject
public DefaultArtifactHandlerManager(Map<String, ArtifactHandler> artifactHandlers) {
this.artifactHandlers = artifactHandlers;
public DefaultArtifactHandlerManager(TypeRegistry typeRegistry) {
this.typeRegistry = requireNonNull(typeRegistry, "null typeRegistry");
this.allHandlers = new ConcurrentHashMap<>();
}
public ArtifactHandler getArtifactHandler(String type) {
ArtifactHandler handler = allHandlers.get(type);
if (handler == null) {
handler = artifactHandlers.get(type);
if (handler == null) {
handler = new DefaultArtifactHandler(type);
} else {
allHandlers.put(type, handler);
@Override
public void onEvent(Object event) {
if (event instanceof ExecutionEvent) {
ExecutionEvent executionEvent = (ExecutionEvent) event;
if (executionEvent.getType() == ExecutionEvent.Type.SessionEnded) {
allHandlers.clear();
}
}
}
return handler;
public ArtifactHandler getArtifactHandler(String id) {
return allHandlers.computeIfAbsent(id, k -> {
Type type = typeRegistry.getType(id);
return new DefaultArtifactHandler(
id,
type.getExtension(),
type.getClassifier(),
null,
null,
type.isIncludesDependencies(),
"none",
type.isAddedToClassPath()); // TODO: watch out for module path
});
}
public void addHandlers(Map<String, ArtifactHandler> handlers) {
// legacy support for maven-gpg-plugin:1.0
allHandlers.putAll(handlers);
throw new UnsupportedOperationException("Adding handlers programmatically is not supported anymore");
}
@Deprecated
public Set<String> getHandlerTypes() {
return artifactHandlers.keySet();
throw new UnsupportedOperationException("Querying handlers programmatically is not supported anymore");
}
}

View File

@ -0,0 +1,72 @@
/*
* 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.
*/
package org.apache.maven.artifact.handler.manager;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.eventspy.AbstractEventSpy;
import org.apache.maven.execution.ExecutionEvent;
import static java.util.Objects.requireNonNull;
/**
*/
@Named
@Singleton
public class LegacyArtifactHandlerManager extends AbstractEventSpy {
private final Map<String, ArtifactHandler> artifactHandlers;
private final Map<String, ArtifactHandler> allHandlers = new ConcurrentHashMap<>();
@Inject
public LegacyArtifactHandlerManager(Map<String, ArtifactHandler> artifactHandlers) {
this.artifactHandlers = requireNonNull(artifactHandlers);
}
@Override
public void onEvent(Object event) {
if (event instanceof ExecutionEvent) {
ExecutionEvent executionEvent = (ExecutionEvent) event;
if (executionEvent.getType() == ExecutionEvent.Type.SessionEnded) {
allHandlers.clear();
}
}
}
public ArtifactHandler getArtifactHandler(String type) {
requireNonNull(type, "null type");
ArtifactHandler handler = allHandlers.get(type);
if (handler == null) {
handler = artifactHandlers.get(type);
if (handler == null) {
handler = new DefaultArtifactHandler(type);
} else {
allHandlers.put(type, handler);
}
}
return handler;
}
}

View File

@ -1,47 +0,0 @@
/*
* 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.
*/
package org.apache.maven.artifact.handler.providers;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
/**
* {@code java-source} artifact handler provider.
*/
@Named("java-source")
@Singleton
public class JavaSourceArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
@Inject
public JavaSourceArtifactHandlerProvider() {
this.artifactHandler =
new DefaultArtifactHandler("java-source", "jar", "sources", null, null, false, "java", false);
}
@Override
public ArtifactHandler get() {
return artifactHandler;
}
}

View File

@ -1,46 +0,0 @@
/*
* 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.
*/
package org.apache.maven.artifact.handler.providers;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
/**
* {@code javadoc} artifact handler provider.
*/
@Named("javadoc")
@Singleton
public class JavadocArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
@Inject
public JavadocArtifactHandlerProvider() {
this.artifactHandler = new DefaultArtifactHandler("javadoc", "jar", "javadoc", null, null, false, "java", true);
}
@Override
public ArtifactHandler get() {
return artifactHandler;
}
}

View File

@ -1,46 +0,0 @@
/*
* 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.
*/
package org.apache.maven.artifact.handler.providers;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
/**
* {@code maven-plugin} artifact handler provider.
*/
@Named("maven-plugin")
@Singleton
public class MavenPluginArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
@Inject
public MavenPluginArtifactHandlerProvider() {
this.artifactHandler = new DefaultArtifactHandler("maven-plugin", "jar", null, null, null, false, "java", true);
}
@Override
public ArtifactHandler get() {
return artifactHandler;
}
}

View File

@ -1,46 +0,0 @@
/*
* 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.
*/
package org.apache.maven.artifact.handler.providers;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
/**
* {@code pom} artifact handler provider.
*/
@Named("pom")
@Singleton
public class PomArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
@Inject
public PomArtifactHandlerProvider() {
this.artifactHandler = new DefaultArtifactHandler("pom", null, null, null, null, false, "none", false);
}
@Override
public ArtifactHandler get() {
return artifactHandler;
}
}

View File

@ -1,46 +0,0 @@
/*
* 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.
*/
package org.apache.maven.artifact.handler.providers;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
/**
* {@code test-jar} artifact handler provider.
*/
@Named("test-jar")
@Singleton
public class TestJarArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
@Inject
public TestJarArtifactHandlerProvider() {
this.artifactHandler = new DefaultArtifactHandler("test-jar", "jar", "tests", null, "jar", false, "java", true);
}
@Override
public ArtifactHandler get() {
return artifactHandler;
}
}

View File

@ -33,6 +33,7 @@
import java.util.stream.Collectors;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.api.services.TypeRegistry;
import org.apache.maven.api.xml.XmlNode;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.repository.ArtifactRepository;
@ -155,6 +156,8 @@ public class DefaultRepositorySystemSessionFactory {
private final RuntimeInformation runtimeInformation;
private final TypeRegistry typeRegistry;
@SuppressWarnings("checkstyle:ParameterNumber")
@Inject
public DefaultRepositorySystemSessionFactory(
@ -163,13 +166,15 @@ public DefaultRepositorySystemSessionFactory(
@Nullable @Named("ide") WorkspaceReader workspaceRepository,
SettingsDecrypter settingsDecrypter,
EventSpyDispatcher eventSpyDispatcher,
RuntimeInformation runtimeInformation) {
RuntimeInformation runtimeInformation,
TypeRegistry typeRegistry) {
this.artifactHandlerManager = artifactHandlerManager;
this.repoSystem = repoSystem;
this.workspaceRepository = workspaceRepository;
this.settingsDecrypter = settingsDecrypter;
this.eventSpyDispatcher = eventSpyDispatcher;
this.runtimeInformation = runtimeInformation;
this.typeRegistry = typeRegistry;
}
@Deprecated
@ -179,7 +184,8 @@ public RepositorySystemSession newRepositorySession(MavenExecutionRequest reques
@SuppressWarnings("checkstyle:methodLength")
public SessionBuilder newRepositorySessionBuilder(MavenExecutionRequest request) {
SessionBuilder session = MavenRepositorySystemUtils.newSession(repoSystem.createSessionBuilder());
SessionBuilder session = MavenRepositorySystemUtils.newSession(
repoSystem.createSessionBuilder(), new TypeRegistryAdapter(typeRegistry));
session.setCache(request.getRepositoryCache());
Map<Object, Object> configProps = new LinkedHashMap<>();

View File

@ -0,0 +1,48 @@
/*
* 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.
*/
package org.apache.maven.internal.aether;
import org.apache.maven.api.Type;
import org.apache.maven.api.services.TypeRegistry;
import org.apache.maven.internal.impl.DefaultType;
import org.eclipse.aether.artifact.ArtifactType;
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
import static java.util.Objects.requireNonNull;
public class TypeRegistryAdapter implements ArtifactTypeRegistry {
private final TypeRegistry typeRegistry;
public TypeRegistryAdapter(TypeRegistry typeRegistry) {
this.typeRegistry = requireNonNull(typeRegistry, "null typeRegistry");
}
@Override
public ArtifactType get(String typeId) {
Type type = typeRegistry.getType(typeId);
if (type instanceof ArtifactType) {
return (ArtifactType) type;
}
if (type != null) {
return new DefaultType(
type.getId(), type.getExtension(), type.getClassifier(), type.getDependencyProperties());
}
return null;
}
}

View File

@ -22,6 +22,7 @@
import org.apache.maven.api.Dependency;
import org.apache.maven.api.DependencyCoordinate;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Scope;
import org.apache.maven.api.Type;
import org.apache.maven.api.Version;
@ -35,12 +36,15 @@
public class DefaultDependency implements Dependency {
private final AbstractSession session;
private final org.eclipse.aether.graph.Dependency dependency;
private final DependencyProperties dependencyProperties;
private final String key;
public DefaultDependency(
@Nonnull AbstractSession session, @Nonnull org.eclipse.aether.graph.Dependency dependency) {
this.session = nonNull(session, "session");
this.dependency = nonNull(dependency, "dependency");
this.dependencyProperties =
new DefaultDependencyProperties(dependency.getArtifact().getProperties());
this.key = getGroupId()
+ ':'
+ getArtifactId()
@ -94,6 +98,11 @@ public Type getType() {
return session.getService(TypeRegistry.class).getType(type);
}
@Override
public DependencyProperties getDependencyProperties() {
return dependencyProperties;
}
@Override
public boolean isSnapshot() {
return DefaultVersionParser.checkSnapshot(dependency.getArtifact().getVersion());

View File

@ -0,0 +1,66 @@
/*
* 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.
*/
package org.apache.maven.internal.impl;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.annotations.Nonnull;
import static org.apache.maven.internal.impl.Utils.nonNull;
/**
* Default implementation of artifact properties.
*/
public class DefaultDependencyProperties implements DependencyProperties {
private final Map<String, String> properties;
public DefaultDependencyProperties(String... flags) {
this(Arrays.asList(flags));
}
public DefaultDependencyProperties(@Nonnull Collection<String> flags) {
nonNull(flags, "null flags");
HashMap<String, String> map = new HashMap<>();
for (String flag : flags) {
map.put(flag, Boolean.TRUE.toString());
}
this.properties = Collections.unmodifiableMap(map);
}
public DefaultDependencyProperties(@Nonnull Map<String, String> properties) {
this.properties = Collections.unmodifiableMap(nonNull(properties, "null properties"));
}
@Nonnull
@Override
public Map<String, String> asMap() {
return properties;
}
@Override
public boolean checkFlag(@Nonnull String flag) {
nonNull(flag, "null flag");
return Boolean.parseBoolean(properties.getOrDefault(flag, ""));
}
}

View File

@ -0,0 +1,72 @@
/*
* 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.
*/
package org.apache.maven.internal.impl;
import java.util.HashMap;
import java.util.Map;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.eclipse.aether.artifact.ArtifactProperties;
import org.eclipse.aether.artifact.ArtifactType;
import static org.apache.maven.internal.impl.Utils.nonNull;
public class DefaultType implements Type, ArtifactType {
private final String extension;
private final String classifier;
private final DependencyProperties dependencyProperties;
public DefaultType(String id, String extension, String classifier, DependencyProperties dependencyProperties) {
nonNull(id, "null id");
this.extension = nonNull(extension, "null extension");
this.classifier = classifier;
nonNull(dependencyProperties, "null dependencyProperties");
HashMap<String, String> props = new HashMap<>(dependencyProperties.asMap());
props.put(ArtifactProperties.TYPE, id);
this.dependencyProperties = new DefaultDependencyProperties(props);
}
@Override
public String getId() {
return dependencyProperties.asMap().get(ArtifactProperties.TYPE);
}
@Override
public String getExtension() {
return extension;
}
@Override
public String getClassifier() {
return classifier;
}
@Override
public DependencyProperties getDependencyProperties() {
return dependencyProperties;
}
@Override
public Map<String, String> getProperties() {
return getDependencyProperties().asMap();
}
}

View File

@ -22,59 +22,77 @@
import javax.inject.Named;
import javax.inject.Singleton;
import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.apache.maven.api.annotations.Nonnull;
import org.apache.maven.api.services.TypeRegistry;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.handler.manager.LegacyArtifactHandlerManager;
import org.apache.maven.eventspy.AbstractEventSpy;
import org.apache.maven.execution.ExecutionEvent;
import static org.apache.maven.internal.impl.Utils.nonNull;
@Named
@Singleton
public class DefaultTypeRegistry implements TypeRegistry {
public class DefaultTypeRegistry extends AbstractEventSpy implements TypeRegistry {
private final Map<String, Type> types;
private final ArtifactHandlerManager manager;
private final ConcurrentHashMap<String, Type> usedTypes;
private final ConcurrentHashMap<String, Type> legacyTypes;
private final LegacyArtifactHandlerManager manager;
@Inject
public DefaultTypeRegistry(ArtifactHandlerManager manager) {
public DefaultTypeRegistry(Map<String, Type> types, LegacyArtifactHandlerManager manager) {
this.types = nonNull(types, "types");
this.usedTypes = new ConcurrentHashMap<>();
this.legacyTypes = new ConcurrentHashMap<>();
this.manager = nonNull(manager, "artifactHandlerManager");
}
@Override
public void onEvent(Object event) {
if (event instanceof ExecutionEvent) {
ExecutionEvent executionEvent = (ExecutionEvent) event;
if (executionEvent.getType() == ExecutionEvent.Type.SessionEnded) {
usedTypes.clear();
legacyTypes.clear();
}
}
}
@Override
@Nonnull
public Type getType(String id) {
// Copy data as the ArtifacHandler is not immutable, but Type should be.
ArtifactHandler handler = manager.getArtifactHandler(nonNull(id, "id"));
String extension = handler.getExtension();
String classifier = handler.getClassifier();
boolean includeDependencies = handler.isIncludesDependencies();
boolean addedToClasspath = handler.isAddedToClasspath();
return new Type() {
@Override
public String getId() {
return id;
nonNull(id, "null id");
return usedTypes.computeIfAbsent(id, i -> {
Type type = types.get(id);
if (type == null) {
// legacy types ALWAYS return type (AHM never returns null)
type = legacyTypes.computeIfAbsent(id, k -> {
// Copy data as the ArtifactHandler is not immutable, but Type should be.
ArtifactHandler handler = manager.getArtifactHandler(id);
ArrayList<String> flags = new ArrayList<>();
if (handler.isAddedToClasspath()) {
flags.add(DependencyProperties.FLAG_CLASS_PATH_CONSTITUENT);
}
if (handler.isIncludesDependencies()) {
flags.add(DependencyProperties.FLAG_INCLUDES_DEPENDENCIES);
}
return new DefaultType(
id,
handler.getExtension(),
handler.getClassifier(),
new DefaultDependencyProperties(flags));
});
}
@Override
public String getExtension() {
return extension;
}
@Override
public String getClassifier() {
return classifier;
}
@Override
public boolean isIncludesDependencies() {
return includeDependencies;
}
@Override
public boolean isAddedToClasspath() {
return addedToClasspath;
}
};
return type;
});
}
}

View File

@ -16,31 +16,29 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.artifact.handler.providers;
package org.apache.maven.internal.impl.types;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
/**
* {@code rar} artifact handler provider.
*/
@Named("rar")
@Named(BomTypeProvider.NAME)
@Singleton
public class RarArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
public class BomTypeProvider implements Provider<Type> {
public static final String NAME = "bom";
@Inject
public RarArtifactHandlerProvider() {
this.artifactHandler = new DefaultArtifactHandler("rar", null, null, null, null, true, "java", false);
private final Type type;
public BomTypeProvider() {
this.type = new DefaultType(NAME, "pom", null, new DefaultDependencyProperties());
}
@Override
public ArtifactHandler get() {
return artifactHandler;
public Type get() {
return type;
}
}

View File

@ -16,31 +16,31 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.artifact.handler.providers;
package org.apache.maven.internal.impl.types;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
/**
* {@code bom} artifact handler provider.
*/
@Named("bom")
@Named(EarTypeProvider.NAME)
@Singleton
public class BomArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
public class EarTypeProvider implements Provider<Type> {
public static final String NAME = "ear";
@Inject
public BomArtifactHandlerProvider() {
this.artifactHandler = new DefaultArtifactHandler("pom", null, null, null, null, false, "none", false);
private final Type type;
public EarTypeProvider() {
this.type = new DefaultType(
NAME, "ear", null, new DefaultDependencyProperties(DependencyProperties.FLAG_INCLUDES_DEPENDENCIES));
}
@Override
public ArtifactHandler get() {
return artifactHandler;
public Type get() {
return type;
}
}

View File

@ -0,0 +1,49 @@
/*
* 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.
*/
package org.apache.maven.internal.impl.types;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
@Named(EjbClientTypeProvider.NAME)
@Singleton
public class EjbClientTypeProvider implements Provider<Type> {
public static final String NAME = "ejb-client";
private final Type type;
public EjbClientTypeProvider() {
this.type = new DefaultType(
NAME,
"jar",
"client",
new DefaultDependencyProperties(DependencyProperties.FLAG_CLASS_PATH_CONSTITUENT));
}
@Override
public Type get() {
return type;
}
}

View File

@ -0,0 +1,46 @@
/*
* 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.
*/
package org.apache.maven.internal.impl.types;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
@Named(EjbTypeProvider.NAME)
@Singleton
public class EjbTypeProvider implements Provider<Type> {
public static final String NAME = "ejb";
private final Type type;
public EjbTypeProvider() {
this.type = new DefaultType(
NAME, "jar", null, new DefaultDependencyProperties(DependencyProperties.FLAG_CLASS_PATH_CONSTITUENT));
}
@Override
public Type get() {
return type;
}
}

View File

@ -0,0 +1,46 @@
/*
* 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.
*/
package org.apache.maven.internal.impl.types;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
@Named(JarTypeProvider.NAME)
@Singleton
public class JarTypeProvider implements Provider<Type> {
public static final String NAME = "jar";
private final Type type;
public JarTypeProvider() {
this.type = new DefaultType(
NAME, "jar", null, new DefaultDependencyProperties(DependencyProperties.FLAG_CLASS_PATH_CONSTITUENT));
}
@Override
public Type get() {
return type;
}
}

View File

@ -16,31 +16,29 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.artifact.handler.providers;
package org.apache.maven.internal.impl.types;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
/**
* {@code ear} artifact handler provider.
*/
@Named("ear")
@Named(JavaSourceTypeProvider.NAME)
@Singleton
public class EarArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
public class JavaSourceTypeProvider implements Provider<Type> {
public static final String NAME = "java-source";
@Inject
public EarArtifactHandlerProvider() {
this.artifactHandler = new DefaultArtifactHandler("ear", null, null, null, null, true, "java", false);
private final Type type;
public JavaSourceTypeProvider() {
this.type = new DefaultType(NAME, "jar", "sources", new DefaultDependencyProperties());
}
@Override
public ArtifactHandler get() {
return artifactHandler;
public Type get() {
return type;
}
}

View File

@ -0,0 +1,49 @@
/*
* 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.
*/
package org.apache.maven.internal.impl.types;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
@Named(JavadocTypeProvider.NAME)
@Singleton
public class JavadocTypeProvider implements Provider<Type> {
public static final String NAME = "javadoc";
private final Type type;
public JavadocTypeProvider() {
this.type = new DefaultType(
NAME,
"jar",
"javadoc",
new DefaultDependencyProperties(DependencyProperties.FLAG_CLASS_PATH_CONSTITUENT));
}
@Override
public Type get() {
return type;
}
}

View File

@ -0,0 +1,46 @@
/*
* 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.
*/
package org.apache.maven.internal.impl.types;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
@Named(MavenPluginTypeProvider.NAME)
@Singleton
public class MavenPluginTypeProvider implements Provider<Type> {
public static final String NAME = "maven-plugin";
private final Type type;
public MavenPluginTypeProvider() {
this.type = new DefaultType(
NAME, "jar", null, new DefaultDependencyProperties(DependencyProperties.FLAG_CLASS_PATH_CONSTITUENT));
}
@Override
public Type get() {
return type;
}
}

View File

@ -16,31 +16,31 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.artifact.handler.providers;
package org.apache.maven.internal.impl.types;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
/**
* {@code ejb} artifact handler provider.
*/
@Named("ejb")
@Named(ParTypeProvider.NAME)
@Singleton
public class EjbArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
public class ParTypeProvider implements Provider<Type> {
public static final String NAME = "par";
@Inject
public EjbArtifactHandlerProvider() {
this.artifactHandler = new DefaultArtifactHandler("ejb", "jar", null, null, null, false, "java", true);
private final Type type;
public ParTypeProvider() {
this.type = new DefaultType(
NAME, "par", null, new DefaultDependencyProperties(DependencyProperties.FLAG_INCLUDES_DEPENDENCIES));
}
@Override
public ArtifactHandler get() {
return artifactHandler;
public Type get() {
return type;
}
}

View File

@ -16,31 +16,29 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.artifact.handler.providers;
package org.apache.maven.internal.impl.types;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
/**
* {@code war} artifact handler provider.
*/
@Named("war")
@Named(PomTypeProvider.NAME)
@Singleton
public class WarArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
public class PomTypeProvider implements Provider<Type> {
public static final String NAME = "pom";
@Inject
public WarArtifactHandlerProvider() {
this.artifactHandler = new DefaultArtifactHandler("war", null, null, null, null, true, "java", false);
private final Type type;
public PomTypeProvider() {
this.type = new DefaultType(NAME, "pom", null, new DefaultDependencyProperties());
}
@Override
public ArtifactHandler get() {
return artifactHandler;
public Type get() {
return type;
}
}

View File

@ -16,31 +16,31 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.artifact.handler.providers;
package org.apache.maven.internal.impl.types;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
/**
* {@code jar} artifact handler provider.
*/
@Named("jar")
@Named(RarTypeProvider.NAME)
@Singleton
public class JarArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
public class RarTypeProvider implements Provider<Type> {
public static final String NAME = "rar";
@Inject
public JarArtifactHandlerProvider() {
this.artifactHandler = new DefaultArtifactHandler("jar", null, null, null, null, false, "java", true);
private final Type type;
public RarTypeProvider() {
this.type = new DefaultType(
NAME, "rar", null, new DefaultDependencyProperties(DependencyProperties.FLAG_INCLUDES_DEPENDENCIES));
}
@Override
public ArtifactHandler get() {
return artifactHandler;
public Type get() {
return type;
}
}

View File

@ -16,32 +16,34 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.artifact.handler.providers;
package org.apache.maven.internal.impl.types;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
/**
* {@code ejb-client} artifact handler provider.
*/
@Named("ejb-client")
@Named(TestJarTypeProvider.NAME)
@Singleton
public class EjbClientArtifactHandlerProvider implements Provider<ArtifactHandler> {
private final ArtifactHandler artifactHandler;
public class TestJarTypeProvider implements Provider<Type> {
public static final String NAME = "test-jar";
@Inject
public EjbClientArtifactHandlerProvider() {
this.artifactHandler =
new DefaultArtifactHandler("ejb-client", "jar", "client", null, "ejb", false, "java", true);
private final Type type;
public TestJarTypeProvider() {
this.type = new DefaultType(
NAME,
"jar",
"tests",
new DefaultDependencyProperties(DependencyProperties.FLAG_CLASS_PATH_CONSTITUENT));
}
@Override
public ArtifactHandler get() {
return artifactHandler;
public Type get() {
return type;
}
}

View File

@ -0,0 +1,46 @@
/*
* 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.
*/
package org.apache.maven.internal.impl.types;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.maven.api.DependencyProperties;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultDependencyProperties;
import org.apache.maven.internal.impl.DefaultType;
@Named(WarTypeProvider.NAME)
@Singleton
public class WarTypeProvider implements Provider<Type> {
public static final String NAME = "war";
private final Type type;
public WarTypeProvider() {
this.type = new DefaultType(
NAME, "war", null, new DefaultDependencyProperties(DependencyProperties.FLAG_INCLUDES_DEPENDENCIES));
}
@Override
public Type get() {
return type;
}
}

View File

@ -24,6 +24,7 @@
import java.nio.file.Files;
import java.util.List;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.testing.PlexusTest;
import org.junit.jupiter.api.Test;
@ -72,11 +73,14 @@ void testAptConsistency() throws Exception {
String addedToClasspath = trimApt(cols[6]);
String includesDependencies = trimApt(cols[7]);
ArtifactHandler handler = container.lookup(ArtifactHandler.class, type);
ArtifactHandler handler =
container.lookup(ArtifactHandlerManager.class).getArtifactHandler(type);
assertEquals(handler.getExtension(), extension, type + " extension");
assertEquals(handler.getPackaging(), packaging, type + " packaging");
// Packaging/Directory is Maven1 remnant!!!
// assertEquals(handler.getPackaging(), packaging, type + " packaging");
assertEquals(handler.getClassifier(), classifier, type + " classifier");
assertEquals(handler.getLanguage(), language, type + " language");
// Language is unused
// assertEquals(handler.getLanguage(), language, type + " language");
assertEquals(
handler.isAddedToClasspath() ? "true" : null, addedToClasspath, type + " addedToClasspath");
assertEquals(

View File

@ -33,6 +33,7 @@
import org.apache.maven.eventspy.internal.EventSpyDispatcher;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.internal.impl.DefaultTypeRegistry;
import org.apache.maven.rtinfo.RuntimeInformation;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.crypto.SettingsDecrypter;
@ -72,6 +73,9 @@ public class DefaultRepositorySystemSessionFactoryTest {
@Inject
protected RuntimeInformation information;
@Inject
protected DefaultTypeRegistry defaultTypeRegistry;
@Test
void isNoSnapshotUpdatesTest() throws InvalidRepositoryException {
DefaultRepositorySystemSessionFactory systemSessionFactory = new DefaultRepositorySystemSessionFactory(
@ -80,7 +84,8 @@ void isNoSnapshotUpdatesTest() throws InvalidRepositoryException {
null,
settingsDecrypter,
eventSpyDispatcher,
information);
information,
defaultTypeRegistry);
MavenExecutionRequest request = new DefaultMavenExecutionRequest();
request.setLocalRepository(getLocalRepository());
@ -102,7 +107,8 @@ void isSnapshotUpdatesTest() throws InvalidRepositoryException {
null,
settingsDecrypter,
eventSpyDispatcher,
information);
information,
defaultTypeRegistry);
MavenExecutionRequest request = new DefaultMavenExecutionRequest();
request.setLocalRepository(getLocalRepository());
@ -136,7 +142,8 @@ void wagonProviderConfigurationTest() throws InvalidRepositoryException {
null,
settingsDecrypter,
eventSpyDispatcher,
information);
information,
defaultTypeRegistry);
PlexusConfiguration plexusConfiguration = (PlexusConfiguration) systemSessionFactory
.newRepositorySession(request)
@ -178,7 +185,8 @@ void httpConfigurationWithHttpHeadersTest() throws InvalidRepositoryException {
null,
settingsDecrypter,
eventSpyDispatcher,
information);
information,
defaultTypeRegistry);
Map<String, String> headers = (Map<String, String>) systemSessionFactory
.newRepositorySession(request)
@ -214,7 +222,8 @@ void connectTimeoutConfigurationTest() throws InvalidRepositoryException {
null,
settingsDecrypter,
eventSpyDispatcher,
information);
information,
defaultTypeRegistry);
int connectionTimeout = (Integer) systemSessionFactory
.newRepositorySession(request)
@ -254,7 +263,8 @@ void connectionTimeoutFromHttpConfigurationTest() throws InvalidRepositoryExcept
null,
settingsDecrypter,
eventSpyDispatcher,
information);
information,
defaultTypeRegistry);
int connectionTimeout = (Integer) systemSessionFactory
.newRepositorySession(request)
@ -288,7 +298,8 @@ void requestTimeoutConfigurationTest() throws InvalidRepositoryException {
null,
settingsDecrypter,
eventSpyDispatcher,
information);
information,
defaultTypeRegistry);
int requestTimeout = (Integer) systemSessionFactory
.newRepositorySession(request)
@ -328,7 +339,8 @@ void readTimeoutFromHttpConfigurationTest() throws InvalidRepositoryException {
null,
settingsDecrypter,
eventSpyDispatcher,
information);
information,
defaultTypeRegistry);
int requestTimeout = (Integer) systemSessionFactory
.newRepositorySession(request)
@ -345,7 +357,8 @@ void transportConfigurationTest() throws InvalidRepositoryException {
null,
settingsDecrypter,
eventSpyDispatcher,
information);
information,
defaultTypeRegistry);
MavenExecutionRequest request = new DefaultMavenExecutionRequest();
request.setLocalRepository(getLocalRepository());

View File

@ -20,6 +20,7 @@
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystemSession.SessionBuilder;
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
import org.eclipse.aether.artifact.DefaultArtifactType;
import org.eclipse.aether.collection.DependencyGraphTransformer;
import org.eclipse.aether.collection.DependencyManager;
@ -41,6 +42,8 @@
import org.eclipse.aether.util.graph.traverser.FatArtifactTraverser;
import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy;
import static java.util.Objects.requireNonNull;
/**
* A utility class to assist in setting up a Maven-like repository system. <em>Note:</em> This component is meant to
* assist those clients that employ the repository system outside of an IoC container, Maven plugins should instead
@ -54,13 +57,11 @@ private MavenRepositorySystemUtils() {
}
/**
* Creates a new Maven-like repository system session by initializing the session with values typical for
* Maven-based resolution. In more detail, this method configures settings relevant for the processing of dependency
* graphs, most other settings remain at their generic default value. Use the various setters to further configure
* the session with authentication, mirror, proxy and other information required for your environment.
* This method is deprecated, nobody should use it.
*
* @return The new repository system session, never {@code null}.
* @deprecated This method is here only for legacy uses (like UTs), nothing else should use it.
*/
@Deprecated
public static DefaultRepositorySystemSession newSession() {
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
@ -82,6 +83,19 @@ public static DefaultRepositorySystemSession newSession() {
transformer = new ChainedDependencyGraphTransformer(transformer, new JavaDependencyContextRefiner());
session.setDependencyGraphTransformer(transformer);
session.setArtifactTypeRegistry(newArtifactTypeRegistry());
session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(true, true));
return session;
}
/**
* Creates new Maven-like {@link ArtifactTypeRegistry}. This method should not be used from Maven.
*
* @since 4.0.0
*/
public static ArtifactTypeRegistry newArtifactTypeRegistry() {
DefaultArtifactTypeRegistry stereotypes = new DefaultArtifactTypeRegistry();
stereotypes.add(new DefaultArtifactType("pom"));
stereotypes.add(new DefaultArtifactType("maven-plugin", "jar", "", "java"));
@ -95,11 +109,7 @@ public static DefaultRepositorySystemSession newSession() {
stereotypes.add(new DefaultArtifactType("ear", "ear", "", "java", false, true));
stereotypes.add(new DefaultArtifactType("rar", "rar", "", "java", false, true));
stereotypes.add(new DefaultArtifactType("par", "par", "", "java", false, true));
session.setArtifactTypeRegistry(stereotypes);
session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(true, true));
return session;
return stereotypes;
}
/**
@ -109,8 +119,12 @@ public static DefaultRepositorySystemSession newSession() {
* the session with authentication, mirror, proxy and other information required for your environment.
*
* @return The new repository system session, never {@code null}.
* @since 4.0.0
*/
public static SessionBuilder newSession(SessionBuilder session) {
public static SessionBuilder newSession(SessionBuilder session, ArtifactTypeRegistry artifactTypeRegistry) {
requireNonNull(session, "null sessionBuilder");
requireNonNull(artifactTypeRegistry, "null artifactTypeRegistry");
DependencyTraverser depTraverser = new FatArtifactTraverser();
session.setDependencyTraverser(depTraverser);
@ -128,21 +142,7 @@ public static SessionBuilder newSession(SessionBuilder session) {
new SimpleOptionalitySelector(), new JavaScopeDeriver());
transformer = new ChainedDependencyGraphTransformer(transformer, new JavaDependencyContextRefiner());
session.setDependencyGraphTransformer(transformer);
DefaultArtifactTypeRegistry stereotypes = new DefaultArtifactTypeRegistry();
stereotypes.add(new DefaultArtifactType("pom"));
stereotypes.add(new DefaultArtifactType("maven-plugin", "jar", "", "java"));
stereotypes.add(new DefaultArtifactType("jar", "jar", "", "java"));
stereotypes.add(new DefaultArtifactType("ejb", "jar", "", "java"));
stereotypes.add(new DefaultArtifactType("ejb-client", "jar", "client", "java"));
stereotypes.add(new DefaultArtifactType("test-jar", "jar", "tests", "java"));
stereotypes.add(new DefaultArtifactType("javadoc", "jar", "javadoc", "java"));
stereotypes.add(new DefaultArtifactType("java-source", "jar", "sources", "java", false, false));
stereotypes.add(new DefaultArtifactType("war", "war", "", "java", false, true));
stereotypes.add(new DefaultArtifactType("ear", "ear", "", "java", false, true));
stereotypes.add(new DefaultArtifactType("rar", "rar", "", "java", false, true));
stereotypes.add(new DefaultArtifactType("par", "par", "", "java", false, true));
session.setArtifactTypeRegistry(stereotypes);
session.setArtifactTypeRegistry(artifactTypeRegistry);
session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(true, true));

View File

@ -26,9 +26,9 @@
import org.apache.maven.repository.internal.util.ConsoleTransferListener;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.testing.PlexusTest;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.RepositorySystemSession.SessionBuilder;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.RemoteRepository;
import org.junit.jupiter.api.BeforeEach;
@ -55,15 +55,14 @@ protected PlexusContainer getContainer() {
}
public static RepositorySystemSession newMavenRepositorySystemSession(RepositorySystem system) {
DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
LocalRepository localRepo = new LocalRepository("target/local-repo");
session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));
SessionBuilder session = MavenRepositorySystemUtils.newSession(
system.createSessionBuilder(), MavenRepositorySystemUtils.newArtifactTypeRegistry());
session.withLocalRepositories(new LocalRepository("target/local-repo"));
session.setTransferListener(new ConsoleTransferListener());
session.setRepositoryListener(new ConsoleRepositoryListener());
return session;
return session.build();
}
public static RemoteRepository newTestRepository() throws MalformedURLException {

View File

@ -1,33 +0,0 @@
/*
* 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.
*/
package org.apache.maven.repository.internal;
import org.eclipse.aether.RepositorySystemSession;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertNotNull;
class MavenRepositorySystemUtilsTest {
@Test
void testNewSession() {
RepositorySystemSession session = MavenRepositorySystemUtils.newSession();
assertNotNull(session);
}
}