//------------------------------------------------------------------------------
// 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 java.util.List;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.epf.library.edit.IConfigurationApplicator;
import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.epf.uma.ContentDescription;
import org.eclipse.epf.uma.DescribableElement;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.VariabilityElement;
import org.eclipse.epf.uma.ecore.util.OppositeFeature;

/**
 * @author Phong Nguyen Le
 * @since 1.1
 */
public class ConfigurationApplicator implements IConfigurationApplicator {
	public static final IConfigurationApplicator INSTANCE = new ConfigurationApplicator();

	public Object getAttribute(VariabilityElement e, EAttribute attribute,
			MethodConfiguration config) {
		// special handling for presentation name of breakdown element
		//
		if(attribute == UmaPackage.eINSTANCE.getDescribableElement_PresentationName()) {
			if(e instanceof BreakdownElement) {
				return ProcessUtil.getPresentationName((BreakdownElement) e);
			}
			else {
				return ConfigurationHelper.getPresentationName(e, config);
			}
		}
		return ConfigurationHelper.calcAttributeFeatureValue(e, attribute,
				config);
	}

	public Object getReference(VariabilityElement e, EReference ref,
			MethodConfiguration config) {
		if (ConfigurationHelper.is0nFeature(ref)) {
			return ConfigurationHelper.calc0nFeatureValue(e, ref,
					new DefaultElementRealizer(config));
		} else if (ConfigurationHelper.is01Feature(ref)) {
			return ConfigurationHelper.calc01FeatureValue(e, ref,
					new DefaultElementRealizer(config));
		}
		return null;
	}

	public Object getReference(ContentDescription desc,
			DescribableElement owner, EReference ref, MethodConfiguration config) {

		List values = ConfigurationHelper.calc0nFeatureValue(desc, owner, ref,
				new DefaultElementRealizer(config));
		if (ref.isMany()) {
			return values;
		}
		if (values.isEmpty())
			return null;
		return values;
	}

	public Object getReference(MethodElement element, OppositeFeature feature,
			MethodConfiguration config) {
		List values = ConfigurationHelper.calc0nFeatureValue(element, feature,
				new DefaultElementRealizer(config));

		return values;
	}

	public Object resolve(Object object, MethodConfiguration config) {
		if (object instanceof MethodElement) {
			Object resolved = ConfigurationHelper.getCalculatedElement(
					(MethodElement) object, config);
			if (resolved == null) {
				return object;
			} else {
				return resolved;
			}
		} else {
			return object;
		}
	}

	public Object getAttribute(ContentDescription desc,
			DescribableElement owner, EAttribute attr,
			MethodConfiguration config) {
		return ConfigurationHelper.calcAttributeFeatureValue(desc, owner, attr,
				config);
	}

}
