/*
* Copyright 2014 Bernd Vogt and others.
*
* 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.
*/
package org.sourcepit.b2.version.plugin.internal;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.util.List;
import javax.inject.Inject;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import org.apache.commons.io.IOUtils;
import org.apache.maven.artifact.manager.WagonManager;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.path.PathTranslator;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.settings.Settings;
import org.codehaus.mojo.versions.api.DefaultVersionsHelper;
import org.codehaus.mojo.versions.api.PomHelper;
import org.codehaus.mojo.versions.api.VersionsHelper;
import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.WriterFactory;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.codehaus.stax2.XMLInputFactory2;
import org.sourcepit.b2.files.ModuleDirectory;
import org.sourcepit.b2.maven.core.B2MavenBridge;
/**
* @author eddi-weiss
*/
@SuppressWarnings("deprecation")
public abstract class ModuleVersionsMojo extends AbstractMojo {
protected B2MavenBridge bridge;
@Parameter(property = "project", readonly = true, required = true)
protected MavenProject project;
@Parameter(property = "reactorProjects", readonly = true, required = true)
protected List<MavenProject> reactorProjects;
@Parameter(defaultValue = "${session}")
protected MavenSession session;
@Parameter(defaultValue = "${localRepository}")
protected ArtifactRepository localRepository;
@Inject
protected RepositorySystem repository;
@Inject
private ResolutionErrorHandler resolutionErrorHandler;
private VersionsHelper helper;
@Inject
private PathTranslator pathTranslator;
@Inject
private ArtifactMetadataSource artifactMetadataSource;
@Inject
private WagonManager wagonManager;
@Inject
private org.apache.maven.artifact.factory.ArtifactFactory artifactFactory;
@Inject
private ArtifactResolver artifactResolver;
@Parameter(defaultValue = "${settings}")
private Settings settings;
@Parameter(defaultValue = "serverId", property = "maven.version.rules.serverId")
private String serverId;
@Parameter(property = "maven.version.rules")
private String rulesUri;
@Override
public final void execute() throws MojoExecutionException, MojoFailureException {
InputStream stream = null;
try {
bridge = B2MavenBridge.get(session);
ModuleDirectory directory = bridge.getModuleDirectory(project);
if (directory != null) {
File dir = directory.getFile();
final File moduleFile = new File(dir, "module.xml");
stream = new FileInputStream(moduleFile);
final Model projectModel = new MavenXpp3Reader().read(stream);
processModule(moduleFile, projectModel);
}
}
catch (FileNotFoundException e) {
throw new MojoExecutionException("", e);
}
catch (IOException e) {
throw new MojoExecutionException("", e);
}
catch (XmlPullParserException e) {
throw new MojoExecutionException("", e);
}
finally {
IOUtils.closeQuietly(stream);
bridge.disconnect(session);
}
}
private void processModule(File moduleFile, final Model projectModel) throws MojoExecutionException,
MojoFailureException {
try {
StringBuilder input = PomHelper.readXmlFile(moduleFile);
ModifiedPomXMLEventReader reader = createReader(input);
updateModule(reader, projectModel);
if (reader.isModified()) {
writeFile(moduleFile, input);
}
}
catch (IOException e) {
getLog().error(e);
}
catch (XMLStreamException e) {
getLog().error(e);
}
}
protected abstract void updateModule(ModifiedPomXMLEventReader reader, Model projectModel)
throws MojoExecutionException, MojoFailureException, XMLStreamException;
private ModifiedPomXMLEventReader createReader(StringBuilder input) {
ModifiedPomXMLEventReader reader = null;
try {
XMLInputFactory factory = XMLInputFactory2.newInstance();
factory.setProperty(XMLInputFactory2.P_PRESERVE_LOCATION, Boolean.TRUE);
reader = new ModifiedPomXMLEventReader(input, factory);
}
catch (XMLStreamException e) {
getLog().error(e);
}
return reader;
}
private void writeFile(File moduleFile, StringBuilder content) throws IOException {
Writer writer = WriterFactory.newXmlWriter(moduleFile);
try {
IOUtil.copy(content.toString(), writer);
}
finally {
IOUtils.closeQuietly(writer);
}
}
public VersionsHelper getHelper() throws MojoExecutionException {
if (helper == null) {
helper = new DefaultVersionsHelper(artifactFactory, artifactResolver, artifactMetadataSource,
project.getRemoteArtifactRepositories(), project.getRemotePluginRepositories(), localRepository,
wagonManager, settings, serverId, rulesUri, getLog(), session, pathTranslator);
}
return helper;
}
}