MavenSettings.java

/*
 * Copyright 2017 Red Hat, Inc. and/or its affiliates.
 *
 * 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 org.appformer.maven.integration.embedder;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.maven.settings.Settings;
import org.apache.maven.settings.building.DefaultSettingsBuilderFactory;
import org.apache.maven.settings.building.DefaultSettingsBuildingRequest;
import org.apache.maven.settings.building.FileSettingsSource;
import org.apache.maven.settings.building.SettingsBuilder;
import org.apache.maven.settings.building.SettingsBuildingException;
import org.apache.maven.settings.building.SettingsSource;
import org.apache.maven.settings.building.StringSettingsSource;
import org.apache.maven.settings.building.UrlSettingsSource;
import org.appformer.maven.integration.Aether;
import org.appformer.maven.integration.MavenRepository;
import org.appformer.maven.integration.MavenRepositoryConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MavenSettings {

    private static final Logger log = LoggerFactory.getLogger(MavenSettings.class);

    public static final String CUSTOM_SETTINGS_PROPERTY = "kie.maven.settings.custom";

    private static class SettingsHolder {
        private static SettingsSource userSettingsSource = initUserSettingsSource();
        private static Settings settings = initSettings(userSettingsSource);
        private static MavenRepositoryConfiguration mavenConf = new MavenRepositoryConfiguration( settings);

        private static void reinitSettings() {
            userSettingsSource = initUserSettingsSource();
            internalInit();
        }

        private static void reinitSettingsFromString(String settings) {
            userSettingsSource = new StringSettingsSource( settings );
            internalInit();
        }

        private static void internalInit() {
            settings = initSettings(userSettingsSource);
            mavenConf = new MavenRepositoryConfiguration( settings);
            Aether.instance = null;
            MavenProjectLoader.mavenProject = null;
            MavenRepository.defaultMavenRepository = null;
        }
    }

    // USE ONLY FOR TESTING PURPOSES
    public static void reinitSettings() {
        SettingsHolder.reinitSettings();
    }

    // USE ONLY FOR TESTING PURPOSES
    public static void reinitSettingsFromString(String settings) {
        SettingsHolder.reinitSettingsFromString(settings);
    }

    public static SettingsSource getUserSettingsSource() {
        return SettingsHolder.userSettingsSource;
    }

    public static Settings getSettings() {
        return SettingsHolder.settings;
    }

    public static MavenRepositoryConfiguration getMavenRepositoryConfiguration() {
        return SettingsHolder.mavenConf;
    }

    private static Settings initSettings(SettingsSource userSettingsSource) {
        SettingsBuilder settingsBuilder = new DefaultSettingsBuilderFactory().newInstance();
        DefaultSettingsBuildingRequest request = new DefaultSettingsBuildingRequest();

        if (userSettingsSource != null) {
            request.setUserSettingsSource( userSettingsSource );
        }

        String mavenHome = System.getenv( "M2_HOME" );
        if (mavenHome != null) {
            File globalSettingsFile = new File( mavenHome + "/conf/settings.xml" );
            if (globalSettingsFile.exists()) {
                request.setGlobalSettingsFile( globalSettingsFile );
            }
        } else {
            log.warn("Environment variable M2_HOME is not set");
        }

        request.setSystemProperties( System.getProperties() );

        Settings settings = null;
        try {
            settings = settingsBuilder.build( request ).getEffectiveSettings();
        } catch ( SettingsBuildingException e ) {
            throw new RuntimeException(e);
        }

        if (settings.getLocalRepository() == null) {
            String userHome = System.getProperty( "user.home" );
            if (userHome != null) {
                settings.setLocalRepository( userHome + "/.m2/repository" );
            } else {
                log.error("Cannot find maven local repository");
            }
        }

        return settings;
    }

    private static SettingsSource initUserSettingsSource() {
        String customSettings = System.getProperty( CUSTOM_SETTINGS_PROPERTY );
        if (customSettings != null) {
            File customSettingsFile = new File( customSettings );
            if (customSettingsFile.exists()) {
                return new FileSettingsSource( customSettingsFile );
            } else {
                try {
                    return new UrlSettingsSource( new URL( customSettings ) );
                } catch (MalformedURLException e) {
                    // Ignore
                }
                log.warn("Cannot find custom maven settings: " + customSettings);
            }
        }

        String userHome = System.getProperty( "user.home" );
        if (userHome != null) {
            File userSettingsFile = new File( userHome + "/.m2/settings.xml" );
            if (userSettingsFile.exists()) {
                return new FileSettingsSource( userSettingsFile );
            }
        } else {
            log.warn("User home is not set");
        }

        return null;
    }
}