package br.ufmg.dcc.labsoft.aserg.modularitycheck.distribution.control; import java.io.File; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import br.ufmg.dcc.labsoft.aserg.modularitycheck.distribution.control.metrics.TopicFocus; import br.ufmg.dcc.labsoft.aserg.modularitycheck.distribution.control.metrics.TopicSpread; public class DistributionMap { private String projectName; private Map<String, List<String>> packageMapping; private Map<String, Integer> classMapping; private Map<Integer, TopicInfo> topicMapping; private DistributionMap(String projectName) { this.projectName = projectName; this.packageMapping = new HashMap<String, List<String>>(); this.classMapping = new HashMap<String, Integer>(); this.topicMapping = new HashMap<Integer, TopicInfo>(); } public void put(String packageName, String className, int clusterIndex) { List<String> classes = this.packageMapping.containsKey(packageName) ? (List<String>) this.packageMapping .get(packageName) : new LinkedList<String>(); classes.add(className); this.packageMapping.put(packageName, classes); this.classMapping.put(className, Integer.valueOf(clusterIndex)); } public void put(int clusterIndex, double spread, double focus) { this.topicMapping.put(Integer.valueOf(clusterIndex), new TopicInfo( spread, focus)); } public String getProjectName() { return this.projectName; } @SuppressWarnings({ "unchecked", "rawtypes" }) public List<String> getPackages() { List<String> packages = new LinkedList<String>(); packages.addAll(this.packageMapping.keySet()); Collections.sort(packages, new Comparator() { @Override public int compare(Object package1, Object package2) { return Integer.compare( ((List<String>) DistributionMap.this.packageMapping .get(package2.toString())).size(), ((List<String>) DistributionMap.this.packageMapping .get(package1.toString())).size()); } }); return packages; } public List<String> getClasses(String packageName) { return (List<String>) this.packageMapping.get(packageName); } public Integer getCluster(String className) { return (Integer) this.classMapping.get(className); } public Double getSpread(int clusterIndex) { return Double.valueOf(((TopicInfo) this.topicMapping.get(Integer .valueOf(clusterIndex))).spread); } public Double getFocus(int clusterIndex) { return Double.valueOf(((TopicInfo) this.topicMapping.get(Integer .valueOf(clusterIndex))).focus); } public void organize() { for (String packageName : this.packageMapping.keySet()) { List<String> classes = (List<String>) this.packageMapping.get(packageName); Collections.sort(classes); } } static class TopicInfo { double spread; double focus; TopicInfo(double spread, double focus) { this.spread = spread; this.focus = focus; } } public static DistributionMap generateDistributionMap(String projectName, String[] documentIds, int[][] clusters) { DistributionMap distributionMap = new DistributionMap(projectName); for (int i = 0; i < clusters.length; i++) { for (int documentId : clusters[i]) { String document = documentIds[documentId]; String packageName = document.substring(0, document.lastIndexOf(File.separatorChar)).replace( File.separatorChar, '.'); String className = document; distributionMap.put(packageName, className, i); } } distributionMap = addSemanticClustersMetrics(distributionMap, clusters.length); distributionMap.organize(); return distributionMap; } public static DistributionMap addSemanticClustersMetrics( DistributionMap distributionMap, int numClusters) { Map<String, Double> spread = new TopicSpread(distributionMap, numClusters).calculate(); Map<String, Double> focus = new TopicFocus(distributionMap, numClusters) .calculate(); for (int i = 0; i < numClusters; i++) { distributionMap.put(i, ((Double) spread.get(String.valueOf(i))).doubleValue(), ((Double) focus.get(String.valueOf(i))).doubleValue()); } return distributionMap; } }