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 @@ -71,7 +71,16 @@ public interface ProjectManager extends Service {
*/
Collection<ProducedArtifact> getAllArtifacts(Project project);

default void attachArtifact(Session session, Project project, Path path) {
/**
* Attaches an artifact to the project using the given file path. The artifact type will be
* determined from the file extension.
*
* @param session the current build session
* @param project the project to attach the artifact to
* @param path the path to the artifact file
* @throws IllegalArgumentException if the session, project or path is null
*/
default void attachArtifact(@Nonnull Session session, @Nonnull Project project, @Nonnull Path path) {
String name = path.getFileName().toString();
int dot = name.lastIndexOf('.');
String ext = dot >= 1 ? name.substring(dot + 1) : "";
Expand All @@ -80,13 +89,33 @@ default void attachArtifact(Session session, Project project, Path path) {
attachArtifact(project, artifact, path);
}

default void attachArtifact(Session session, Project project, String type, Path path) {
/**
* Attaches an artifact to the project with an explicitly specified type.
*
* @param session the current build session
* @param project the project to attach the artifact to
* @param type the type of the artifact (e.g., "jar", "war", "sources")
* @param path the path to the artifact file
* @throws IllegalArgumentException if the session, project, type or path is null
* @see org.apache.maven.api.Type
*/
default void attachArtifact(
@Nonnull Session session, @Nonnull Project project, @Nonnull String type, @Nonnull Path path) {
ProducedArtifact artifact = session.createProducedArtifact(
project.getGroupId(), project.getArtifactId(), project.getVersion(), null, null, type);
attachArtifact(project, artifact, path);
}

void attachArtifact(Project project, ProducedArtifact artifact, Path path);
/**
* Attaches a produced artifact to the project at the specified path. This is the base method
* that the other attachArtifact methods delegate to.
*
* @param project the project to attach the artifact to
* @param artifact the produced artifact to attach
* @param path the path to the artifact file
* @throws IllegalArgumentException if the project, artifact or path is null
*/
void attachArtifact(@Nonnull Project project, @Nonnull ProducedArtifact artifact, @Nonnull Path path);

/**
* Obtain an immutable list of compile source roots for the given project and scope.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* 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 org.apache.maven.api.Version;
import org.eclipse.aether.util.version.GenericVersionScheme;
import org.junit.jupiter.api.Test;

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

class DefaultModelVersionParserTest {

@Test
void parseVersion() {
Version v = new DefaultModelVersionParser(new GenericVersionScheme()).parseVersion("");
assertNotNull(v);
assertEquals("", v.asString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Properties;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -93,6 +94,32 @@ public Collection<ProducedArtifact> getAllArtifacts(Project project) {

@Override
public void attachArtifact(Project project, ProducedArtifact artifact, Path path) {
nonNull(project, "project");
nonNull(artifact, "artifact");
nonNull(path, "path");
if (artifact.getGroupId().isEmpty()
|| artifact.getArtifactId().isEmpty()
|| artifact.getBaseVersion().asString().isEmpty()) {
artifact = session.createProducedArtifact(
artifact.getGroupId().isEmpty() ? project.getGroupId() : artifact.getGroupId(),
artifact.getArtifactId().isEmpty() ? project.getArtifactId() : artifact.getArtifactId(),
artifact.getBaseVersion().asString().isEmpty()
? session.parseVersion(project.getVersion()).asString()
: artifact.getBaseVersion().asString(),
artifact.getClassifier(),
artifact.getExtension(),
null);
}
if (!Objects.equals(project.getGroupId(), artifact.getGroupId())
|| !Objects.equals(project.getArtifactId(), artifact.getArtifactId())
|| !Objects.equals(
project.getVersion(), artifact.getBaseVersion().asString())) {
throw new IllegalArgumentException(
"The produced artifact must have the same groupId/artifactId/version than the project it is attached to. Expecting "
+ project.getGroupId() + ":" + project.getArtifactId() + ":" + project.getVersion()
+ " but received " + artifact.getGroupId() + ":" + artifact.getArtifactId() + ":"
+ artifact.getBaseVersion());
}
getMavenProject(project)
.addAttachedArtifact(RepositoryUtils.toArtifact(
((DefaultProject) project).getSession().toArtifact(artifact)));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* 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.nio.file.Path;
import java.nio.file.Paths;

import org.apache.maven.api.ProducedArtifact;
import org.apache.maven.api.Project;
import org.apache.maven.api.services.ArtifactManager;
import org.apache.maven.project.MavenProject;
import org.eclipse.aether.util.version.GenericVersionScheme;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.when;

class DefaultProjectManagerTest {

@Test
void attachArtifact() {
InternalMavenSession session = Mockito.mock(InternalMavenSession.class);
ArtifactManager artifactManager = Mockito.mock(ArtifactManager.class);
MavenProject mavenProject = new MavenProject();
Project project = new DefaultProject(session, mavenProject);
ProducedArtifact artifact = Mockito.mock(ProducedArtifact.class);
Path path = Paths.get("");
DefaultVersionParser versionParser =
new DefaultVersionParser(new DefaultModelVersionParser(new GenericVersionScheme()));
DefaultProjectManager projectManager = new DefaultProjectManager(session, artifactManager);

mavenProject.setGroupId("myGroup");
mavenProject.setArtifactId("myArtifact");
mavenProject.setVersion("1.0-SNAPSHOT");
when(artifact.getGroupId()).thenReturn("myGroup");
when(artifact.getArtifactId()).thenReturn("myArtifact");
when(artifact.getBaseVersion()).thenReturn(versionParser.parseVersion("1.0-SNAPSHOT"));
projectManager.attachArtifact(project, artifact, path);

when(artifact.getArtifactId()).thenReturn("anotherArtifact");
assertThrows(IllegalArgumentException.class, () -> projectManager.attachArtifact(project, artifact, path));
}
}