org.codehaus.mojo.mockrepo.ProxyRepository.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.mojo.mockrepo.ProxyRepository.java

Source

package org.codehaus.mojo.mockrepo;

/*
 * 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 org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
import org.apache.maven.artifact.repository.metadata.GroupRepositoryMetadata;
import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.plugin.logging.Log;
import org.codehaus.plexus.util.StringUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * A proxy repository that uses maven's repositories to resolve artifacts.
 */
public class ProxyRepository implements Repository {
    private final RepositoryMetadataManager repositoryMetadataManager;

    private final List remoteArtifactRepositories;

    private final List remotePluginRepositories;

    private final ArtifactRepository localRepository;

    private final ArtifactFactory artifactFactory;

    private final List remoteRepositories;

    private final VersionRange anyVersion;

    private final ArtifactResolver artifactResolver;

    private final Log log;

    public ProxyRepository(RepositoryMetadataManager repositoryMetadataManager, List remoteArtifactRepositories,
            List remotePluginRepositories, ArtifactRepository localRepository, ArtifactFactory artifactFactory,
            Log log, ArtifactResolver artifactResolver) throws InvalidVersionSpecificationException {
        this.repositoryMetadataManager = repositoryMetadataManager;
        this.remoteArtifactRepositories = remoteArtifactRepositories;
        this.remotePluginRepositories = remotePluginRepositories;
        this.localRepository = localRepository;
        this.artifactFactory = artifactFactory;
        this.log = log;
        this.artifactResolver = artifactResolver;
        remoteRepositories = new ArrayList();
        remoteRepositories.addAll(remoteArtifactRepositories);
        remoteRepositories.addAll(remotePluginRepositories);
        anyVersion = VersionRange.createFromVersionSpec("[0,]");
    }

    public Metadata getMetadata(String path) {
        if (StringUtils.isEmpty(path) || path.length() < 13) {
            return null;
        }
        String coordPath = StringUtils.chompLast(path, "/metadata.xml");

        int index = coordPath.lastIndexOf('/');

        String artifactId = index == -1 ? null : coordPath.substring(index + 1);
        String groupId = index == -1 ? null : coordPath.substring(0, index);
        String pluginGroupId = coordPath.replace('/', '.');

        Metadata metadata = new Metadata();

        // is this path a groupId:artifactId pair?
        if (!StringUtils.isEmpty(artifactId) && !StringUtils.isEmpty(groupId)) {
            final Artifact artifact = artifactFactory.createDependencyArtifact(groupId, artifactId, anyVersion,
                    "pom", null, "compile");
            final ArtifactRepositoryMetadata artifactRepositoryMetadata = new ArtifactRepositoryMetadata(artifact);
            try {
                repositoryMetadataManager.resolve(artifactRepositoryMetadata, remoteRepositories, localRepository);

                final Metadata artifactMetadata = artifactRepositoryMetadata.getMetadata();
                if (artifactMetadata.getVersioning() != null) {
                    metadata.setGroupId(groupId);
                    metadata.setArtifactId(artifactId);
                    metadata.merge(artifactMetadata);
                }
            } catch (RepositoryMetadataResolutionException e) {
                log.debug(e);
            }
        }

        // if this path a groupId on its own?
        final GroupRepositoryMetadata groupRepositoryMetadata = new GroupRepositoryMetadata(pluginGroupId);
        try {
            repositoryMetadataManager.resolve(groupRepositoryMetadata, remotePluginRepositories, localRepository);
            metadata.merge(groupRepositoryMetadata.getMetadata());
        } catch (RepositoryMetadataResolutionException e) {
            log.debug(e);
        }

        return metadata;
    }

    public Content getContent(String path) {
        // ok, decode the path... it must be formed like so
        // groupId.replace('.','/')+'/'+artifactId+'/'+version+'/'+artifactId+'-'+version
        // +(classifier!=null?'-'+classifier:"")+'.'+type

        String groupId;
        String artifactId;
        String version;
        String classifier;
        String type;

        int index1;
        int index2;
        int index3;

        index3 = path.lastIndexOf('/');
        if (index3 == -1 || index3 + 1 >= path.length()) {
            // not a valid content path, so nothing at this path
            return null;
        }
        index2 = path.lastIndexOf('/', index3 - 1);
        if (index2 == -1) {
            // not a valid content path, so nothing at this path
            return null;
        }
        version = path.substring(index2 + 1, index3);
        index1 = path.lastIndexOf('/', index2 - 1);
        if (index1 == -1) {
            // not a valid content path, so nothing at this path
            return null;
        }
        artifactId = path.substring(index1 + 1, index2);
        groupId = path.substring(0, index1).replace('/', '.');

        String name = path.substring(index3 + 1);
        if (!name.startsWith(artifactId + '-' + version)) {
            // not a valid content path, so nothing at this path
            return null;
        }

        String classifierAndType = name.substring(artifactId.length() + version.length() + 1);
        // the problem is that both the classifier and the type could legally contain a '.'
        // so we need to try all posibilities
        int index = -1;
        while (-1 != (index = classifierAndType.indexOf('.', index + 1))) {
            if (index == 0) {
                classifier = null;
            } else {
                classifier = classifierAndType.substring(0, index);
            }
            type = classifierAndType.substring(index + 1);
            Artifact artifact = artifactFactory.createArtifactWithClassifier(groupId, artifactId, version, type,
                    classifier);
            try {
                artifactResolver.resolve(artifact, remoteRepositories, localRepository);
                final File file = artifact.getFile();
                if (file != null && file.isFile()) {
                    return new FileContent(file);
                }
            } catch (ArtifactResolutionException e) {
                log.debug(e);
            } catch (ArtifactNotFoundException e) {
                log.debug(e);
            }
        }

        return null; // couldn't find the artifact
    }

    public List getChildPaths(String path) {
        return Collections.EMPTY_LIST;
    }
}