Java tutorial
/* * 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); } }