hudson.maven.ReactorReader.java Source code

Java tutorial

Introduction

Here is the source code for hudson.maven.ReactorReader.java

Source

package hudson.maven;

/*
 * 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.
 */

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.project.MavenProject;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.repository.WorkspaceReader;
import org.eclipse.aether.repository.WorkspaceRepository;

/**
 * NOTE : <b>this class is not designed for external use so it can change without any prior notice</b>
 * class coming from ASF sources 
 * http://svn.apache.org/repos/asf/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/ReactorReader.java
 * FIXME simplify more !!
 * @author Olivier Lamy
 * @since 1.1
 */
public class ReactorReader implements WorkspaceReader {
    private Map<String, MavenProject> projectsByGAV;

    private Map<String, List<MavenProject>> projectsByGA;

    private WorkspaceRepository repository;

    private File workspaceRoot;

    public ReactorReader(Map<String, MavenProject> reactorProjects, File workspaceRoot) {
        projectsByGAV = reactorProjects;
        this.workspaceRoot = workspaceRoot;
        projectsByGA = new HashMap<String, List<MavenProject>>(reactorProjects.size() * 2);
        for (MavenProject project : reactorProjects.values()) {
            String key = ArtifactUtils.versionlessKey(project.getGroupId(), project.getArtifactId());

            List<MavenProject> projects = projectsByGA.get(key);

            if (projects == null) {
                projects = new ArrayList<MavenProject>(1);
                projectsByGA.put(key, projects);
            }

            projects.add(project);
        }

        repository = new WorkspaceRepository("reactor", new HashSet<String>(projectsByGAV.keySet()));
    }

    private File find(MavenProject project, Artifact artifact) {
        if ("pom".equals(artifact.getExtension())) {
            return project.getFile();
        }

        org.apache.maven.artifact.Artifact matchingArtifact = findMatchingArtifact(project, artifact);
        if (matchingArtifact != null) {
            return matchingArtifact.getFile();
        }
        return null;
    }

    /**
     * Tries to resolve the specified artifact from the artifacts of the given project.
     * 
     * @param project The project to try to resolve the artifact from, must not be <code>null</code>.
     * @param requestedArtifact The artifact to resolve, must not be <code>null</code>.
     * @return The matching artifact from the project or <code>null</code> if not found.
     */
    private org.apache.maven.artifact.Artifact findMatchingArtifact(MavenProject project,
            Artifact requestedArtifact) {
        String requestedRepositoryConflictId = getConflictId(requestedArtifact);

        org.apache.maven.artifact.Artifact mainArtifact = project.getArtifact();
        if (requestedRepositoryConflictId.equals(getConflictId(mainArtifact))) {
            mainArtifact.setFile(new File(workspaceRoot, project.getArtifactId()));
            return mainArtifact;
        }

        Collection<org.apache.maven.artifact.Artifact> attachedArtifacts = project.getAttachedArtifacts();
        if (attachedArtifacts != null && !attachedArtifacts.isEmpty()) {
            for (org.apache.maven.artifact.Artifact attachedArtifact : attachedArtifacts) {
                if (requestedRepositoryConflictId.equals(getConflictId(attachedArtifact))) {
                    attachedArtifact.setFile(new File(workspaceRoot, project.getArtifactId()));
                    return attachedArtifact;
                }
            }
        }

        return null;
    }

    /**
     * Gets the repository conflict id of the specified artifact. Unlike the dependency conflict id, the repository
     * conflict id uses the artifact file extension instead of the artifact type. Hence, the repository conflict id more
     * closely reflects the identity of artifacts as perceived by a repository.
     * 
     * @param artifact The artifact, must not be <code>null</code>.
     * @return The repository conflict id, never <code>null</code>.
     */
    private String getConflictId(org.apache.maven.artifact.Artifact artifact) {
        StringBuilder buffer = new StringBuilder(128);
        buffer.append(artifact.getGroupId());
        buffer.append(':').append(artifact.getArtifactId());
        if (artifact.getArtifactHandler() != null) {
            buffer.append(':').append(artifact.getArtifactHandler().getExtension());
        } else {
            buffer.append(':').append(artifact.getType());
        }
        if (artifact.hasClassifier()) {
            buffer.append(':').append(artifact.getClassifier());
        }
        return buffer.toString();
    }

    private String getConflictId(Artifact artifact) {
        StringBuilder buffer = new StringBuilder(128);
        buffer.append(artifact.getGroupId());
        buffer.append(':').append(artifact.getArtifactId());
        buffer.append(':').append(artifact.getExtension());
        if (artifact.getClassifier().length() > 0) {
            buffer.append(':').append(artifact.getClassifier());
        }
        return buffer.toString();
    }

    public File findArtifact(Artifact artifact) {
        String projectKey = artifact.getGroupId() + ':' + artifact.getArtifactId() + ':' + artifact.getVersion();

        MavenProject project = projectsByGAV.get(projectKey);

        if (project != null) {
            return find(project, artifact);
        }

        return null;
    }

    public List<String> findVersions(Artifact artifact) {
        String key = artifact.getGroupId() + ':' + artifact.getArtifactId();

        List<MavenProject> projects = projectsByGA.get(key);
        if (projects == null || projects.isEmpty()) {
            return Collections.emptyList();
        }

        List<String> versions = new ArrayList<String>();

        for (MavenProject project : projects) {
            if (find(project, artifact) != null) {
                versions.add(project.getVersion());
            }
        }

        return Collections.unmodifiableList(versions);
    }

    public void addProject(MavenProject mavenProject) {
        String key = mavenProject.getGroupId() + ':' + mavenProject.getArtifactId();
        this.projectsByGA.put(key, Arrays.asList(mavenProject));

        String projectKey = mavenProject.getGroupId() + ':' + mavenProject.getArtifactId() + ':'
                + mavenProject.getVersion();

        this.projectsByGAV.put(projectKey, mavenProject);
    }

    public WorkspaceRepository getRepository() {
        return repository;
    }
}