org.automagic.mojo.UpdateDepsToUpperBoundMojo.java Source code

Java tutorial

Introduction

Here is the source code for org.automagic.mojo.UpdateDepsToUpperBoundMojo.java

Source

/*
 * Copyright 2015 Jose Carrizo
 * Licensed under the Apache License, Version 2.0 
 * See accompanying file LICENSE or get a copy at http://www.apache.org/licenses/LICENSE-2.0
 */
package org.automagic.mojo;

/*
 * 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.
 */

import static org.apache.commons.lang3.StringUtils.EMPTY;
import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.split;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactCollector;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
import org.automagic.deps.doctor.DependenciesDoctor;
import org.automagic.deps.doctor.TransitiveDependency;
import org.automagic.deps.doctor.editor.PomEditor;
import org.automagic.deps.doctor.editor.PomWriter;
import org.automagic.deps.doctor.editor.PomWriterImpl;
import org.automagic.deps.doctor.editor.Result;
import org.automagic.deps.doctor.filter.DependenciesFilter;
import org.automagic.deps.doctor.filter.DependenciesFilterImpl;
import org.automagic.deps.doctor.spy.PomSpy;
import org.automagic.deps.doctor.spy.PomSpyImpl;

import com.google.common.base.Optional;

/**
 * 
 */
@Mojo(name = "updateDepsToUpperBound", defaultPhase = LifecyclePhase.VALIDATE)
public class UpdateDepsToUpperBoundMojo extends AbstractMojo {

    @Parameter(defaultValue = "${project}", readonly = true, required = true)
    private MavenProject project;

    @Parameter(defaultValue = "${localRepository}", readonly = true, required = true)
    private ArtifactRepository repository;

    @Component
    private ArtifactFactory factory;

    @Component
    private ArtifactMetadataSource metadataSource;

    @Component
    private ArtifactCollector collector;

    @Component
    private DependencyTreeBuilder treeBuilder;

    @Parameter(defaultValue = "false", property = "honor.top.deps")
    private boolean honorTopDependencies;

    @Parameter(defaultValue = "1", property = "indent.size")
    private int indentSize;

    @Parameter(defaultValue = "true", property = "indent.with.tabs")
    private boolean indentWithTabs;

    @Parameter(defaultValue = "true", property = "add.comments")
    private boolean addComments;

    @Parameter(defaultValue = "false", property = "skip.magic")
    private boolean skip;

    @Parameter(defaultValue = "false", property = "use.parent")
    private boolean useParent;

    @Parameter(property = "magic.include")
    private String include;

    @Parameter(property = "magic.exclude")
    private String exclude;

    @Parameter(defaultValue = "false", property = "magic.dry.run")
    private boolean dryRun;

    public void execute() throws MojoExecutionException {

        if (skip) {
            lineBreak();
            getLog().info("--- Skipped!");
            return;
        }

        PomSpy pomSpy = new PomSpyImpl(project, repository, factory, metadataSource, collector, treeBuilder,
                useParent);
        DependenciesFilter filter = new DependenciesFilterImpl(toList(include), toList(exclude));
        DependenciesDoctor doctor = new DependenciesDoctor(pomSpy, honorTopDependencies, filter);

        Optional<List<TransitiveDependency>> antidote = doctor.getAntidote();

        if (!antidote.isPresent()) {
            lineBreak();
            getLog().info("--- Everything is fine!");
            return;
        }

        PomWriter pomWriter = new PomWriterImpl(project, indentSize, indentWithTabs, addComments);
        PomEditor pomEditor = new PomEditor(pomSpy, pomWriter);

        Result result = pomEditor.updateDependencies(antidote.get());

        lineBreak();
        getLog().info("--- Updating dependencies:");
        for (TransitiveDependency dep : result.getModifiedDependencies()) {
            getLog().info(dep.getDependencyNode().toNodeString().trim());
        }
        for (TransitiveDependency dep : result.getNewDependencies()) {
            getLog().info(dep.getDependencyNode().toNodeString().trim());
        }

        if (dryRun) {
            lineBreak();
            getLog().info("--- Finished dry run!");
            return;
        }

        try {
            if (result.isProjectModified()) {
                lineBreak();
                getLog().info("--- Saving changes in pom.xml file:");
                getLog().info(project.getFile().getPath());
                byte[] bytes = pomWriter.saveChanges(!pomSpy.hasXmlDeclaration());
                FileUtils.writeByteArrayToFile(project.getFile(), bytes);
            }
            if (result.isParentProjectModified()) {
                lineBreak();
                getLog().info("--- Saving changes in parent pom.xml file:");
                getLog().info(project.getParent().getFile().getPath());
                byte[] bytes = pomWriter.getParentWriter().saveChanges(!pomSpy.hasXmlDeclaration());
                FileUtils.writeByteArrayToFile(project.getParent().getFile(), bytes);
            }
        } catch (IOException e) {
            throw new MojoExecutionException(String.format("%nError writing in the pom.xml file"), e);
        }
    }

    private static List<String> toList(String filter) {
        if (isBlank(filter)) {
            return Collections.emptyList();
        }
        return Arrays.asList(split(filter, ','));
    }

    private void lineBreak() {
        getLog().info(EMPTY);
    }

}