blob: 0f15db5a4c34374ba064cd47abf5886bc637571e [file] [log] [blame]
/*
* 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 npanday.dao;
import npanday.ArtifactType;
import npanday.ArtifactTypeHelper;
import npanday.PathUtil;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
/**
* Class for creating Project/ProjectDependency objects.
*/
public final class ProjectFactory
{
private static final Logger logger = Logger.getAnonymousLogger();
/**
* Creates model from the specified project.
*
* @param project the project to create the model from.
* @return model created from the specified project
* @throws IOException if there was a problem creating the model
*/
public static Model createModelFrom( Project project )
throws IOException
{
Model model = new Model();
model.setGroupId( project.getGroupId() );
model.setArtifactId( project.getArtifactId() );
model.setVersion( project.getVersion() );
model.setPackaging( project.getArtifactType() );
List<Dependency> dependencies = new ArrayList<Dependency>();
for ( ProjectDependency projectDependency : project.getProjectDependencies() )
{
Dependency dependency = new Dependency();
dependency.setGroupId( projectDependency.getGroupId() );
dependency.setArtifactId( projectDependency.getArtifactId() );
dependency.setVersion( projectDependency.getVersion() );
dependency.setType( projectDependency.getArtifactType() );
dependency.setClassifier( projectDependency.getPublicKeyTokenId() );
dependency.setScope(projectDependency.getScope());
dependency.setSystemPath(projectDependency.getSystemPath());
dependencies.add( dependency );
}
model.setDependencies( dependencies );
return model;
}
/**
* Creates a project using information from the specified model
*
* @param model the project object model used to create the project.
* @param pomFileDirectory the directory containing the pom.xml (model).
* @return a project created from the specified model
* @throws IOException if there was a problem creating the project
*/
public static Project createProjectFrom( Model model, File pomFileDirectory )
throws IOException
{
Project project = new Project();
project.setGroupId( model.getGroupId() );
project.setArtifactId( model.getArtifactId() );
project.setVersion( model.getVersion() );
project.setArtifactType( model.getPackaging() );
Parent parent = model.getParent();
if (parent != null)
{
if (project.getGroupId() == null)
{
project.setGroupId(parent.getGroupId());
}
if(project.getVersion()== null)
{
project.setVersion(parent.getVersion());
}
}
if ( parent != null && pomFileDirectory != null && (project.getGroupId() == null || project.getVersion() == null))
{
File parentPomFile = new File( pomFileDirectory , parent.getRelativePath().replace( "\\", File.separator)
.replace( "/", File.separator) );
if ( parentPomFile.exists() ) // if pom resides in remote repo, Maven should already handle this.
{
FileReader fileReader = new FileReader( parentPomFile );
MavenXpp3Reader reader = new MavenXpp3Reader();
Model parentModel;
try
{
parentModel = reader.read( fileReader );
if (project.getGroupId()==null)
{
project.setGroupId( parentModel.getGroupId() );
}
if ( project.getVersion()==null )
{
project.setVersion( parentModel.getVersion() );
}
}
catch ( XmlPullParserException e )
{
throw new IOException( "NPANDAY-180-000: Unable to read model: Message = " + e.getMessage() );
}
//Project parentProject = createProjectFrom( parentModel, parentPomFile.getParentFile() );
//project.setParentProject( parentProject );
}
}
//TODO: publickey/classifier
List<Dependency> sourceArtifactDependencies = model.getDependencies();
for ( Dependency dependency : sourceArtifactDependencies )
{
project.addProjectDependency( createProjectDependencyFrom( dependency ) );
}
return project;
}
/**
* Creates a project dependency using information from the specified dependency.
*
* @param dependency a dependency to use as the source of the returned project dependency
* @return a project dependency
*/
public static ProjectDependency createProjectDependencyFrom( Dependency dependency )
{
ProjectDependency projectDependency = new ProjectDependency();
projectDependency.setGroupId( dependency.getGroupId() );
projectDependency.setArtifactId( dependency.getArtifactId() );
projectDependency.setVersion( dependency.getVersion() );
projectDependency.setPublicKeyTokenId( dependency.getClassifier() );
projectDependency.setArtifactType( dependency.getType() );
projectDependency.setScope(dependency.getScope());
projectDependency.setSystemPath(dependency.getSystemPath());
projectDependency.setScope(dependency.getScope());
projectDependency.setSystemPath(dependency.getSystemPath());
logAndVerifyProjectParameters( projectDependency );
return projectDependency;
}
/**
* Creates a dependency using information from the specified project dependency.
*
* @param projectDependency a project dependency to use as the source of the returned dependency
* @return a dependency created using information from the specified project dependency
*/
public static Dependency createDependencyFrom( ProjectDependency projectDependency )
{
logAndVerifyProjectParameters( projectDependency );
Dependency dependency = new Dependency();
dependency.setGroupId( projectDependency.getGroupId() );
dependency.setArtifactId( projectDependency.getArtifactId() );
dependency.setVersion( projectDependency.getVersion() );
dependency.setType( projectDependency.getArtifactType() );
dependency.setClassifier( projectDependency.getPublicKeyTokenId() );
dependency.setScope(projectDependency.getScope());
dependency.setSystemPath(projectDependency.getSystemPath());
return dependency;
}
/**
* Creates an artifact using information from the specified project.
*
* @param project a project to use as the source of the returned artifact
* @param artifactFactory artifact factory used to create the artifact
* @param localRepository the local repository
* @return an artifact using information from the specified project
*/
public static Artifact createArtifactFrom( Project project, ArtifactFactory artifactFactory, File localRepository )
{
logAndVerifyProjectParameters( project );
Artifact assembly = artifactFactory.createArtifactWithClassifier( project.getGroupId(), project.getArtifactId(),
project.getVersion(),
project.getArtifactType(),
project.getPublicKeyTokenId() );
File artifactFile = ( ( ArtifactTypeHelper.isDotnetAnyGac( project.getArtifactType() ) ) ) ? new File(
"C:\\WINDOWS\\assembly\\" + project.getArtifactType() + File.separator + project.getArtifactId() + File.separator +
project.getVersion() + "__" + project.getPublicKeyTokenId() + File.separator + project.getArtifactId() + ArtifactType.getArtifactTypeForPackagingName( project.getArtifactType() ).getExtension() )
: PathUtil.getDotNetArtifact( assembly, localRepository ) ;
assembly.setFile( artifactFile );
return assembly;
}
/**
* Logs missing value if specified project in invalid and returns true if the specified project is valid, otherwise
* returns false.
*
* @param project the project to check
* @return true if the project is valid, otherwise returns false
*/
private static boolean logAndVerifyProjectParameters( Project project )
{
if ( project.getGroupId() == null )
{
logger.warning( "NPANDAY-180-001: Project Group ID is missing" );
return false;
}
if ( project.getArtifactId() == null )
{
logger.warning( "NPANDAY-180-002: Project Artifact ID is missing: Group Id = " + project.getGroupId() );
return false;
}
if ( project.getVersion() == null )
{
logger.warning( "NPANDAY-180-003: Project Version is missing: Group Id = " + project.getGroupId() +
", Artifact Id = " + project.getArtifactId() );
return false;
}
if ( project.getArtifactType() == null )
{
logger.warning( "NPANDAY-180-004: Project Artifact Type is missing: Group Id" + project.getGroupId() +
", Artifact Id = " + project.getArtifactId() + ", Version = " + project.getVersion() );
return false;
}
return true;
}
}