/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.scanner.profiling;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import org.sonar.api.utils.System2;
public class PhaseProfiling extends AbstractTimeProfiling {
private final Phase phase;
private Map<String, ItemProfiling> profilingPerItem = new HashMap<>();
PhaseProfiling(System2 system, Phase phase) {
super(system);
this.phase = phase;
}
public static PhaseProfiling create(System2 system, Phase phase) {
return new PhaseProfiling(system, phase);
}
public Phase phase() {
return phase;
}
public boolean hasItems() {
return !profilingPerItem.isEmpty();
}
public ItemProfiling getProfilingPerItem(Object item) {
String stringOrSimpleName = toStringOrSimpleName(item);
return profilingPerItem.get(stringOrSimpleName);
}
public void newItemProfiling(Object item) {
String stringOrSimpleName = toStringOrSimpleName(item);
profilingPerItem.put(stringOrSimpleName, new ItemProfiling(system(), stringOrSimpleName));
}
public void newItemProfiling(String itemName) {
profilingPerItem.put(itemName, new ItemProfiling(system(), itemName));
}
public void merge(PhaseProfiling other) {
super.add(other);
for (Entry<String, ItemProfiling> entry : other.profilingPerItem.entrySet()) {
if (!this.profilingPerItem.containsKey(entry.getKey())) {
newItemProfiling(entry.getKey());
}
this.getProfilingPerItem(entry.getKey()).add(entry.getValue());
}
}
public void dump(Properties props) {
double percent = this.totalTime() / 100.0;
for (ItemProfiling itemProfiling : profilingPerItem.values()) {
props.setProperty(itemProfiling.itemName(), Long.toString(itemProfiling.totalTime()));
}
for (ItemProfiling itemProfiling : truncate(sortByDescendingTotalTime(profilingPerItem).values())) {
println(" o " + itemProfiling.itemName() + ": ", percent, itemProfiling);
}
}
/**
* Try to use toString if it is not the default {@link Object#toString()}. Else use {@link Class#getSimpleName()}
* @param o
* @return
*/
private static String toStringOrSimpleName(Object o) {
String toString = o.toString();
if (toString == null || toString.startsWith(o.getClass().getName())) {
return o.getClass().getSimpleName();
}
return toString;
}
}