// 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.core.dependencies;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class DependencyGraph {
private final Scope scope;
private final Map<Dependable, Set<Dependable>> dependants = new HashMap<Dependable, Set<Dependable>>();
private final Map<Dependable, Set<Dependable>> dependencies = new HashMap<Dependable, Set<Dependable>>();
private final Map<Dependency, Integer> dependencyWeights = new HashMap<Dependency, Integer>();
private final Set<Dependable> allItems = new HashSet<Dependable>();
public DependencyGraph(Scope scope) {
this.scope = scope;
}
public DependencyGraph(Scope scope, Collection<Dependable> items) {
this.scope = scope;
this.allItems.addAll(items);
}
public void addItem(Dependable item) {
this.allItems.add(item);
}
public void addDependency(Dependable dependant, Dependable dependee) {
if (!isValid(dependant) || !isValid(dependee))
return;
if (dependant.equals(dependee))
return;
getDependencies(dependant).add(dependee);
getDependants(dependee).add(dependant);
addDependencyWeight(dependant, dependee);
}
private boolean isValid(Dependable dependant) {
return dependant != null && allItems.contains(dependant);
}
private void addDependencyWeight(Dependable dependant, Dependable dependee) {
Dependency dependency = new Dependency(dependant, dependee);
Integer weight = dependencyWeights.get(dependency);
if (weight == null)
weight = 1;
else
weight++;
dependencyWeights.put(dependency, weight);
}
public Set<Dependable> getAllItems() {
return allItems;
}
public Set<Dependable> getDependants(Dependable dependant) {
Set<Dependable> classes = dependants.get(dependant);
if (classes == null) {
classes = new HashSet<Dependable>();
dependants.put(dependant, classes);
}
return classes;
}
public Set<Dependable> getDependencies(Dependable dependee) {
Set<Dependable> classes = dependencies.get(dependee);
if (classes == null) {
classes = new HashSet<Dependable>();
dependencies.put(dependee, classes);
}
return classes;
}
public float getInstability(Dependable item) {
float ce = getDependencyCount(item);
float ca = getDependantCount(item);
float f = (ce / (ce + ca));
return f;
}
private int getDependencyCount(Dependable item) {
return getDependencies(item).size();
}
private int getDependantCount(Dependable item) {
return getDependants(item).size();
}
public int getDependencyWeight(Dependable dependant, Dependable dependee) {
return getDependencyWeight(new Dependency(dependant, dependee));
}
public int getOutgoingDependenciesWeight(Dependable item) {
int sum = 0;
for (Dependable dependee : getDependencies(item)) {
sum += getDependencyWeight(item, dependee);
}
return sum;
}
private int getDependencyWeight(Dependency dependency) {
Integer weight = dependencyWeights.get(dependency);
return weight != null ? weight : 0;
}
public Dependable getItemByName(String name) {
for (Dependable dependable : getAllItems()) {
if (dependable.getDisplayName().equals(name))
return dependable;
}
return null;
}
public Scope getScope() {
return scope;
}
}