/*
* Copyright (c) 2011 Red Hat, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
* <http://www.gnu.org/licenses>.
*/
package com.redhat.rcm.version.mgr.mod;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.apache.maven.model.Activation;
import org.apache.maven.model.ActivationProperty;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.DependencyManagement;
import org.apache.maven.model.Model;
import org.apache.maven.model.Profile;
import org.codehaus.plexus.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.redhat.rcm.version.maven.WildcardProjectKey;
import com.redhat.rcm.version.mgr.session.VersionManagerSession;
import com.redhat.rcm.version.model.DependencyManagementKey;
import com.redhat.rcm.version.model.Project;
@Component( role = ProjectModder.class, hint = "testremoval" )
public class TestRemovalModder
implements ProjectModder
{
private final Logger logger = LoggerFactory.getLogger( getClass() );
public static final String TEST_DEPS_PROFILE_ID = "_testDependencies";
public static final String SKIP_TEST = "maven.test.skip";
@Override
public String getDescription()
{
return "Move test scoped dependencies from the pom into a separate profile.";
}
@Override
public boolean inject( final Project project, final VersionManagerSession session )
{
final Model model = project.getModel();
boolean changed = false;
final List<WildcardProjectKey> removedTests = session.getRemovedTests();
final WildcardProjectKey projectkey = new WildcardProjectKey( project.getGroupId(), project.getArtifactId() );
if ( removedTests.contains( projectkey ) )
{
if ( model.getDependencies() != null )
{
final List<Dependency> movedDeps = new ArrayList<Dependency>();
for ( final Iterator<Dependency> it = model.getDependencies()
.iterator(); it.hasNext(); )
{
final Dependency dep = it.next();
final DependencyManagementKey depvpk = new DependencyManagementKey( dep );
if ( dep.getScope() != null && dep.getScope()
.equals( "test" ) )
{
logger.info( "Removing scoped test dependency {} for '{}'...", dep, project.getKey() );
movedDeps.add( dep );
it.remove();
}
final Dependency managed = session.getManagedDependency( depvpk );
if ( managed != null && dep.getScope() == null && "test".equals( managed.getScope() ) )
{
logger.info( "Removing scoped test dependency {} for '{}'...", managed, project.getKey() );
movedDeps.add( managed );
it.remove();
}
// If we are inheriting the default scope from the managed dependency and that
// is test also move this to the inactive profile.
final Model effectivemodel = project.getEffectiveModel();
if ( effectivemodel != null )
{
final DependencyManagement depMgmt = effectivemodel.getDependencyManagement();
if ( depMgmt != null )
{
for ( final Dependency managedDep : depMgmt.getDependencies() )
{
final DependencyManagementKey depmgmtvpk = new DependencyManagementKey( managedDep );
if ( depvpk.equals( depmgmtvpk ) && dep.getScope() == null
&& "test".equals( managedDep.getScope() ) )
{
logger.info( "Removing scoped test dependency {} for '{}'...", managedDep,
project.getKey() );
movedDeps.add( managedDep );
it.remove();
break;
}
}
}
}
}
if ( !movedDeps.isEmpty() )
{
final Profile profile = new Profile();
profile.setId( TEST_DEPS_PROFILE_ID );
profile.setDependencies( movedDeps );
final ActivationProperty actProp = new ActivationProperty();
actProp.setName( SKIP_TEST );
actProp.setValue( "false" );
final Activation act = new Activation();
act.setProperty( actProp );
profile.setActivation( act );
model.addProfile( profile );
}
}
Properties props = model.getProperties();
logger.info( "Injecting skip test property..." );
if ( props == null )
{
props = new Properties();
}
props.put( SKIP_TEST, "true" );
model.setProperties( props );
changed = true;
}
return changed;
}
}