sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/engine/ProjectResults.java
author Matti Laitinen <matti.t.laitinen@nokia.com>
Wed, 21 Apr 2010 19:42:48 +0300
changeset 6 f65f740e69f9
parent 1 1050670c6980
child 15 0367d2db2c06
permissions -rw-r--r--
AnalyzeTool Carbide Extension v1.9.0

/*
 * Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description:  Definitions for the class ProjectResults
 *
 */

package com.nokia.s60tools.analyzetool.engine;

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Locale;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;

import com.nokia.s60tools.analyzetool.Activator;
import com.nokia.s60tools.analyzetool.global.Util;

/**
 * Stores project related memory analysis results.
 *
 * @author kihe
 *
 */
public class ProjectResults {

	/** Contains project related results. */
	private final Hashtable<IProject, AbstractList<RunResults>> projRelatedRes;

	/** Contains project related data file path and name. */
	private final Hashtable<IProject, String> projDataFile;

	/** Contains list of project unknown componets */
	private final Hashtable<IProject, AbstractList<String>> projectUnknownComp;


	/**
	 * Constructor.
	 */
	public ProjectResults() {
		projRelatedRes = new Hashtable<IProject, AbstractList<RunResults>>();
		projDataFile = new Hashtable<IProject, String>();
		projectUnknownComp = new Hashtable<IProject, AbstractList<String>>();
	}

	/**
	 * Clears all the stored data.
	 */
	public final void clear() {
		projDataFile.clear();
		projRelatedRes.clear();
		projectUnknownComp.clear();
	}

	/**
	 * Clears given project data.
	 *
	 * @param project
	 *            Project reference
	 */
	public final void clearProjectData(final IProject project) {
		// existing data contains project => delete it
		if (projRelatedRes.containsKey(project)) {
			projRelatedRes.remove(project);
		}

		// delete data file
		if (projDataFile.containsKey(project)) {
			projDataFile.remove(project);
		}

		// remove project unknown components
		if(projectUnknownComp.containsKey(project)) {
			projectUnknownComp.remove(project);
		}
	}

	/**
	 * Checks is there stored results available for the given project reference.
	 *
	 * @param project
	 *            Project reference
	 * @return True if project contains results, otherwise False
	 */
	public final boolean contains(final IProject project) {
		if (project == null) {
			return false;
		}
		return projRelatedRes.containsKey(project);
	}

	/**
	 * Gets project related data file name.
	 *
	 * @param projRef
	 *            Project reference
	 * @return Data file or null
	 */
	public final String getDataFileName( final IProject projRef) {

		if( projDataFile == null || projDataFile.isEmpty() ) {
			return null;
		}
		// if selected project contains data file
		if (projDataFile.containsKey(projRef)) {
			// thru projects
			for (java.util.Enumeration<IProject> e = projDataFile.keys(); e
					.hasMoreElements();) {
				// get project ref
				IProject key = e.nextElement();

				// if project ref equals selected project
				if (key.equals(projRef)) {
					// return data file name
					return projDataFile.get(key);
				}
			}
		}

		return null;
	}

	/**
	 * Gets project results by project reference.
	 *
	 * @param projRef
	 *            Project reference
	 * @return Project moduleresults
	 */
	public final AbstractList<RunResults> getResults(final IProject projRef) {
		// if selected project contains results
		if (projRelatedRes.containsKey(projRef)) {
			// thru projects
			for (java.util.Enumeration<IProject> e = projRelatedRes.keys(); e
					.hasMoreElements();) {
				// get project ref
				IProject key = e.nextElement();

				// if project ref equals selected project
				if (key.equals(projRef)) {
					// return project results
					return projRelatedRes.get(key);
				}
			}
		}
		// project does not contain existing results
		// =>just return empty results
		return new ArrayList<RunResults>();
	}

	/**
	 * Gets project run results by run ID.
	 *
	 * @param project
	 *            Project reference
	 * @param runID
	 *            Given run ID
	 * @return Project run results if exists, otherwise null
	 */
	public final RunResults getRun(final IProject project, final int runID) {
		AbstractList<RunResults> runs = getResults(project);
		Iterator<RunResults> iterRuns = runs.iterator();
		while (iterRuns.hasNext()) {
			RunResults oneRunRes = iterRuns.next();
			if (oneRunRes.getItemID() == runID) {
				return oneRunRes;
			}
		}
		return null;
	}

	/**
	 * Gets project one AnalysisItem by run ID and leak ID.
	 *
	 * @param project
	 *            Project reference
	 * @param runID
	 *            Given run ID
	 * @param leakID
	 *            Given leak ID
	 * @return AlysisItem if exists, otherwise null
	 */
	public final AnalysisItem getSpecific(final IProject project, final int runID, final int leakID) {
		AbstractList<RunResults> runs = getResults(project);
		Iterator<RunResults> iterRuns = runs.iterator();
		while (iterRuns.hasNext()) {
			RunResults oneRunRes = iterRuns.next();
			if (oneRunRes.getItemID() == runID) {
				AbstractList<AnalysisItem> items = oneRunRes.getAnalysisItems();
				Iterator<AnalysisItem> iterItems = items.iterator();
				while (iterItems.hasNext()) {
					AnalysisItem oneItem = iterItems.next();
					if (oneItem.getID() == leakID) {
						return oneItem;
					}
				}
			}
		}
		return null;
	}

