com.github.jeluard.maven.ParentEnforcerRule Maven / Gradle / Ivy
/**
*
* Parent enforcer rule
* =========================
*
* Please visit the Remote Process web site for more information:
*
* * http://jeluard.github.com/remote-process
*
* Copyright 2012 Julien Eluard
*
* Julien Eluard licenses this product to you under the Apache License, version 2.0 (the
* "License"); you may not use this product 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.
*
* Also, please refer to each LICENSE..txt file, which is located in
* the 'licenses' directory of the distribution file, for the license terms of the
* components that this product depends on.
*/
package com.github.jeluard.maven;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.apache.maven.enforcer.rule.api.EnforcerRule;
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
* {@link EnforcerRule} implementation checking parent artifacts.
*/
public class ParentEnforcerRule implements EnforcerRule {
private static final String POM_ARTIFACT_TYPE = "pom";
@Override
public void execute(final EnforcerRuleHelper helper) throws EnforcerRuleException {
final MavenProject project;
try {
project = (MavenProject) helper.evaluate("${project}");
} catch (ExpressionEvaluationException e) {
throw new EnforcerRuleException("Failed to access ${project} variable", e);
}
final String type = project.getArtifact().getType();
if (!ParentEnforcerRule.POM_ARTIFACT_TYPE.equals(type)) {
helper.getLog().debug("Skipping non "+ParentEnforcerRule.POM_ARTIFACT_TYPE+" artifact.");
return;
}
final Parent parent = new Parent();
parent.setGroupId(project.getGroupId());
parent.setArtifactId(project.getArtifactId());
parent.setVersion(project.getVersion());
try {
validateSubModules(extractRootFolder(project), project.getModel(), parent);
} catch (IOException e) {
throw new EnforcerRuleException("Failed to process one of project's module", e);
}
}
protected final File extractRootFolder(final MavenProject project) {
return new File(project.getFile().getParentFile().getPath());
}
protected final void validateModel(final File rootFolder, final Model model, final Parent parent) throws IOException {
if (!isParentValid(model.getParent(), parent)) {
throw new IllegalArgumentException("Parent for <"+model+"> is <"+model.getParent()+"> but must be <"+parent+">");
}
validateSubModules(rootFolder, model, parent);
}
protected final void validateSubModules(final File rootFolder, final Model model, final Parent parent) throws IOException {
//Validate all modules of pom type modules.
if (ParentEnforcerRule.POM_ARTIFACT_TYPE.equals(model.getPackaging())) {
final Parent newParent = new Parent();
newParent.setGroupId(model.getGroupId());
newParent.setArtifactId(model.getArtifactId());
newParent.setVersion(parent.getVersion());//Model version might be inherited from Parent (thus not set at the model level). Rely on Parent#getVersion().
for (final String module : model.getModules()) {
final Model moduleModel = loadModel(rootFolder, module+"/pom.xml");
validateModel(new File(rootFolder, module), moduleModel, newParent);
}
}
}
protected final boolean isParentValid(final Parent modelParent, final Parent parent) {
return parent.getArtifactId().equals(modelParent.getArtifactId()) && parent.getGroupId().equals(modelParent.getGroupId()) && parent.getVersion().equals(modelParent.getVersion());
}
protected final Model loadModel(final File rootFolder, final String moduleFileName) throws IOException {
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try
{
fileReader = new FileReader(new File(rootFolder, moduleFileName));
bufferedReader = new BufferedReader(fileReader);
final MavenXpp3Reader reader = new MavenXpp3Reader();
return reader.read(bufferedReader);
} catch (XmlPullParserException e) {
final IOException ioe = new IOException(e);
throw ioe;
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
if (fileReader != null) {
fileReader.close();
}
}
}
@Override
public boolean isCacheable() {
return false;
}
@Override
public boolean isResultValid(final EnforcerRule cachedRule) {
return false;
}
@Override
public String getCacheId() {
return "0";
}
}