+ getTable().remove(oldLoc);
+
+ for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
+ T key = (T) iterator.next();
+ getTable().get(key).remove(oldLoc);
+ }
+
+ }
+
+ public void removeRedundantEdges() {
+
+ Set<T> keySet = getTable().keySet();
+
+ for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
+ T src = (T) iterator.next();
+ Set<T> connectedSet = getTable().get(src);
+ Set<T> toberemovedSet = new HashSet<T>();
+ for (Iterator iterator2 = connectedSet.iterator(); iterator2.hasNext();) {
+ T dst = (T) iterator2.next();
+ Set<T> otherNeighborSet = new HashSet<T>();
+ otherNeighborSet.addAll(connectedSet);
+ otherNeighborSet.remove(dst);
+ for (Iterator iterator3 = otherNeighborSet.iterator(); iterator3.hasNext();) {
+ T neighbor = (T) iterator3.next();
+ if (isReachable(neighbor, new HashSet<T>(), dst)) {
+ toberemovedSet.add(dst);
+ }
+ }
+ }
+ if (toberemovedSet.size() > 0) {
+ connectedSet.removeAll(toberemovedSet);
+ }
+ }
+
+ }
+
+ private boolean isReachable(T neighbor, Set<T> visited, T dst) {
+ Set<T> connectedSet = getTable().get(neighbor);
+ if (connectedSet != null) {
+ for (Iterator<T> iterator = connectedSet.iterator(); iterator.hasNext();) {
+ T n = iterator.next();
+ if (n.equals(dst)) {
+ return true;
+ }
+ if (!visited.contains(n)) {
+ visited.add(n);
+ if (isReachable(n, visited, dst)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ public Map<T, Set<T>> getIncomingElementMap() {
+ Map<T, Set<T>> map = new HashMap<T, Set<T>>();
+
+ Set<T> keySet = getKeySet();
+ for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
+ T key = (T) iterator.next();
+
+ Set<T> incomingSet = new HashSet<T>();
+
+ for (Iterator iterator2 = keySet.iterator(); iterator2.hasNext();) {
+ T in = (T) iterator2.next();
+ if (!in.equals(key) && get(in).contains(key)) {
+ incomingSet.add(in);
+ }
+ }
+ map.put(key, incomingSet);
+ }
+
+ return map;
+ }
+
+ public void insertNewLocationBetween(T higher, T lower, T newLoc) {
+ Set<T> connectedSet = get(higher);
+ connectedSet.remove(lower);
+ connectedSet.add(newLoc);
+
+ put(newLoc, lower);
+ }
+
+ public void insertNewLocationBetween(T higher, Set<T> lowerSet, T newLoc) {
+ System.out.println("---insert new location=" + newLoc + " between=" + higher + "<->"
+ + lowerSet);
+ Set<T> connectedSet = get(higher);
+ if (connectedSet == null) {
+ connectedSet = new HashSet<T>();
+ }else{
+ connectedSet.removeAll(lowerSet);
+ }
+ connectedSet.add(newLoc);
+
+ for (Iterator iterator = lowerSet.iterator(); iterator.hasNext();) {
+ T lower = (T) iterator.next();
+ put(newLoc, lower);
+ }
+ }
+
+ public SSJavaLattice<T> clone() {
+
+ SSJavaLattice<T> clone = new SSJavaLattice<T>(getTopItem(), getBottomItem());
+ clone.setTable(getTable());
+ clone.setSharedLocSet(getSharedLocSet());
+ return clone;