com.rebaze.maven.focus.FocusConfigurationProcessor.java Source code

Java tutorial

Introduction

Here is the source code for com.rebaze.maven.focus.FocusConfigurationProcessor.java

Source

/*******************************************************************************
 * Copyright (c) 2015 Rebaze GmbH.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Apache Software License v2.0
 * which accompanies this distribution, and is available at
 * http://www.apache.org/licenses/
 * <p/>
 * Contributors:
 * Rebaze
 *******************************************************************************/
package com.rebaze.maven.focus;

import org.apache.maven.MavenExecutionException;
import org.apache.maven.cli.CliRequest;
import org.apache.maven.cli.configuration.ConfigurationProcessor;
import org.apache.maven.cli.configuration.SettingsXmlConfigurationProcessor;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.model.Profile;
import org.apache.maven.model.Repository;
import org.apache.maven.model.RepositoryPolicy;
import org.apache.maven.settings.Mirror;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * A configuration post-processor restricting all external repositories to a single (focus-) repository.
 *
 * @author Toni Menzel (toni.menzel@rebaze.com)
 */
@Component(role = ConfigurationProcessor.class, hint = FocusConfigurationProcessor.HINT)
public class FocusConfigurationProcessor implements ConfigurationProcessor {
    /**
     * When set, this plugin will upload dependencies in target/PAYLOAD_FILENAME to the repo configured here.
     */
    public static String PROPERTY_FOCUS_REPO = "focus.repo";

    public static final String HINT = "focus";
    private static final String FOCUS_PROFILE_NAME = "focus";
    private static final String FOCUS_MIRROR_NAME = "focus";
    private static final String NOOP_URL = "http://noop";

    @Requirement(hint = SettingsXmlConfigurationProcessor.HINT)
    ConfigurationProcessor realProc;

    @Requirement
    Logger logger;

    @Override
    public void process(CliRequest cliRequest) throws Exception {
        realProc.process(cliRequest);
        if (cliRequest.getUserProperties().getProperty(PROPERTY_FOCUS_REPO) != null) {
            logger.info("Focus mode is enabled.");
            Repository focusRepo = findRepository(cliRequest.getRequest(),
                    cliRequest.getUserProperties().getProperty(PROPERTY_FOCUS_REPO));
            cliRequest.getRequest().setMirrors(adaptMirrors(cliRequest.getRequest(), focusRepo));
            cliRequest.getRequest().setProfiles(adaptProfiles(cliRequest.getRequest(), focusRepo));

            cliRequest.getRequest().addActiveProfile(FOCUS_PROFILE_NAME);
            Set<String> profiles = new HashSet<String>(cliRequest.getRequest().getActiveProfiles());
            printNewSettingsOverview(cliRequest, profiles);
        } else {
            logger.info("Focus mode is disabled.");
        }
    }

    private void printNewSettingsOverview(CliRequest cliRequest, Set<String> profiles) {
        for (Profile p : cliRequest.getRequest().getProfiles()) {
            String active = profiles.contains(p.getId()) ? "Active" : "Inactive";
            logger.info(active + " Profile: " + p.getId());
            for (Repository repo : p.getRepositories()) {
                logger.info(active + " Repository " + repo.getId() + " from profile " + p.getId() + " with target: "
                        + repo.getUrl());
            }
            for (Repository repo : p.getPluginRepositories()) {
                logger.info(active + " PluginRepository " + repo.getId() + " from profile " + p.getId()
                        + " with target: " + repo.getUrl());
            }
        }
    }

    private Repository findRepository(MavenExecutionRequest request, String repoID) throws MavenExecutionException {
        for (Profile profile : request.getProfiles()) {
            for (Repository repo : profile.getRepositories()) {
                if (repo.getId().equals(repoID)) {
                    return repo;
                }
            }
        }
        throw new MavenExecutionException("Focus repository " + repoID + " is not configured.", request.getPom());
    }

    private List<Profile> adaptProfiles(MavenExecutionRequest request, Repository focusRepo) {
        List<Profile> profiles = new ArrayList<>();

        for (Profile profile : request.getProfiles()) {
            logger.info("Checking profile.." + profile);
            for (Repository repo : profile.getRepositories()) {
                if (!repo.getId().equals(focusRepo.getId())) {
                    repo.setUrl(NOOP_URL);
                    logger.info("Invalidated access for + " + repo.getId() + " to " + repo.getUrl() + ".");
                }
            }
            for (Repository repo : profile.getPluginRepositories()) {
                if (!repo.getId().equals(focusRepo.getId())) {
                    repo.setUrl(NOOP_URL);
                    logger.info("Invalidated access for + " + repo.getId() + " to " + repo.getUrl() + ".");
                }
            }
            profiles.add(profile);
        }
        profiles.add(invalidateCentralProfile());
        return profiles;
    }

    private Profile invalidateCentralProfile() {
        Profile focusProfile = new Profile();
        focusProfile.setId(FOCUS_PROFILE_NAME);

        RepositoryPolicy activePolicy = new RepositoryPolicy();
        activePolicy.setEnabled(true);

        Repository centralRepoReleases = new Repository();
        centralRepoReleases.setId("central");
        centralRepoReleases.setReleases(activePolicy);
        centralRepoReleases.setSnapshots(activePolicy);
        centralRepoReleases.setUrl(NOOP_URL);
        focusProfile.addRepository(centralRepoReleases);
        focusProfile.addPluginRepository(centralRepoReleases);
        return focusProfile;
    }

    private List<Mirror> adaptMirrors(MavenExecutionRequest request, Repository focusRepo) {
        List<Mirror> mirrors = new ArrayList<>();
        Mirror mirror = new Mirror();
        mirror.setId(FOCUS_MIRROR_NAME);
        mirror.setMirrorOf("*,!" + focusRepo.getId());
        mirror.setUrl(focusRepo.getUrl());
        logger.info("Set mirror for " + mirror.getMirrorOf() + " to " + mirror.getUrl() + ".");
        mirrors.add(mirror);
        return mirrors;
    }
}