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