//------------------------------------------------------------------------------
// 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);
	}	
	
}
