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

dev.gradleplugins.test.fixtures.maven.M2Installation Maven / Gradle / Ivy

/*
 * Copyright 2019 the original author or authors.
 *
 * 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
 *
 *      https://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 dev.gradleplugins.test.fixtures.maven;

import dev.gradleplugins.runnerkit.GradleRunner;
import dev.gradleplugins.test.fixtures.file.TestFile;

import java.io.File;
import java.util.Collections;
import java.util.function.Function;
import java.util.function.UnaryOperator;

import static dev.gradleplugins.fixtures.file.FileSystemUtils.*;
import static org.junit.Assert.assertTrue;

public class M2Installation implements UnaryOperator {
    private final File testDirectory;
    private boolean initialized = false;
    private File userHomeDirectory;
    private File userM2Directory;
    private File userSettingsFile;
    private File globalMavenDirectory;
    private File globalSettingsFile;
    private File isolatedMavenRepoForLeakageChecks;
    private boolean isolateMavenLocal = true;

    public M2Installation(File testDirectory) {
        this.testDirectory = testDirectory;
    }

    private void init() {
        if (!initialized) {
            userHomeDirectory = createDirectory(file(testDirectory, "maven_home"));
            userM2Directory = createDirectory(file(userHomeDirectory, ".m2"));
            userSettingsFile = file(userM2Directory, "settings.xml");
            globalMavenDirectory = createDirectory(file(userHomeDirectory, "m2_home"));
            globalSettingsFile = file(globalMavenDirectory, "conf/settings.xml");
            System.out.println("M2 home: " + userHomeDirectory);

            initialized = true;
        }
    }

    public TestFile getUserHomeDir() {
        init();
        return TestFile.of(userHomeDirectory);
    }

    public TestFile getUserM2Directory() {
        init();
        return TestFile.of(userM2Directory);
    }

    public TestFile getUserSettingsFile() {
        init();
        return TestFile.of(userSettingsFile);
    }

    public TestFile getGlobalMavenDirectory() {
        init();
        return TestFile.of(globalMavenDirectory);
    }

    public TestFile getGlobalSettingsFile() {
        init();
        return TestFile.of(globalSettingsFile);
    }

    public MavenLocalRepository mavenRepo() {
        init();
        return new MavenLocalRepository(TestFile.of(file(userM2Directory, "repository")));
    }

    public M2Installation generateUserSettingsFile(MavenLocalRepository userRepository) {
        init();
        TestFile.of(userSettingsFile).write("\n"
                        + "    ${userRepository.rootDir.absolutePath}\n"
                        + "");
        return this;
    }

    public M2Installation generateGlobalSettingsFile() {
        return generateGlobalSettingsFile(mavenRepo());
    }

    public M2Installation generateGlobalSettingsFile(MavenLocalRepository globalRepository) {
        init();
        TestFile.of(createFile(globalSettingsFile)).write("\n"
                + "    ${globalRepository.rootDir.absolutePath}\n"
                + "");
        return this;
    }

    @Override
    public GradleRunner apply(GradleRunner gradleExecuter) {
        init();
        GradleRunner result = gradleExecuter.withUserHomeDirectory(userHomeDirectory);
        // if call `using m2`, then we disable the automatic isolation of m2
        isolateMavenLocal = false;
        if (globalMavenDirectory.exists()) {
            result = result.withEnvironmentVariable("M2_HOME", globalMavenDirectory.getAbsolutePath());
        }
        return result;
    }

    public GradleRunner isolateMavenLocalRepo(GradleRunner gradleExecuter) {
        gradleExecuter = gradleExecuter.beforeExecute(executer -> {
            if (isolateMavenLocal) {
                isolatedMavenRepoForLeakageChecks = createDirectory(file(executer.getWorkingDirectory(), "m2-home-should-not-be-filled"));
                return setMavenLocalLocation(executer, isolatedMavenRepoForLeakageChecks);
            }
            return executer;
        });
        gradleExecuter = gradleExecuter.afterExecute(executer -> {
            if (isolateMavenLocal) {
                assertTrue(String.format("%s is not an empty directory.", isolatedMavenRepoForLeakageChecks), isEmptyDirectory(isolatedMavenRepoForLeakageChecks));
            }
        });

        return gradleExecuter;
    }

    private static GradleRunner setMavenLocalLocation(GradleRunner runner, File destination) {
        return runner.withArgument("-Dmaven.repo.local=" + destination.getAbsolutePath());
    }
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy