blob: 7b4657df5af3b89e87c33d89e058b277ef4d1247 [file] [log] [blame]
package org.apache.maven.archetype.ui
import org.apache.maven.archetype.ArchetypeGenerationRequest
import org.apache.maven.archetype.catalog.ArchetypeCataloger
import org.codehaus.plexus.logging.AbstractLogEnabled
import org.codehaus.plexus.components.interactivity.Prompter
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout
import org.apache.maven.artifact.repository.DefaultArtifactRepository
import org.apache.maven.archetype.util.RepositoryCreator
/**
*
* @author raphaelpieroni
* @plexus.component
*/
class DefaultArchetypeSelector
extends AbstractLogEnabled
implements ArchetypeSelector {
static DEFAULT_ARCHETYPE = [groupId:"org.apache.maven.archetypes", artifactId:"maven-archetype-quickstart"]
/** @plexus.requirement */
private RepositoryCreator repositoryCreator
/** @plexus.requirement */
private ArchetypeCataloger archetypeCataloger
/** @plexus.requirement role-hint="archetype" */
private Prompter prompter
void selectArchetype( ArchetypeGenerationRequest request, Boolean interactiveMode, String catalogs ) {
def definition = [groupId:request.groupId, artifactId:request.artifactId, version:request.version]
def archetypeCatalogs = archetypeCataloger.getArchetypesByCatalog( catalogs )
def catalogArchetype
def repositories = request.repositories.clone()
if( archetypeDefined( definition ) ) {
catalogArchetype = archetypeCataloger.searchArchetype( definition, archetypeCatalogs )
if( catalogArchetype ) repositories.add repositoryCreator.createRepository( catalogArchetype.repository )
if( archetypeCataloger.archetypeRecursivelyExists( catalogArchetype, archetypeCatalogs, request.localRepository, repositories ) ) {
request.repositories = repositories
logger.info "Using defined archetype $definition"
return
} else {
logger.error "Defined archetype $definition not found"
throw new RuntimeException( "Defined archetype $definition not found" )
}
} else if( !interactiveMode ) {
catalogArchetype = archetypeCataloger.searchArchetype( DEFAULT_ARCHETYPE, archetypeCatalogs )
if( catalogArchetype ) repositories.add repositoryCreator.createRepository( catalogArchetype.repository )
if( archetypeCataloger.archetypeRecursivelyExists( catalogArchetype, archetypeCatalogs, request.localRepository, request.repositories ) ) {
request.repositories = repositories
def archetype = archetypeCataloger.searchArchetype( catalogArchetype, archetypeCatalogs )
request.groupId = archetype.groupId
request.artifactId = archetype.artifactId
request.version = archetype.version
logger.info "Using default archetype $DEFAULT_ARCHETYPE"
return
} else {
logger.error "Default archetype $DEFAULT_ARCHETYPE not found"
throw new RuntimeException( "Default archetype $DEFAULT_ARCHETYPE not found" )
}
} else {
catalogArchetype = askForDefinition( archetypeCatalogs )
if( catalogArchetype ) repositories.add repositoryCreator.createRepository( catalogArchetype.repository )
if( archetypeCataloger.archetypeRecursivelyExists( catalogArchetype, archetypeCatalogs, request.localRepository, request.repositories ) ) {
request.repositories = repositories
def archetype = archetypeCataloger.searchArchetype( catalogArchetype, archetypeCatalogs )
request.groupId = archetype.groupId
request.artifactId = archetype.artifactId
request.version = archetype.version
logger.info "Using selected archetype $catalogArchetype"
return
} else {
logger.error "Selected archetype $catalogArchetype not found"
throw new RuntimeException( "Selected archetype $catalogArchetype not found" )
}
}
}
def archetypeDefined( definition ) {
return definition?.groupId && definition?.artifactId && definition?.version
}
def askForDefinition( archetypeCatalogs ) {
def chooseArchetypeQuery = "Choose archetype:\n"
def chooseArchetypeList =[]
def archetypeAnswerMap = [:]
def archetypeReverseAnswerMap = [:]
def archetypeVersions
def counter = 1
def defaultArchetype = 0
archetypeCatalogs.each { key, archetype ->
def archetypeKey = "${archetype.groupId}:${archetype.artifactId}".toString()
def answerKey = "$counter".toString()
if( archetypeReverseAnswerMap.containsKey( archetypeKey ) ) {
archetypeVersions = archetypeAnswerMap[ archetypeReverseAnswerMap[archetypeKey] ]
} else {
archetypeVersions = []
archetypeAnswerMap[answerKey] = archetypeVersions
chooseArchetypeQuery += "$answerKey:${archetype.catalog} -> ${archetype.artifactId} (${archetype.description})\n"
chooseArchetypeList.add answerKey
if( archetypeKey == DEFAULT_ARCHETYPE ) {
defaultArchetype = answerKey
}
archetypeReverseAnswerMap[archetypeKey] = answerKey
counter ++
}
archetypeVersions.add archetype
}
chooseArchetypeQuery += "choose a number: "
def chooseArchetypeAnswer
if( !defaultArchetype ) {
chooseArchetypeAnswer = prompter.prompt( chooseArchetypeQuery, chooseArchetypeList )
} else {
chooseArchetypeAnswer = prompter.prompt( chooseArchetypeQuery, chooseArchetypeList, defaultArchetype )
}
archetypeVersions = archetypeAnswerMap[chooseArchetypeAnswer]
if( archetypeVersions.size() == 1 ) {
return archetypeVersions[0]
} else {
return askForVersion( archetypeVersions )
}
}
def askForVersion( archetypes )
{
def chooseVersionQuery = "Choose version: \n"
List chooseVersionList = []
def versionAnswerMap = [:]
def counter = 1
archetypes.each { archetype ->
def answerKey = "$counter".toString()
versionAnswerMap.put answerKey, archetype
chooseVersionList.add answerKey
chooseVersionQuery += "$counter: ${archetype.version}\n"
counter++
}
chooseVersionQuery += "Choose a number: "
return versionAnswerMap[prompter.prompt( chooseVersionQuery, chooseVersionList )]
}
}