/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.codehaus.mojo.pom;
import java.util.HashMap;
import java.util.Map;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
public abstract class AbstractPomModifyMojo extends AbstractPomMojo {
/**
* The groupId of the module to change version of.
*
* @parameter expression="${groupId}" default-value="${project.groupId}"
* @required
* @since 1.0.0
*/
private String groupId;
/**
* The artifactId of the module to change version of.
*
* @parameter expression="${artifactId}"
* @required
* @since 1.0.0
*/
private String artifactId;
/**
* The old version to replace. The default value is <code>null</code> and
* only matches the current version of the according reactor project. Set to
* <code>"*"</code> in order to match any version.
*
* @parameter expression="${version}"
* @since 1.0.0
*/
private String version;
/**
* The type (e.g. "jar") to replace in dependencies. The default value is
* <code>null</code> and matches any type.
*
* @parameter expression="${type}"
* @since 1.0.0
*/
private String type;
/**
* The scope (e.g. "compile", "test", ...) to replace in dependencies. The
* default value is <code>null</code> and matches any scope.
*
* @parameter expression="${scope}"
* @since 1.0.0
*/
private String scope;
/**
* The classifier (e.g. "sources") to replace in dependencies. The default
* value is <code>null</code> and matches any classifier.
*
* @parameter expression="${classifier}"
* @since 1.0.0
*/
private String classifier;
/**
* The encoding used to write pom.xml files.
*
* @parameter expression="${xmlEncoding}" default-value="${file.encoding}"
* @required
* @since 1.0.0
*/
private String xmlEncoding;
/**
* The flag to indicate if original pom.xml should be overwritten, or a new
* pom.xml should be created in <code>project.build.outputDirectory</code>.
*
* @parameter expression="${overwrite}" default-value="false"
* @required
* @since 1.0.0
*/
private boolean overwrite;
private DependencyPatternMatcher matcher;
private final Map<ProjectId, ProjectContainer> projectContainerMap;
/**
* The constructor.
*/
public AbstractPomModifyMojo() {
super();
this.projectContainerMap = new HashMap<ProjectId, ProjectContainer>();
}
/**
* @return the overwrite
*/
public boolean isOverwrite() {
return this.overwrite;
}
/**
* @return the matcher
*/
public DependencyPatternMatcher getMatcher() {
return this.matcher;
}
public ProjectContainer getReactorProject(String groupId, String artifactId) {
ProjectId pid = new ProjectId(groupId, artifactId);
ProjectContainer reactorProject = this.projectContainerMap.get(pid);
return reactorProject;
}
/**
* {@inheritDoc}
*/
public void execute() throws MojoExecutionException, MojoFailureException {
super.execute();
this.matcher = new DependencyPatternMatcher(this.groupId, this.artifactId, this.version,
this.type, this.scope, this.classifier);
// pass 1: search matching modules in reactor...
for (MavenProject module : this.reactorProjects) {
ProjectContainer parent = null;
if (module.getParent() != null) {
MavenProject parentProject = module.getParent();
ProjectId parentId = new ProjectId(parentProject);
parent = this.projectContainerMap.get(parentId);
if (parent == null) {
getLog().debug("Parent project '" + parentId + "' NOT in reactor.");
}
}
ProjectContainer container = new ProjectContainer(module, parent, getLog());
this.projectContainerMap.put(container.getId(), container);
// getLog().info("Matching " + module);
}
// pass 2: modify modules...
for (MavenProject module : this.reactorProjects) {
ProjectId pid = new ProjectId(module);
ProjectContainer container = this.projectContainerMap.get(pid);
execute(container);
}
// pass 3: save modified POMs...
for (MavenProject module : this.reactorProjects) {
ProjectId pid = new ProjectId(module);
ProjectContainer container = this.projectContainerMap.get(pid);
container.save(this.xmlEncoding, this.overwrite);
}
}
protected void execute(ProjectContainer projectContainer) throws MojoExecutionException,
MojoFailureException {
getLog().info("Processing project " + projectContainer.getId() + "...");
}
}