1e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/*******************************************************************************
2398ee59bebad6835dab57b60157eff16d511709eMarc R. Hoffmann * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors
3e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * All rights reserved. This program and the accompanying materials
4e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * are made available under the terms of the Eclipse Public License v1.0
5e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * which accompanies this distribution, and is available at
6e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * http://www.eclipse.org/legal/epl-v10.html
7e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *
8e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Contributors:
9e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *    Marc R. Hoffmann - initial API and implementation
10e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *
11e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *******************************************************************************/
12e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpackage org.jacoco.core.analysis;
13e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
14e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.io.Serializable;
15e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.util.ArrayList;
16e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.util.Collection;
17e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.util.Collections;
18e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.util.Comparator;
19e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport java.util.List;
20e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
21e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.core.analysis.ICoverageNode.CounterEntity;
22e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
23e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/**
24e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Comparator to compare {@link ICoverageNode} objects by different counter
25e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * criteria.
26e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *
27e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @see CounterComparator#on(ICoverageNode.CounterEntity)
28e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */
29e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpublic class NodeComparator implements Comparator<ICoverageNode>, Serializable {
30e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
31e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	private static final long serialVersionUID = 8550521643608826519L;
32e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
33e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	private final Comparator<ICounter> counterComparator;
34e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
35e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	private final CounterEntity entity;
36e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
37e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	NodeComparator(final Comparator<ICounter> counterComparator,
38e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			final CounterEntity entity) {
39e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		this.counterComparator = counterComparator;
40e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		this.entity = entity;
41e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
42e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
43e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
44e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Creates a new composite comparator with a second search criterion.
45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
46e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param second
47e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            second criterion comparator
48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
49e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @return composite comparator
50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
51e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public NodeComparator second(final Comparator<ICoverageNode> second) {
52e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		final Comparator<ICoverageNode> first = this;
53e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		return new NodeComparator(null, null) {
54e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
55e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			private static final long serialVersionUID = -5515272752138802838L;
56e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
57e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			@Override
58e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			public int compare(final ICoverageNode o1, final ICoverageNode o2) {
59e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov				final int result = first.compare(o1, o2);
60e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov				return result == 0 ? second.compare(o1, o2) : result;
61e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			}
62e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		};
63e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
64e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
65e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
66e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Returns a sorted copy of the given collection of {@link ICoverageNode}
67e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * elements.
68e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
69e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param <T>
70e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            actual type of the elements
71e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param summaries
72e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            collection to create a copy of
73e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @return sorted copy
74e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
75e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public <T extends ICoverageNode> List<T> sort(final Collection<T> summaries) {
76e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		final List<T> result = new ArrayList<T>(summaries);
77e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		Collections.sort(result, this);
78e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		return result;
79e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
80e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
81e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public int compare(final ICoverageNode n1, final ICoverageNode n2) {
82e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		final ICounter c1 = n1.getCounter(entity);
83e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		final ICounter c2 = n2.getCounter(entity);
84e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		return counterComparator.compare(c1, c2);
85e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
86e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
87e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov}
88