package org.apache.maven.surefire.its;
/*
* 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.
*/
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Random;
import org.apache.maven.settings.Profile;
import org.apache.maven.settings.Repository;
import org.apache.maven.settings.RepositoryPolicy;
import org.apache.maven.settings.Settings;
import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader;
import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
import org.apache.maven.shared.utils.ReaderFactory;
import org.apache.maven.shared.utils.WriterFactory;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
* Helper class to assist in using verifier with a staged local repository.
*
* @author Stephen Connolly
* @since 05-Jan-2010 07:36:22
*/
public final class StagedLocalRepoHelper
{
private StagedLocalRepoHelper()
{
throw new IllegalAccessError( "Helper class" );
}
private static String toUrl( String filename )
{
/*
* NOTE: Maven fails to properly handle percent-encoded "file:" URLs (WAGON-111) so don't use File.toURI() here
* as-is but use the decoded path component in the URL.
*/
String url = "file://" + new File( filename ).toURI().getPath();
if ( url.endsWith( "/" ) )
{
url = url.substring( 0, url.length() - 1 );
}
return url;
}
public static void createStagedSettingsXml( File originalSettingsXml, File stagedLocalRepo, File stagedSettingsXml )
throws IOException
{
Random entropy = new Random();
try
{
System.out.println( Settings.class.getClassLoader()
.getResource( "org/apache/maven/settings/Server.class" ) );
Settings settings = new SettingsXpp3Reader().read( ReaderFactory.newXmlReader( originalSettingsXml ) );
String localRepo = System.getProperty( "maven.repo.local" );
if ( localRepo == null )
{
localRepo = settings.getLocalRepository();
}
if ( localRepo == null )
{
localRepo = System.getProperty( "user.home" ) + "/.m2/repository";
}
File repoDir = new File( localRepo );
if ( !repoDir.exists() )
{
repoDir.mkdirs();
}
// normalize path
localRepo = repoDir.getAbsolutePath();
Profile profile = new Profile();
do
{
profile.setId( "stagedLocalRepo" + entropy.nextLong() );
}
while ( settings.getProfilesAsMap().containsKey( profile.getId() ) );
Repository repository = new Repository();
repository.setId( profile.getId() + entropy.nextLong() );
RepositoryPolicy policy = new RepositoryPolicy();
policy.setEnabled( true );
policy.setChecksumPolicy( "ignore" );
policy.setUpdatePolicy( "never" );
repository.setReleases( policy );
repository.setSnapshots( policy );
repository.setLayout( "default" );
repository.setName( "Original Local Repository" );
repository.setUrl( toUrl( localRepo ) );
profile.addPluginRepository( repository );
profile.addRepository( repository );
settings.addProfile( profile );
settings.addActiveProfile( profile.getId() );
settings.setLocalRepository( stagedLocalRepo.getAbsolutePath() );
for ( Object o : settings.getProfiles() )
{
profile = (Profile) o;
disableUpdates( profile.getRepositories() );
disableUpdates( profile.getPluginRepositories() );
}
new SettingsXpp3Writer().write( WriterFactory.newXmlWriter( stagedSettingsXml ), settings );
}
catch ( XmlPullParserException e )
{
IOException ioe = new IOException( e.getMessage() );
ioe.initCause( e );
throw ioe;
}
}
private static void disableUpdates( List<Repository> repositories )
{
if ( repositories != null )
{
for (Repository repo : repositories) {
repo.setReleases(disableUpdates(repo.getReleases()));
repo.setSnapshots(disableUpdates(repo.getSnapshots()));
}
}
}
private static RepositoryPolicy disableUpdates( RepositoryPolicy policy )
{
if ( policy == null )
{
policy = new RepositoryPolicy();
}
policy.setUpdatePolicy( "never" );
return policy;
}
}