MavenExecutionComparator.java

package it.serendigity.maven.plugin.lifecycle.helper.vo;

import java.io.Serializable;
import java.util.Comparator;
import java.util.EnumSet;
import java.util.Set;

import org.apache.commons.lang3.builder.CompareToBuilder;

/**
 * Order a {@link MavenExecutionInfo} by {@link MavenExecutionAttribute}
 *
 */
@SuppressWarnings("serial")
public class MavenExecutionComparator implements Comparator<MavenExecutionInfo>, Serializable {

	private final MavenExecutionAttribute orderAttribute;

	public MavenExecutionComparator( MavenExecutionAttribute orderAttribute ) {
		this.orderAttribute = orderAttribute;
	}

	@Override
	public int compare( MavenExecutionInfo o1, MavenExecutionInfo o2 ) {

		MavenExecutionAttribute orderAttr = getOrderAttribute();

		CompareToBuilder builder = new CompareToBuilder();

		Set<MavenExecutionAttribute> excludes = EnumSet.noneOf( MavenExecutionAttribute.class );

		// Order by orderAttribute
		if ( orderAttr != null ) {
			builder.append( o1.getValue( orderAttr ), o2.getValue( orderAttr ) );
			excludes.add( orderAttr );
		}

		// Always second order with ExecutionOrder to preserve execution plan order
		if ( orderAttr == null || orderAttr != MavenExecutionAttribute.PLAN_ORDER ) {
			builder.append( o1.getExecutionOrder(), o2.getExecutionOrder() );
			excludes.add( MavenExecutionAttribute.PLAN_ORDER );
		}
		MavenExecutionAttribute[] excludesArray = excludes.toArray( new MavenExecutionAttribute[excludes.size()] );

		// Add other fields
		Set<MavenExecutionAttribute> complementOf = MavenExecutionAttribute.complementOf( excludesArray );

		if ( complementOf != null && !complementOf.isEmpty() ) {
			complementOf.stream().forEach( p -> builder.append( o1.getValue( p ), o2.getValue( p ) ) );

		}

		return builder.toComparison();

	}

	protected MavenExecutionAttribute getOrderAttribute() {
		return orderAttribute;
	}

}