blob: f00e93dbd0d0f8f0f1016fd8fc246b9fdb8dec79 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.validation.internal;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.validation.IPerformanceMonitor;
import org.eclipse.wst.validation.PerformanceCounters;
import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
public class PerformanceMonitor implements IPerformanceMonitor {
private CollectionLevel _level = CollectionLevel.None;
private boolean _summaryOnly;
/**
* Create a performance monitor.
*
* @param traceTimes
* Should the monitor be turned on?
* @param file
* Should the events be logged to a file. If this is null or the
* empty string the events will be written to stderr. Otherwise
* the events are appended to a file with this name.
*
* @param logInSeconds
* Set this to true if you want the times that are logged in the
* trace file normalized to seconds. Otherwise the default units are used,
* milliseconds for elapsed time and nanoseconds for cpu time.
*/
public static PerformanceMonitor create(boolean traceTimes, String file, boolean logInSeconds){
PerformanceMonitor pm = null;
if (file == null || file.length() == 0)pm = new PerformanceMonitor();
else pm = new ToFile(file, logInSeconds);
if (traceTimes)pm.setCollectionLevel(CollectionLevel.Default);
return pm;
}
private PerformanceMonitor(){};
public CollectionLevel getCollectionLevel() {
return _level;
}
public void setCollectionLevel(CollectionLevel level) {
_level = level;
}
public List<PerformanceCounters> getPerformanceCounters(boolean asSummary) {
return new LinkedList<PerformanceCounters>();
}
public void resetPerformanceCounters() {
}
public boolean isCollecting() {
return _level != CollectionLevel.None;
}
public boolean isSummaryOnly() {
return _summaryOnly;
}
public void add(PerformanceCounters counters){
Tracing.write(counters.toString());
}
public static class Counters{
String name;
int numberInvocations;
/** Elapsed time in milliseconds. */
long elapsedTime;
/** CPU time in nanoseconds, or -1 if unknown. */
long cpuTime;
}
public static class ToFile extends PerformanceMonitor {
private String _fileName;
private boolean _logInSeconds;
private PrintWriter _pw;
private static final String Comma=","; //$NON-NLS-1$
private static DateFormat _df = new SimpleDateFormat("HH:mm:ss.SSSS"); //$NON-NLS-1$
private ToFile(String fileName, boolean logInSeconds){
_fileName = fileName;
_logInSeconds = logInSeconds;
}
@Override
public synchronized void add(PerformanceCounters pc) {
try {
PrintWriter pw = getWriter();
pw.print(_df.format(pc.getWhen()) + Comma +
pc.getValidatorId() + Comma + pc.getNumberInvocations() + Comma);
if (_logInSeconds){
double sec = ((double)pc.getElapsedTime()) / 1000.0;
pw.print(sec);
pw.print(Comma);
sec = ((double)pc.getCpuTime()) / 1000000000.0;
pw.print(sec);
}
else {
pw.print(pc.getElapsedTime()+Comma+pc.getCpuTime());
}
pw.println(Comma + pc.getResourceName());
pw.flush();
}
catch (IOException e){
ValidationPlugin.getPlugin().handleException(e);
}
}
private PrintWriter getWriter() throws IOException {
if (_pw == null){
_pw = new PrintWriter(new FileOutputStream(_fileName, true));
DateFormat df = DateFormat.getDateTimeInstance();
_pw.println("# " + NLS.bind(ValMessages.LogSession, //$NON-NLS-1$
df.format(new Date(System.currentTimeMillis()))));
if (_logInSeconds)
_pw.println("# when, id, invocation count, elapsed time (seconds), cpu time (seconds), resource"); //$NON-NLS-1$
else
_pw.println("# when, id, invocation count, elapsed time (ms), cpu time (ns), resource"); //$NON-NLS-1$
}
return _pw;
}
}
public static class Collecting extends PerformanceMonitor {
private List<PerformanceCounters> _counters = new LinkedList<PerformanceCounters>();
public void add(PerformanceCounters counters){
_counters.add(counters);
}
public List<PerformanceCounters> getPerformanceCounters(boolean asSummary) {
if (asSummary){
Map<String, Counters> map = new HashMap<String, Counters>(40);
for (PerformanceCounters pc : _counters){
Counters c = map.get(pc.getValidatorId());
if (c == null){
c = new Counters();
c.name = pc.getValidatorName();
map.put(pc.getValidatorId(), c);
}
c.numberInvocations += pc.getNumberInvocations();
c.elapsedTime += pc.getElapsedTime();
if (pc.getCpuTime() != -1)c.cpuTime += pc.getCpuTime();
else c.cpuTime = -1;
}
List<PerformanceCounters> list = new LinkedList<PerformanceCounters>();
for (Map.Entry<String, Counters> me : map.entrySet()){
Counters c = me.getValue();
list.add(new PerformanceCounters(me.getKey(), c.name, null, c.numberInvocations, c.elapsedTime, c.cpuTime));
}
return list;
}
return _counters;
}
public void resetPerformanceCounters() {
_counters.clear();
}
}
}