//------------------------------------------------------------------------------ // 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.FulfillableElement; 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 fulfills elements which a workproduct is * associated with. */ public static final OppositeFeature FulFills_FullFillableElements = new OppositeFeature( FulfillableElement.class, "FulFills_FullFillableElements", UmaPackage.eINSTANCE.getFulfillableElement_Fulfills(), 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(), true); //$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 list of work products for which given work product fulfills. * * @param wp * a work product * @return a list of work products */ public static List getFullFills(WorkProduct wp) { return (List) wp.getOppositeFeatureValue(FulFills_FullFillableElements); } /** * 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; } }