package org.codehaus.mojo.pomtools.wrapper.custom;
/*
* Copyright 2005-2006 The Apache Software Foundation.
*
* 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 java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
import org.codehaus.mojo.pomtools.PomToolsPluginContext;
import org.codehaus.mojo.pomtools.PomToolsException;
import org.codehaus.mojo.pomtools.PomToolsRTException;
import org.codehaus.mojo.pomtools.helpers.APIWorkaroundHelper;
import org.codehaus.mojo.pomtools.helpers.ModelHelper;
import org.codehaus.mojo.pomtools.validation.ProjectValidationResult;
import org.codehaus.mojo.pomtools.wrapper.ListWrapper;
import org.codehaus.mojo.pomtools.wrapper.ObjectWrapper;
import org.codehaus.mojo.pomtools.wrapper.modify.AbstractModifiableObject;
import org.codehaus.mojo.pomtools.wrapper.modify.Modifiable;
import org.apache.maven.profiles.DefaultProfileManager;
import org.apache.maven.profiles.ProfileManager;
import org.apache.maven.project.InvalidProjectModelException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.validation.DefaultModelValidator;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
*
* @author <a href="mailto:dhawkins@codehaus.org">David Hawkins</a>
* @version $Id$
*/
public class ProjectWrapper
extends AbstractModifiableObject
{
private final MavenProject mavenProject;
private ObjectWrapper wrappedModel;
private MavenProject tempResolvedProject;
public ProjectWrapper( Modifiable parentMod, MavenProject project )
throws PomToolsException
{
super( parentMod );
this.mavenProject = project;
initializeModel();
}
protected void initializeModel()
throws PomToolsException
{
// Get our own fresh copy of the model to edit.
Model mavenModel = readModel( this.mavenProject.getFile() );
this.wrappedModel = new ObjectWrapper( this, null, mavenModel, "project", Model.class );
}
public ObjectWrapper getWrappedModel()
{
return wrappedModel;
}
/** Creates a temporary MavenProject from the current contents of our
* wrappedModel. This is usefule when performing operations that need
* full model resolution. For example, dependencies that inherit their versions
* from the parent pom.
*/
protected MavenProject createTempResolvedProject( Model model )
throws PomToolsException, ProjectBuildingException, InvalidProjectModelException
{
PomToolsPluginContext context = PomToolsPluginContext.getInstance();
File baseDir = getBaseDir();
PlexusContainer container = context.getSession().getContainer();
File tempPomFile = null;
try
{
tempPomFile = File.createTempFile( ".pomtools-plugin-temp", "-pom.xml.", baseDir );
tempPomFile.deleteOnExit();
ProjectWrapper.writeModel( tempPomFile, model );
MavenProjectBuilder builder = (MavenProjectBuilder) container.lookup( MavenProjectBuilder.ROLE );
// TODO: This is not right. I think we need to get a handle to the global ProfileManager
ProfileManager profileManager = new DefaultProfileManager( container );
APIWorkaroundHelper.clearBuilderCache( builder );
MavenProject project = builder.build( tempPomFile,
context.getMetadataHelper().getLocalRepository(), profileManager );
return project;
}
catch ( IOException e )
{
throw new PomToolsException( "An error occured while writing temporary pom", e );
}
catch ( ComponentLookupException e )
{
throw new PomToolsException( "Unable to get the default MavenProjectBuilder", e );
}
finally
{
if ( tempPomFile != null && tempPomFile.exists() )
{
tempPomFile.delete();
}
}
}
public void setModified( boolean modified )
{
super.setModified( modified );
if ( modified )
{
// clear our cached resolved model
tempResolvedProject = null;
}
}
public MavenProject getTemporaryResolvedProject()
throws PomToolsException, InvalidProjectModelException, ProjectBuildingException
{
if ( tempResolvedProject == null )
{
tempResolvedProject = createTempResolvedProject( (Model) wrappedModel.getWrappedObject() );
}
return tempResolvedProject;
}
public Dependency findResolvedDependency( DependencyWrapper dep )
throws PomToolsException
{
try
{
List deps = getTemporaryResolvedProject().getDependencies();
if ( deps != null )
{
for ( Iterator i = deps.iterator(); i.hasNext(); )
{
Dependency tmpDep = (Dependency) i.next();
if ( StringUtils.equals( dep.getGroupId(), tmpDep.getGroupId() )
&& StringUtils.equals( dep.getArtifactId(), tmpDep.getArtifactId() ) )
{
return tmpDep;
}
}
}
}
catch ( ProjectBuildingException e )
{
throw new PomToolsException( "Error building resolved project", e );
}
return null;
}
public String getGroupId()
{
return (String) wrappedModel.getFieldValue( ModelHelper.GROUP_ID );
}
public String getArtifactId()
{
return (String) wrappedModel.getFieldValue( ModelHelper.ARTIFACT_ID );
}
public String getVersion()
{
return (String) wrappedModel.getFieldValue( ModelHelper.VERSION );
}
public String getValueLabel()
{
String name = getArtifactId();
if ( name == null )
{
name = ModelHelper.versionlessKey( getGroupId(), getArtifactId() );
}
return name;
}
public File getBaseDir()
{
return mavenProject.getBasedir();
}
public File getFile()
{
return mavenProject.getFile();
}
public ProjectValidationResult validateModel()
throws ProjectBuildingException, PomToolsException
{
try
{
return validateModel( getTemporaryResolvedProject().getModel() );
}
catch ( InvalidProjectModelException e )
{
return new ProjectValidationResult( this, e.getValidationResult() );
}
}
public ProjectValidationResult validateModel( Model model )
{
try
{
return new ProjectValidationResult( this, new DefaultModelValidator().validate( model ) );
}
catch ( Exception e )
{
throw new PomToolsRTException( e );
}
}
public void save()
throws IOException
{
if ( isModified() )
{
Model newModel = (Model) this.wrappedModel.getWrappedObject();
writeModel( mavenProject.getFile(), newModel );
setModified( false );
}
}
public void revert()
throws PomToolsException
{
if ( isModified() )
{
this.initializeModel();
setModified( false );
tempResolvedProject = null;
}
}
public static void writeModel( File pomFile, Model model )
throws IOException
{
Writer writer = null;
try
{
writer = new FileWriter( pomFile );
MavenXpp3Writer pomWriter = new MavenXpp3Writer();
pomWriter.write( writer, model );
}
finally
{
IOUtil.close( writer );
}
}
protected Model readModel( File pomFile )
throws PomToolsException
{
FileReader fileReader = null;
try
{
fileReader = new FileReader( pomFile );
return new MavenXpp3Reader().read( fileReader );
}
catch ( IOException e )
{
throw new PomToolsException( "Unable to read project file: " + pomFile.getAbsolutePath(), e );
}
catch ( XmlPullParserException e )
{
throw new PomToolsException( "XML error while reading project configuration", e );
}
finally
{
if ( fileReader != null )
{
IOUtil.close( fileReader );
}
}
}
public ObjectWrapper findDependency( Artifact artifact )
{
ListWrapper dependencies = (ListWrapper) wrappedModel.getFieldValue( "dependencies" );
for ( Iterator iter = dependencies.getItems().iterator(); iter.hasNext(); )
{
ObjectWrapper dependency = (ObjectWrapper) iter.next();
if ( StringUtils.equals( (String) dependency.getFieldValue( ModelHelper.GROUP_ID ),
artifact.getGroupId() )
&& StringUtils.equals( (String) dependency.getFieldValue( ModelHelper.ARTIFACT_ID ),
artifact.getArtifactId() )
&& StringUtils.equals( (String) dependency.getFieldValue( ModelHelper.VERSION ),
artifact.getVersion() )
)
{
return dependency;
}
}
return null;
}
}