blob: 38012e2654d2f4cb6bedb285660796287b7ce944 [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 org.codehaus.mojo.archetypeng;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.codehaus.mojo.archetypeng.registry.ArchetypeRegistry;
import org.codehaus.mojo.archetypeng.registry.ArchetypeRepository;
import org.codehaus.mojo.archetypeng.registry.io.xpp3.ArchetypeRegistryXpp3Reader;
import org.codehaus.mojo.archetypeng.registry.io.xpp3.ArchetypeRegistryXpp3Writer;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* @plexus.component
*/
public class DefaultArchetypeRegistryManager
extends AbstractLogEnabled
implements ArchetypeRegistryManager
{
/**
* Used to create ArtifactRepository objects given the urls of the remote repositories.
*
* @plexus.requirement
*/
private ArtifactRepositoryFactory artifactRepositoryFactory;
/**
* Determines whether the layout is legacy or not.
*
* @plexus.requirement roleHint="default"
*/
private ArtifactRepositoryLayout defaultArtifactRepositoryLayout;
public List getArchetypeGroups ( File archetypeRegistryFile )
{
try
{
ArchetypeRegistry registry = readArchetypeRegistry ( archetypeRegistryFile );
return registry.getArchetypeGroups ();
}
catch ( IOException e )
{
getLogger ().warn ( "Can not read ~/m2/archetype.xml" );
return
Arrays.asList (
new String[] { "org.apache.maven.archetypes", "org.codehaus.mojo.archetypes" }
);
}
catch ( XmlPullParserException e )
{
getLogger ().warn ( "Can not read ~/m2/archetype.xml" );
return
Arrays.asList (
new String[] { "org.apache.maven.archetypes", "org.codehaus.mojo.archetypes" }
);
}
}
public ArchetypeRegistry readArchetypeRegistry ( File archetypeRegistryFile )
throws IOException, FileNotFoundException, XmlPullParserException
{
ArchetypeRegistryXpp3Reader reader = new ArchetypeRegistryXpp3Reader ();
FileReader fileReader = new FileReader ( archetypeRegistryFile );
try
{
return reader.read ( fileReader );
}
finally
{
IOUtil.close ( fileReader );
}
}
public List getRepositories (
List pomRemoteRepositories,
String remoteRepositories,
File archetypeRegistryFile
)
throws IOException, XmlPullParserException
{
List archetypeRemoteRepositories = new ArrayList ( pomRemoteRepositories );
ArchetypeRegistry registry = readArchetypeRegistry ( archetypeRegistryFile );
if ( !registry.getArchetypeRepositories ().isEmpty () )
{
archetypeRemoteRepositories = new ArrayList ();
Iterator repositories = registry.getArchetypeRepositories ().iterator ();
while ( repositories.hasNext () )
{
ArchetypeRepository repository = (ArchetypeRepository) repositories.next ();
archetypeRemoteRepositories.add (
createRepository ( repository.getUrl (), repository.getId () )
);
}
}
if ( remoteRepositories != null )
{
archetypeRemoteRepositories = new ArrayList ();
String[] s = StringUtils.split ( remoteRepositories, "," );
for ( int i = 0; i < s.length; i++ )
{
archetypeRemoteRepositories.add ( createRepository ( s[i], "id" + i ) );
}
}
return archetypeRemoteRepositories;
}
public void writeArchetypeRegistry (
File archetypeRegistryFile,
ArchetypeRegistry archetypeRegistry
)
throws IOException
{
ArchetypeRegistryXpp3Writer writer = new ArchetypeRegistryXpp3Writer ();
FileWriter fileWriter = new FileWriter ( archetypeRegistryFile );
try
{
writer.write ( fileWriter, archetypeRegistry );
}
finally
{
IOUtil.close ( fileWriter );
}
}
/**
* Code stealed from MavenArchetypeMojo
* (org.apache.maven.plugins:maven-archetype-plugin:1.0-alpha4).
*/
private ArtifactRepository createRepository ( String url, String repositoryId )
{
// snapshots vs releases
// offline = to turning the update policy off
// TODO: we'll need to allow finer grained creation of repositories but this will do for now
String updatePolicyFlag = ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS;
String checksumPolicyFlag = ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN;
ArtifactRepositoryPolicy snapshotsPolicy =
new ArtifactRepositoryPolicy ( true, updatePolicyFlag, checksumPolicyFlag );
ArtifactRepositoryPolicy releasesPolicy =
new ArtifactRepositoryPolicy ( true, updatePolicyFlag, checksumPolicyFlag );
return
artifactRepositoryFactory.createArtifactRepository (
repositoryId,
url,
defaultArtifactRepositoryLayout,
snapshotsPolicy,
releasesPolicy
);
}
public List getLanguages ( String archetypeLanguages, File archetypeRegistryFile )
throws IOException
{
List languages = new ArrayList ();
if (StringUtils.isNotEmpty(archetypeLanguages))
{
languages.addAll ( Arrays.asList ( StringUtils.split ( archetypeLanguages, "," ) ) );
}
try
{
ArchetypeRegistry registry = readArchetypeRegistry ( archetypeRegistryFile );
languages.addAll ( registry.getLanguages () );
}
catch ( IOException e )
{
getLogger ().warn ( "Can not read ~/m2/archetype.xml" );
}
catch ( XmlPullParserException e )
{
getLogger ().warn ( "Can not read ~/m2/archetype.xml" );
}
if (languages.isEmpty())
{
languages.addAll (Constants.DEFAULT_LANGUAGES);
}
return languages;
}
public List getFilteredExtensions (
String archetypeFilteredExtentions,
File archetypeRegistryFile
)
throws IOException
{
List filteredExtensions = new ArrayList ();
if (StringUtils.isNotEmpty(archetypeFilteredExtentions))
{
filteredExtensions.addAll ( Arrays.asList ( StringUtils.split ( archetypeFilteredExtentions, "," ) ) );
}
try
{
ArchetypeRegistry registry = readArchetypeRegistry ( archetypeRegistryFile );
filteredExtensions.addAll ( registry.getFilteredExtensions () );
}
catch ( IOException e )
{
getLogger ().warn ( "Can not read ~/m2/archetype.xml" );
}
catch ( XmlPullParserException e )
{
getLogger ().warn ( "Can not read ~/m2/archetype.xml" );
}
if(filteredExtensions.isEmpty())
{
filteredExtensions.addAll(Constants.DEFAULT_FILTERED_EXTENSIONS);
}
return filteredExtensions;
}
}