/*******************************************************************************
* Copyright (c) 2008 Scott Stanchfield
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package com.javadude.dependencies.editparts;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.jdt.core.IJavaProject;
import com.javadude.dependencies.Dependency;
public class DependencyManager {
private static Map<IJavaProject, Set<Dependency>> sourceDependencies = new HashMap<IJavaProject, Set<Dependency>>();
private static Map<IJavaProject, Set<Dependency>> targetDependencies = new HashMap<IJavaProject, Set<Dependency>>();
public static void add(Dependency dependency) {
DependencyManager.add(dependency.getSource(), dependency, DependencyManager.sourceDependencies);
DependencyManager.add(dependency.getTarget(), dependency, DependencyManager.targetDependencies);
}
public static boolean indirectPathExists(Dependency directPath, IJavaProject source, IJavaProject target) {
// System.out.print("checking " + source.getElementName() + "->" + target.getElementName());
boolean result = DependencyManager.indirectPathExists(new HashSet<IJavaProject>(), directPath, source, target);
// System.out.println(": " + result);
return result;
}
private static boolean indirectPathExists(Set<IJavaProject> visited, Dependency directPath, IJavaProject source, IJavaProject target) {
if (visited.contains(source)) {
// CYCLE!!! stop walking or we're doomed!
return false;
}
visited.add(source);
Set<Dependency> sourceDeps = DependencyManager.sourceDependencies.get(source);
if (sourceDeps != null) {
for (Dependency dependency : sourceDeps) {
if (!dependency.isExported() || dependency.equals(directPath)) {
continue;
}
if (dependency.getTarget().equals(target)) {
return true;
} else {
// recurse to try to find an indirect path
if (DependencyManager.indirectPathExists(visited, directPath, dependency.getTarget(), target)) {
return true;
}
}
}
}
return false;
}
private static void add(IJavaProject key, Dependency dependency, Map<IJavaProject, Set<Dependency>> map) {
Set<Dependency> set = map.get(key);
if (set == null) {
set = new HashSet<Dependency>();
map.put(key, set);
set.add(dependency);
} else if (!set.contains(dependency)) {
set.add(dependency);
}
}
public static List<Dependency> findSourceDependencies(IJavaProject source) {
return DependencyManager.get(source, DependencyManager.sourceDependencies);
}
public static List<Dependency> findTargetDependencies(IJavaProject target) {
return DependencyManager.get(target, DependencyManager.targetDependencies);
}
private static List<Dependency> get(IJavaProject source, Map<IJavaProject, Set<Dependency>> map) {
Set<Dependency> set = map.get(source);
if (set == null || set.isEmpty()) {
return Collections.emptyList();
}
return new ArrayList<Dependency>(set);
}
public static void removeDependency(IJavaProject source, IJavaProject target) {
DependencyManager.remove(source, target, DependencyManager.sourceDependencies);
DependencyManager.remove(target, source, DependencyManager.targetDependencies);
}
private static void remove(IJavaProject key, IJavaProject value, Map<IJavaProject, Set<Dependency>> map) {
Set<Dependency> set = map.get(key);
if (set == null) {
return;
}
set.remove(value);
if (set.isEmpty()) {
map.remove(key);
}
}
public static void clear() {
DependencyManager.sourceDependencies.clear();
DependencyManager.targetDependencies.clear();
}
}