// This product is provided under the terms of EPL (Eclipse Public License)
// version 1.0.
//
// The full license text can be read from: http://www.eclipse.org/org/documents/epl-v10.php
package org.dtangler.javaengine.dependencyengine;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.dtangler.core.dependencies.Dependable;
import org.dtangler.core.dependencies.Dependencies;
import org.dtangler.javaengine.types.JavaClass;
import org.dtangler.javaengine.types.JavaScope;
public class ClassDependencies {
private final Map<String, JavaClass> classes;
private final Map<String, Dependable> packages = new HashMap();
private final Map<String, Dependable> locations = new HashMap();
public ClassDependencies(Set<JavaClass> classes) {
Set<JavaClass> normalizedClasses = new InnerClassNormalizer()
.normalize(classes);
this.classes = getFullClassNames(normalizedClasses);
setUpperScopes(normalizedClasses);
}
private Map<String, JavaClass> getFullClassNames(Set<JavaClass> classes) {
Map<String, JavaClass> map = new HashMap<String, JavaClass>();
for (JavaClass clazz : classes) {
map.put(clazz.getFullName(), clazz);
}
return map;
}
private void setUpperScopes(Set<JavaClass> classes) {
Map<String, Dependable> pkgs = new HashMap();
Map<String, Dependable> locs = new HashMap();
for (JavaClass clazz : classes) {
setPackageNames(pkgs, clazz);
setLocationNames(locs, clazz);
}
this.packages.putAll(pkgs);
this.locations.putAll(locs);
}
private void setPackageNames(Map<String, Dependable> pkgs, JavaClass clazz) {
String package1 = clazz.getPackage();
Dependable pkg = pkgs.get(package1);
if (pkg == null) {
String fullName = clazz.getLocation() + ": " + package1;
pkg = new Dependable(JavaScope.packages, fullName, package1, 0);
pkgs.put(package1, pkg);
}
pkg.setContentCount(pkg.getContentCount() + 1);
}
private void setLocationNames(Map<String, Dependable> locs, JavaClass clazz) {
String location = clazz.getLocation();
Dependable loc = locations.get(location);
if (loc == null) {
String fullName = clazz.getLocation();
loc = new Dependable(JavaScope.locations, fullName, location, 0);
locations.put(location, loc);
}
}
public Dependencies getDependencies() {
Dependencies deps = new Dependencies();
for (JavaClass javaClass : classes.values()) {
Dependable clazz = javaClass.toDependable();
Dependable pkg = getPackageByName(javaClass.getPackage());
Dependable loc = getLocationByName(javaClass.getLocation());
deps.addDependencies(clazz, getDependencies(javaClass));
deps.addChild(pkg, clazz);
deps.addChild(loc, pkg);
loc.setContentCount(deps.getChilds(loc).size());
}
return deps;
}
private Map<Dependable, Integer> getDependencies(JavaClass javaClass) {
Map<Dependable, Integer> dependencies = new HashMap();
Map<String, Integer> javaDeps = javaClass.getDependencies();
for (String depName : javaDeps.keySet()) {
JavaClass dep = classes.get(depName);
if (dep == null)
continue; // outer dep
dependencies.put(dep.toDependable(), javaDeps.get(depName));
}
return dependencies;
}
protected Dependable getPackageByName(String name) {
return packages.get(name);
}
protected Dependable getLocationByName(String name) {
return locations.get(name);
}
}