View Javadoc
1   package it.serendigity.maven.plugin.lifecycle.helper.vo;
2   
3   import java.io.Serializable;
4   import java.util.Comparator;
5   import java.util.EnumSet;
6   import java.util.Set;
7   
8   import org.apache.commons.lang3.builder.CompareToBuilder;
9   
10  /**
11   * Order a {@link MavenExecutionInfo} by {@link MavenExecutionAttribute}
12   *
13   */
14  @SuppressWarnings("serial")
15  public class MavenExecutionComparator implements Comparator<MavenExecutionInfo>, Serializable {
16  
17  	private final MavenExecutionAttribute orderAttribute;
18  
19  	public MavenExecutionComparator( MavenExecutionAttribute orderAttribute ) {
20  		this.orderAttribute = orderAttribute;
21  	}
22  
23  	@Override
24  	public int compare( MavenExecutionInfo o1, MavenExecutionInfo o2 ) {
25  
26  		MavenExecutionAttribute orderAttr = getOrderAttribute();
27  
28  		CompareToBuilder builder = new CompareToBuilder();
29  
30  		Set<MavenExecutionAttribute> excludes = EnumSet.noneOf( MavenExecutionAttribute.class );
31  
32  		// Order by orderAttribute
33  		if ( orderAttr != null ) {
34  			builder.append( o1.getValue( orderAttr ), o2.getValue( orderAttr ) );
35  			excludes.add( orderAttr );
36  		}
37  
38  		// Always second order with ExecutionOrder to preserve execution plan order
39  		if ( orderAttr == null || orderAttr != MavenExecutionAttribute.PLAN_ORDER ) {
40  			builder.append( o1.getExecutionOrder(), o2.getExecutionOrder() );
41  			excludes.add( MavenExecutionAttribute.PLAN_ORDER );
42  		}
43  		MavenExecutionAttribute[] excludesArray = excludes.toArray( new MavenExecutionAttribute[excludes.size()] );
44  
45  		// Add other fields
46  		Set<MavenExecutionAttribute> complementOf = MavenExecutionAttribute.complementOf( excludesArray );
47  
48  		if ( complementOf != null && !complementOf.isEmpty() ) {
49  			complementOf.stream().forEach( p -> builder.append( o1.getValue( p ), o2.getValue( p ) ) );
50  
51  		}
52  
53  		return builder.toComparison();
54  
55  	}
56  
57  	protected MavenExecutionAttribute getOrderAttribute() {
58  		return orderAttribute;
59  	}
60  
61  }