1 /*
2 * Grapht, an open source dependency injector.
3 * Copyright 2014-2015 various contributors (see CONTRIBUTORS.txt)
4 * Copyright 2010-2014 Regents of the University of Minnesota
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as
8 * published by the Free Software Foundation; either version 2.1 of the
9 * License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14 * details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc., 51
18 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 */
20 package org.grouplens.grapht.context;
21
22 import com.google.common.collect.Ordering;
23
24 import javax.annotation.Nullable;
25 import java.util.Comparator;
26
27 /**
28 * A single element in a context match. Used in {@link ContextMatch}.
29 *
30 * @since 0.7
31 * @author <a href="http://www.grouplens.org">GroupLens Research</a>
32 */
33 public interface MatchElement {
34 /**
35 * Get the priority of this element matcher.
36 *
37 * @return The element matcher's priority.
38 */
39 ContextElements.MatchPriority getPriority();
40
41 /**
42 * Get the type distance of this match.
43 *
44 * @return The type distance in this match, or empty if the type distance is irrelevant
45 * for this type of matcher.
46 */
47 @Nullable
48 Integer getTypeDistance();
49
50 /**
51 * Orderings for the match order.
52 */
53 public static enum Order implements Comparator<MatchElement> {
54 /**
55 * Priority-only ordering, used for first-pass comparison of context matchers.
56 */
57 PRIORITY_ONLY {
58 @Override
59 public int compare(MatchElement e1, MatchElement e2) {
60 return e1.getPriority().compareTo(e2.getPriority());
61 }
62 },
63 /**
64 * Full ordering of match elements, including type distance. Closer compares lower (higher
65 * priority).
66 */
67 PRIORITY_AND_DISTANCE {
68 @Override
69 public int compare(MatchElement e1, MatchElement e2) {
70 int cmp = e1.getPriority().compareTo(e2.getPriority());
71 if (cmp == 0) {
72 Ordering<Integer> distOrder = Ordering.<Integer>natural().nullsLast();
73 cmp = distOrder.compare(e1.getTypeDistance(), e2.getTypeDistance());
74 }
75 return cmp;
76 }
77 }
78 }
79 }