package org.eclipse.epf.library.realization.impl;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.epf.library.edit.realization.IRealizedRoleDescriptor;
import org.eclipse.epf.uma.Descriptor;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.RoleDescriptor;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.WorkProductDescriptor;

public class RealizedRoleDescriptor extends RealizedDescriptor implements
		IRealizedRoleDescriptor {

	private static Set<EStructuralFeature> featureSet = new HashSet<EStructuralFeature>();
	static {
		UmaPackage up = UmaPackage.eINSTANCE;		
		featureSet.add(up.getRoleDescriptor_ResponsibleFor());
	}
	
	public RealizedRoleDescriptor(RoleDescriptor rd) {
		super(rd);
	}
		
	public boolean handleFeature(EStructuralFeature feature) {
		if (featureSet.contains(feature)) {
			return true;
		}
		return super.handleFeature(feature);
	}
	
	protected MethodElement getRawLinkedElement() {
		return getRoleDescriptor().getRole();
	}
	
	private RoleDescriptor getRoleDescriptor() {
		return (RoleDescriptor) getElement();
	}
	
	public List<WorkProductDescriptor> getResponsibleFor() {
		UmaPackage up = UmaPackage.eINSTANCE;
		EReference rdReference = up.getRoleDescriptor_ResponsibleFor();
		List<WorkProductDescriptor> wpdList = (List<WorkProductDescriptor>) getCachedValue(rdReference);
		if (wpdList == null) {
			EReference[] rdFeatures = { rdReference,
					up.getRoleDescriptor_ResponsibleForExclude(), };
			wpdList = (List<WorkProductDescriptor>) getDescriptorList(up
					.getRole_ResponsibleFor(), rdFeatures);
			storeCachedValue(rdReference, wpdList);
		}
		return wpdList;
	}
	
	@Override
	public Set<Descriptor> updateAndGetAllReferenced() {		
		Set<Descriptor> referenced = new HashSet<Descriptor>();
		addToSet(referenced, getResponsibleFor());
		
		Set<Descriptor> superSet = super.updateAndGetAllReferenced();
		referenced.addAll(superSet);		
		return referenced;
	}
	
	public Object getFeatureValue(EStructuralFeature feature) {		
		UmaPackage up = UmaPackage.eINSTANCE;		
		if (feature == up.getRoleDescriptor_ResponsibleFor()) {
			return getResponsibleFor();
		}

		return super.getFeatureValue(feature); 
	}
	
}
