com.redhat.rcm.version.config.DefaultSessionConfigurator.java Source code

Java tutorial

Introduction

Here is the source code for com.redhat.rcm.version.config.DefaultSessionConfigurator.java

Source

/*
 * Copyright (c) 2011 Red Hat, Inc.
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see 
 * <http://www.gnu.org/licenses>.
 */

package com.redhat.rcm.version.config;

import static com.redhat.rcm.version.util.InputUtils.getFile;
import static com.redhat.rcm.version.util.InputUtils.getFiles;
import static org.apache.commons.lang.StringUtils.join;

import java.io.File;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionRequestPopulationException;
import org.apache.maven.execution.MavenExecutionRequestPopulator;
import org.apache.maven.mae.project.ProjectLoader;
import org.apache.maven.mae.project.ProjectToolsException;
import org.apache.maven.mae.project.key.FullProjectKey;
import org.apache.maven.mae.project.session.SessionInitializer;
import org.apache.maven.project.MavenProject;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Settings;
import org.apache.maven.settings.building.DefaultSettingsBuildingRequest;
import org.apache.maven.settings.building.SettingsBuilder;
import org.apache.maven.settings.building.SettingsBuildingException;
import org.apache.maven.settings.building.SettingsBuildingResult;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.redhat.rcm.version.VManException;
import com.redhat.rcm.version.maven.VManWorkspaceReader;
import com.redhat.rcm.version.mgr.session.VersionManagerSession;
import com.redhat.rcm.version.util.PomPeek;

@Component(role = SessionConfigurator.class)
public class DefaultSessionConfigurator implements SessionConfigurator {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Requirement
    private ProjectLoader projectLoader;

    @Requirement
    private SettingsBuilder settingsBuilder;

    @Requirement
    private MavenExecutionRequestPopulator requestPopulator;

    @Requirement
    private SessionInitializer sessionInitializer;

    DefaultSessionConfigurator() {
    }

    @Override
    public void configureSession(final List<String> boms, final String toolchain,
            final VersionManagerSession session, final File[] pomFiles) {
        if (session.getSettingsXml() != null) {
            loadSettings(session);
        }

        try {
            sessionInitializer.initializeSessionComponents(session);
        } catch (final ProjectToolsException e) {
            session.addError(e);
            return;
        }

        if (session.getWorkspaceReader() == null) {
            final VManWorkspaceReader workspaceReader = new VManWorkspaceReader(session);
            session.setWorkspaceReader(workspaceReader);
        }

        final Set<File> poms = new HashSet<File>();
        poms.addAll(Arrays.asList(pomFiles));

        if (boms != null) {
            final File[] bomFiles = loadBOMs(boms, session);
            if (bomFiles != null && bomFiles.length > 0) {
                poms.addAll(Arrays.asList(bomFiles));
            }
        }

        if (toolchain != null) {
            final File toolchainFile = loadToolchain(toolchain, session);
            if (toolchainFile != null) {
                poms.add(toolchainFile);
            }
        }

        if (session.getPeekedPoms().isEmpty()) {
            final Map<FullProjectKey, File> peekPoms = peekPoms(poms);
            session.setPeekedPoms(peekPoms);
        }
    }

    private Map<FullProjectKey, File> peekPoms(final Set<File> poms) {
        final Map<FullProjectKey, File> result = new HashMap<FullProjectKey, File>();
        for (final File pom : poms) {
            final PomPeek peek = new PomPeek(pom);
            final FullProjectKey key = peek.getKey();
            if (key != null) {
                result.put(key, pom);
            }
        }

        final List<FullProjectKey> keys = new ArrayList<FullProjectKey>(result.keySet());
        Collections.sort(keys);

        logger.info("PEEKed the following coordinates from pom file-list:\n\n  {}\n\n{} POMs could not be PEEKed.",
                join(keys, "\n  "), (poms.size() - keys.size()));

        return result;
    }

