package org.codemap.eclemma; import static java.util.Collections.emptySet; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import org.codemap.mapview.MapController; import org.codemap.resources.MapValues; import org.codemap.util.CodemapColors; import org.codemap.util.Log; import org.codemap.util.MColor; import org.codemap.util.MapScheme; import org.codemap.util.Resources; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import ch.akuhn.util.Pair; import ch.akuhn.values.Value; import com.mountainminds.eclemma.core.CoverageTools; import com.mountainminds.eclemma.core.analysis.IJavaCoverageListener; // import com.mountainminds.eclemma.core.analysis.IJavaElementCoverage; import com.mountainminds.eclemma.core.analysis.IJavaModelCoverage; public class CoverageListener implements IJavaCoverageListener, ICodemapCoverage { protected final class CoverageResourceVisitor implements IResourceVisitor { private final List<Pair<String, Double>> identifiers; protected CoverageResourceVisitor(List<Pair<String, Double>> identifiers) { this.identifiers = identifiers; } @Override public boolean visit(IResource resource) throws CoreException { IJavaElement javaElement = JavaCore.create(resource); if (javaElement == null) return true; if (javaElement.getElementType() != IJavaElement.COMPILATION_UNIT) return true; ICompilationUnit compilationUnit = (ICompilationUnit) javaElement .getAdapter(ICompilationUnit.class); return visit(compilationUnit); } private boolean visit(ICompilationUnit compilationUnit) { // XXX commented this out to make it run! // String identifier = Resources.asPath(compilationUnit); // IJavaElementCoverage coverageInfo = CoverageTools // .getCoverageInfo(compilationUnit); // if (coverageInfo == null) { // // for interfaces where we do not have coverage information // return false; // } // identifiers.add(new Pair<String, Double>(identifier, coverageInfo // .getLineCounter().getRatio())); return false; } } private MapController theController; private Set<Pair<String, Double>> lastCoverageInfo; private boolean enabled; public CoverageListener(MapController mapController) { theController = mapController; enabled = false; lastCoverageInfo = emptySet(); CoverageTools.addJavaCoverageListener(this); } public void dispose() { CoverageTools.removeJavaCoverageListener(this); } @Override public void coverageChanged() { // XXX commented this out to make it run! // IJavaModelCoverage coverage = CoverageTools.getJavaModelCoverage(); // if (coverage == null) return; // // Set<Pair<String, Double>> coverageInfo = new HashSet<Pair<String, Double>>(); // List<IJavaProject> projects = Arrays.asList(coverage // .getInstrumentedProjects()); // for (IJavaProject each : projects) { // if (!each.isOpen()) // continue; // coverageInfo.addAll(compilationUnitCoverage(each)); // } // updateCoverageInfo(coverageInfo); } private void updateCoverageInfo(Set<Pair<String, Double>> coverageInfo) { lastCoverageInfo = coverageInfo; maybeDisplayCoverage(); } private void maybeDisplayCoverage() { if (!enabled) return; MapValues values = theController.getActiveMap().getValues(); if (values == null) return; Value<MapScheme<MColor>> colorValue = values.colorScheme; CodemapColors colorScheme = new CodemapColors(MColor.GRAY_204); for (Pair<String, Double> pair : lastCoverageInfo) { String identifier = pair.fst; Double ratio = pair.snd; int redVal = (int) ((1 - ratio) * 255); int greenVal = (int) (ratio * 255); MColor col = new MColor(redVal, greenVal, 0); colorScheme.setColor(identifier, col); } colorValue.setValue(colorScheme); } private List<Pair<String, Double>> compilationUnitCoverage( IJavaProject project) { List<Pair<String, Double>> identifiers = new ArrayList<Pair<String, Double>>(); try { for (IPackageFragmentRoot root : project.getPackageFragmentRoots()) { IResource resource = root.getResource(); if (resource == null) continue; resource.accept(new CoverageResourceVisitor(identifiers)); } } catch (JavaModelException e) { Log.error(e); } catch (CoreException e) { Log.error(e); } return identifiers; } public void setEnabled(boolean b) { enabled = b; maybeDisplayCoverage(); } @Override public boolean isEclemmaPluginAvailable() { return true; } }