/*******************************************************************************
* Copyright (c) 2006 Mountainminds GmbH & Co. KG
* This software is provided under the terms of the Eclipse Public License v1.0
* See http://www.eclipse.org/legal/epl-v10.html.
*
* $Id: JavaModelCoverage.java 199 2006-12-18 14:49:40Z mtnminds $
******************************************************************************/
package com.mountainminds.eclemma.internal.core.analysis;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import com.mountainminds.eclemma.core.analysis.IJavaElementCoverage;
import com.mountainminds.eclemma.core.analysis.IJavaModelCoverage;
/**
* The IJavaModelCoverage implementation maps Java elements to its corresponding
* coverage data objects.
*
* @author Marc R. Hoffmann
* @version $Revision: 199 $
*/
public class JavaModelCoverage extends JavaElementCoverage implements
IJavaModelCoverage {
/** Maps Java elements to coverage objects */
private final Map coveragemap = new HashMap();
/** Maps coverage objects to Java elements */
private final Map elementmap = new HashMap();
/** List of all IJavaProject objects with coverage information attached */
private final List projects = new ArrayList();
/** List of all IPackageFragmentRoot objects with coverage information attached */
private final List fragmentroots = new ArrayList();
/** List of all IPackageFragment objects with coverage information attached */
private final List fragments = new ArrayList();
/** List of all IType objects with coverage information attached */
private final List types = new ArrayList();
public JavaModelCoverage() {
super(null, false, 0);
}
public void put(IJavaElement element, IJavaElementCoverage coverage) {
coveragemap.put(element, coverage);
elementmap.put(coverage, element);
switch (element.getElementType()) {
case IJavaElement.JAVA_PROJECT:
projects.add(element);
break;
case IJavaElement.PACKAGE_FRAGMENT_ROOT:
fragmentroots.add(element);
break;
case IJavaElement.PACKAGE_FRAGMENT:
fragments.add(element);
break;
case IJavaElement.TYPE:
types.add(element);
break;
}
}
// IJavaModelCoverage interface
public IJavaProject[] getInstrumentedProjects() {
IJavaProject[] arr = new IJavaProject[projects.size()];
return (IJavaProject[]) projects.toArray(arr);
}
public IPackageFragmentRoot[] getInstrumentedPackageFragmentRoots() {
IPackageFragmentRoot[] arr = new IPackageFragmentRoot[fragmentroots.size()];
return (IPackageFragmentRoot[]) fragmentroots.toArray(arr);
}
public IPackageFragment[] getInstrumentedPackageFragments() {
IPackageFragment[] arr = new IPackageFragment[fragments.size()];
return (IPackageFragment[]) fragments.toArray(arr);
}
public IType[] getInstrumentedTypes() {
IType[] arr = new IType[types.size()];
return (IType[]) types.toArray(arr);
}
public IJavaElementCoverage getCoverageFor(IJavaElement element) {
IJavaElementCoverage c = (IJavaElementCoverage) coveragemap.get(element);
// Currently lazy binding is for methods only:
if (c == null && element.getElementType() == IJavaElement.METHOD) {
IJavaElement parent = element.getParent();
Object parentcoverage = getCoverageFor(parent);
if (parentcoverage instanceof ILazyBinding) {
((ILazyBinding) parentcoverage).resolve(parent, this);
}
c = (IJavaElementCoverage) coveragemap.get(element);
}
return c;
}
/**
* @param coverageNode Node to do the lookup for.
* @return IJavaElement related to a particular coverageNode.
*/
public IJavaElement getJavaElement(IJavaElementCoverage coverageNode) {
return (IJavaElement)elementmap.get(coverageNode);
}
}