/*******************************************************************************
 * Copyright (c) 2000, 2005 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.core.runtime.internal.stats;

import java.util.ArrayList;

/**
 * Maintain statistics about a loaded class.
 */
public class ClassStats {
	private String className; // fully qualified name of this class 
	private ClassloaderStats classloader; // the classloader that loaded this class
	private int loadOrder = -1;

	private long timestamp; // time at which this class was loaded
	private long timeLoading; // time to load the class
	private long timeLoadingOthers = 0; // time spent loading classes which has been triggered by this class  

	// parentage of classes loaded
	private ClassStats loadedBy = null; // a reference to the class that loaded this class
	private ArrayList loaded = new ArrayList(2); // a reference to the classes that this class loaded

	private boolean duringStartup; // indicate if the class was loaded during platform startup

	//information to retrieve the stacktrace from the file
	private long traceStart = -1;
	private long traceEnd = -1;

	public ClassStats(String name, ClassloaderStats classloader) {
		className = name;
		timestamp = System.currentTimeMillis();
		duringStartup = StatsManager.isBooting();
		this.classloader = classloader;
	}

	public void setLoadOrder(int order) {
		loadOrder = order;
	}

	public void loadingDone() {
		timeLoading = System.currentTimeMillis() - timestamp;
	}

	public long getTimeLoading() {
		return timeLoading;
	}

	public long getLocalTimeLoading() {
		return timeLoading - timeLoadingOthers;
	}

	public void addTimeLoadingOthers(long time) {
		timeLoadingOthers = timeLoadingOthers + time;
	}

	public long getTraceStart() {
		return traceStart;
	}

	public long getTraceEnd() {
		return traceEnd;
	}

	public void setTraceStart(long position) {
		traceStart = position;
	}

	public void setTraceEnd(long position) {
		traceEnd = position;
	}

	public void loaded(ClassStats child) {
		loaded.add(child);
	}

	public void setLoadedBy(ClassStats parent) {
		loadedBy = parent;
	}

	public ClassStats getLoadedBy() {
		return loadedBy;
	}

	public ArrayList getLoadedClasses() {
		return loaded;
	}

	public String getClassName() {
		return className;
	}

	public boolean isStartupClass() {
		return duringStartup;
	}

	public ClassloaderStats getClassloader() {
		return classloader;
	}

	public int getLoadOrder() {
		return loadOrder;
	}

	public long getTimestamp() {
		return timestamp;
	}

	public void toBaseClass() {
		duringStartup = true;
		loadOrder = -2;
	}
}
