o Created non-abstract base class for DefaultArtifactFactory to extend, called ArtifactConstructionSupport, which provides centralized means for constructing artifacts consistently without all the maven-core specific methods. These maven-core specifics not delegate to the generic methods provided in this new class.

o Adjusted the maven-archetype stuff to work with the new artifact creation/resolution/etc. methods in maven-artifact and maven-core.
o Removed all direct construction of DefaultArtifact and replaced with ArtifactConstructionSupport where it would have involved putting the DefaultArtifactFactory in the plexus.xml, and where the code doesn't need dependency-oriented methods.
o Archetype works now, using the example provided in plexus/plexus-site/src/site/apt/building-plexus-applications.apt


git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@163615 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
John Dennis Casey 2005-03-18 22:02:09 +00:00
parent fcb311e99c
commit 10b55add40
15 changed files with 140 additions and 71 deletions

View File

@ -16,8 +16,8 @@ package org.apache.maven.archetype;
* limitations under the License. * limitations under the License.
*/ */
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepository;
@ -36,6 +36,6 @@ public interface Archetype
String ARCHETYPE_POM = "pom.xml"; String ARCHETYPE_POM = "pom.xml";
void createArchetype( String archetypeGroupId, String archetypeArtifactId, String archetypeVersion, void createArchetype( String archetypeGroupId, String archetypeArtifactId, String archetypeVersion,
ArtifactRepository localRepository, Set remoteRepositories, Map parameters ) ArtifactRepository localRepository, List remoteRepositories, Map parameters )
throws ArchetypeNotFoundException, ArchetypeDescriptorException, ArchetypeTemplateProcessingException; throws ArchetypeNotFoundException, ArchetypeDescriptorException, ArchetypeTemplateProcessingException;
} }

View File

