blob: 4053cc9201090e0a41eda71c943973fc17a65776 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.osgi.framework.stats;
import org.osgi.framework.Bundle;
import java.io.*;
import java.util.*;
import org.eclipse.core.runtime.adaptor.EclipseAdaptor;
import org.eclipse.osgi.framework.adaptor.BundleWatcher;
public class StatsManager implements BundleWatcher {
// This connect plugins and their info, and so allows to access the info without running through
// the plugin registry. This map only contains activated plugins. The key is the plugin Id
private static Map plugins = new HashMap(20);
private static Stack activationStack = new Stack(); // a stack of the plugins being activated
private static boolean booting = true; // the state of the platform. This value is changed by the InternalPlatform itself.
private static StatsManager defaultInstance;
public static boolean MONITOR_BUNDLES = false;
public static boolean MONITOR_CLASSES = false;
public static String TRACE_FILENAME = null;
public static StatsManager getDefault() {
if (defaultInstance == null)
defaultInstance = new StatsManager();
return defaultInstance;
}
public void startActivation(Bundle bundle) {
// should be called from a synchronized location to protect against concurrent updates
BundleStats plugin = findPlugin(bundle.getSymbolicName());
plugin.setTimestamp(System.currentTimeMillis());
plugin.setActivationOrder(plugins.size());
// set the parentage of activation
if (activationStack.size() != 0) {
BundleStats activatedBy = (BundleStats) activationStack.peek();
activatedBy.activated(plugin);
plugin.setActivatedBy(activatedBy);
}
activationStack.push(plugin);
if (EclipseAdaptor.TRACE_BUNDLES = true) {
traceActivate(bundle.getSymbolicName(), plugin);
}
}
public void endActivation(Bundle pluginId) {
// should be called from a synchronized location to protect against concurrent updates
BundleStats plugin = (BundleStats) activationStack.pop();
plugin.endActivation();
}
private void traceActivate(String id, BundleStats plugin) {
try {
PrintWriter output = new PrintWriter(new FileOutputStream(ClassloaderStats.traceFile.getAbsolutePath(), true));
try {
long startPosition = ClassloaderStats.traceFile.length();
output.println("Activating plugin: " + id); //$NON-NLS-1$
output.println("Plugin activation stack:"); //$NON-NLS-1$
for (int i = activationStack.size() - 1; i >= 0; i--)
output.println("\t" + ((BundleStats) activationStack.get(i)).getPluginId()); //$NON-NLS-1$
output.println("Class loading stack:"); //$NON-NLS-1$
Stack classStack = ClassloaderStats.getClassStack();
for (int i = classStack.size() - 1; i >= 0; i--)
output.println("\t" + ((ClassStats) classStack.get(i)).getClassName()); //$NON-NLS-1$
output.println("Stack trace:"); //$NON-NLS-1$
new Throwable().printStackTrace(output);
plugin.setTraceStart(startPosition);
} finally {
output.close();
plugin.setTraceEnd(ClassloaderStats.traceFile.length());
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static BundleStats findPlugin(String id) {
BundleStats result = (BundleStats) plugins.get(id);
ClassLoader cl = BundleStats.class.getClassLoader();
System.out.println(cl);
System.out.println(StatsManager.class.getClassLoader());
try {
if (result == null) {
result = new BundleStats(id);
plugins.put(id, result);
}
} catch (IllegalAccessError e) {
e.printStackTrace();
}
return result;
}
public BundleStats[] getPlugins() {
return (BundleStats[]) plugins.values().toArray(new BundleStats[plugins.size()]);
}
public BundleStats getPlugin(String id) {
return (BundleStats) plugins.get(id);
}
}