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

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.UniqueEList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.epf.uma.CapabilityPattern;
import org.eclipse.epf.uma.Checklist;
import org.eclipse.epf.uma.Concept;
import org.eclipse.epf.uma.ContentElement;
import org.eclipse.epf.uma.CustomCategory;
import org.eclipse.epf.uma.DescribableElement;
import org.eclipse.epf.uma.Discipline;
import org.eclipse.epf.uma.Example;
import org.eclipse.epf.uma.Guideline;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodPackage;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.Report;
import org.eclipse.epf.uma.ReusableAsset;
import org.eclipse.epf.uma.Roadmap;
import org.eclipse.epf.uma.Role;
import org.eclipse.epf.uma.RoleDescriptor;
import org.eclipse.epf.uma.RoleSet;
import org.eclipse.epf.uma.Section;
import org.eclipse.epf.uma.SupportingMaterial;
import org.eclipse.epf.uma.Task;
import org.eclipse.epf.uma.Template;
import org.eclipse.epf.uma.Tool;
import org.eclipse.epf.uma.ToolMentor;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.VariabilityElement;
import org.eclipse.epf.uma.WorkBreakdownElement;
import org.eclipse.epf.uma.WorkOrder;
import org.eclipse.epf.uma.WorkProduct;
import org.eclipse.epf.uma.WorkProductDescriptor;
import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
import org.eclipse.epf.uma.ecore.util.OppositeFeature;

/**
 * A helper class for navigating and querying bidirectional associations among
 * the model objects.
 * 
 * @author Phong Nguyen Le
 * @author Kelvin Low
 * @since 1.0
 */
public final class AssociationHelper {