@ -26,12 +26,11 @@ import java.net.URLClassLoader;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.apache.maven.archetype.descriptor.ArchetypeDescriptor; import org.apache.maven.archetype.descriptor.ArchetypeDescriptor;
import org.apache.maven.archetype.descriptor.ArchetypeDescriptorBuilder; import org.apache.maven.archetype.descriptor.ArchetypeDescriptorBuilder;
import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.manager.WagonManager; import org.apache.maven.artifact.construction.ArtifactConstructionSupport;
import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.resolver.ArtifactResolver;
@ -54,33 +53,33 @@ public class DefaultArchetype
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
private VelocityComponent velocity; private VelocityComponent velocity;
private WagonManager wagonManager;
private ArtifactResolver artifactResolver; private ArtifactResolver artifactResolver;
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// Implementation // Implementation
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
private ArtifactConstructionSupport artifactConstructionSupport = new ArtifactConstructionSupport();
// groupId = maven // groupId = maven
// artifactId = maven-foo-archetype // artifactId = maven-foo-archetype
// version = latest // version = latest
public void createArchetype( String archetypeGroupId, String archetypeArtifactId, String archetypeVersion, public void createArchetype( String archetypeGroupId, String archetypeArtifactId, String archetypeVersion,
ArtifactRepository localRepository, Set remoteRepositories, Map parameters ) ArtifactRepository localRepository, List remoteRepositories, Map parameters )
throws ArchetypeNotFoundException, ArchetypeDescriptorException, ArchetypeTemplateProcessingException throws ArchetypeNotFoundException, ArchetypeDescriptorException, ArchetypeTemplateProcessingException
{ {
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// Download the archetype // Download the archetype
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
Artifact archetypeJar = Artifact archetypeArtifact =
wagonManager.createArtifact( archetypeGroupId, archetypeArtifactId, archetypeVersion, "jar" ); artifactConstructionSupport.createArtifact( archetypeGroupId, archetypeArtifactId, archetypeVersion, Artifact.SCOPE_RUNTIME, "jar" );
try try
{ {
artifactResolver.resolve( archetypeJar, remoteRepositories, localRepository ); artifactResolver.resolve( archetypeArtifact, remoteRepositories, localRepository );
} }
catch ( ArtifactResolutionException e ) catch ( ArtifactResolutionException e )
{ {
@ -107,7 +106,7 @@ public class DefaultArchetype
{ {
URL[] urls = new URL[1]; URL[] urls = new URL[1];
urls[0] = archetypeJar.getFile().toURL(); urls[0] = archetypeArtifact.getFile().toURL();
archetypeJarLoader = new URLClassLoader( urls ); archetypeJarLoader = new URLClassLoader( urls );

View File

@ -7,9 +7,6 @@
<requirement> <requirement>
<role>org.codehaus.plexus.velocity.VelocityComponent</role> <role>org.codehaus.plexus.velocity.VelocityComponent</role>
</requirement> </requirement>
<requirement>
<role>org.apache.maven.artifact.manager.WagonManager</role>
</requirement>
<requirement> <requirement>
<role>org.apache.maven.artifact.resolver.ArtifactResolver</role> <role>org.apache.maven.artifact.resolver.ArtifactResolver</role>
</requirement> </requirement>

View File

@ -16,16 +16,16 @@ package org.apache.maven.archetype;
* limitations under the License. * limitations under the License.
*/ */
import org.codehaus.plexus.PlexusTestCase;
import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepository;
import org.codehaus.plexus.PlexusTestCase;
import java.util.Map;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.Properties;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/** /**
* @author <a href="mailto:jason@maven.org">Jason van Zyl</a> * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
@ -65,7 +65,7 @@ public class ArchetypeTest
ArtifactRepository localRepository = new ArtifactRepository( "local", "file://" + mavenProperties.getProperty( "maven.repo.local" ) ); ArtifactRepository localRepository = new ArtifactRepository( "local", "file://" + mavenProperties.getProperty( "maven.repo.local" ) );
Set remoteRepositories = new HashSet(); List remoteRepositories = new ArrayList();
ArtifactRepository remoteRepository = new ArtifactRepository( "remote", "http://repo1.maven.org" ); ArtifactRepository remoteRepository = new ArtifactRepository( "remote", "http://repo1.maven.org" );

View File

@ -7,7 +7,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>maven</groupId> <groupId>maven</groupId>
<artifactId>maven-archetype-plugin</artifactId> <artifactId>maven-archetype-plugin</artifactId>
<packaging>plugin</packaging> <packaging>maven-plugin</packaging>
<name>Maven Archetype Plugin</name> <name>Maven Archetype Plugin</name>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<dependencies> <dependencies>

View File

@ -22,8 +22,8 @@ import org.apache.maven.plugin.AbstractPlugin;
import org.apache.maven.plugin.PluginExecutionRequest; import org.apache.maven.plugin.PluginExecutionRequest;
import org.apache.maven.plugin.PluginExecutionResponse; import org.apache.maven.plugin.PluginExecutionResponse;
import java.util.HashSet; import java.util.ArrayList;
import java.util.Set; import java.util.List;
/** /**
* @goal create * @goal create
@ -131,7 +131,7 @@ public class MavenArchetypePlugin
ArtifactRepository localRepository = (ArtifactRepository) request.getParameter( "localRepository" ); ArtifactRepository localRepository = (ArtifactRepository) request.getParameter( "localRepository" );
Set remoteRepositories = new HashSet(); List remoteRepositories = new ArrayList();
ArtifactRepository remoteRepository = new ArtifactRepository( "remote", "http://repo1.maven.org" ); ArtifactRepository remoteRepository = new ArtifactRepository( "remote", "http://repo1.maven.org" );

View File

@ -25,6 +25,7 @@ import java.io.File;
public class DefaultArtifact public class DefaultArtifact
implements Artifact implements Artifact
{ {
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// These are the only things i need to specify // These are the only things i need to specify
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
@ -48,6 +49,11 @@ public class DefaultArtifact
*/ */
public DefaultArtifact( String groupId, String artifactId, String version, String scope, String type, String extension ) public DefaultArtifact( String groupId, String artifactId, String version, String scope, String type, String extension )
{ {
if(type == null)
{
throw new NullPointerException("Artifact type cannot be null.");
}
this.groupId = groupId; this.groupId = groupId;
this.artifactId = artifactId; this.artifactId = artifactId;

View File

@ -0,0 +1,71 @@
package org.apache.maven.artifact.construction;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
/* ====================================================================
* Copyright 2001-2004 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.
* ====================================================================
*/
/**
* @author jdcasey
*/
public class ArtifactConstructionSupport
{
public Artifact createArtifact( String groupId, String artifactId, String version, String scope, String type )
{
return createArtifact( groupId, artifactId, version, scope, type, type, null );
}
public Artifact createArtifact( String groupId, String artifactId, String version, String scope, String type, String extension )
{
return createArtifact( groupId, artifactId, version, scope, type, extension, null );
}
public Artifact createArtifact( String groupId, String artifactId, String version, String scope, String type,
String extension, String inheritedScope )
{
// TODO: can refactor, use scope handler
// if this artifact is test, and the dependency is test, don't transitively create
if ( Artifact.SCOPE_TEST.equals( inheritedScope ) && Artifact.SCOPE_TEST.equals( scope ) )
{
return null;
}
// TODO: localRepository not used (should be used here to resolve path?
String desiredScope = Artifact.SCOPE_RUNTIME;
if ( Artifact.SCOPE_COMPILE.equals( scope ) && inheritedScope == null )
{
desiredScope = Artifact.SCOPE_COMPILE;
}
// vvv added to retain compile scope. Remove if you want compile inherited as runtime
else if ( Artifact.SCOPE_COMPILE.equals( scope ) && Artifact.SCOPE_COMPILE.equals( inheritedScope ) )
{
desiredScope = Artifact.SCOPE_COMPILE;
}
// ^^^ added to retain compile scope. Remove if you want compile inherited as runtime
if ( Artifact.SCOPE_TEST.equals( scope ) || Artifact.SCOPE_TEST.equals( inheritedScope ) )
{
desiredScope = Artifact.SCOPE_TEST;
}
return new DefaultArtifact( groupId, artifactId, version, desiredScope, type, extension );
}
}

View File

@ -2,7 +2,7 @@ package org.apache.maven.artifact.resolver;
import org.apache.maven.artifact.AbstractArtifactComponent; import org.apache.maven.artifact.AbstractArtifactComponent;
import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact; import org.apache.maven.artifact.construction.ArtifactConstructionSupport;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerNotFoundException; import org.apache.maven.artifact.handler.manager.ArtifactHandlerNotFoundException;
import org.apache.maven.artifact.manager.WagonManager; import org.apache.maven.artifact.manager.WagonManager;
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException; import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
@ -45,6 +45,8 @@ public class DefaultArtifactResolver
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// Implementation // Implementation
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
private ArtifactConstructionSupport artifactConstructionSupport = new ArtifactConstructionSupport();
public Artifact resolve( Artifact artifact, List remoteRepositories, ArtifactRepository localRepository ) public Artifact resolve( Artifact artifact, List remoteRepositories, ArtifactRepository localRepository )
throws ArtifactResolutionException throws ArtifactResolutionException
@ -228,10 +230,12 @@ public class DefaultArtifactResolver
if ( updateScope ) if ( updateScope )
{ {
// TODO: Artifact factory? // TODO: Artifact factory?
Artifact artifact = new DefaultArtifact( knownArtifact.getGroupId(), // TODO: [jc] Is this a better way to centralize artifact construction here?
knownArtifact.getArtifactId(), knownVersion, Artifact artifact = artifactConstructionSupport.createArtifact( knownArtifact.getGroupId(),
newArtifact.getScope(), knownArtifact.getType(), knownArtifact.getArtifactId(),
knownArtifact.getExtension() ); knownVersion, newArtifact.getScope(),
knownArtifact.getType(),
knownArtifact.getExtension() );
resolvedArtifacts.put( artifact.getConflictId(), artifact ); resolvedArtifacts.put( artifact.getConflictId(), artifact );
} }
} }

View File

@ -101,7 +101,7 @@ public class DefaultMaven
if ( projects.isEmpty() ) if ( projects.isEmpty() )
{ {
projects.add( projectBuilder.buildSuperProject( request.getLocalRepository() ) ); projects.add( projectBuilder.buildStandaloneSuperProject( request.getLocalRepository() ) );
} }
} }
catch ( IOException e ) catch ( IOException e )

View File

@ -17,7 +17,7 @@ package org.apache.maven.artifact.factory;
*/ */
import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact; import org.apache.maven.artifact.construction.ArtifactConstructionSupport;
import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.model.Dependency; import org.apache.maven.model.Dependency;
@ -29,6 +29,7 @@ import java.util.Set;
// TODO: packaging is very confusing - this isn't in artifact after all // TODO: packaging is very confusing - this isn't in artifact after all
public class DefaultArtifactFactory public class DefaultArtifactFactory
extends ArtifactConstructionSupport
implements ArtifactFactory implements ArtifactFactory
{ {
public Set createArtifacts( List dependencies, ArtifactRepository localRepository, String inheritedScope ) public Set createArtifacts( List dependencies, ArtifactRepository localRepository, String inheritedScope )
@ -55,35 +56,4 @@ public class DefaultArtifactFactory
dependency.getScope(), dependency.getType(), dependency.getType(), inheritedScope ); dependency.getScope(), dependency.getType(), dependency.getType(), inheritedScope );
} }
public Artifact createArtifact( String groupId, String artifactId, String version, String scope, String type,
String extension, String inheritedScope )
{
// TODO: can refactor, use scope handler
// if this artifact is test, and the dependency is test, don't transitively create
if ( Artifact.SCOPE_TEST.equals( inheritedScope ) && Artifact.SCOPE_TEST.equals( scope ) )
{
return null;
}
// TODO: localRepository not used (should be used here to resolve path?
String desiredScope = Artifact.SCOPE_RUNTIME;
if ( Artifact.SCOPE_COMPILE.equals( scope ) && inheritedScope == null )
{
desiredScope = Artifact.SCOPE_COMPILE;
}
// vvv added to retain compile scope. Remove if you want compile inherited as runtime
else if ( Artifact.SCOPE_COMPILE.equals( scope ) && Artifact.SCOPE_COMPILE.equals( inheritedScope ) )
{
desiredScope = Artifact.SCOPE_COMPILE;
}
// ^^^ added to retain compile scope. Remove if you want compile inherited as runtime
if ( Artifact.SCOPE_TEST.equals( scope ) || Artifact.SCOPE_TEST.equals( inheritedScope ) )
{
desiredScope = Artifact.SCOPE_TEST;
}
return new DefaultArtifact( groupId, artifactId, version, desiredScope, type, extension );
}
} }

