// 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.cycleanalysis; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.dtangler.core.analysisresult.Violation; import org.dtangler.core.dependencies.Dependable; public class DependencyCycle implements Violation { private final List<Dependable> elements; private final Set<Dependable> searchSet; private final List<String> stringElements; private final int hashCode; public DependencyCycle(List<Dependable> cycleElements) { this.elements = cycleElements; searchSet = new HashSet<Dependable>(cycleElements); stringElements = new ArrayList(); for (Dependable item : cycleElements) stringElements.add(item.getDisplayName()); hashCode = calculateHashCode(); } public List<Dependable> getElements() { return elements; } public List<String> getStringElements() { return stringElements; } public boolean contains(Dependable dependable) { return searchSet.contains(dependable); } @Override public boolean equals(Object obj) { if (!(obj instanceof DependencyCycle)) return false; List<String> otherElements = ((DependencyCycle) obj).stringElements; if (stringElements.size() != otherElements.size()) return false; // get rid of last element otherElements = otherElements.subList(0, otherElements.size() - 1); for (int i = 0; i < otherElements.size(); i++) { if (otherElements.equals(getRolledList(i))) return true; } return false; } private List<String> getRolledList(int startIndex) { List<String> result = new ArrayList<String>(); while (result.size() < stringElements.size() - 1) { result.add(stringElements.get(startIndex)); startIndex++; if (startIndex >= stringElements.size() - 1) startIndex = 0; } return result; } @Override public int hashCode() { return hashCode; } private int calculateHashCode() { int result = 0; for (int i = 0; i < stringElements.size() - 1; i++) { result += stringElements.get(i).hashCode(); } return result; } @Override public String toString() { return asText(); } public String asText() { StringBuilder sb = new StringBuilder(); for (Dependable e : elements) { if (sb.length() > 0) sb.append("-->"); sb.append(e.getDisplayName()); } return "Cycle: " + sb.toString(); } public Severity getSeverity() { return Severity.error; } public boolean appliesTo(Set<Dependable> dependables) { return dependables.containsAll(searchSet); } public Set<Dependable> getMembers() { return new HashSet(getElements()); } }