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