View File

@ -377,10 +377,18 @@ public class DefaultMavenProjectBuilder
return groupId + ":" + artifactId + ":" + version; return groupId + ":" + artifactId + ":" + version;
} }
public MavenProject buildSuperProject( ArtifactRepository localRepository ) public MavenProject buildStandaloneSuperProject( ArtifactRepository localRepository )
throws ProjectBuildingException throws ProjectBuildingException
{ {
MavenProject project = new MavenProject( getSuperModel() ); Model superModel = getSuperModel();
superModel.setGroupId( STANDALONE_SUPERPOM_GROUPID );
superModel.setArtifactId( STANDALONE_SUPERPOM_ARTIFACTID );
superModel.setVersion( STANDALONE_SUPERPOM_VERSION );
MavenProject project = new MavenProject( superModel );
try try
{ {

View File

@ -18,7 +18,7 @@ package org.apache.maven.project;
*/ */
import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact; import org.apache.maven.artifact.construction.ArtifactConstructionSupport;
import org.apache.maven.model.Build; import org.apache.maven.model.Build;
import org.apache.maven.model.CiManagement; import org.apache.maven.model.CiManagement;
import org.apache.maven.model.Contributor; import org.apache.maven.model.Contributor;
@ -74,6 +74,8 @@ public class MavenProject
private Set artifacts; private Set artifacts;
private List collectedProjects = Collections.EMPTY_LIST; private List collectedProjects = Collections.EMPTY_LIST;
private ArtifactConstructionSupport artifactConstructionSupport = new ArtifactConstructionSupport();
public MavenProject( Model model ) public MavenProject( Model model )
{ {
@ -682,9 +684,14 @@ public class MavenProject
if ( updateScope ) if ( updateScope )
{ {
// TODO: Artifact factory? // TODO: Artifact factory?
Artifact artifact = new DefaultArtifact( existing.getGroupId(), existing.getArtifactId(), // TODO: [jc] Is this a better way to centralize artifact construction here?
existing.getVersion(), a.getScope(), existing.getType(), Artifact artifact = artifactConstructionSupport.createArtifact( existing.getGroupId(),
existing.getExtension() ); existing.getArtifactId(),
existing.getVersion(),
a.getScope(),
existing.getType(),
existing.getExtension() );
artifacts.put( id, artifact ); artifacts.put( id, artifact );
} }
} }

View File

@ -26,6 +26,12 @@ import java.io.File;
public interface MavenProjectBuilder public interface MavenProjectBuilder
{ {
String ROLE = MavenProjectBuilder.class.getName(); String ROLE = MavenProjectBuilder.class.getName();
static final String STANDALONE_SUPERPOM_GROUPID = "maven";
static final String STANDALONE_SUPERPOM_ARTIFACTID = "super-pom";
static final String STANDALONE_SUPERPOM_VERSION = "2.0";
MavenProject build( File project, ArtifactRepository localRepository ) MavenProject build( File project, ArtifactRepository localRepository )
throws ProjectBuildingException; throws ProjectBuildingException;
@ -36,7 +42,7 @@ public interface MavenProjectBuilder
MavenProject buildFromRepository( Artifact artifact, ArtifactRepository localRepository ) MavenProject buildFromRepository( Artifact artifact, ArtifactRepository localRepository )
throws ProjectBuildingException; throws ProjectBuildingException;
MavenProject buildSuperProject( ArtifactRepository localRepository ) MavenProject buildStandaloneSuperProject( ArtifactRepository localRepository )
throws ProjectBuildingException; throws ProjectBuildingException;
Model getCachedModel( String groupId, String artifactId, String version ); Model getCachedModel( String groupId, String artifactId, String version );

View File

@ -54,6 +54,7 @@ public class MBoot
String[] pluginGeneratorDeps = new String[]{"plexus/jars/plexus-container-default-1.0-alpha-2-SNAPSHOT.jar", String[] pluginGeneratorDeps = new String[]{"plexus/jars/plexus-container-default-1.0-alpha-2-SNAPSHOT.jar",
"maven/jars/maven-core-2.0-SNAPSHOT.jar", "maven/jars/maven-core-2.0-SNAPSHOT.jar",
"maven/jars/maven-artifact-2.0-SNAPSHOT.jar",
"maven/jars/maven-model-2.0-SNAPSHOT.jar", "maven/jars/maven-model-2.0-SNAPSHOT.jar",
"maven/jars/maven-plugin-2.0-SNAPSHOT.jar", "maven/jars/maven-plugin-2.0-SNAPSHOT.jar",
"maven/jars/maven-plugin-tools-api-2.0-SNAPSHOT.jar", "maven/jars/maven-plugin-tools-api-2.0-SNAPSHOT.jar",