View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.lifecycle.internal;
20  
21  import java.util.Comparator;
22  import java.util.List;
23  
24  /**
25   * Compares phases within the context of a specific lifecycle with secondary sorting based on the {@link PhaseId}.
26   */
27  public class PhaseComparator implements Comparator<String> {
28      /**
29       * The lifecycle phase ordering.
30       */
31      private final List<String> lifecyclePhases;
32  
33      /**
34       * Constructor.
35       *
36       * @param lifecyclePhases the lifecycle phase ordering.
37       */
38      public PhaseComparator(List<String> lifecyclePhases) {
39          this.lifecyclePhases = lifecyclePhases;
40      }
41  
42      @Override
43      public int compare(String o1, String o2) {
44          PhaseId p1 = PhaseId.of(o1);
45          PhaseId p2 = PhaseId.of(o2);
46          int i1 = lifecyclePhases.indexOf(p1.phase());
47          int i2 = lifecyclePhases.indexOf(p2.phase());
48          if (i1 == -1 && i2 == -1) {
49              // unknown phases, leave in existing order
50              return 0;
51          }
52          if (i1 == -1) {
53              // second one is known, so it comes first
54              return 1;
55          }
56          if (i2 == -1) {
57              // first one is known, so it comes first
58              return -1;
59          }
60          int rv = Integer.compare(i1, i2);
61          if (rv != 0) {
62              return rv;
63          }
64          // same phase, now compare execution points
65          i1 = p1.executionPoint().ordinal();
66          i2 = p2.executionPoint().ordinal();
67          rv = Integer.compare(i1, i2);
68          if (rv != 0) {
69              return rv;
70          }
71          // same execution point, now compare priorities
72          return Integer.compare(p1.priority(), p2.priority());
73      }
74  }