blob: f6abf3343fab7fdfc02ce50d21686e00fe62ccb7 [file] [log] [blame]
package org.apache.maven.archetype.old;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/*
* Copyright 2004-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 org.apache.maven.archetype.ArchetypeGenerationRequest;
import org.apache.maven.archetype.exception.InvalidPackaging;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.project.DefaultProjectBuildingRequest;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.repository.internal.MavenRepositorySystemSession;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.context.Context;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.codehaus.plexus.velocity.VelocityComponent;
import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.xmlunit.matchers.CompareMatcher.isIdenticalTo;
/**
* @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
* @version $Id$
*/
public class ArchetypeTest
extends PlexusTestCase
{
private OldArchetype archetype;
private StringWriter out = new StringWriter();;
public void testArchetype()
throws Exception
{
FileUtils.deleteDirectory( getTestFile( "target/quickstart" ) );
// ----------------------------------------------------------------------
// This needs to be encapsulated in a maven test case.
// ----------------------------------------------------------------------
ArtifactRepositoryLayout layout =
(ArtifactRepositoryLayout) getContainer().lookup( ArtifactRepositoryLayout.ROLE );
String mavenRepoLocal = getTestFile( "target/local-repository" ).toURI().toURL().toString();
ArtifactRepository localRepository = new DefaultArtifactRepository( "local", mavenRepoLocal, layout );
List<ArtifactRepository> remoteRepositories = new ArrayList<>();
String mavenRepoRemote = getTestFile( "src/test/repository" ).toURI().toURL().toString();
ArtifactRepository remoteRepository = new DefaultArtifactRepository( "remote", mavenRepoRemote, layout );
remoteRepositories.add( remoteRepository );
ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest();
buildingRequest.setRemoteRepositories( remoteRepositories );
MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( localRepository.getBasedir() ) );
buildingRequest.setRepositorySession( repositorySession );
ArchetypeGenerationRequest request = new ArchetypeGenerationRequest()
.setProjectBuildingRequest( buildingRequest )
.setPackage( "org.apache.maven.quickstart" )
.setGroupId( "maven" )
.setArtifactId( "quickstart" )
.setVersion( "1.0-alpha-1-SNAPSHOT" )
.setArchetypeGroupId( "org.apache.maven.archetypes" )
.setArchetypeArtifactId( "maven-archetype-quickstart" )
.setArchetypeVersion( "1.0-alpha-1-SNAPSHOT" )
.setLocalRepository( localRepository )
.setRemoteArtifactRepositories( remoteRepositories )
.setOutputDirectory( getTestFile( "target" ).getAbsolutePath() );
//parameters.put( "name", "jason" );
archetype.createArchetype( request, remoteRepository );
// ----------------------------------------------------------------------
// Set up the Velocity context
// ----------------------------------------------------------------------
Map<String, Object> parameters = new HashMap<>();
parameters.put( "basedir", request.getOutputDirectory() );
parameters.put( "package", request.getPackage() );
parameters.put( "packageName", request.getPackage() );
parameters.put( "groupId", request.getGroupId() );
parameters.put( "artifactId", request.getArtifactId() );
parameters.put( "version", request.getVersion() );
Context context = new VelocityContext();
for ( Map.Entry<String, Object> entry : parameters.entrySet() )
{
context.put( entry.getKey(), entry.getValue() );
}
// ----------------------------------------------------------------------
// Validate POM generation
// ----------------------------------------------------------------------
ArtifactFactory artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.class.getName() );
Artifact archetypeArtifact = artifactFactory.createArtifact( request.getArchetypeGroupId(), request.getArchetypeArtifactId(),
request.getArchetypeVersion(), Artifact.SCOPE_RUNTIME, "jar" );
StringWriter writer = new StringWriter();
ClassLoader old = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(
getContextClassloader( archetypeArtifact, localRepository, remoteRepositories ) );
try
{
VelocityComponent velocity = (VelocityComponent) lookup( VelocityComponent.class.getName() );
velocity.getEngine().mergeTemplate( OldArchetype.ARCHETYPE_RESOURCES + "/" + OldArchetype.ARCHETYPE_POM, context,
writer );
}
finally
{
Thread.currentThread().setContextClassLoader( old );
}
Model generatedModel, templateModel;
try
{
StringReader strReader = new StringReader( writer.toString() );
MavenXpp3Reader reader = new MavenXpp3Reader();
templateModel = reader.read( strReader );
}
catch ( IOException e )
{
throw new ArchetypeTemplateProcessingException( "Error reading template POM", e );
}
File artifactDir = getTestFile( "target", (String) parameters.get( "artifactId" ) );
File pomFile = getTestFile( artifactDir.getAbsolutePath(), OldArchetype.ARCHETYPE_POM );
try ( FileReader pomReader = new FileReader( pomFile ) )
{
MavenXpp3Reader reader = new MavenXpp3Reader();
generatedModel = reader.read( pomReader );
}
catch ( IOException e )
{
throw new ArchetypeTemplateProcessingException( "Error reading generated POM", e );
}
catch ( XmlPullParserException e )
{
throw new ArchetypeTemplateProcessingException( "Error reading generated POM", e );
}
assertEquals( "Generated POM ArtifactId is not equivalent to expected result.", generatedModel.getArtifactId(),
templateModel.getArtifactId() );
assertEquals( "Generated POM GroupId is not equivalent to expected result.", generatedModel.getGroupId(),
templateModel.getGroupId() );
assertEquals( "Generated POM Id is not equivalent to expected result.", generatedModel.getId(),
templateModel.getId() );
assertEquals( "Generated POM Version is not equivalent to expected result.", generatedModel.getVersion(),
templateModel.getVersion() );
assertEquals( "Generated POM Packaging is not equivalent to expected result.", generatedModel.getPackaging(),
templateModel.getPackaging() );
assertEquals( "Generated POM Developers is not equivalent to expected result.", generatedModel.getDevelopers(),
templateModel.getDevelopers() );
assertEquals( "Generated POM Scm is not equivalent to expected result.", generatedModel.getScm(),
templateModel.getScm() );
}
// Gets the classloader for this artifact's file.
private ClassLoader getContextClassloader( Artifact archetypeArtifact, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories )
throws Exception
{
ArtifactResolver artifactResolver = (ArtifactResolver) lookup( ArtifactResolver.class.getName() );
try
{
artifactResolver.resolve( archetypeArtifact, remoteRepositories, localRepository );
}
catch ( ArtifactResolutionException e )
{
throw new ArchetypeDescriptorException( "Error attempting to download archetype: " + e.getMessage(), e );
}
catch ( ArtifactNotFoundException e )
{
throw new ArchetypeNotFoundException( "OldArchetype does not exist: " + e.getMessage(), e );
}
URLClassLoader archetypeJarLoader;
try
{
URL[] urls = new URL[1];
urls[0] = archetypeArtifact.getFile().toURI().toURL();
archetypeJarLoader = new URLClassLoader( urls );
}
catch ( IOException e )
{
throw new ArchetypeDescriptorException(
"Error reading the " + OldArchetype.ARCHETYPE_DESCRIPTOR + " descriptor.", e );
}
return archetypeJarLoader;
}
public void testAddModuleToParentBasic()
throws Exception
{
String pom = ("<project " +
"xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 " +
"http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n")
+ " <packaging>pom</packaging>\n"
+ "</project>";
assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", new StringReader( pom ), out ) );
assertThat( out.toString(), isIdenticalTo( "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ ("<project " +
"xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 " +
"http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n")
+ " <packaging>pom</packaging>\n"
+ " <modules>\n"
+ " <module>myArtifactId1</module>\n"
+ " </modules>\n"
+ "</project>") );
}
public void testAddModuleToParentWithModelVersion()
throws Exception
{
String pom = ("<project " +
"xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 " +
"http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n")
+ " <modelVersion>4.0.0</modelVersion>\n"
+ " <packaging>pom</packaging>\n"
+ "</project>";
assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId2", new StringReader( pom ), out ) );
assertThat( out.toString(), isIdenticalTo( "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ ("<project " +
"xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 " +
"http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n")
+ " <modelVersion>4.0.0</modelVersion>\n"
+ " <packaging>pom</packaging>\n"
+ " <modules>\n"
+ " <module>myArtifactId2</module>\n"
+ " </modules>\n"
+ "</project>") );
}
public void testAddModuleToParentWithEmptyModulesElement()
throws Exception
{
String pom = ("<project " +
"xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 " +
"http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n")
+ " <modelVersion>4.0.0</modelVersion>\n"
+ " <packaging>pom</packaging>\n"
+ " <modules>\n"
+ " </modules>\n"
+ "</project>";
assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId3", new StringReader( pom ), out ) );
assertThat( out.toString(), isIdenticalTo( "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ ("<project " +
"xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 " +
"http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n")
+ " <modelVersion>4.0.0</modelVersion>\n"
+ " <packaging>pom</packaging>\n"
+ " <modules>\n"
+ " <module>myArtifactId3</module>\n"
+ " </modules>\n"
+ "</project>") );
}
public void testAddModuleToParentWithOneModulePresent()
throws Exception
{
String pom = ("<project " +
"xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 " +
"http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n")
+ " <modelVersion>4.0.0</modelVersion>\n"
+ " <packaging>pom</packaging>\n"
+ " <modules>\n"
+ " <module>myArtifactId3</module>\n"
+ " </modules>\n"
+ "</project>";
assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId4", new StringReader( pom ), out ) );
assertThat( out.toString(), isIdenticalTo( "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ ("<project " +
"xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 " +
"http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n")
+ " <modelVersion>4.0.0</modelVersion>\n"
+ " <packaging>pom</packaging>\n"
+ " <modules>\n"
+ " <module>myArtifactId3</module>\n"
+ " <module>myArtifactId4</module>\n"
+ " </modules>\n"
+ "</project>") );
}
public void testAddModuleToParentDoesNothingWhenSameModuleAdded()
throws Exception
{
String pom = ("<project " +
"xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 " +
"http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n")
+ " <modelVersion>4.0.0</modelVersion>\n"
+ " <packaging>pom</packaging>\n"
+ " <modules>\n"
+ " <module>myArtifactId3</module>\n"
+ " </modules>\n"
+ "</project>";
assertFalse( DefaultOldArchetype.addModuleToParentPom( "myArtifactId3", new StringReader( pom ), out ) );
// empty means unchanged
assertEquals( "", out.toString().trim() );
}
public void testAddModuleToParentWithProfiles()
throws Exception
{
String pom = ("<project " +
"xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 " +
"http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n")
+ " <modelVersion>4.0.0</modelVersion>\n"
+ " <packaging>pom</packaging>\n"
+ " <modules>\n"
+ " <module>myArtifactId1</module>\n"
+ " <module>myArtifactId2</module>\n"
+ " <module>myArtifactId3</module>\n"
+ " </modules>\n"
+ " <profiles>\n"
+ " <profile>\n"
+ " <id>profile1</id>\n"
+ " <modules>\n"
+ " <module>module1</module>\n"
+ " </modules>\n"
+ " </profile>\n"
+ " <profile>\n"
+ " <id>profile2</id>\n"
+ " <modules>\n"
+ " <module>module2</module>\n"
+ " </modules>\n"
+ " </profile>\n"
+ " </profiles>\n" +
"</project>";
assertTrue( DefaultOldArchetype.addModuleToParentPom( "module1", new StringReader( pom ), out ) );
assertThat( out.toString(), isIdenticalTo("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ ("<project " +
"xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 " +
"http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n")
+ " <modelVersion>4.0.0</modelVersion>\n"
+ " <packaging>pom</packaging>\n"
+ " <modules>\n"
+ " <module>myArtifactId1</module>\n"
+ " <module>myArtifactId2</module>\n"
+ " <module>myArtifactId3</module>\n"
+ " <module>module1</module>\n"
+ " </modules>\n"
+ " <profiles>\n"
+ " <profile>\n"
+ " <id>profile1</id>\n"
+ " <modules>\n"
+ " <module>module1</module>\n"
+ " </modules>\n"
+ " </profile>\n"
+ " <profile>\n"
+ " <id>profile2</id>\n"
+ " <modules>\n"
+ " <module>module2</module>\n"
+ " </modules>\n"
+ " </profile>\n"
+ " </profiles>\n"
+ "</project>") );
}
public void testAddModuleToParentPOMNoPackaging()
throws Exception
{
try
{
String pom = "<project>\n</project>";
DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", new StringReader( pom ), new StringWriter() );
fail( "Should fail to add a module to a JAR packaged project" );
}
catch ( InvalidPackaging e )
{
// great!
assertEquals( "Unable to add module to the current project as it is not of packaging type 'pom'",
e.getLocalizedMessage() );
}
}
public void testAddModuleToParentPOMJarPackaging()
throws Exception
{
try
{
String pom = "<project>\n <packaging>jar</packaging>\n</project>";
DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", new StringReader( pom ), new StringWriter() );
fail( "Should fail to add a module to a JAR packaged project" );
}
catch ( InvalidPackaging e )
{
// great!
assertEquals( "Unable to add module to the current project as it is not of packaging type 'pom'",
e.getLocalizedMessage() );
}
}
@Override
protected void setUp()
throws Exception
{
super.setUp();
archetype = (OldArchetype) lookup( OldArchetype.ROLE );
}
}