    private void loadSettings(final VersionManagerSession session) {
        MavenExecutionRequest executionRequest = session.getExecutionRequest();
        if (executionRequest == null) {
            executionRequest = new DefaultMavenExecutionRequest();
        }

        File settingsXml;
        try {
            settingsXml = getFile(session.getSettingsXml(), session.getDownloads());
        } catch (final VManException e) {
            session.addError(e);
            return;
        }

        final DefaultSettingsBuildingRequest req = new DefaultSettingsBuildingRequest();
        req.setUserSettingsFile(settingsXml);
        req.setSystemProperties(System.getProperties());

        try {
            final SettingsBuildingResult result = settingsBuilder.build(req);
            final Settings settings = result.getEffectiveSettings();

            final String proxyHost = System.getProperty("http.proxyHost");
            final String proxyPort = System.getProperty("http.proxyPort", "8080");
            final String nonProxyHosts = System.getProperty("http.nonProxyHosts", "localhost");

            final String proxyUser = System.getProperty("http.proxyUser");
            final String proxyPassword = System.getProperty("http.proxyPassword");
            if (proxyHost != null) {
                final Proxy proxy = new Proxy();
                proxy.setActive(true);
                proxy.setHost(proxyHost);
                proxy.setId("cli");
                proxy.setNonProxyHosts(nonProxyHosts);
                proxy.setPort(Integer.parseInt(proxyPort));

                if (proxyUser != null && proxyPassword != null) {
                    proxy.setUsername(proxyUser);
                    proxy.setPassword(proxyPassword);

                    Authenticator.setDefault(new Authenticator() {
                        @Override
                        public PasswordAuthentication getPasswordAuthentication() {
                            return new PasswordAuthentication(proxyUser, proxyPassword.toCharArray());
                        }
                    });
                }

                settings.setProxies(Collections.singletonList(proxy));
            }

            executionRequest = requestPopulator.populateFromSettings(executionRequest, settings);
            session.setExecutionRequest(executionRequest);
        } catch (final SettingsBuildingException e) {
            session.addError(new VManException("Failed to build settings from: %s. Reason: %s", e, settingsXml,
                    e.getMessage()));
        } catch (final MavenExecutionRequestPopulationException e) {
            session.addError(new VManException("Failed to initialize system using settings from: %s. Reason: %s", e,
                    settingsXml, e.getMessage()));
        }
    }

    private File loadToolchain(final String toolchain, final VersionManagerSession session) {
        File toolchainFile = null;
        try {
            toolchainFile = getFile(toolchain, session.getDownloads());
        } catch (final VManException e) {
            session.addError(e);
        }

        if (toolchainFile != null) {
            MavenProject project = null;
            try {
                project = projectLoader.buildProjectInstance(toolchainFile, session);
            } catch (final ProjectToolsException e) {
                session.addError(new VManException("Error building toolchain: %s", e, e.getMessage()));
            }

            if (project != null) {
                session.setToolchain(toolchainFile, project);
            }
        }

        return toolchainFile;
    }

    private File[] loadBOMs(final List<String> boms, final VersionManagerSession session) {
        if (!session.hasDependencyMap()) {
            File[] bomFiles = null;
            try {
                bomFiles = getFiles(boms, session.getDownloads());
            } catch (final VManException e) {
                session.addError(e);
            }

            List<MavenProject> projects = null;
            if (bomFiles != null) {
                try {
                    projects = projectLoader.buildReactorProjectInstances(session, false, bomFiles);
                } catch (final ProjectToolsException e) {
                    session.addError(new VManException("Error building BOM: %s", e, e.getMessage()));
                }
            }

            if (projects != null) {
                for (final MavenProject project : projects) {
                    final File bom = project.getFile();

                    logger.info("Adding BOM to session: " + bom + "; " + project);
                    try {
                        session.addBOM(bom, project);
                    } catch (final VManException e) {
                        session.addError(e);
                    }
                }
            }

            return bomFiles;
        }

        return null;
    }

}