blob: 5b6996ce66e203fb938861d1d37e29299eaa34c8 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 IBM Corporation and others.
// 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
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit.validation;
import org.eclipse.epf.library.edit.IFilter;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.Artifact;
import org.eclipse.epf.uma.CustomCategory;
import org.eclipse.epf.uma.Deliverable;
import org.eclipse.epf.uma.Domain;
import org.eclipse.epf.uma.Practice;
import org.eclipse.epf.uma.VariabilityElement;
/**
* This class does circular dependency check
*
* @author Weiping Lu
* @since 1.2
*/
public class CircularDependencyCheck {
private DependencyInfoMgr depInfoMgr;
private IDependencyInfo veInfo;
private boolean move = false;
public CircularDependencyCheck(DependencyInfoMgr mgr, VariabilityElement ve,
boolean filter, boolean move) {
depInfoMgr = mgr;
veInfo = depInfoMgr.registerVariabilityElement(ve, filter, false);
this.move = move;
}
protected DependencyInfoMgr getDepInfoMgr() {
return depInfoMgr;
}
protected IDependencyInfo getVeInfo() {
return veInfo;
}
public boolean accept(Object obj) {
if (reachable(obj, true, true)) {
return false;
}
if (move) {
if(!(obj instanceof VariabilityElement)) return true;
VariabilityElement objVeBase = ((VariabilityElement) obj).getVariabilityBasedOnElement();
if (objVeBase != null) {
IDependencyInfo info = depInfoMgr.registerVariabilityElement(objVeBase, false, false);
if (info.reachableBy(veInfo)) {
return false;
}
}
}
return true;
}
private boolean reachable(Object obj, boolean checkReachableByObj, boolean checkReachableToObj) {
if (! (obj instanceof VariabilityElement)) {
return false;
}
VariabilityElement ve = (VariabilityElement) veInfo.getElement();
if (ve == obj) {
return true;
}
IDependencyInfo objVeInfo = depInfoMgr.registerVariabilityElement( (VariabilityElement) obj, false, move);
if (checkReachableByObj && veInfo.reachableBy(objVeInfo)) {
return true;
}
if (checkReachableToObj && objVeInfo.reachableBy(veInfo)) {
return true;
}
return false;
}
public boolean reachableBy(Object obj) {
return reachable(obj, true, false);
}
public boolean reachableTo(Object obj) {
return reachable(obj, false, true);
}
}