	/**
	 * Gets subtest info for given project and given run.
	 *
	 * @param project
	 *            Project reference
	 * @param runID
	 *            Current run ID
	 * @param leakID
	 *            Current leak ID
	 * @param subtestID
	 *            Subtest ID
	 * @return Subtest if it exists otherwise null
	 */
	public final AnalysisItem getSubtestItem(final IProject project, final int runID, final int leakID,
			final int subtestID) {
		// get project runs
		AbstractList<RunResults> runs = getResults(project);
		Iterator<RunResults> iterRuns = runs.iterator();

		// thru runs
		while (iterRuns.hasNext()) {
			RunResults oneRunRes = iterRuns.next();

			// run ID equals given ID
			if (oneRunRes.getItemID() == runID) {
				// get run subtest
				AbstractList<Subtest> subtests = oneRunRes.getSubtest();
				Iterator<Subtest> iterSubtests = subtests.iterator();
				while (iterSubtests.hasNext()) {
					Subtest oneSubtest = iterSubtests.next();

					// if subtest ID equals with given ID return it
					if (oneSubtest.getItemID() == subtestID) {
						return oneSubtest.getItemByID(leakID);
					}
				}
			}
		}
		return null;
	}

	/**
	 * Set project used data file name and path.
	 *
	 * @param projectRef
	 *            Project reference
	 * @param newDataFileName
	 *            Project used data file name
	 */
	public final void setDataFileName(final IProject projectRef, final String newDataFileName) {
		// store data file name
		projDataFile.put(projectRef, newDataFileName);
	}

	/**
	 * Updates/stores project related memory analysis results.
	 *
	 * @param projRef
	 *            Project reference
	 * @param runResults
	 *            Run results
	 * @param dataFile
	 *            Used data file name and path
	 */
	public final void updateRunResults(final IProject projRef,
			final AbstractList<RunResults> runResults, final String dataFile) {
		// store data
		projRelatedRes.put(projRef, runResults);

		// set project used data file name and path
		setDataFileName(projRef, dataFile);
	}


	/**
	 * Sets project modules, also creating the unknown component list
	 * @param project Project reference
	 * @param mmps Project mmp's
	 * @param modules List of the modules.
	 */
	public void setProjectModules(IProject project, AbstractList<MMPInfo> mmps, AbstractList<String> modules)
	{
		try{
			if( modules.isEmpty() || mmps.isEmpty() ) {
				return;
			}
			Iterator<String> iterModules = modules.iterator();
			AbstractList<String> unknownComponents = new ArrayList<String>();
			while( iterModules.hasNext() ) {
				String moduleName = iterModules.next();
				boolean build = Util.isModulePartOfProject(mmps, moduleName);
				if( !build ) {
					unknownComponents.add(moduleName);
				}
			}
			setProjectUnknownModules(project, unknownComponents);
		}
		catch(Exception e)
		{
			Activator.getDefault().log(IStatus.ERROR, "Can not set project modules", e);
		}
		
		
	}

	/**
	 * Stores project unknown modules.
	 * @param project Project reference
	 * @param modules Project unknown modules
	 */
	private void setProjectUnknownModules(IProject project, AbstractList<String> modules) {

		//update list only it is empty
		if( !projectUnknownComp.containsKey(project) ) {
			projectUnknownComp.put(project, modules);
			return;
		}

		AbstractList<String> existingModules = projectUnknownComp.get(project);
		if( existingModules == null || existingModules.isEmpty() ) {
			projectUnknownComp.put(project, modules);
		}
	}

	/**
	 * Returns project unknown modules.
	 * @param project Project reference
	 * @return If project contains unknown modules returns unknown component list otherwise empty list
	 */
	public AbstractList<String> getProjectUnknownModules(IProject project){
		if( projectUnknownComp == null || projectUnknownComp.isEmpty() ) {
			return new ArrayList<String>();
		}
		if( projectUnknownComp.containsKey(project)) {
			return projectUnknownComp.get(project);
		}

		//no unknown components found for given project => return empty list
		return new ArrayList<String>();
	}

	/**
	 * Updates project unknown components list
	 * @param project Project reference
	 * @param targets Project targets
	 */
	public void updateUnknownModulesList(final IProject project, final AbstractList<MMPInfo> targets) {
		if( project != null && project.isOpen() ) {
			AbstractList<String> unkModules = projectUnknownComp.get(project);
			if( unkModules == null || unkModules.isEmpty() ) {
				return;
			}

			if( targets == null || targets.isEmpty() ) {
				return;
			}
			Iterator<MMPInfo> iterTargets = targets.iterator();

			while(iterTargets.hasNext()) {
				MMPInfo oneInfo = iterTargets.next();
				if( oneInfo == null ) {
					continue;
				}
				String oneModule = oneInfo.getTarget();
				if( oneModule == null || ("").equals(oneModule ) ) {
					continue;
				}

				if(unkModules.contains(oneModule.toLowerCase(Locale.US)) ) {
					unkModules.remove(oneModule.toLowerCase(Locale.US));
				}
			}

			projectUnknownComp.put(project,unkModules);
		}
	}
}