package org.codemap; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.codemap.util.CodemapColors; import org.codemap.util.GoodColorGenerator; import org.codemap.util.Log; import org.codemap.util.MColor; import org.codemap.util.MapScheme; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IPackageDeclaration; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; public class ByPackageColorScheme extends MapScheme<MColor> { private final MapPerProject mapPerProject; private CodemapColors colorScheme; public ByPackageColorScheme(MapPerProject mapPerProject) { this.mapPerProject = mapPerProject; } @Override public MColor forLocation(Point location) { if (colorScheme == null) { init(); } return colorScheme.forLocation(location); } private void init() { colorScheme = new CodemapColors(); HashMap<String, List<String>> forPackage = findPackageDeclarations(); GoodColorGenerator colors = new GoodColorGenerator(forPackage.keySet().size()); for(String pack: forPackage.keySet()) { MColor col = colors.next(); List<String> classes = forPackage.get(pack); for(String clazz: classes) { colorScheme.setColor(clazz, col); } } } /** * maps all packages in the current codemap to their classes in the * current codemap. */ private HashMap<String, List<String>> findPackageDeclarations() { HashMap<String, List<String>> forPackage = new HashMap<String, List<String>>(); for(Point each: mapPerProject.getConfiguration().points()) { String fileName = each.getDocument(); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IResource resource = root.findMember(new Path(fileName)); IJavaElement create = JavaCore.create(resource); if (!(create instanceof ICompilationUnit)) continue; ICompilationUnit unit = (ICompilationUnit) create; try { IPackageDeclaration[] packageDeclarations = unit.getPackageDeclarations(); if (packageDeclarations.length != 1) continue; IPackageDeclaration pack = packageDeclarations[0]; String packageName = pack.getElementName(); List<String> classes = forPackage.get(packageName); if (classes == null) { classes = new ArrayList<String>(); forPackage.put(packageName, classes); } classes.add(fileName); } catch (JavaModelException e) { Log.error(e); } } return forPackage; } }