in tools/maven-bundle-plugin/src/main/java/org/apache/felix/bundleplugin/baseline/AbstractBaselinePlugin.java [161:354]
protected void execute( Object context)
throws MojoExecutionException, MojoFailureException
{
if ( skip )
{
getLog().info( "Skipping Baseline execution" );
return;
}
if ( !supportedProjectTypes.contains( project.getArtifact().getType() ) )
{
getLog().info("Skipping Baseline (project type " + project.getArtifact().getType() + " not supported)");
return;
}
// get the bundles that have to be compared
final Jar currentBundle = getCurrentBundle();
if ( currentBundle == null )
{
getLog().info( "Not generating Baseline report as there is no bundle generated by the project" );
return;
}
final Artifact previousArtifact = getPreviousArtifact();
final Jar previousBundle;
if (previousArtifact != null)
{
previousBundle = openJar(previousArtifact.getFile());
}
else
{
previousBundle = null;
}
if ( previousBundle == null )
{
getLog().info( "Not generating Baseline report as there is no previous version of the library to compare against" );
return;
}
// preparing the filters
final Instructions packageFilters;
if ( filters == null || filters.length == 0 )
{
packageFilters = new Instructions();
}
else
{
packageFilters = new Instructions( Arrays.asList( filters ) );
}
String generationDate = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm'Z'" ).format( new Date() );
final Reporter reporter = new Processor();
final Info[] infos;
try
{
final Set<Info> infoSet = new Baseline( reporter, new DiffPluginImpl() )
.baseline( currentBundle, previousBundle, packageFilters );
infos = infoSet.toArray( new Info[infoSet.size()] );
Arrays.sort( infos, new InfoComparator() );
}
catch ( final Exception e )
{
throw new MojoExecutionException( "Impossible to calculate the baseline", e );
}
finally
{
closeJars( currentBundle, previousBundle );
}
try
{
// go!
context = this.init(context);
startBaseline( context, generationDate, project.getArtifactId(), project.getVersion(), previousArtifact.getVersion() );
for ( final Info info : infos )
{
DiffMessage diffMessage = null;
if ( info.suggestedVersion != null )
{
if ( info.newerVersion.compareTo( info.suggestedVersion ) > 0 )
{
diffMessage = new DiffMessage( "Excessive version increase", DiffMessage.Type.warning );
reporter.warning( "%s: %s; detected %s, suggested %s",
info.packageName, diffMessage, info.newerVersion, info.suggestedVersion );
}
else if ( info.newerVersion.compareTo( info.suggestedVersion ) < 0 )
{
diffMessage = new DiffMessage( "Version increase required", DiffMessage.Type.error );
reporter.error( "%s: %s; detected %s, suggested %s",
info.packageName, diffMessage, info.newerVersion, info.suggestedVersion );
}
}
switch ( info.packageDiff.getDelta() )
{
case UNCHANGED:
if ( info.newerVersion.compareTo( info.suggestedVersion ) != 0 )
{
diffMessage = new DiffMessage( "Version has been increased but analysis detected no changes", DiffMessage.Type.warning );
reporter.warning( "%s: %s; detected %s, suggested %s",
info.packageName, diffMessage, info.newerVersion, info.suggestedVersion );
}
break;
case REMOVED:
diffMessage = new DiffMessage( "Package removed", DiffMessage.Type.info );
reporter.trace( "%s: %s ", info.packageName, diffMessage );
break;
case CHANGED:
case MICRO:
case MINOR:
case MAJOR:
case ADDED:
default:
// ok
break;
}
startPackage( context,
info.mismatch,
info.packageName,
getShortDelta( info.packageDiff.getDelta() ),
StringUtils.lowerCase( String.valueOf( info.packageDiff.getDelta() ) ),
info.newerVersion,
info.olderVersion,
info.suggestedVersion,
diffMessage,
info.attributes );
if ( Delta.REMOVED != info.packageDiff.getDelta() )
{
doPackageDiff( context, info.packageDiff );
}
endPackage(context);
}
endBaseline(context);
}
finally
{
this.close(context);
}
// check if it has to fail if some error has been detected
boolean fail = false;
if ( !reporter.isOk() )
{
for ( String errorMessage : reporter.getErrors() )
{
getLog().error( errorMessage );
}
if ( failOnError )
{
fail = true;
}
}
// check if it has to fail if some warning has been detected
if ( !reporter.getWarnings().isEmpty() )
{
for ( String warningMessage : reporter.getWarnings() )
{
getLog().warn( warningMessage );
}
if ( failOnWarning )
{
fail = true;
}
}
getLog().info( String.format( "Baseline analysis complete, %s error(s), %s warning(s)",
reporter.getErrors().size(),
reporter.getWarnings().size() ) );
if ( fail )
{
throw new MojoFailureException( "Baseline failed, see generated report" );
}
}