//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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.configuration;

import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.epf.uma.Descriptor;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.Milestone;
import org.eclipse.epf.uma.TeamProfile;
import org.eclipse.epf.uma.VariabilityType;
import org.eclipse.jface.viewers.Viewer;


/**
 * 
 * @author Phong Le
 * @author Shilpa Toraskar
 * @since 1.0
 *
 */
public class ProcessConfigurator extends ConfigurationFilter {

	private boolean checkOwningProcess;

	/**
	 * @param methodConfig
	 * @param viewer
	 */
	public ProcessConfigurator(MethodConfiguration methodConfig, Viewer viewer) {
		super(methodConfig, viewer);
	}
	
	/**
	 * @param methodConfig
	 * @param viewer
	 * @param checkOwningProcess if true will check on owning process of activities whether it is in the configuration.
	 *          This check is not required in process editor and skipping it helps the performance.
	 */
	public ProcessConfigurator(MethodConfiguration methodConfig, Viewer viewer, boolean checkOwningProcess) {
		this(methodConfig, viewer);
		this.checkOwningProcess = checkOwningProcess;
	}

	public void setMethodConfiguration(MethodConfiguration newConfig) {
		methodConfig = newConfig;
	}

	public boolean accept(Object obj) {
		if (methodConfig == null)
			return true;

		if (obj instanceof BreakdownElement) {
			DefaultElementRealizer realizer = new DefaultElementRealizer(super.methodConfig);
			return accept((BreakdownElement)obj, realizer);
		}
		
		return super.accept(obj);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.epf.library.configuration.ProcessConfigurator#accept(org.eclipse.epf.uma.Descriptor)
	 */
	protected boolean accept(BreakdownElement e, ElementRealizer realizer) {
		if (e instanceof Milestone || e instanceof TeamProfile) {
			// accept all process elements that are not associated with any content
			// element
			//
			return true;
		} else if (e instanceof Activity) {
			Activity act = ((Activity) e);
			Activity base = (Activity) act.getVariabilityBasedOnElement();
			VariabilityType type = act.getVariabilityType();
			if (base == null)
			{
				if(checkOwningProcess) {
					return realizer.inConfig(TngUtil.getOwningProcess(act));
				}
				else {
					return true;
				}
			}
			else if(type == VariabilityType.EXTENDS_LITERAL || type == VariabilityType.LOCAL_CONTRIBUTION_LITERAL || type == VariabilityType.LOCAL_REPLACEMENT_LITERAL)
			{
				// check owning process of base activity only for extends and local contribution/replacement
				//
				return realizer.inConfig(TngUtil.getOwningProcess(base) );
			}
			else {
				return true;
			}
		}
		else if(e instanceof Descriptor) {
			// TODO: need to consider checking on owning process of the descriptor whether it is in the configuration.
			// Currently, this check is not required and skipping it helps the performance.
			// But this check might affect the current code, e.g.: process properties view.
			//
			MethodElement linked_obj = ProcessUtil.getAssociatedElement((Descriptor) e);
			if (linked_obj == null || linked_obj.eIsProxy()) {
				// this is the processes own descriptor (independent from the content)
				// always accept it
				return true;
			} else {
				// make sure that element with replacer might still be accepted
				//
				linked_obj = ConfigurationHelper.getCalculatedElement(linked_obj, realizer);

				// if the linked element is not in config, don't accept it
				return realizer.inConfig(linked_obj);
			}		
		}
		
		return super.accept(e);
	}
}