	/**
	 * An opposite feature used for retrieving the disciplines which a task is
	 * categorized under.
	 */
	public static final OppositeFeature Task_Disciplines = new OppositeFeature(
			Task.class,
			"Task_Disciplines", UmaPackage.eINSTANCE.getDiscipline_Tasks(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the task descriptors which are
	 * created from a specific task.
	 */
	public static final OppositeFeature Task_TaskDescriptors = new OppositeFeature(
			Task.class,
			"Task_TaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_Task(), true, false); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the domains which a work product
	 * is categorized under.
	 */
	public static final OppositeFeature WorkProduct_Domains = new OppositeFeature(
			WorkProduct.class,
			"WorkProduct_Domains", UmaPackage.eINSTANCE.getDomain_WorkProducts(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the tasks which produce a work
	 * product as an output.
	 */
	public static final OppositeFeature WorkProduct_OutputFrom_Tasks = new OppositeFeature(
			WorkProduct.class,
			"WorkProduct_OutputFrom_Tasks", UmaPackage.eINSTANCE.getTask_Output(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the tasks which use a work
	 * product as a mandatory input.
	 */
	public static final OppositeFeature WorkProduct_MandatoryInputTo_Tasks = new OppositeFeature(
			WorkProduct.class,
			"WorkProduct_InputTo_Tasks", UmaPackage.eINSTANCE.getTask_MandatoryInput(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the work product types which a
	 * work product is categorized under.
	 */
	public static final OppositeFeature WorkProduct_WorkProductTypes = new OppositeFeature(
			WorkProduct.class,
			"WorkProduct_WorkProductTypes", UmaPackage.eINSTANCE.getWorkProductType_WorkProducts(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the responsible roles for a work
	 * product.
	 */
	public static final OppositeFeature WorkProduct_ResponsibleRoles = new OppositeFeature(
			WorkProduct.class,
			"WorkProduct_ResponsibleRoles", UmaPackage.eINSTANCE.getRole_ResponsibleFor(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the deliverables which a work
	 * product is contained in.
	 */
	public static final OppositeFeature WorkProduct_Deliverables = new OppositeFeature(
			WorkProduct.class,
			"WorkProduct_Deliverables", UmaPackage.eINSTANCE.getDeliverable_DeliveredWorkProducts(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the tasks that use a work product
	 * as an optional input.
	 */
	public static final OppositeFeature WorkProduct_OptionalInputTo_Tasks = new OppositeFeature(
			WorkProduct.class,
			"WorkProduct_OptionalInputTo_Tasks", UmaPackage.eINSTANCE.getTask_OptionalInput(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the work product descriptors
	 * which are created from a work product.
	 */
	public static final OppositeFeature WorkProduct_WorkProductDescriptors = new OppositeFeature(
			WorkProduct.class,
			"WorkProduct_WorkProductDescriptors", UmaPackage.eINSTANCE.getWorkProductDescriptor_WorkProduct(), true, false); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the primary tasks of a role.
	 */
	public static final OppositeFeature Role_Primary_Tasks = new OppositeFeature(
			Role.class,
			"Role_Primary_Tasks", UmaPackage.eINSTANCE.getTask_PerformedBy(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the secondary tasks of a role.
	 */
	public static final OppositeFeature Role_Secondary_Tasks = new OppositeFeature(
			Role.class,
			"Role_Secondary_Tasks", UmaPackage.eINSTANCE.getTask_AdditionallyPerformedBy(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the role sets which a role is
	 * categorized under.
	 */
	public static final OppositeFeature Role_RoleSets = new OppositeFeature(
			Role.class,
			"Role_RoleSets", UmaPackage.eINSTANCE.getRoleSet_Roles(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the composite roles which
	 * includes a role.
	 */
	public static final OppositeFeature Role_CompositeRoles = new OppositeFeature(
			Role.class,
			"Role_CompositeRoles", UmaPackage.eINSTANCE.getCompositeRole_AggregatedRoles(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the role descriptors which are
	 * created from a role.
	 */
	public static final OppositeFeature Role_RoleDescriptors = new OppositeFeature(
			Role.class,
			"Role_RoleDescriptors", UmaPackage.eINSTANCE.getRoleDescriptor_Role(), true, false); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the content elements which a
	 * checklist is associated with.
	 */
	public static final OppositeFeature Checklist_ContentElements = new OppositeFeature(
			Checklist.class,
			"Checklist_ContentElements", UmaPackage.eINSTANCE.getContentElement_Checklists(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the activities which a checklist is
	 * associated with.
	 */
	public static final OppositeFeature Checklist_BreakdownElements = new OppositeFeature(
			Checklist.class,
			"Checklist_BreakdownElements", UmaPackage.eINSTANCE.getBreakdownElement_Checklists(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the activities which a concept is
	 * associated with.
	 */
	public static final OppositeFeature Concept_BreakdownElements = new OppositeFeature(
			Concept.class,
			"Concept_BreakdownElements", UmaPackage.eINSTANCE.getBreakdownElement_Concepts(), true, false); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the activities which an example is
	 * associated with.
	 */
	public static final OppositeFeature Example_BreakdownElements = new OppositeFeature(
			Concept.class,
			"Example_BreakdownElements", UmaPackage.eINSTANCE.getBreakdownElement_Examples(), true, false); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the activities which a ReusableAsset is
	 * associated with.
	 */
	public static final OppositeFeature ReusableAsset_BreakdownElements = new OppositeFeature(
			Concept.class,
			"ReusableAsset_BreakdownElements", UmaPackage.eINSTANCE.getBreakdownElement_ReusableAssets(), true, false); //$NON-NLS-1$


	/**
	 * An opposite feature used for retrieving the content elements which a
	 * concept is associated with.
	 */
	public static final OppositeFeature Concept_ContentElements = new OppositeFeature(
			Concept.class,
			"Concept_ContentElements", UmaPackage.eINSTANCE.getContentElement_ConceptsAndPapers(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the content elements which an
	 * example is associated with.
	 */
	public static final OppositeFeature Example_ContentElements = new OppositeFeature(
			Example.class,
			"Example_ContentElements", UmaPackage.eINSTANCE.getContentElement_Examples(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the content elements which a
	 * report is associated with.
	 */
	public static final OppositeFeature Report_WorkProducts = new OppositeFeature(
			Report.class,
			"Report_WorkProducts", UmaPackage.eINSTANCE.getWorkProduct_Reports(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the tasks which a
	 * EstimationConsiderations is associated with.
	 */
	public static final OppositeFeature EstimationConsiderations_Tasks = new OppositeFeature(
			Report.class,
			"EstimationConsiderations_Tasks", UmaPackage.eINSTANCE.getTask_EstimationConsiderations(), true); //$NON-NLS-1$
	
	/**
	 * An opposite feature used for retrieving the work products which a
	 * EstimationConsiderations is associated with.
	 */
	public static final OppositeFeature EstimationConsiderations_WorkProducts = new OppositeFeature(
			Report.class,
			"EstimationConsiderations_WorkProducts", UmaPackage.eINSTANCE.getWorkProduct_EstimationConsiderations(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the content elements which a
	 * reusable asset is associated with.
	 */
	public static final OppositeFeature ReusableAsset_ContentElements = new OppositeFeature(
			ReusableAsset.class,
			"ReusableAsset_ContentElements", UmaPackage.eINSTANCE.getContentElement_Assets(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the activities which a roadmap is
	 * associated with.
	 */
	public static final OppositeFeature Roadmap_Activites = new OppositeFeature(
			Roadmap.class,
			"Roadmap_Activites", UmaPackage.eINSTANCE.getActivity_Roadmaps(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the activities which a supporting
	 * material is associated with.
	 */
	public static final OppositeFeature SupportingMaterial_BreakdownElements = new OppositeFeature(
			SupportingMaterial.class,
			"SupportingMaterial_BreakdownElements", UmaPackage.eINSTANCE.getBreakdownElement_SupportingMaterials(), true, false); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the content elements which a
	 * supporting material is associated with.
	 */
	public static final OppositeFeature SupportingMaterial_ContentElements = new OppositeFeature(
			SupportingMaterial.class,
			"SupportingMaterial_ContentElements", UmaPackage.eINSTANCE.getContentElement_SupportingMaterials(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the delivery processes which a
	 * communication supporting material is associated with.
	 */
	public static final OppositeFeature SupportingMaterial_Communications_DeliveryProcesses = new OppositeFeature(
			SupportingMaterial.class,
			"SupportingMaterial_Communications_DeliveryProcesses", UmaPackage.eINSTANCE.getDeliveryProcess_CommunicationsMaterials(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the delivery processes which an
	 * education supporting material is associated with.
	 */
	public static final OppositeFeature SupportingMaterial_Education_DeliveryProcesses = new OppositeFeature(
			SupportingMaterial.class,
			"SupportingMaterial_Education_DeliveryProcesses", UmaPackage.eINSTANCE.getDeliveryProcess_EducationMaterials(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the method units which a
	 * copyright supporting material is associated with.
	 */
	public static final OppositeFeature SupportingMaterial_CopyrightStatement_MethodUnits = new OppositeFeature(
			SupportingMaterial.class,
			"SupportingMaterial_CopyrightStatement_MethodPlugins", UmaPackage.eINSTANCE.getMethodUnit_CopyrightStatement(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the content elements which a
	 * guideline is associated with.
	 */
	public static final OppositeFeature Guideline_ContentElements = new OppositeFeature(
			Guideline.class,
			"Guideline_ContentElements", UmaPackage.eINSTANCE.getContentElement_Guidelines(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the activities which a guideline
	 * is associated with.
	 */
	public static final OppositeFeature Guideline_BreakdownElements = new OppositeFeature(
			Guideline.class,
			"Guideline_BreakdownElements", UmaPackage.eINSTANCE.getBreakdownElement_Guidelines(), true, false); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the work products which a
	 * template is associated with.
	 */
	public static final OppositeFeature Template_WorkProducts = new OppositeFeature(
			Template.class,
			"Template_WorkProducts", UmaPackage.eINSTANCE.getWorkProduct_Templates(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the tool which a tool mentor is
	 * categorized under.
	 */
	public static final OppositeFeature ToolMentor_Tools = new OppositeFeature(
			ToolMentor.class,
			"ToolMentor_Tools", UmaPackage.eINSTANCE.getTool_ToolMentors(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the tasks which a tool mentor is
	 * associated with.
	 */
	public static final OppositeFeature ToolMentor_Tasks = new OppositeFeature(
			ToolMentor.class,
			"ToolMentor_Tasks", UmaPackage.eINSTANCE.getTask_ToolMentors(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the work products which a tool
	 * mentor is associated with.
	 */
	public static final OppositeFeature ToolMentor_WorkProducts = new OppositeFeature(
			Template.class,
			"ToolMentor_WorkProducts", UmaPackage.eINSTANCE.getWorkProduct_ToolMentors(), true); //$NON-NLS-1$	

	/**
	 * An opposite feature used for retrieving the custom categories which a
	 * describable element is associated with.
	 */
	public static final OppositeFeature DescribableElement_CustomCategories = new OppositeFeature(
			DescribableElement.class,
			"ContentElement_CustomCategories", UmaPackage.eINSTANCE.getCustomCategory_CategorizedElements(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the practices referenced by a
	 * content element.
	 */
	public static final OppositeFeature ContentElement_Practices = new OppositeFeature(
			ContentElement.class,
			"ContentElement_Practices", UmaPackage.eINSTANCE.getPractice_ContentReferences(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the method plug-ins referenced by
	 * a method plug-in.
	 */
	public static final OppositeFeature MethodPlugin_DirectExtensions = new OppositeFeature(
			MethodPlugin.class,
			"MethodPlugin_DirectExtensions", UmaPackage.eINSTANCE.getMethodPlugin_Bases(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the method configurations which
	 * contain a reference to a method plug-in.
	 */
	public static final OppositeFeature MethodPlugin_MethodConfigurations = new OppositeFeature(
			MethodPlugin.class,
			"MethodPlugin_MethodConfigurations", UmaPackage.eINSTANCE.getMethodConfiguration_MethodPluginSelection(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the method packages
	 * used/referenced by a method package.
	 */
	public static final OppositeFeature MethodPackage_UsingPackages = new OppositeFeature(
			MethodPackage.class,
			"MethodPackage_UsingPackages", UmaPackage.eINSTANCE.getMethodPackage_ReusedPackages(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the method configurations which
	 * contain a reference to a method package.
	 */
	public static final OppositeFeature MethodPackage_MethodConfigurations = new OppositeFeature(
			MethodPackage.class,
			"MethodPackage_MethodConfigurations", UmaPackage.eINSTANCE.getMethodConfiguration_MethodPackageSelection(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the method configurations which
	 * contain a reference to a CustomCategory.
	 */
	public static final OppositeFeature CustomCategory_MethodConfigurations = new OppositeFeature(
			CustomCategory.class,
			"CustomCategory_MethodConfigurations", UmaPackage.eINSTANCE.getMethodConfiguration_ProcessViews(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the discipline groupings which
	 * contain a reference to a discipline.
	 */
	public static final OppositeFeature Discipline_DisciplineGroupings = new OppositeFeature(
			Discipline.class,
			"Discipline_DisciplineGroupings", UmaPackage.eINSTANCE.getDisciplineGrouping_Disciplines(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the disciplines which
	 * contain a reference to a discipline (ie, a subdiscipline).
	 */
	public static final OppositeFeature Subdiscipline_Discipline = new OppositeFeature(
			Discipline.class,
			"Subdiscipline_Discipline", UmaPackage.eINSTANCE.getDiscipline_Subdiscipline(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the role set groupings which
	 * contain a reference to a role set.
	 */
	public static final OppositeFeature RoleSet_RoleSetGrouppings = new OppositeFeature(
			RoleSet.class,
			"RoleSet_RoleSetGrouppings", UmaPackage.eINSTANCE.getRoleSetGrouping_RoleSets(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the successor of a work order.
	 */
	public static final OppositeFeature WorkOrder_Successor = new OppositeFeature(
			WorkOrder.class,
			"WorkOrder_Successor", UmaPackage.eINSTANCE.getWorkBreakdownElement_LinkToPredecessor(), false); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the successor link of a work
	 * breakdown element.
	 */
	public static final OppositeFeature WorkBreakdownElement_LinkToSuccessor = new OppositeFeature(
			WorkBreakdownElement.class,
			"WorkBreakdownElement_LinkToSuccessor", UmaPackage.eINSTANCE.getWorkOrder_Pred(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the immediate variaties of a
	 * variability element.
	 */
	public static final OppositeFeature VariabilityElement_ImmediateVarieties = new OppositeFeature(
			VariabilityElement.class,
			"VariabilityElement_ImmediateVarieties", UmaPackage.eINSTANCE.getVariabilityElement_VariabilityBasedOnElement(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the successors to a section.
	 */
	public static final OppositeFeature Section_Successors = new OppositeFeature(
			Section.class,
			"Section_Successors", UmaPackage.eINSTANCE.getSection_Predecessor(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the task descriptors which a
	 * section is associated with.
	 */
	public static final OppositeFeature Section_TaskDescriptors = new OppositeFeature(
			Section.class,
			"Section_TaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_SelectedSteps(), true, false); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the team profiles which includes
	 * a specific role descriptor.
	 */
	public static final OppositeFeature RoleDescriptor_TeamProfiles = new OppositeFeature(
			RoleDescriptor.class,
			"RoleDescriptor_TeamProfiles", UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the primary task descriptors
	 * performed by a role descriptor.
	 */
	public static final OppositeFeature RoleDescriptor_PrimaryTaskDescriptors = new OppositeFeature(
			RoleDescriptor.class,
			"RoleDescriptor_PrimaryTaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_PerformedPrimarilyBy(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the additional task descriptors
	 * performed by a role descriptor.
	 */
	public static final OppositeFeature RoleDescriptor_AdditionalTaskDescriptors = new OppositeFeature(
			RoleDescriptor.class,
			"RoleDescriptor_AdditionalTaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_AdditionallyPerformedBy(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the assisting task descriptors
	 * performed by a role descriptor.
	 */
	public static final OppositeFeature RoleDescriptor_AssistsIn_TaskDescriptors = new OppositeFeature(
			RoleDescriptor.class,
			"RoleDescriptor_AssistsIn_TaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_AssistedBy(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the dependent processes
	 * referenced in a method configuration.
	 */
	public static final OppositeFeature MethodConfiguration_DependentProcesses = new OppositeFeature(
			MethodConfiguration.class,
			"MethodConfiguration_DependentProcesses", UmaPackage.eINSTANCE.getProcess_DefaultContext(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the valid processes referenced in
	 * a method configuration.
	 */
	public static final OppositeFeature MethodConfiguration_ValidContext_Processes = new OppositeFeature(
			MethodConfiguration.class,
			"MethodConfiguration_ValidContext_Processes", UmaPackage.eINSTANCE.getProcess_ValidContext(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the task descriptors which
	 * produce a work product descriptor as an output.
	 */
	public static final OppositeFeature WorkProductDescriptor_OutputFrom_TaskDescriptors = new OppositeFeature(
			WorkProductDescriptor.class,
			"WorkProductDescriptor_OutputFrom_TaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_Output(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the task descriptors which use a
	 * work product descriptor as an optional input.
	 */
	public static final OppositeFeature WorkProductDescriptor_OptionalInputTo_TaskDescriptors = new OppositeFeature(
			WorkProductDescriptor.class,
			"WorkProductDescriptor_OptionalInputTo_TaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_OptionalInput(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the task descriptors which use a
	 * work product descriptor as an mandatory input.
	 */
	public static final OppositeFeature WorkProductDescriptor_MandatoryInputTo_TaskDescriptors = new OppositeFeature(
			WorkProductDescriptor.class,
			"WorkProductDescriptor_MandatoryInputTo_TaskDescriptors", //$NON-NLS-1$
			UmaPackage.eINSTANCE.getTaskDescriptor_MandatoryInput(), true);

	/**
	 * An opposite feature used for retrieving the task descriptors which use a
	 * work product descriptor as an external input.
	 */
	public static final OppositeFeature WorkProductDescriptor_ExternalInputTo_TaskDescriptors = new OppositeFeature(
			WorkProductDescriptor.class,
			"WorkProductDescriptor_ExternalInputTo_TaskDescriptors", //$NON-NLS-1$
			UmaPackage.eINSTANCE.getTaskDescriptor_ExternalInput(), true);

	/**
	 * An opposite feature used for retrieving the role descriptors which are
	 * responsible for a work product descriptor.
	 */
	public static final OppositeFeature WorkProductDescriptor_ResponsibleRoleDescriptors = new OppositeFeature(
			WorkProductDescriptor.class,
			"WorkProductDescriptor_ResponsibleRoleDescriptors", //$NON-NLS-1$
			UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor(), true);

	/**
	 * An opposite feature used for retrieving the deliverable descriptors which
	 * contain a specific work product descriptor.
	 */
	public static final OppositeFeature WorkProductDescriptor_DeliverableDescriptors = new OppositeFeature(
			WorkProductDescriptor.class,
			"WorkProductDescriptor_DeliverableDescriptors", UmaPackage.eINSTANCE.getWorkProductDescriptor_DeliverableParts(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the disciplines which an activity
	 * is associated with.
	 */
	public static final OppositeFeature Activity_Disciplines = new OppositeFeature(
			Activity.class,
			"Activity_Disciplines", UmaPackage.eINSTANCE.getDiscipline_ReferenceWorkflows(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the practices which an activity
	 * is associated with.
	 */
	public static final OppositeFeature Activity_Pratices = new OppositeFeature(
			Activity.class,
			"Activity_Pratices", UmaPackage.eINSTANCE.getPractice_ActivityReferences(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the process planning templates
	 * which a process is associated with.
	 */
	public static final OppositeFeature Process_ProcessPlanningTemplates = new OppositeFeature(
			Process.class,
			"Process_ProcessPlanningTemplates", UmaPackage.eINSTANCE.getProcessPlanningTemplate_BasedOnProcesses(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the procesess which references a
	 * capability pattern.
	 */
	public static final OppositeFeature CapabilityPattern_ConsumingProcesses = new OppositeFeature(
			CapabilityPattern.class,
			"CapabilityPattern_ConsumingProcesses", UmaPackage.eINSTANCE.getProcess_IncludesPatterns(), true); //$NON-NLS-1$

	/**
	 * An opposite feature used for retrieving the breakdown element which is
	 * displayed before a breakdown element.
	 */
	public static final OppositeFeature BreakdownElement_PresentedBefore = new OppositeFeature(
			BreakdownElement.class,
			"BreakdownElement_PresentedBefore", //$NON-NLS-1$
			UmaPackage.eINSTANCE.getBreakdownElement_PresentedAfter(), true,
			false);

	/**
	 * An opposite feature used for retrieving the breakdown element which is
	 * displayed after a breakdown element.
	 */
	public static final OppositeFeature BreakdownElement_PresentedAfter = new OppositeFeature(
			BreakdownElement.class,
			"BreakdownElement_PresentedAfter", //$NON-NLS-1$
			UmaPackage.eINSTANCE.getBreakdownElement_PresentedBefore(), true,
			false);

	/**
	 * An opposite feature used for retrieving the UMA sematic model bridges
	 * referenced by a method element.
	 */
	public static final OppositeFeature MethodElement_UMASematicModelBridges = new OppositeFeature(
			MethodElement.class,
			"MethodElement_UMASematicModelBridges", //$NON-NLS-1$
			UmaPackage.eINSTANCE.getUMASemanticModelBridge_Element(), true,
			false);

	private static ArrayList predefinedOppositeFeatures;

	static {
		registerPredefinedOppositeFeatures();
	}

	/**
	 * Registers the predefined opposite features.
	 */
	public static final void registerPredefinedOppositeFeatures() {
		predefinedOppositeFeatures = new ArrayList();
		AssociationHelper object = new AssociationHelper();
		Field[] fields = object.getClass().getDeclaredFields();
		for (int i = 0; i < fields.length; i++) {
			Field field = fields[i];
			int mod = field.getModifiers();
			if (Modifier.isPublic(mod) && Modifier.isStatic(mod)
					&& Modifier.isFinal(mod)
					&& field.getType() == OppositeFeature.class) {
				try {
					predefinedOppositeFeatures.add(field.get(object));
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
			}
		}

		/*
		 * System.out
		 * .println("AssociationHelper.registerPredefinedOppositeFeatures():
		 * defined opposite features: " + predefinedOppositeFeatures.size());
		 * //$NON-NLS-1$ System.out.println(predefinedOppositeFeatures);
		 */

		for (Iterator iter = predefinedOppositeFeatures.iterator(); iter
				.hasNext();) {
			OppositeFeature feature = (OppositeFeature) iter.next();
			OppositeFeature.registerOppositeFeature(feature);
		}
	}

	/**
	 * Gets the predefined opposite features.
	 * 
	 * @return the predefined opposite features
	 */
	public static Collection getPredefinedOppositeFeatures() {
		return predefinedOppositeFeatures;
	}

	/**
	 * Gets the deliverable descriptors which contain the given work product
	 * descriptor.
	 * 
	 * @param wpd
	 *            a work descriptor
	 * @return a list of deliverable descriptors
	 */
	public static List getDeliverableDescriptors(WorkProductDescriptor wpd) {
		return (List) ((MultiResourceEObject) wpd)
				.getOppositeFeatureValue(WorkProductDescriptor_DeliverableDescriptors);
	}

	/**
	 * Gets the task descriptors which use a work product descriptor as an
	 * external input.
	 * 
	 * @param wpd
	 *            a work descriptor
	 * @return a list of task descriptors
	 */
	public static List getExternalInputTo(WorkProductDescriptor wpd) {
		return (List) ((MultiResourceEObject) wpd)
				.getOppositeFeatureValue(WorkProductDescriptor_ExternalInputTo_TaskDescriptors);
	}

	/**
	 * Gets the task descriptors which use a work product descriptor as a
	 * mandatory input.
	 * 
	 * @param wpd
	 *            a work descriptor
	 * @return a list of task descriptors
	 */
	public static List getMandatoryInputTo(WorkProductDescriptor wpd) {
		return (List) ((MultiResourceEObject) wpd)
				.getOppositeFeatureValue(WorkProductDescriptor_MandatoryInputTo_TaskDescriptors);
	}

	/**
	 * Gets the task descriptors which use a work product descriptor as an
	 * optional input.
	 * 
	 * @param wpd
	 *            a work descriptor
	 * @return a list of task descriptors
	 */
	public static List getOptionalInputTo(WorkProductDescriptor wpd) {
		return (List) ((MultiResourceEObject) wpd)
				.getOppositeFeatureValue(WorkProductDescriptor_OptionalInputTo_TaskDescriptors);
	}

	/**
	 * Gets the task descriptors which which produce a work product descriptor
	 * as an output.
	 * 
	 * @param wpd
	 *            a work descriptor
	 * @return a list of task descriptors
	 */
	public static List getOutputFrom(WorkProductDescriptor wpd) {
		return (List) ((MultiResourceEObject) wpd)
				.getOppositeFeatureValue(WorkProductDescriptor_OutputFrom_TaskDescriptors);
	}

	/**
	 * Gets the role descriptors which are responsible for a work product
	 * descriptor.
	 * 
	 * @param wpd
	 *            a work descriptor
	 * @return a list of role descriptors
	 */
	public static List getResponsibleRoleDescriptors(WorkProductDescriptor wpd) {
		return (List) wpd
				.getOppositeFeatureValue(WorkProductDescriptor_ResponsibleRoleDescriptors);
	}

	/**
	 * Gets the the dependent processes referenced in a method configuration.
	 * 
	 * @param e
	 *            a method configuration
	 * @return a list of processes
	 */
	public static List getDependentProcesses(MethodConfiguration e) {
		return (List) ((MultiResourceEObject) e)
				.getOppositeFeatureValue(MethodConfiguration_DependentProcesses);
	}

	/**
	 * Gets the team profiles which includes a specific role descriptor.
	 * 
	 * @param e
	 *            a role descriptor
	 * @return a list of team profiles
	 */
	public static List getTeamProfiles(RoleDescriptor e) {
		return (List) ((MultiResourceEObject) e)
				.getOppositeFeatureValue(RoleDescriptor_TeamProfiles);
	}

	/**
	 * Gets the practices referenced by a content element.
	 * 
	 * @param e
	 *            a content element
	 * @return a list of practices
	 */
	public static List getPractices(ContentElement e) {
		return (List) ((MultiResourceEObject) e)
				.getOppositeFeatureValue(ContentElement_Practices);
	}

	/**
	 * Gets the tool which a tool mentor is categorized under.
	 * 
	 * @param e
	 *            a tool mentor
	 * @return a tool
	 */
	public static List<? extends ToolMentor> getTools(ToolMentor toolMentor) {
		return (List<? extends ToolMentor>) ((MultiResourceEObject) toolMentor)
				.getOppositeFeatureValue(ToolMentor_Tools);
	}

	/**
	 * Gets the successors to a section.
	 * 
	 * @param e
	 *            a section
	 * @return a list of sections that are postioned after the given section
	 */
	public static List getSuccessors(Section section) {
		return (List) ((MultiResourceEObject) section)
				.getOppositeFeatureValue(Section_Successors);
	}

	/**
	 * Gets the immediate variaties of a variability element.
	 * 
	 * @param e
	 *            a variability element
	 * @return a list of immediate variaties
	 */
	public static List getImmediateVarieties(VariabilityElement e) {
		return (List) ((MultiResourceEObject) e)
				.getOppositeFeatureValue(VariabilityElement_ImmediateVarieties);
	}

	/**
	 * Gets the primary tasks of a role.
	 * 
	 * @param role
	 *            a role
	 * @return a list of tasks
	 */
	public static List getPrimaryTasks(Role role) {
		return (List) ((MultiResourceEObject) role)
				.getOppositeFeatureValue(Role_Primary_Tasks);
	}

	/**
	 * Gets the secondary tasks of a role.
	 * 
	 * @param role
	 *            a role
	 * @return a list of tasks
	 */
	public static List getSecondaryTasks(Role role) {
		return (List) ((MultiResourceEObject) role)
				.getOppositeFeatureValue(Role_Secondary_Tasks);
	}

	/**
	 * Gets the successor link of a work breakdown element.
	 * 
	 * @param e
	 *            a break down element
	 * @return a list of links to work breakdown elements
	 */
	public static List getLinkToSuccessor(BreakdownElement e) {
		return (List) ((MultiResourceEObject) e)
				.getOppositeFeatureValue(WorkBreakdownElement_LinkToSuccessor);
	}

	/**
	 * Gets the successor of a work order.
	 * 
	 * @param workOrder
	 *            a work order
	 * @return a work breakdown element
	 */
	public static WorkBreakdownElement getSuccessor(WorkOrder workOrder) {
		return (WorkBreakdownElement) ((MultiResourceEObject) workOrder)
				.getOppositeFeatureValue(WorkOrder_Successor);
	}

	/**
	 * Gets the tasks which produce a work product as an output.
	 * 
	 * @param wp
	 *            a work product
	 * @return a list of tasks
	 */
	public static List getOutputtingTasks(WorkProduct wp) {
		return (List) ((MultiResourceEObject) wp)
				.getOppositeFeatureValue(WorkProduct_OutputFrom_Tasks);
	}

	/**
	 * Gets the tasks which use a work product as a mandatory input.
	 * 
	 * @param wp
	 *            a work product
	 * @return a list of tasks
	 */
	public static List getMandatoryInputToTasks(WorkProduct wp) {
		return (List) ((MultiResourceEObject) wp)
				.getOppositeFeatureValue(WorkProduct_MandatoryInputTo_Tasks);
	}

	/**
	 * Gets the responsible roles for a work product.
	 * 
	 * @param wp
	 *            a work product
	 * @return a list of roles
	 */
	public static List getResponsibleRoles(WorkProduct wp) {
		return (List) wp.getOppositeFeatureValue(WorkProduct_ResponsibleRoles);
	}

	/**
	 * Gets the work products modified by a role.
	 * 
	 * @param role
	 *            a role
	 * @return a list of work products
	 */
	public static List getModifiedWorkProducts(Role role) {
		List performs = getPrimaryTasks(role);
		List modifies = new BasicEList();
		if (performs != null && performs.size() > 0) {
			for (Iterator i = performs.iterator(); i.hasNext();) {
				Task task = (Task) i.next();

				// for each task, get output work product;
				List outputWPs = task.getOutput();
				if (outputWPs != null && outputWPs.size() > 0) {
					for (Iterator it = outputWPs.iterator(); it.hasNext();) {
						WorkProduct wp = (WorkProduct) it.next();
						if (wp != null) {
							if (!modifies.contains(wp)) {
								modifies.add(wp);
							}
						}
					}
				}
			}
		}
		return modifies;

	}

	/**
	 * Gets the roles that modify a work product.
	 * 
	 * @param wp
	 *            a work product
	 * @return a list of roles
	 */
	public static List getModifiedBy(WorkProduct wp) {
		List outputFrom = AssociationHelper.getOutputtingTasks(wp);
		UniqueEList<Role> modifies = new UniqueEList<Role>();
		if (outputFrom != null && outputFrom.size() > 0) {
			for (Iterator it = outputFrom.iterator(); it.hasNext();) {
				//	for each task get, get primary performer role
				Task task = (Task) it.next();
				modifies.addAll(task.getPerformedBy());
			}
		}
		return modifies;
	}

	/**
	 * Gets the discipline groupings which contain a reference to a discipline.
	 * 
	 * @param discipline
	 *            a discipline
	 * @return a list of discipline groupings
	 */
	public static List getDisciplineGroups(Discipline discipline) {
		return (List) ((MultiResourceEObject) discipline)
				.getOppositeFeatureValue(Discipline_DisciplineGroupings);
	}

	/**
	 * Gets the discipline which contain a reference to a subdiscipline.
	 * 
	 * @param discipline
	 *            a discipline
	 * @return a list of discipline groupings
	 */
	public static List getDiscipline(Discipline subdiscipline) {
		return (List) ((MultiResourceEObject) subdiscipline)
				.getOppositeFeatureValue(Subdiscipline_Discipline);
	}

	/**
	 * Gets the domains which a work product is categorized under.
	 * 
	 * @param wp
	 *            a work product
	 * @return a domain
	 */
	public static List getDomains(WorkProduct wp) {
		return (List) ((MultiResourceEObject) wp)
				.getOppositeFeatureValue(WorkProduct_Domains);
	}

	/**
	 * Gets the role set groupings which contain a reference to a role set.
	 * 
	 * @param roleSet
	 *            a role set
	 * @return a list of role set groupings
	 */
	public static List getRoleSetGroups(RoleSet roleSet) {
		return (List) ((MultiResourceEObject) roleSet)
				.getOppositeFeatureValue(RoleSet_RoleSetGrouppings);
	}

	/**
	 * Gets the role sets which a role is categorized under.
	 * 
	 * @param role
	 *            a role
	 * @return a list of role sets
	 */
	public static List getRoleSets(Role role) {
		return (List) ((MultiResourceEObject) role)
				.getOppositeFeatureValue(Role_RoleSets);
	}

	/**
	 * Gets the task descriptors which have been created from a task.
	 * 
	 * @param task
	 *            a task
	 * @return a list of task descriptors
	 */
	public static List getTaskDescriptors(Task task) {
		return (List) task.getOppositeFeatureValue(Task_TaskDescriptors);
	}

	/**
	 * Gets the disciplines which a task is categorized under.
	 * 
	 * @param task
	 *            a task
	 * @return a list of disciplines
	 */
	public static List getDisciplines(Task task) {
		return (List) task.getOppositeFeatureValue(Task_Disciplines);
	}

	/**
	 * Gets the disciplines which an activity is associated with.
	 * 
	 * @param activity
	 *            an activity
	 * @return a list of disciplines
	 */
	public static List getDisciplines(Activity activity) {
		return (List) activity.getOppositeFeatureValue(Activity_Disciplines);
	}

	/**
	 * Gets the primary task descriptors performed by a role descriptor.
	 * 
	 * @param roleDesc
	 *            a role descriptor
	 * @return a list of task descriptors
	 */
	public static List getPrimaryTaskDescriptors(RoleDescriptor roleDesc) {
		return (List) ((MultiResourceEObject) roleDesc)
				.getOppositeFeatureValue(RoleDescriptor_PrimaryTaskDescriptors);
	}

	/**
	 * Gets the additional task descriptors performed by a role descriptor.
	 * 
	 * @param roleDesc
	 *            a role descriptor
	 * @return a list of task descriptors
	 */
	public static List getAdditionalTaskDescriptors(RoleDescriptor roleDesc) {
		return (List) ((MultiResourceEObject) roleDesc)
				.getOppositeFeatureValue(RoleDescriptor_AdditionalTaskDescriptors);
	}

	/**
	 * Gets the assisting task descriptors performed by a role descriptor.
	 * 
	 * @param roleDesc
	 *            a role descriptor
	 * @return a list of task descriptors
	 */
	public static List getAssistedTaskDescriptors(RoleDescriptor roleDesc) {
		return (List) ((MultiResourceEObject) roleDesc)
				.getOppositeFeatureValue(RoleDescriptor_AssistsIn_TaskDescriptors);
	}

	/**
	 * Gets the work product types which a work product is categorized under.
	 * 
	 * @param wp
	 *            a work product
	 * @return a list of work product types
	 */
	public static List getWorkProductTypes(WorkProduct wp) {
		return (List) ((MultiResourceEObject) wp)
				.getOppositeFeatureValue(WorkProduct_WorkProductTypes);
	}

	/**
	 * Gets the custom categories which a describable element is associated
	 * with.
	 * 
	 * @param wp
	 *            a describable element
	 * @return a list of custom categories
	 */
	public static List getCustomCategories(DescribableElement element) {
		return (List) ((MultiResourceEObject) element)
				.getOppositeFeatureValue(DescribableElement_CustomCategories);
	}

	/**
	 * Gets the Deliverables which a WorkProduct element is associated with.
	 * 
	 * @param wp
	 *            a WorkProduct element
	 * @return a list of Deliverables
	 */
	public static List getDeliverables(WorkProduct element) {
		return (List) ((MultiResourceEObject) element)
				.getOppositeFeatureValue(WorkProduct_Deliverables);
	}

	/**
	 * Gets the method plug-ins referenced by a method plug-in.
	 * 
	 * @param plugin
	 *            a method plug-in
	 * @return a list of method plug-ins
	 */
	public static List<MethodPlugin> getPluginDirectExtensions(MethodPlugin plugin) {
		return (List<MethodPlugin>) ((MultiResourceEObject) plugin)
				.getOppositeFeatureValue(MethodPlugin_DirectExtensions);
	}

	/**
	 * Gets all the references to a method element.
	 * 
	 * @param element
	 *            a method element
	 * @return a collection of method element references
	 */
	public static Collection getReferences(MethodElement element) {
		Set references = new HashSet();
		MultiResourceEObject eObj = (MultiResourceEObject) element;

		if (eObj.basicGetOppositeFeatureMap() == null)
			return references;

		for (Iterator iter = eObj.getOppositeFeatureMap().entrySet().iterator(); iter
				.hasNext();) {
			Map.Entry entry = (Map.Entry) iter.next();
			OppositeFeature oppositeFeature = ((OppositeFeature) entry.getKey());
			oppositeFeature.getTargetFeature();
			if (oppositeFeature.isMany()) {
				references.addAll((Collection) eObj
						.getOppositeFeatureValue(oppositeFeature));
			} else {
				EObject obj = (EObject) eObj
						.getOppositeFeatureValue(oppositeFeature);
				if (obj != null) {
					references.add(obj);
				}
			}
		}

		return references;
	}

	/**
	 * Gets all the references to a method element.
	 * 
	 * @param element
	 *            a method element
	 * @return a map containing method element references
	 */
	public static Map<EObject, Collection<EStructuralFeature>> getReferenceMap(MethodElement element) {
		Map<EObject, Collection<EStructuralFeature>> objectToFeaturesMap = new HashMap<EObject, Collection<EStructuralFeature>>();

		MultiResourceEObject eObj = (MultiResourceEObject) element;

		if (eObj.basicGetOppositeFeatureMap() == null) {
			return objectToFeaturesMap;
		}

		for (Iterator iter = eObj.getOppositeFeatureMap().entrySet().iterator(); iter
				.hasNext();) {
			Map.Entry entry = (Map.Entry) iter.next();
			OppositeFeature oppositeFeature = ((OppositeFeature) entry.getKey());
			EStructuralFeature feature = oppositeFeature.getTargetFeature();
			if (oppositeFeature.isMany()) {
				for (Iterator iterator = ((Collection) eObj
						.getOppositeFeatureValue(oppositeFeature)).iterator(); iterator
						.hasNext();) {
					EObject object = (EObject) iterator.next();
					Collection<EStructuralFeature> features = objectToFeaturesMap
							.get(object);
					if (features == null) {
						features = new ArrayList<EStructuralFeature>();
						objectToFeaturesMap.put(object, features);
					}
					features.add(feature);
				}
				;
			} else {
				EObject object = (EObject) eObj
						.getOppositeFeatureValue(oppositeFeature);
				if (object != null) {
					Collection<EStructuralFeature> features = objectToFeaturesMap
							.get(object);
					if (features == null) {
						features = new ArrayList<EStructuralFeature>();
						objectToFeaturesMap.put(object, features);
					}
					features.add(feature);
				}
			}
		}

		return objectToFeaturesMap;
	}

	public static final void init() {
	}

	/**
	 * Given a set of elements, returns the set of those elements plus any
	 * variability elements associated with them.
	 * 
	 * @param elementSet
	 *            a set of method elements for which to retrieve the variability
	 *            elements
	 * @param getBases
	 *            if <code>true</code>, recurse into the variability base
	 *            elements ("up the tree")
	 * @param getChildren
	 *            if <code>true</code>, recurse into the varieties ("down the
	 *            tree")
	 * @return a collective set of method elements plus the associated
	 *         variability elements
	 */
	public static Set getVariabilityElements(Set elementSet, boolean getBases,
			boolean getChildren) {
		if (elementSet != null && !elementSet.isEmpty()) {
			Set varSet = new HashSet();
			for (Iterator iter = elementSet.iterator(); iter.hasNext();) {
				Object o = iter.next();
				if (o instanceof VariabilityElement) {
					VariabilityElement element = (VariabilityElement) o;
					if (getChildren)
						varSet.addAll(getImmediateVarieties(element));
					if (getBases
							&& element.getVariabilityBasedOnElement() != null)
						varSet.add(element.getVariabilityBasedOnElement());
				}
			}
			if (varSet.isEmpty())
				return elementSet;
			if (elementSet.containsAll(varSet))
				return elementSet;
			elementSet.addAll(varSet);
			elementSet.addAll(getVariabilityElements(elementSet, getBases,
					getChildren));
		}
		return elementSet;
	}

}