All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.android.ide.common.repository.MavenRepositories Maven / Gradle / Ivy

/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed 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 com.android.ide.common.repository;

import static com.android.ide.common.repository.GradleCoordinate.COMPARE_PLUS_HIGHER;
import static com.google.common.base.Preconditions.checkNotNull;
import static java.io.File.separator;
import static java.io.File.separatorChar;

import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.repository.io.FileOp;
import com.android.repository.io.FileOpUtils;
import com.google.common.collect.Lists;
import java.io.File;
import java.util.Collections;
import java.util.List;

/**
 * Utilities for dealing with the standard m2repository directory layout.
 */
@SuppressWarnings("WeakerAccess")
public class MavenRepositories {

    private static final String MAVEN_METADATA_FILE_NAME = "maven-metadata.xml";

    private MavenRepositories() {}

    /**
     * Find the best matching {@link GradleCoordinate}
     *
     * @param groupId      the artifact group id
     * @param artifactId   the artifact id
     * @param repository   the path to the m2repository directory
     * @param filter       an optional filter which the matched coordinate's version name must start
     *                     with
     * @param allowPreview whether preview versions are allowed to match
     * @return the best (highest version) matching coordinate, or null if none were found
     */
    @Nullable
    public static GradleCoordinate getHighestInstalledVersion(
            @NonNull String groupId,
            @NonNull String artifactId,
            @NonNull File repository,
            @Nullable String filter,
            boolean allowPreview,
            @NonNull FileOp fileOp) {
        File versionDir = getArtifactIdDirectory(repository, groupId, artifactId);
        File[] versions = fileOp.listFiles(versionDir);
        List versionCoordinates = Lists.newArrayList();
        for (File dir : versions) {
            if (!fileOp.isDirectory(dir)) {
                continue;
            }
            if (filter != null && !dir.getName().startsWith(filter)) {
                continue;
            }
            GradleCoordinate gc = GradleCoordinate.parseCoordinateString(
                    groupId + ":" + artifactId + ":" + dir.getName());

            if (gc != null && (allowPreview || !isPreview(gc))) {
                versionCoordinates.add(gc);
            }
        }

        if (!versionCoordinates.isEmpty()) {
            return Collections.max(versionCoordinates, COMPARE_PLUS_HIGHER);
        }

        return null;
    }

  /**
   * Decides whether a given {@link GradleCoordinate} is considered preview.
   *
   * 

This is mostly compatible with {@link GradleCoordinate#isPreview()}, but there is one edge * case that we need to handle, related to Play Services. (See https://b.android.com/75292) */ public static boolean isPreview(GradleCoordinate coordinate) { //noinspection SimplifiableIfStatement if (coordinate.isPreview()) { return true; } return "com.google.android.gms".equals(coordinate.getGroupId()) && "play-services".equals(coordinate.getArtifactId()) && "5.2.08".equals(coordinate.getRevision()); } /** * @deprecated For testability, use {@link MavenRepositories#getHighestInstalledVersion(String, * String, File, String, boolean, FileOp)}. */ @Deprecated @Nullable public static GradleCoordinate getHighestInstalledVersion( @NonNull String groupId, @NonNull String artifactId, @NonNull File repository, @Nullable String filter, boolean allowPreview) { return getHighestInstalledVersion(groupId, artifactId, repository, filter, allowPreview, FileOpUtils.create()); } public static File getArtifactIdDirectory( @NonNull File repository, @NonNull String groupId, @NonNull String artifactId) { return new File(repository, groupId.replace('.', separatorChar) + separator + artifactId); } public static File getArtifactDirectory( @NonNull File repository, @NonNull GradleCoordinate coordinate) { checkNotNull(coordinate.getGroupId()); checkNotNull(coordinate.getArtifactId()); File artifactIdDirectory = getArtifactIdDirectory( repository, coordinate.getGroupId(), coordinate.getArtifactId()); return new File(artifactIdDirectory, coordinate.getRevision()); } public static File getMavenMetadataFile( @NonNull File repository, @NonNull String groupId, @NonNull String artifactId) { return new File(getArtifactIdDirectory(repository, groupId, artifactId), MAVEN_METADATA_FILE_NAME); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy