//------------------------------------------------------------------------------ // Copyright (c) 2005, 2007 IBM Corporation and others. // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // which accompanies this distribution, and is available at // http://www.eclipse.org/legal/epl-v10.html // // Contributors: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.library.edit.util; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.MissingResourceException; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.NotificationImpl; import org.eclipse.emf.common.util.AbstractTreeIterator; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator; import org.eclipse.emf.edit.provider.IChangeNotifier; import org.eclipse.emf.edit.provider.IItemLabelProvider; import org.eclipse.emf.edit.provider.ITreeItemContentProvider; import org.eclipse.emf.edit.provider.IWrapperItemProvider; import org.eclipse.emf.edit.provider.ItemProviderAdapter; import org.eclipse.emf.edit.provider.ViewerNotification; import org.eclipse.emf.edit.provider.WrapperItemProvider; import org.eclipse.epf.common.utils.StrUtil; import org.eclipse.epf.library.edit.IConfigurationApplicator; import org.eclipse.epf.library.edit.IConfigurator; import org.eclipse.epf.library.edit.IFilter; import org.eclipse.epf.library.edit.LibraryEditPlugin; import org.eclipse.epf.library.edit.LibraryEditResources; import org.eclipse.epf.library.edit.Providers; import org.eclipse.epf.library.edit.TngAdapterFactory; import org.eclipse.epf.library.edit.command.IActionManager; import org.eclipse.epf.library.edit.meta.TypeDefUtil; import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider; import org.eclipse.epf.library.edit.process.BSActivityItemProvider; import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider; import org.eclipse.epf.library.edit.process.ComposedBreakdownElementWrapperItemProvider; import org.eclipse.epf.library.edit.process.DescribableElementWrapperItemProvider; import org.eclipse.epf.library.edit.process.IBSItemProvider; import org.eclipse.epf.library.edit.process.IBreakdownElementWrapperItemProviderFactory; import org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider; import org.eclipse.epf.library.edit.process.TaskDescriptorWrapperItemProvider; import org.eclipse.epf.library.edit.process.WorkProductDescriptorWrapperItemProvider; import org.eclipse.epf.library.edit.process.command.BSDropCommand; import org.eclipse.epf.library.edit.process.command.CopyHelper; import org.eclipse.epf.library.edit.process.command.ProcessCommandUtil; import org.eclipse.epf.library.edit.process.command.ProcessDeepCopyCommand; import org.eclipse.epf.library.edit.process.command.WBSDropCommand; import org.eclipse.epf.library.edit.process.internal.BreakdownElementWrapperItemProviderFactory; import org.eclipse.epf.library.edit.realization.IRealizationManager; import org.eclipse.epf.library.edit.ui.UserInteractionHelper; import org.eclipse.epf.library.edit.util.PredecessorList.DepthLevelItemProvider; import org.eclipse.epf.library.edit.validation.NameChecker; import org.eclipse.epf.uma.Activity; import org.eclipse.epf.uma.Artifact; import org.eclipse.epf.uma.BreakdownElement; import org.eclipse.epf.uma.CompositeRole; import org.eclipse.epf.uma.ContentPackage; import org.eclipse.epf.uma.Deliverable; import org.eclipse.epf.uma.Descriptor; import org.eclipse.epf.uma.Guidance; import org.eclipse.epf.uma.MethodConfiguration; import org.eclipse.epf.uma.MethodElement; import org.eclipse.epf.uma.MethodElementProperty; import org.eclipse.epf.uma.MethodPlugin; import org.eclipse.epf.uma.Milestone; import org.eclipse.epf.uma.Process; import org.eclipse.epf.uma.ProcessComponent; import org.eclipse.epf.uma.ProcessPackage; import org.eclipse.epf.uma.Role; import org.eclipse.epf.uma.RoleDescriptor; import org.eclipse.epf.uma.Section; import org.eclipse.epf.uma.Step; import org.eclipse.epf.uma.Task; import org.eclipse.epf.uma.TaskDescriptor; import org.eclipse.epf.uma.TeamProfile; import org.eclipse.epf.uma.UmaFactory; import org.eclipse.epf.uma.UmaPackage; import org.eclipse.epf.uma.VariabilityElement; import org.eclipse.epf.uma.VariabilityType; 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.provider.UmaEditPlugin; import org.eclipse.epf.uma.util.AssociationHelper; import org.eclipse.epf.uma.util.ExtendedReference; import org.eclipse.epf.uma.util.ModifiedTypeMeta; import org.eclipse.epf.uma.util.Scope; import org.eclipse.epf.uma.util.UmaUtil; import com.ibm.icu.text.MessageFormat; import com.ibm.icu.util.StringTokenizer; /** * Utility class that defines static methods for process authoring * * @author Phong Nguyen Le * @author Shilpa Toraskar * @since 1.0 */ public final class ProcessUtil { private static Collection<EClass> OBSEclasses = null; private static Collection<EClass> WBSEclasses = null; private static Collection<EClass> PBSEclasses = null; private static Collection<VariabilityType> extendAndLocalContributionVariabilityTypes = null; public static boolean isSynFree() { boolean synFree = LibraryEditUtil.getInstance().isSynFree(); return synFree; } private static Collection<VariabilityType> getExtendAndLocalContributionVariabilityTypes() { if (extendAndLocalContributionVariabilityTypes == null) { extendAndLocalContributionVariabilityTypes = new ArrayList<VariabilityType>(); extendAndLocalContributionVariabilityTypes .add(VariabilityType.EXTENDS); extendAndLocalContributionVariabilityTypes .add(VariabilityType.LOCAL_CONTRIBUTION); } return extendAndLocalContributionVariabilityTypes; } public static String checkBreakdownElementName( AdapterFactory adapterFactory, BreakdownElement e, String name, Suppression suppression) { return NameChecker.checkName(adapterFactory, e, UmaPackage.eINSTANCE .getNamedElement_Name(), name, suppression); } public static String checkBreakdownElementName( AdapterFactory adapterFactory, BreakdownElement e, String name, Suppression suppression, boolean ignoreSuppressed) { return NameChecker.checkName(adapterFactory, e, UmaPackage.eINSTANCE .getNamedElement_Name(), name, suppression, ignoreSuppressed); } public static String checkBreakdownElementPresentationName( AdapterFactory adapterFactory, BreakdownElement e, String name, Suppression suppression) { // might allow empty presentation name for extender or contributor. The element will inherit // the presentation name from the base element. Check will be performed on the inherited name // if (name == null || name.length() == 0) { if (isExtendingOrLocallyContributing(e)) { BreakdownElement base = (BreakdownElement) ((VariabilityElement) e) .getVariabilityBasedOnElement(); name = getPresentationName(base); } } return NameChecker.checkName(adapterFactory, e, UmaPackage.eINSTANCE .getMethodElement_PresentationName(), name, suppression); } public static String checkBreakdownElementPresentationName( AdapterFactory adapterFactory, BreakdownElement e, String name, Suppression suppression, boolean ignoreSuppressed) { return NameChecker.checkName(adapterFactory, e, UmaPackage.eINSTANCE .getMethodElement_PresentationName(), name, suppression, ignoreSuppressed); } public static Object getRootProcess(AdapterFactory adapterFactory, ItemProviderAdapter adapter, Object obj) { Object parent = adapter.getParent(obj); adapter = (ItemProviderAdapter) adapterFactory.adapt(parent, ITreeItemContentProvider.class); if (parent == null) { return obj; } else { return getRootProcess(adapterFactory, adapter, parent); } } public static Collection<EClass> getWBSEclasses() { if (WBSEclasses == null) { WBSEclasses = new HashSet<EClass>(); WBSEclasses.add(UmaPackage.eINSTANCE.getTaskDescriptor()); WBSEclasses.add(UmaPackage.eINSTANCE.getActivity()); WBSEclasses.add(UmaPackage.eINSTANCE.getMilestone()); } return WBSEclasses; } public static Collection<EClass> getOBSEclasses() { if (OBSEclasses == null) { OBSEclasses = new HashSet<EClass>(); OBSEclasses.add(UmaPackage.eINSTANCE.getRoleDescriptor()); OBSEclasses.add(UmaPackage.eINSTANCE.getActivity()); OBSEclasses.add(UmaPackage.eINSTANCE.getMilestone()); OBSEclasses.add(UmaPackage.eINSTANCE.getTeamProfile()); OBSEclasses.add(UmaPackage.eINSTANCE.getCompositeRole()); } return OBSEclasses; } public static Collection<EClass> getPBSEclasses() { if (PBSEclasses == null) { PBSEclasses = new HashSet<EClass>(); PBSEclasses.add(UmaPackage.eINSTANCE.getWorkProductDescriptor()); PBSEclasses.add(UmaPackage.eINSTANCE.getActivity()); PBSEclasses.add(UmaPackage.eINSTANCE.getMilestone()); } return PBSEclasses; } public static boolean isFirstElement(AdapterFactory adapterFactory, ItemProviderAdapter itemProvider, Object obj) { Object parent = itemProvider.getParent(obj); if (parent instanceof TeamProfile) return true; LinkedList siblings = getSiblings(adapterFactory, itemProvider, obj); if (siblings != null && !siblings.isEmpty()) { return siblings.getFirst() == obj; } return true; } public static LinkedList getSiblings(AdapterFactory adapterFactory, ItemProviderAdapter itemProvider, Object obj) { Object parent = itemProvider.getParent(obj); if (parent == null) return null; ITreeItemContentProvider parentItemProvider = (ITreeItemContentProvider) adapterFactory .adapt(parent, ITreeItemContentProvider.class); if (parentItemProvider != null) { return new LinkedList(parentItemProvider.getChildren(parent)); } return null; } public static boolean isLastElement(AdapterFactory adapterFactory, ItemProviderAdapter itemProvider, Object obj) { Object parent = itemProvider.getParent(obj); if (parent instanceof TeamProfile) return true; LinkedList siblings = getSiblings(adapterFactory, itemProvider, obj); if (siblings != null && !siblings.isEmpty()) { return siblings.getLast() == obj; } return true; } /** * Gets elements that have been affected after the event that triggered the * given notification. * * @param notification * @param filter * @return */ public static List getAffectedElements(Notification notification, IFilter filter) { List affectedElements = new ArrayList(); switch (notification.getEventType()) { case Notification.ADD: Object obj = notification.getNewValue(); if (filter == null || filter.accept(obj)) { affectedElements.add(obj); } break; case Notification.ADD_MANY: for (Iterator iter = ((Collection) notification.getNewValue()) .iterator(); iter.hasNext();) { Object element = iter.next(); if (filter == null || filter.accept(element)) { affectedElements.add(element); } } break; case Notification.REMOVE: obj = notification.getOldValue(); if (filter == null || filter.accept(obj)) { affectedElements.add(obj); } break; case Notification.REMOVE_MANY: for (Iterator iter = ((Collection) notification.getOldValue()) .iterator(); iter.hasNext();) { Object element = iter.next(); if (filter == null || filter.accept(element)) { affectedElements.add(element); } } break; case Notification.MOVE: obj = notification.getNewValue(); if (obj instanceof Collection) { for (Iterator iter = ((Collection) obj).iterator(); iter .hasNext();) { Object element = iter.next(); if (filter == null || filter.accept(element)) { affectedElements.add(element); } } } else { if (filter == null || filter.accept(obj)) { affectedElements.add(obj); } } break; } return affectedElements; } public static boolean isRefreshRequired(Notification notification, IFilter filter) { switch (notification.getEventType()) { case Notification.SET: case Notification.ADD: Object obj = notification.getNewValue(); if (filter == null || filter.accept(obj)) { return true; } break; case Notification.ADD_MANY: for (Iterator iter = ((Collection) notification.getNewValue()) .iterator(); iter.hasNext();) { Object element = iter.next(); if (filter == null || filter.accept(element)) { return true; } } break; case Notification.REMOVE: obj = notification.getOldValue(); if (filter == null || filter.accept(obj)) { return true; } break; case Notification.REMOVE_MANY: for (Iterator iter = ((Collection) notification.getOldValue()) .iterator(); iter.hasNext();) { Object element = iter.next(); if (filter == null || filter.accept(element)) { return true; } } break; case Notification.MOVE: obj = notification.getNewValue(); if (obj instanceof Collection) { for (Iterator iter = ((Collection) obj).iterator(); iter .hasNext();) { Object element = iter.next(); if (filter == null || filter.accept(element)) { return true; } } } else { if (filter == null || filter.accept(obj)) { return true; } } break; } return false; } public static void addToContainer(BreakdownElement e, ItemProviderAdapter itemProvider) { addToContainer(e, itemProvider, true); } /** * Adds the given BreakdownElement to a new container if it does not have * one or moves it to the right container if requested. * * @param e * @param itemProvider */ public static void addToContainer(BreakdownElement e, ItemProviderAdapter itemProvider, boolean move) { ProcessPackage pkg = null; Object parent = itemProvider.getParent(e); if (parent instanceof EObject) { EObject container = ((EObject) parent).eContainer(); if (container instanceof ProcessPackage) { pkg = (ProcessPackage) container; } } if (pkg == null) { return; } if (e instanceof Activity) { Activity act = (Activity) e; if (act.eContainer() == null) { // create new ProcessPackage for the activity // ProcessPackage newPkg = UmaFactory.eINSTANCE .createProcessPackage(); newPkg.setName(act.getName()); pkg.getChildPackages().add(newPkg); newPkg.getProcessElements().add(e); } else if (move) { // Check if the activity's ProcessPackage is at the right place. // If not, move it to the right ProcessComponent. // ProcessPackage oldPkg = (ProcessPackage) act.eContainer(); if (oldPkg.eContainer() != pkg) { pkg.getChildPackages().add(oldPkg); } } } else { if (e.eContainer() == null) { pkg.getProcessElements().add(e); } else if (move && e.eContainer() != pkg) { // move to new ProcessPackage // pkg.getProcessElements().add(e); } } } public static void setParent(Object child, Object parent, AdapterFactory adapterFactory) { Object adapter = adapterFactory.adapt(child, ITreeItemContentProvider.class); if (adapter instanceof IBSItemProvider) { ((IBSItemProvider) adapter).setParent(parent); } // else { // System.out // .println(LibraryEditResources.util_ProcessUtil_err_setparent + child); //$NON-NLS-1$ // System.out // .println(LibraryEditResources.util_ProcessUtil_childadapter + adapter); //$NON-NLS-1$ // } } /** * Creates a new RoleDescriptor from the given role. * * @param role * @return */ public static RoleDescriptor createRoleDescriptor(Role role) { return createRoleDescriptor(role, false); } /** * Creates a new RoleDescriptor from the given role. * * @param role * @return */ public static RoleDescriptor createRoleDescriptor(Role role, boolean isDynamic) { RoleDescriptor roleDesc = UmaFactory.eINSTANCE.createRoleDescriptor(); roleDesc.setRole(role); String presentationName = role.getPresentationName(); roleDesc.setName(role.getName()); roleDesc.setPresentationName(StrUtil.isBlank(presentationName) ? role .getName() : presentationName); // roleDesc.setBriefDescription(role.getBriefDescription()); if (isSynFree() && isDynamic) { DescriptorPropUtil.getDesciptorPropUtil().setCreatedByReference(roleDesc, true); } return roleDesc; } public static WorkProductDescriptor createWorkProductDescriptor( WorkProduct wp) { return createWorkProductDescriptor(wp, false); } public static WorkProductDescriptor createWorkProductDescriptor( WorkProduct wp, boolean isDynamic) { WorkProductDescriptor wpDesc = UmaFactory.eINSTANCE .createWorkProductDescriptor(); wpDesc.setWorkProduct(wp); wpDesc.setName(wp.getName()); wpDesc .setPresentationName(StrUtil.isBlank(wp.getPresentationName()) ? wp .getName() : wp.getPresentationName()); // wpDesc.setBriefDescription(wp.getBriefDescription()); if (isSynFree() && isDynamic) { DescriptorPropUtil.getDesciptorPropUtil().setCreatedByReference(wpDesc, true); } return wpDesc; } public static boolean refreshNeeded(AdapterFactory adapterFactory, BSActivityItemProvider itemProvider) { return UserInteractionHelper.getUIHelper().refreshNeeded(adapterFactory, itemProvider); } public static void refreshPredeccessorLists(AdapterFactory factory, Process proc) { List<DepthLevelItemProvider> list = PredecessorList.createItemProviderList(proc, factory); for (DepthLevelItemProvider ip : list) { Object itemProvider = ip.getItemProvider(); if(itemProvider instanceof IBSItemProvider) { PredecessorList predList = ((IBSItemProvider)itemProvider).getPredecessors(); if(predList != null) { predList.refresh(list); } } } } /** * Updates IDs of work breakdown elements of the view of the given process * * @param factory * adapter factory of the current process view (WBS, TBS, WPBS, * CBS) * @param proc * must be refreshed. */ public static void updateIDs(AdapterFactory factory, Process proc) { AdapterFactoryTreeIterator<Object> iter = new AdapterFactoryTreeIterator<Object>( factory, proc) { private static final long serialVersionUID = 1L; @Override protected Iterator<Object> getChildren(Object o) { Object e = TngUtil.unwrap(o); if(e instanceof Descriptor || e instanceof Milestone) { return Collections.emptyList().iterator(); } return super.getChildren(o); } }; Object obj; for (int id = 0; iter.hasNext();) { obj = iter.next(); Object adapter = factory.adapt(obj, ITreeItemContentProvider.class); if (adapter instanceof IBSItemProvider) { IBSItemProvider itemProvider = (IBSItemProvider) adapter; if (itemProvider != null && TngUtil.unwrap(obj) instanceof WorkBreakdownElement) { itemProvider.setId(id++); } } } } public static void refreshViewer(AdapterFactory factory, Process proc) { UserInteractionHelper.getUIHelper().refreshViewer(factory, proc); } /** * Refreshes the element IDs in those viewers that require this. * * @param adapterFactory */ public static void refreshIDsInViewers(final ExposedAdapterFactory adapterFactory) { UserInteractionHelper.getUIHelper().refreshIDsInViewer(adapterFactory); } public static void refreshAllViewers(final ExposedAdapterFactory adapterFactory) { UserInteractionHelper.getUIHelper().refreshAllViewers(adapterFactory); } /** * @param e * the breakdown element whose predecessor list to be checked. * @param predIdList * a list of predecessor IDs (Integer) as shown in the ID column * of the editor * @param adapterFactory * @param process * @param predecessors * output, the predecessor list * @return null if predList is valid, an error message otherwise */ public static String checkPredecessorList(WorkBreakdownElement e, List<Integer> predIdList, AdapterFactory adapterFactory, Object process, List<Object> predecessors) { // get BreakdownElement list from ID list // List<Object> beList = new ArrayList<Object>(); List<Object> allElements = new ArrayList<Object>(); for (Iterator<Object> iter = new AdapterFactoryTreeIterator<Object>(adapterFactory, process); iter.hasNext();) { Object obj = iter.next(); IBSItemProvider itemProvider = (IBSItemProvider) adapterFactory .adapt(obj, ITreeItemContentProvider.class); Integer id = new Integer(itemProvider.getId()); Object element = TngUtil.unwrap(obj); allElements.add(element); if (predIdList.contains(id)) { beList.add(obj); } } // check for circular dependency // int size = beList.size(); for (int i = 0; i < size; i++) { Object obj = TngUtil.unwrap(beList.get(i)); if (obj instanceof WorkBreakdownElement) { WorkBreakdownElement pred = (WorkBreakdownElement) obj; if (ProcessUtil.checkCircular(e, pred, allElements)) { return LibraryEditResources.util_ProcessUtil_err_same_breakdown_element; } if (TngUtil.isSubelementOf(pred, e, adapterFactory)) { return LibraryEditResources.util_ProcessUtil_err_same_sub_element; } if (TngUtil.isSuperElementOf(pred, e, adapterFactory)) { return LibraryEditResources.util_ProcessUtil_err_child_element; } } else return LibraryEditResources.util_ProcessUtil_err_wrong_element; } if (predecessors != null) predecessors.addAll(beList); return null; } /** * Checks for circular dependency * * @param successor * @param predecessor * @param list * the list of all breakdown elements in the breakdown structure */ public static boolean checkCircular(WorkBreakdownElement successor, WorkBreakdownElement predecessor, List list) { if (successor == predecessor) { if (predecessor.getIsRepeatable().booleanValue()) { return false; } return true; } for (Iterator<?> iter = predecessor.getLinkToPredecessor().iterator(); iter .hasNext();) { WorkOrder element = (WorkOrder) iter.next(); WorkBreakdownElement pred = element.getPred(); if (pred != predecessor && list.contains(pred)) { if (checkCircular(successor, pred, list)) return true; } } return false; } public static void getAllPredecessorList(WorkBreakdownElement predecessor, List list, List predList) { if (!predList.contains(predecessor)) predList.add(predecessor); for (Iterator iter = predecessor.getLinkToPredecessor().iterator(); iter .hasNext();) { WorkOrder element = (WorkOrder) iter.next(); WorkBreakdownElement pred = (WorkBreakdownElement) element .getPred(); if (pred != predecessor && list.contains(pred)) { if (!predList.contains(pred)) { predList.add(pred); getAllPredecessorList(pred, list, predList); } } } } /** * * @param e * the breakdown element whose predecessor list to be checked. * @param predList * a comma-separated list of predecessor IDs * @param adapterFactory * @param topAct * @param predecessors * output, the predecessor list * @param allElements * output, the whole breakdown element list is copied into this * list. * @return null if predList is valid. The predecessor list is saved in * predecessors and the whole breakdown element list is saved in * allElements. */ public static String checkPredecessorList(WorkBreakdownElement e, String predList, AdapterFactory adapterFactory, Object topAct, List<Object> predecessors) { List<Integer> idList = new ArrayList<Integer>(); for (StringTokenizer tokens = new StringTokenizer(predList, ","); tokens.hasMoreTokens();) { //$NON-NLS-1$ String token = tokens.nextToken().trim(); Integer id; try { id = new Integer(token); } catch (NumberFormatException ex) { return LibraryEditResources.invalidPredecessorError_msg; } idList.add(id); } return checkPredecessorList(e, idList, adapterFactory, topAct, predecessors); } /** * Adds the given object's method package and plugin to the default * configuration of the given process if they are not in the configuration * yet. * * @param proc * @param object * @param addedObjects */ public static void addToDefaultConfiguration(Process proc, EObject e, Set addedObjects) { // add the element's method package to the default configuration // MethodConfiguration config = proc.getDefaultContext(); if (e instanceof Task) { addTaskToDefaultConfiguration(proc, (Task) e, addedObjects, true); } else if (e instanceof WorkProduct) { WorkProduct wp = (WorkProduct) e; addWPToDefaultConfiguration(proc, wp, addedObjects); List tasks = getTasksForWorkProduct(wp, config); if (tasks != null) { for (Iterator iter = tasks.iterator(); iter.hasNext();) { addTaskToDefaultConfiguration(proc, (Task) iter.next(), addedObjects, false); } } } else if (e instanceof Role) { Role role = (Role) e; addRoleToDefaultConfiguration(proc, role, addedObjects); } else if (e instanceof Activity) { addActivityToDefaultConfiguration(proc, (Activity) e, addedObjects); } else if (e instanceof Guidance) { TngUtil.addToConfiguration(config, (Guidance) e, addedObjects); } } private static void addActivityToDefaultConfiguration(Process proc, Activity activity, Set addedObjects) { MethodConfiguration config = proc.getDefaultContext(); TngUtil.addTo(config, UmaUtil.getProcessComponent(activity), addedObjects); // add linked element of descriptors // for (Iterator iter = activity.getBreakdownElements().iterator(); iter.hasNext();) { Object e = (Object) iter.next(); if(e instanceof Descriptor) { MethodElement o = ProcessUtil.getAssociatedElement((Descriptor) e); if(o != null) { addToDefaultConfiguration(proc, o, addedObjects); } } else if (e instanceof Activity){ // this is needed for adding sub-activities descriptors addActivityToDefaultConfiguration(proc, (Activity) e, addedObjects); } } // add all the base elements if there is any for (Activity base = (Activity) activity.getVariabilityBasedOnElement(); base != null; base = (Activity) base .getVariabilityBasedOnElement()) { addActivityToDefaultConfiguration(proc, base, addedObjects); } } private static void addTaskToDefaultConfiguration(Process proc, Task task, Set addedObjects, boolean includeWorkProducts) { MethodConfiguration config = proc.getDefaultContext(); TngUtil.addToConfiguration(config, task, addedObjects); // add all other dependencies // // add roles ArrayList<EObject> dependencies = new ArrayList<EObject>(); dependencies.addAll(task.getAdditionallyPerformedBy()); dependencies.addAll(task.getPerformedBy()); for (EObject eObject : dependencies) { TngUtil.addToConfiguration(config, eObject, addedObjects); } // add work products if (includeWorkProducts) { dependencies.clear(); dependencies.addAll(task.getOptionalInput()); dependencies.addAll(task.getOutput()); dependencies.addAll(task.getMandatoryInput()); for (EObject eObject : dependencies) { addWPToDefaultConfiguration(proc, (WorkProduct) eObject, addedObjects); } } for (Section step : task.getSteps()) { EObject base = step.getVariabilityBasedOnElement(); if (base != null) { TngUtil.addToConfiguration(config, base, addedObjects); } } } private static void addRoleToDefaultConfiguration(Process proc, Role role, Set addedObjects) { MethodConfiguration config = proc.getDefaultContext(); TngUtil.addToConfiguration(config, role, addedObjects); // add work products ArrayList dependencies = new ArrayList(); dependencies.addAll(role.getModifies()); dependencies.addAll(role.getResponsibleFor()); for (Iterator iter = dependencies.iterator(); iter.hasNext();) { addWPToDefaultConfiguration(proc, (WorkProduct) iter.next(), addedObjects); } } private static void addWPToDefaultConfiguration(Process proc, WorkProduct wp, Set addedObjects) { MethodConfiguration config = proc.getDefaultContext(); TngUtil.addToConfiguration(config, wp, addedObjects); if (wp instanceof Deliverable) { for (Iterator iter = ((Deliverable) wp).getDeliveredWorkProducts() .iterator(); iter.hasNext();) { TngUtil.addToConfiguration(config, (EObject) iter.next(), addedObjects); } } } public static void updateTaskDescriptorSteps(Activity activity, TaskDescriptor taskDesc) { if (taskDesc == null) { return; } Task task = taskDesc.getTask(); IConfigurationApplicator configApplicator = Providers .getConfigurationApplicator(); MethodConfiguration config = TngUtil.getOwningProcess(activity) .getDefaultContext(); List<Step> steps = (List<Step>) configApplicator.getReference(task, UmaPackage.eINSTANCE.getTask_Steps(), config); // add those steps to TaskDescriptor if they are not there yet. // for (Step step : steps) { if (!taskDesc.getSelectedSteps().contains(step)) { taskDesc.getSelectedSteps().add(step); } } } /** * Gets the MethodElement that the given descriptor is associated with. * * @param descriptor * @return */ public static MethodElement getAssociatedElement(Descriptor descriptor) { if (descriptor instanceof RoleDescriptor) { return ((RoleDescriptor) descriptor).getRole(); } else if (descriptor instanceof TaskDescriptor) { return ((TaskDescriptor) descriptor).getTask(); } else if (descriptor instanceof WorkProductDescriptor) { return ((WorkProductDescriptor) descriptor).getWorkProduct(); } return null; } public static EReference getLinkReference(Descriptor descriptor) { if (descriptor instanceof RoleDescriptor) { return UmaPackage.eINSTANCE.getRoleDescriptor_Role(); } else if (descriptor instanceof TaskDescriptor) { return UmaPackage.eINSTANCE.getTaskDescriptor_Task(); } else if (descriptor instanceof WorkProductDescriptor) { return UmaPackage.eINSTANCE.getWorkProductDescriptor_WorkProduct(); } return null; } public static void disposeWrappers(Collection children) { if (children == null) return; for (Iterator iter = children.iterator(); iter.hasNext();) { Object element = iter.next(); if (element instanceof IWrapperItemProvider) { ((IWrapperItemProvider) element).dispose(); } } } /** * Get all tasks that have the given workproduct in their output * in the given configuration * * @param wp * @param config * @return */ public static List getTasksForWorkProduct(WorkProduct wp, MethodConfiguration config) { IConfigurationApplicator configApplicator = Providers.getConfigurationApplicator(); List tasks = (List) configApplicator.getReference(wp, AssociationHelper.WorkProduct_OutputFrom_Tasks, config); return tasks; } /** * Get all workproducts that have the role as responsible role in the * given configuration * * @param wp * @param config * @return */ public static List getWorkProductsForRole(Role role, MethodConfiguration config) { IConfigurationApplicator configApplicator = Providers.getConfigurationApplicator(); List wps = (List) configApplicator.getReference(role, UmaPackage.eINSTANCE.getRole_ResponsibleFor(), config); return wps; } /** * Gets all workproducts which are, except the contributor, in the given * plugin. * * @param plugin * @return */ public static List getAllWorkProducts(MethodPlugin plugin) { ContentPackage coreContentPkg = UmaUtil.findContentPackage(plugin, ModelStructure.DEFAULT.coreContentPath); Iterator iter = new AbstractTreeIterator(coreContentPkg, false) { /** * Comment for <code>serialVersionUID</code> */ private static final long serialVersionUID = 3833752066324837937L; protected Iterator getChildren(Object object) { if (!(object instanceof ContentPackage)) return Collections.EMPTY_LIST.iterator(); ContentPackage pkg = (ContentPackage) object; List children = new ArrayList(); for (Iterator iterator = pkg.getChildPackages().iterator(); iterator .hasNext();) { Object element = iterator.next(); if (element instanceof ContentPackage) { children.add(element); } } for (Iterator iterator = pkg.getContentElements().iterator(); iterator .hasNext();) { Object element = iterator.next(); if ((element instanceof WorkProduct) && !TngUtil .isContributor((VariabilityElement) element)) { children.add(element); } } return children.iterator(); } }; List methodElements = new ArrayList(); while (iter.hasNext()) { Object e = iter.next(); if (e instanceof WorkProduct) { methodElements.add(e); } } return methodElements; } /** * Gets all task, except the contributor, in the given plugin. * * @param plugin * @return */ public static List getAllTasks(MethodPlugin plugin) { ContentPackage coreContentPkg = UmaUtil.findContentPackage(plugin, ModelStructure.DEFAULT.coreContentPath); Iterator iter = new AbstractTreeIterator(coreContentPkg, false) { /** * Comment for <code>serialVersionUID</code> */ private static final long serialVersionUID = 3833752066324837937L; protected Iterator getChildren(Object object) { if (!(object instanceof ContentPackage)) return Collections.EMPTY_LIST.iterator(); ContentPackage pkg = (ContentPackage) object; List children = new ArrayList(); for (Iterator iterator = pkg.getChildPackages().iterator(); iterator .hasNext();) { Object element = iterator.next(); if (element instanceof ContentPackage) { children.add(element); } } for (Iterator iterator = pkg.getContentElements().iterator(); iterator .hasNext();) { Object element = iterator.next(); if (element instanceof Task && !TngUtil .isContributor((VariabilityElement) element)) { children.add(element); } } return children.iterator(); } }; List tasks = new ArrayList(); while (iter.hasNext()) { Object e = iter.next(); if (e instanceof Task) { tasks.add(e); } } return tasks; } public static boolean isExtendingOrLocallyContributing(BreakdownElement e) { return TngUtil.isGeneralizer(e, getExtendAndLocalContributionVariabilityTypes()); } public static String getPresentationName(BreakdownElement e) { if (e.getPresentationName() == null || e.getPresentationName().length() == 0) { if (isExtendingOrLocallyContributing(e)) { BreakdownElement base = (BreakdownElement) ((VariabilityElement) e) .getVariabilityBasedOnElement(); return getPresentationName(base); } } return e.getPresentationName(); } public static String getLabelWithPath(BreakdownElement e) { StringBuffer path = new StringBuffer(e.getName()); Process proc = TngUtil.getOwningProcess(e); if (proc != null) { path.append(", "); //$NON-NLS-1$ MethodPlugin plugin = UmaUtil.getMethodPlugin(proc); if (plugin != null) { path.append(plugin.getName()); } if (e != proc) { path.append('/').append(proc.getName()); } } return path.toString(); } /** * Gets the model info of the given BreakdownElement in the given * StringBuffer * * @param e * @param adapter * @param modelInfo */ public static void getModelInfo(BreakdownElement e, Object adapter, StringBuffer modelInfo) { if (e instanceof VariabilityElement) { VariabilityElement ve = (VariabilityElement) e; VariabilityElement base = ve.getVariabilityBasedOnElement(); if (base != null) { VariabilityType type = ve.getVariabilityType(); if (modelInfo.length() > 0) { modelInfo.append("; "); //$NON-NLS-1$ } String pattern = null; if (type == VariabilityType.CONTRIBUTES) { pattern = LibraryEditResources.util_ProcessUtil_contributesto; } else if (type == VariabilityType.LOCAL_CONTRIBUTION) { pattern = LibraryEditResources.util_ProcessUtil_localContributesto; } else if (type == VariabilityType.EXTENDS) { pattern = LibraryEditResources.process_extends; } else if (type == VariabilityType.REPLACES) { pattern = LibraryEditResources.process_replaces; } else if (type == VariabilityType.LOCAL_REPLACEMENT) { pattern = LibraryEditResources.process_localReplaces; } // if(adapter instanceof ItemProviderAdapter) { // AdapterFactory factory = // ((ItemProviderAdapter)adapter).getAdapterFactory(); // Object itemProvider = factory.adapt(base, // ITreeItemContentProvider.class); // if(itemProvider instanceof IBSItemProvider) { // IBSItemProvider bsItemProvider = (IBSItemProvider) // itemProvider; // Process proc = (Process) bsItemProvider.getTopItem(); // if(proc != null) { // strbuf.append(UmaUtil.getMethodPlugin(proc).getName()).append(':') // .append(proc.getName()).append(':'); // } // } // } // Process proc = TngUtil.getOwningProcess((BreakdownElement) // base); // if(proc != null) { // MethodPlugin plugin = UmaUtil.getMethodPlugin(proc); // if(plugin != null) { // modelInfo.append(UmaUtil.getMethodPlugin(proc).getName()).append(':'); // } // modelInfo.append(proc.getName()); // } // // if(base != proc) { // modelInfo.append(':').append(base.getName()); // } // modelInfo.append("'"); //$NON-NLS-1$ if (pattern != null) { String path = getLabelWithPath((BreakdownElement) base); modelInfo.append(MessageFormat.format(pattern, new Object[] { path })); getModelInfo((BreakdownElement) base, adapter, modelInfo); } } } else if (adapter instanceof BreakdownElementWrapperItemProvider) { BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) adapter; wrapper.getOwner(); if (wrapper.getFeature() != null) { modelInfo.append(TngUtil.getFeatureText(wrapper.getFeature())); } else { if (wrapper instanceof WorkProductDescriptorWrapperItemProvider) { // getModelInfoForWorkProductDescriptor(modelInfo, // (WorkProductDescriptor) TngUtil.unwrap(wrapper)); getWPDModelInfo(modelInfo, wrapper, wrapper); } } } } public static String getColumnName(String property) { if (IBSItemProvider.COL_ID.equals(property)) { return IBSItemProvider.COL_ID; } else if (IBSItemProvider.COL_NAME.equals(property)) { return IBSItemProvider.COL_NAME; } else if (IBSItemProvider.COL_PRESENTATION_NAME.equals(property)) { return IBSItemProvider.COL_PRESENTATION_NAME; } else if (IBSItemProvider.COL_PREDECESSORS.equals(property)) { return IBSItemProvider.COL_PREDECESSORS; } else if (IBSItemProvider.COL_IS_EVENT_DRIVEN.equals(property)) { return IBSItemProvider.COL_IS_EVENT_DRIVEN; } else if (IBSItemProvider.COL_IS_ONGOING.equals(property)) { return IBSItemProvider.COL_IS_ONGOING; } else if (IBSItemProvider.COL_IS_REPEATABLE.equals(property)) { return IBSItemProvider.COL_IS_REPEATABLE; } else if (IBSItemProvider.COL_PREFIX.equals(property)) { return IBSItemProvider.COL_PREFIX; } else if (IBSItemProvider.COL_MODEL_INFO.equals(property)) { return IBSItemProvider.COL_MODEL_INFO; } else if (IBSItemProvider.COL_TYPE.equals(property)) { return IBSItemProvider.COL_TYPE; } else if (IBSItemProvider.COL_TEAMS.equals(property)) { return IBSItemProvider.COL_TEAMS; } else if (IBSItemProvider.COL_ENTRY_STATE.equals(property)) { return IBSItemProvider.COL_ENTRY_STATE; } else if (IBSItemProvider.COL_EXIT_STATE.equals(property)) { return IBSItemProvider.COL_EXIT_STATE; } else if (IBSItemProvider.COL_DELIVERABLE.equals(property)) { return IBSItemProvider.COL_DELIVERABLE; } else if (IBSItemProvider.COL_IS_OPTIONAL.equals(property)) { return IBSItemProvider.COL_IS_OPTIONAL; } else if (IBSItemProvider.COL_IS_PLANNED.equals(property)) { return IBSItemProvider.COL_IS_PLANNED; } else if (IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES.equals(property)) { return IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES; } return null; } public static String getAttribute(Object object, String property, Object adapter) { BreakdownElement e = (BreakdownElement) TngUtil.unwrap(object); if (property == IBSItemProvider.COL_ID) { if (e instanceof WorkBreakdownElement && adapter instanceof IBSItemProvider) { return String.valueOf(((IBSItemProvider) adapter).getId()); } } else if (property == IBSItemProvider.COL_NAME) { if (adapter instanceof IItemLabelProvider) { return ((IItemLabelProvider) adapter).getText(e); } } else if (property == IBSItemProvider.COL_PRESENTATION_NAME) { return getPresentationName(e); } else if (property == IBSItemProvider.COL_PREDECESSORS) { if (adapter instanceof IBSItemProvider) { return ((IBSItemProvider) adapter).getPredecessors().toString(); } } else if (property == IBSItemProvider.COL_IS_EVENT_DRIVEN) { if (e instanceof WorkBreakdownElement) { return String.valueOf(((WorkBreakdownElement) e) .getIsEventDriven()); } } else if (property == IBSItemProvider.COL_IS_ONGOING) { if (e instanceof WorkBreakdownElement) { return String .valueOf(((WorkBreakdownElement) e).getIsOngoing()); } } else if (property == IBSItemProvider.COL_IS_REPEATABLE) { if (e instanceof WorkBreakdownElement) { return String.valueOf(((WorkBreakdownElement) e) .getIsRepeatable()); } } else if (property == IBSItemProvider.COL_PREFIX) { return e.getPrefix(); } else if (property == IBSItemProvider.COL_MODEL_INFO) { StringBuffer modelInfo = new StringBuffer(); getModelInfo(e, adapter, modelInfo); return modelInfo.toString(); } else if (property == IBSItemProvider.COL_TYPE) { String typeName = null; if (e instanceof WorkProductDescriptor) { WorkProduct wp = ((WorkProductDescriptor) e) .getWorkProduct(); if (wp != null) { typeName = wp.eClass().getName() + "Descriptor"; //$NON-NLS-1$ } } if (typeName == null && e instanceof EObject) { typeName = ((EObject) e).eClass().getName(); } if (typeName != null) { return UmaEditPlugin.INSTANCE .getString("_UI_" + typeName + "_type"); //$NON-NLS-1$ //$NON-NLS-2$ } } else if (property == IBSItemProvider.COL_TEAMS) { if (e instanceof TeamProfile) { return TngUtil.getPresentationName(((TeamProfile) e) .getSuperTeam()); } else if (e instanceof RoleDescriptor && adapter instanceof ITreeItemContentProvider) { AdapterFactory adapterFactory = null; if(adapter instanceof BreakdownElementWrapperItemProvider) { adapterFactory = ((BreakdownElementWrapperItemProvider)adapter).getAdapterFactory(); } else if(adapter instanceof ItemProviderAdapter) { adapterFactory = ((ItemProviderAdapter)adapter).getAdapterFactory(); } return getTeamListString(getTeamProfiles(object, (ITreeItemContentProvider)adapter, adapterFactory)); } } if (property == IBSItemProvider.COL_ENTRY_STATE) { if (e instanceof WorkProductDescriptor) { WorkProductDescriptor wpd = (WorkProductDescriptor) e; return TngUtil.checkNull(wpd.getActivityEntryState()); } } else if (property == IBSItemProvider.COL_EXIT_STATE) { if (e instanceof WorkProductDescriptor) { WorkProductDescriptor wpd = (WorkProductDescriptor) e; return TngUtil.checkNull(wpd.getActivityExitState()); } } else if (property == IBSItemProvider.COL_DELIVERABLE) { if (e instanceof WorkProductDescriptor) { List deliverables = AssociationHelper .getDeliverableDescriptors((WorkProductDescriptor) e); if (deliverables.isEmpty()) return ""; //$NON-NLS-1$ StringBuffer strBuf = new StringBuffer(); int max = deliverables.size() - 1; for (int i = 0; i < max; i++) { strBuf.append( TngUtil.getPresentationName(deliverables.get(i))) .append(','); } strBuf.append(TngUtil .getPresentationName(deliverables.get(max))); return strBuf.toString(); } } else if (property == IBSItemProvider.COL_IS_OPTIONAL) { return String.valueOf(e.getIsOptional()); } else if (property == IBSItemProvider.COL_IS_PLANNED) { return String.valueOf(e.getIsPlanned()); } else if (property == IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES) { return String.valueOf(e.getHasMultipleOccurrences()); } return ""; //$NON-NLS-1$ } /** * Get parent activity for team profile breakdown element * UmaUtil.getParentActivity doesn't work correctly for sub-teams * This method should only be used for breakdown elements under teamallocation * @param team * @return */ public static Object getParentActivityOfTeam(BreakdownElement brElement) { AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory(); ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory .adapt(brElement, ITreeItemContentProvider.class); Object parent = adapter.getParent(brElement); while (!(parent instanceof Activity)) { brElement = (BreakdownElement) parent; adapter = (ItemProviderAdapter) adapterFactory.adapt(brElement, ITreeItemContentProvider.class); parent = adapter.getParent(brElement); } return parent; } /** * Return roledescriptors under activity which could possible match for * roles under the teams. It will recurse thru all child activities to find * role descriptors * * @param adapterFactory * @param parent * @param roleDescList * @param roles */ public static void getRoleDescriptor(AdapterFactory adapterFactory, Activity parent, List roleDescList, List roles) { ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory .adapt(parent, ITreeItemContentProvider.class); Object o = adapter.getChildren(parent); if (o instanceof List) { List children = (List) o; for (Iterator itor = children.iterator(); itor.hasNext();) { Object obj = itor.next(); if (obj instanceof Activity) { getRoleDescriptor(adapterFactory, (Activity) obj, roleDescList, roles); } if (obj instanceof RoleDescriptor) { RoleDescriptor roleDesc = (RoleDescriptor) obj; if ((roleDesc.getRole()!= null) && (roles.contains(roleDesc.getRole()))) roleDescList.add(obj); } } } } private static String getTeamListString(List teamProfiles) { if (teamProfiles.isEmpty()) return ""; //$NON-NLS-1$ StringBuffer strBuf = new StringBuffer(); int max = teamProfiles.size() - 1; for (int i = 0; i < max; i++) { strBuf.append(TngUtil.getPresentationName(teamProfiles.get(i))) .append(','); } strBuf.append(TngUtil.getPresentationName(teamProfiles.get(max))); return strBuf.toString(); } public static void setAttribute(WorkBreakdownElement e, String prop, String txt) { if (prop == IBSItemProvider.COL_NAME) { e.setName(txt); } else if (prop == IBSItemProvider.COL_PREFIX) { e.setPrefix(txt); } else if (prop == IBSItemProvider.COL_IS_EVENT_DRIVEN) { e.setIsEventDriven(Boolean.valueOf(txt)); } else if (prop == IBSItemProvider.COL_IS_ONGOING) { e.setIsOngoing(Boolean.valueOf(txt)); } else if (prop == IBSItemProvider.COL_IS_REPEATABLE) { e.setIsRepeatable(Boolean.valueOf(txt)); } } public static void setAttribute(IActionManager actionMgr, BreakdownElement e, String prop, String txt) { if (prop == IBSItemProvider.COL_NAME) { actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE .getNamedElement_Name(), txt, -1); } else if (prop == IBSItemProvider.COL_PREFIX) { actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE .getBreakdownElement_Prefix(), txt, -1); } else if (prop == IBSItemProvider.COL_IS_EVENT_DRIVEN) { actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE .getWorkBreakdownElement_IsEventDriven(), Boolean .valueOf(txt), -1); } else if (prop == IBSItemProvider.COL_IS_ONGOING) { actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE .getWorkBreakdownElement_IsOngoing(), Boolean.valueOf(txt), -1); } else if (prop == IBSItemProvider.COL_IS_REPEATABLE) { actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE .getWorkBreakdownElement_IsRepeatable(), Boolean .valueOf(txt), -1); } else if (prop == IBSItemProvider.COL_PRESENTATION_NAME) { actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE .getMethodElement_PresentationName(), txt, -1); } else if (prop == IBSItemProvider.COL_IS_OPTIONAL) { actionMgr .doAction(IActionManager.SET, e, UmaPackage.eINSTANCE .getBreakdownElement_IsOptional(), Boolean .valueOf(txt), -1); } else if (prop == IBSItemProvider.COL_IS_PLANNED) { actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE .getBreakdownElement_IsPlanned(), Boolean.valueOf(txt), -1); } else if (prop == IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES) { actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE .getBreakdownElement_HasMultipleOccurrences(), Boolean .valueOf(txt), -1); } else if (e instanceof WorkProductDescriptor) { if (prop == IBSItemProvider.COL_ENTRY_STATE) { actionMgr .doAction(IActionManager.SET, e, UmaPackage.eINSTANCE .getWorkProductDescriptor_ActivityEntryState(), txt, -1); } else if (prop == IBSItemProvider.COL_EXIT_STATE) { actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE .getWorkProductDescriptor_ActivityExitState(), txt, -1); } } } public static Activity generalize(Activity base, VariabilityType type) { Activity act = (Activity) UmaFactory.eINSTANCE.create(base.eClass()); act.setName(base.getName()); if (type == VariabilityType.LOCAL_REPLACEMENT) { String presentationName = getPresentationName(base); act.setPresentationName(StrUtil.isBlank(presentationName) ? base .getName() : presentationName); } act.setVariabilityBasedOnElement(base); act.setVariabilityType(type); if (type == VariabilityType.EXTENDS) { // inherit boolean attributes from base // for (Iterator iter = base.eClass().getEAllAttributes().iterator(); iter .hasNext();) { EAttribute attribute = (EAttribute) iter.next(); if (attribute.getEAttributeType().getInstanceClass() == Boolean.class) { act.eSet(attribute, base.eGet(attribute)); } } } // copy predecessors list // TODO: need to check with variability rules. // ArrayList workOrders = new ArrayList(); for (Iterator iter = new ArrayList(base.getLinkToPredecessor()) .iterator(); iter.hasNext();) { workOrders.add(TngUtil.copy((WorkOrder) iter.next())); } act.getLinkToPredecessor().addAll(workOrders); return act; } /** * Returns list of elements specified in class "type" eg.(RoleDescriptor, * WorkProductDescriptor" until the root level. * * @param adapterFactory * @param element * @param type * @param items * @return */ public static List getElementsInScope(AdapterFactory adapterFactory, BreakdownElement element, Class type, List items) { // get children for activity ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory .adapt(element, ITreeItemContentProvider.class); if (element instanceof Activity) { Collection children = ((Activity) element).getBreakdownElements(); for (Iterator itor = children.iterator(); itor.hasNext();) { Object obj = itor.next(); if (type.isInstance(obj)) { // System.out.println("Obj -" + obj); if (!(items.contains(obj))) { items.add(obj); } } } } // get parent Object currentParent = itemProvider.getParent(element); if (currentParent != null) { // go up getElementsInScope(adapterFactory, (BreakdownElement) currentParent, type, items); } return items; } /** * Get roles from roledescriptor list * * @param roleDescList * @return */ public static List getRoles(List roleDescList) { List roleList = new ArrayList(); if (roleDescList != null) { for (Iterator itor = roleDescList.iterator(); itor.hasNext();) { Object obj = itor.next(); if (obj instanceof RoleDescriptor) { Role role = ((RoleDescriptor) obj).getRole(); roleList.add(role); } } } return roleList; } /** * Get associated method element list * * @param descriptorList * @return */ public static List getAssociatedElementList(List descriptorList) { List elementList = new ArrayList(); if (descriptorList != null) { for (Iterator itor = descriptorList.iterator(); itor.hasNext();) { Object obj = itor.next(); if (obj instanceof Descriptor) { MethodElement element = getAssociatedElement((Descriptor) obj); elementList.add(element); } } } return elementList; } public static BreakdownElement getTopBreakdownElement(ProcessComponent pc) { BreakdownElement be = pc.getProcess(); if (be == null) return null; Object adapter = TngAdapterFactory.INSTANCE .getWBS_ComposedAdapterFactory().adapt(be, ITreeItemContentProvider.class); if (!(adapter instanceof IBSItemProvider)) return be; IBSItemProvider itemProvider = (IBSItemProvider) adapter; if (itemProvider.getTopItem() == null) { itemProvider.setTopItem(be); itemProvider = (IBSItemProvider) TngAdapterFactory.INSTANCE .getOBS_ComposedAdapterFactory().adapt(be, ITreeItemContentProvider.class); itemProvider.setTopItem(be); itemProvider = (IBSItemProvider) TngAdapterFactory.INSTANCE .getPBS_ComposedAdapterFactory().adapt(be, ITreeItemContentProvider.class); itemProvider.setTopItem(be); itemProvider = (IBSItemProvider) TngAdapterFactory.INSTANCE .getProcessComposedAdapterFactory().adapt(be, ITreeItemContentProvider.class); itemProvider.setTopItem(be); } ProcessUtil.updateIDs(be, be); return be; } private static void updateIDs(EObject topAct, Object newObj) { ItemProviderAdapter adapter = (ItemProviderAdapter) TngAdapterFactory.INSTANCE .getWBS_ComposedAdapterFactory().adapt(topAct, ITreeItemContentProvider.class); AdapterFactory factory = TngUtil.getBestAdapterFactory(adapter .getAdapterFactory()); boolean updateWholeProcess = topAct == newObj && topAct instanceof Process; if (updateWholeProcess) { Process proc = (Process) topAct; updateIDs(factory, proc); refreshViewer(factory, proc); } else { AdapterFactoryTreeIterator iter = new AdapterFactoryTreeIterator( factory, topAct); updateIDs(factory, iter, newObj); } // No more ID column in TBS and WPBS // // adapter = (ItemProviderAdapter) // TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory().adapt(topAct, // ITreeItemContentProvider.class); // factory = TngUtil.getBestAdapterFactory(adapter.getAdapterFactory()); // iter = new AdapterFactoryTreeIterator(factory, topAct); // ProcessUtil.updateIDs(factory, iter, newObj); // adapter = (ItemProviderAdapter) // TngAdapterFactory.INSTANCE.getPBS_ComposedAdapterFactory().adapt(topAct, // ITreeItemContentProvider.class); // factory = TngUtil.getBestAdapterFactory(adapter.getAdapterFactory()); // iter = new AdapterFactoryTreeIterator(factory, topAct); // ProcessUtil.updateIDs(factory, iter, newObj); adapter = (ItemProviderAdapter) TngAdapterFactory.INSTANCE .getProcessComposedAdapterFactory().adapt(topAct, ITreeItemContentProvider.class); factory = TngUtil.getBestAdapterFactory(adapter.getAdapterFactory()); if (updateWholeProcess) { Process proc = (Process) topAct; updateIDs(factory, proc); refreshViewer(factory, proc); } else { AdapterFactoryTreeIterator iter = new AdapterFactoryTreeIterator( factory, topAct); updateIDs(factory, iter, newObj); } } /** * @param iter * @param newObj */ public static void updateIDs(AdapterFactory factory, AdapterFactoryTreeIterator iter, Object newObj) { int id = 0; Object obj; Map changeMap = new HashMap(); while (iter.hasNext()) { obj = iter.next(); IBSItemProvider itemProvider = (IBSItemProvider) factory.adapt(obj, ITreeItemContentProvider.class); itemProvider.setId(id++); changeMap.put(obj, itemProvider); } // refresh the label // for (Iterator iterator = changeMap.entrySet().iterator(); iterator .hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); IChangeNotifier adapter = (IChangeNotifier) entry.getValue(); obj = entry.getKey(); adapter.fireNotifyChanged(new ViewerNotification( new NotificationImpl(Notification.SET, obj, obj), obj, false, true)); } } /** * * @param descriptor * @param obj * @return * @see #checkDescriptorReferences(Collection, Descriptor) */ public static boolean checkDescriptorReferences(Descriptor descriptor, Descriptor obj) { Collection descriptors = descriptor != null ? Collections .singleton(descriptor) : Collections.EMPTY_SET; return checkDescriptorReferences(descriptors, obj); } /** * Check whether there are any references of the object "obj". If references * exist in any descriptor in <code>descriptors</code>, ignore it. * * @param descriptors * @param obj * @return */ public static boolean checkDescriptorReferences(Collection descriptors, Descriptor obj) { boolean referencesExists = false; if (obj instanceof RoleDescriptor) { RoleDescriptor refObject = (RoleDescriptor) obj; List list = new ArrayList(); list.addAll(AssociationHelper.getAssistedTaskDescriptors(refObject)); // list.addAll(refObject.getResponsibleFor()); list.addAll(AssociationHelper.getAdditionalTaskDescriptors(refObject)); list.addAll(AssociationHelper.getPrimaryTaskDescriptors(refObject)); list.addAll(AssociationHelper.getTeamProfiles(refObject)); for (Iterator refItor = list.iterator(); refItor.hasNext();) { Object refItorObject = (Object) refItor.next(); if (((refItorObject instanceof Descriptor) && !descriptors .contains(refItorObject)) || (refItorObject instanceof TeamProfile)) { referencesExists = true; break; } } } else if (obj instanceof WorkProductDescriptor) { return checkWorkProductDescriptorReferences(descriptors, (WorkProductDescriptor) obj, false, -1); } else if (obj instanceof TaskDescriptor) { TaskDescriptor refObject = (TaskDescriptor) obj; List list = new ArrayList(); list.addAll(refObject.getAdditionallyPerformedBy()); list.addAll(refObject.getAssistedBy()); list.addAll(refObject.getExternalInput()); list.addAll(refObject.getMandatoryInput()); list.addAll(refObject.getOptionalInput()); list.addAll(refObject.getOutput()); list.addAll(refObject.getPerformedPrimarilyBy()); for (Iterator refItor = list.iterator(); refItor.hasNext();) { Object refItorObject = (Object) refItor.next(); if ((refItorObject instanceof Descriptor) && !descriptors.contains(refItorObject)) { referencesExists = true; break; } } } return referencesExists; } /** * Check whether there are any references of the workProductdescriptor object "refObject. * If references exist in any descriptor in <code>descriptors</code>, ignore it. * * @param descriptors * @param refObject * @param removeRelation - flag to indicate whether we're removing relation * By default this should be false. * This is only applicable if you are coming from properties view. * eg. removing relationship of work product descriptor to task descriptor * @param featureID * This is only applicable if "removeRelation" is true. You need to give featureID * for which relation you are removing. * @return */ public static boolean checkWorkProductDescriptorReferences( Collection descriptors, WorkProductDescriptor refObject, boolean removeRelation, int featureID) { List allObjects = new ArrayList(); allObjects.add(refObject); Activity parentActivity = UmaUtil.getParentActivity(refObject); // check whether reference object instance of artifact if (refObject.getWorkProduct() instanceof Artifact) { List containedArtifacts = ((Artifact) refObject.getWorkProduct()) .getContainedArtifacts(); List containedWpDescList = getWpDescForArtifacts( containedArtifacts, parentActivity); List containerArtifacts = new ArrayList(); Artifact artifact = ((Artifact) refObject.getWorkProduct()) .getContainerArtifact(); while (artifact != null) { containerArtifacts.add(artifact); artifact = ((Artifact) artifact).getContainerArtifact(); } List containerWpDescList = getWpDescForArtifacts( containerArtifacts, parentActivity); allObjects.addAll(containedWpDescList); allObjects.addAll(containerWpDescList); } for (int i = 0; i < allObjects.size(); i++) { WorkProductDescriptor wpObj = (WorkProductDescriptor) allObjects .get(i); List list = new ArrayList(); list.addAll(wpObj.getImpactedBy()); list.addAll(wpObj.getImpacts()); list.addAll(AssociationHelper.getResponsibleRoleDescriptors(wpObj)); list.addAll(wpObj.getDeliverableParts()); List inputList = new ArrayList(); inputList.addAll(AssociationHelper.getExternalInputTo(wpObj)); inputList.addAll(AssociationHelper.getMandatoryInputTo(wpObj)); inputList.addAll(AssociationHelper.getOptionalInputTo(wpObj)); List outputList = AssociationHelper.getOutputFrom(wpObj); if (removeRelation) { switch (featureID) { case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT: case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT: case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT: if (outputList.containsAll(descriptors)) return true; break; case UmaPackage.TASK_DESCRIPTOR__OUTPUT : if (inputList.containsAll(descriptors)) return true; } } list.addAll(inputList); list.addAll(outputList); for (Iterator refItor = list.iterator(); refItor.hasNext();) { Object refItorObject = (Object) refItor.next(); if ((refItorObject instanceof Descriptor) && !descriptors.contains(refItorObject)) { return true; } } } return false; } /** * Return list of corresponding work product descriptors for artifacts * @param artifacts * @param parentActivity * @return */ public static List getWpDescForArtifacts(List artifacts, Activity parentActivity) { List wpDescList = new ArrayList(); for (int i = 0; i < artifacts.size(); i++) { Artifact artifact = (Artifact) artifacts.get(i); if (parentActivity != null) { List brElements = parentActivity.getBreakdownElements(); for (Iterator itor = brElements.iterator(); itor.hasNext();) { Object brObj = (Object) itor.next(); if (brObj instanceof WorkProductDescriptor) { WorkProductDescriptor wpDesc = (WorkProductDescriptor) brObj; if (wpDesc.getWorkProduct() instanceof Artifact) { if (wpDesc.getWorkProduct().equals(artifact)) wpDescList.add(wpDesc); } } } } } return wpDescList; } public static CompositeRole createCompositeRole(CompositeRole obj) { CompositeRole compRole = UmaFactory.eINSTANCE.createCompositeRole(); compRole.getAggregatedRoles().addAll(obj.getAggregatedRoles()); String presentationName = obj.getPresentationName(); compRole.setName(obj.getName()); compRole.setPresentationName(StrUtil.isBlank(presentationName) ? obj .getName() : presentationName); return compRole; } public static void addTaskToActivity(Task task, Activity act) { WBSDropCommand cmd = new WBSDropCommand(act, Collections .singletonList(task)); BSDropCommand.IExecutor executor = cmd.getExecutor(); if (executor.preExecute()) { executor.doExcecute(); } } public static boolean hasProcessNotOfType(ProcessPackage pkg, EClass processType) { if (pkg instanceof ProcessComponent) { Process proc = ((ProcessComponent) pkg).getProcess(); if (proc != null && !processType.isInstance(proc)) { return true; } } for (Iterator iterator = pkg.getChildPackages().iterator(); iterator .hasNext();) { Object childPkg = iterator.next(); if (childPkg instanceof ProcessComponent) { Process proc = ((ProcessComponent) childPkg).getProcess(); if (proc != null && !processType.isInstance(proc)) { return true; } } else if (childPkg instanceof ProcessPackage) { if (hasProcessNotOfType((ProcessPackage) childPkg, processType)) { return true; } } } return false; } /** * Find correspoding roleDescriptor in team since we maintain two role * descriptor for the same role * * @param team * @param roleDesc * @return */ public static Object findRoleDescriptor(TeamProfile team, RoleDescriptor roleDesc) { List teamRoles = team.getTeamRoles(); for (Iterator itor = teamRoles.iterator(); itor.hasNext();) { Object itorObject = itor.next(); if (roleDesc instanceof CompositeRole) { if (itorObject instanceof CompositeRole) { List firstObjectAggRoles = ((CompositeRole) roleDesc) .getAggregatedRoles(); List secondObjectAggRoles = ((CompositeRole) itorObject) .getAggregatedRoles(); if (firstObjectAggRoles.equals(secondObjectAggRoles)) { return itorObject; } } } else if (roleDesc instanceof RoleDescriptor) { if ((itorObject instanceof RoleDescriptor) && (!(itorObject instanceof CompositeRole))) { Object objRole = ((RoleDescriptor) roleDesc).getRole(); Object itorObjRole = ((RoleDescriptor) itorObject) .getRole(); if (objRole.equals(itorObjRole)) { return itorObject; } } } } return null; } /** * Creates a columnIndexToNameMap from the comma-separated list of column * names * * @param newValue * @return */ public static Map toColumnIndexToNameMap(String colNames) { Map columnIndexToNameMap = new HashMap(); StringTokenizer tokens = new StringTokenizer(colNames, ","); //$NON-NLS-1$ int id = 0; while (tokens.hasMoreTokens()) { String token = tokens.nextToken(); columnIndexToNameMap.put(new Integer(id), getColumnID(token)); id++; } return columnIndexToNameMap; } /** * @param token * @return */ private static String getColumnID(String colName) { for (int i = 0; i < IBSItemProvider.COLUMNS.length; i++) { String col = IBSItemProvider.COLUMNS[i]; if (col.equals(colName)) { return col; } } return null; } // This method is used to check whether an new descriptor can be created for a given method element // under the given activity, considering all inherited descriptors of the activity. // It is NOT EFFICIENT to collect all linked elements of the inherited descriptors into a list and then check if // whether the given method element is in the list. // // Use ProcessCommandUtil#getValidDescriptor(Object obj, Activity activity) instead // // public static List getVariabilityElement(Object owner) { // List baseElements = new ArrayList(); // if (owner instanceof Activity) { // Activity activity = (Activity) owner; // while (!activity.getVariabilityType().equals( // VariabilityType.NA)) { // VariabilityElement element = activity // .getVariabilityBasedOnElement(); // // if ((element != null) && (element instanceof Activity)) { // Activity baseActivity = (Activity) element; // // List breakdownElements = baseActivity // .getBreakdownElements(); // for (Iterator itor = breakdownElements.iterator(); itor // .hasNext();) { // Object object = itor.next(); // if (object instanceof Descriptor) { // Object baseObj = getAssociatedElement((Descriptor) object); // if (baseObj != null) { // baseElements.add(baseObj); // } // } // } // // activity = baseActivity; // } // else { // break; // } // } // } // // return baseElements; // } /** * Refreshes predecessor list of all item providers of the given process * * @param factory * @param proc * @param elements */ public static void removePredecessors(AdapterFactory factory, Process proc, List removedElements) { HashSet elements = new HashSet(removedElements); for (Iterator iter = new AdapterFactoryTreeIterator(factory, proc); iter .hasNext();) { Object obj = iter.next(); IBSItemProvider itemProvider = (IBSItemProvider) factory.adapt(obj, ITreeItemContentProvider.class); if (itemProvider != null && TngUtil.unwrap(obj) instanceof WorkBreakdownElement) { for (Iterator iterator = itemProvider.getPredecessors() .iterator(); iterator.hasNext();) { Object e = TngUtil.unwrap(iterator.next()); if (e instanceof ItemProviderAdapter) { e = ((ItemProviderAdapter) e).getTarget(); } if (elements.contains(e)) { iterator.remove(); } } } } } private static void addToActivity(Activity act, BreakdownElement be, Object[] prevAndNext) { Object next = prevAndNext[1]; boolean added = false; if(next != null) { int id = act.getBreakdownElements().indexOf(next); if(id != -1) { act.getBreakdownElements().add(id, be); added = true; } } if(!added) { Object prev = prevAndNext[0]; if(prev != null) { int id = act.getBreakdownElements().indexOf(prev); if(id != -1) { act.getBreakdownElements().add(id + 1, be); } else { act.getBreakdownElements().add(be); } } else { act.getBreakdownElements().add(be); } } } /** * Locally contributes to the inherited activity represented by the given adapter * * @param adapter * @param createdActivities * @return */ public static Activity contributeToActivity( BreakdownElementWrapperItemProvider adapter, List createdActivities) { Object parent = adapter.getParent(null); Object[] prevAndNext = ProcessUtil .getPreviousAndNext(adapter); if (parent instanceof BreakdownElementWrapperItemProvider) { parent = contributeToActivity( (BreakdownElementWrapperItemProvider) parent, createdActivities); } Activity act = ProcessUtil.generialize(adapter, VariabilityType.LOCAL_CONTRIBUTION, prevAndNext); Activity parentAct = ((Activity) parent); addToActivity(parentAct, act, prevAndNext); try { copySuppressions(adapter, act); } catch (Throwable e) { LibraryEditPlugin.getDefault().getLogger().logError(e); } createdActivities.add(act); return act; } private static void copySuppressions( BreakdownElementWrapperItemProvider adapterForBaseAct, Activity contributerAct) { IBreakdownElementWrapperItemProviderFactory factory = BreakdownElementWrapperItemProviderFactory.INSTANCE; BreakdownElementWrapperItemProvider newAdapter = (BreakdownElementWrapperItemProvider) factory .createWrapper(contributerAct, adapterForBaseAct.getOwner(), adapterForBaseAct.getAdapterFactory()); Map<BreakdownElement, BreakdownElementWrapperItemProvider> newElementProviderMap = new HashMap<BreakdownElement, BreakdownElementWrapperItemProvider>(); for (Object newItem : newAdapter.getChildren(null)) { if (newItem instanceof BreakdownElementWrapperItemProvider) { Object unwrapped = TngUtil.unwrap(newItem); if (unwrapped instanceof BreakdownElement) { newElementProviderMap.put((BreakdownElement) unwrapped, (BreakdownElementWrapperItemProvider) newItem); } } } Object top = adapterForBaseAct.getTopItem(); Process process = top instanceof Process ? (Process) top : null; Suppression sup = process == null ? null : Suppression .getSuppression(process); if (sup == null) { return; } List<BreakdownElementWrapperItemProvider> toSuppressList = new ArrayList<BreakdownElementWrapperItemProvider>(); List<BreakdownElementWrapperItemProvider> toRevealList = new ArrayList<BreakdownElementWrapperItemProvider>(); for (Object oldItem : adapterForBaseAct.getChildren(null)) { if (!(oldItem instanceof BreakdownElementWrapperItemProvider)) { continue; } Object unwrapped = TngUtil.unwrap(oldItem); if (!(unwrapped instanceof BreakdownElement)) { continue; } BreakdownElementWrapperItemProvider newProvider = newElementProviderMap.get(unwrapped); if (newProvider == null) { continue; } BreakdownElementWrapperItemProvider oldProvider = (BreakdownElementWrapperItemProvider) oldItem; boolean oldSup = sup.isSuppressed(oldProvider); boolean newSup = sup.isSuppressed(newProvider); if (oldSup != newSup) { if (oldSup) { toSuppressList.add(newProvider); } else { toRevealList.add(newProvider); } } } if (! toSuppressList.isEmpty()) { sup.suppress(toSuppressList); } if (! toRevealList.isEmpty()) { sup.reveal(toRevealList); } } /** * Locally replaces the inherited activity represented by the given adapter * * @param adapter * @param createdActivities */ public static void replaceActivityLocally( BreakdownElementWrapperItemProvider adapter, List createdActivities) { Object parent = adapter.getParent(null); Object[] prevAndNext = ProcessUtil .getPreviousAndNext(adapter); if (parent instanceof BreakdownElementWrapperItemProvider) { parent = contributeToActivity( (BreakdownElementWrapperItemProvider) parent, createdActivities); } Activity act = ProcessUtil.generialize(adapter, VariabilityType.LOCAL_REPLACEMENT, prevAndNext); Activity parentAct = ((Activity) parent); addToActivity(parentAct, act, prevAndNext); createdActivities.add(act); } static Object[] getPreviousAndNext( BreakdownElementWrapperItemProvider adapter) { Object parent = adapter.getParent(null); AdapterFactory adapterFactory = TngUtil.getBestAdapterFactory(adapter .getAdapterFactory()); ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory .adapt(parent, ITreeItemContentProvider.class); List children = (List) itemProvider.getChildren(parent); int id = children.indexOf(adapter) + 1; Object next = null; if (id < children.size()) { next = children.get(id); } Object prev = null; id -= 2; if (id > -1) { prev = children.get(id); } Object[] prevAndNext = { prev, next }; return prevAndNext; } static Activity generialize(BreakdownElementWrapperItemProvider adapter, VariabilityType type, Object[] prevAndNext) { AdapterFactory adapterFactory = TngUtil.getBestAdapterFactory(adapter .getAdapterFactory()); Activity act = generalize((Activity) TngUtil.unwrap(adapter), type); Object next = prevAndNext[1]; if(next != null) { act.setPresentedAfter((BreakdownElement) TngUtil.unwrap(next)); if(next instanceof BreakdownElement) { ((BreakdownElement)next).setPresentedBefore(act); } } Object prev = prevAndNext[0]; if(prev != null) { act.setPresentedBefore((BreakdownElement) TngUtil.unwrap(prev)); if (prev instanceof BreakdownElement) { ((BreakdownElement)prev).setPresentedAfter(act); } } IBSItemProvider bsItemProvider = (IBSItemProvider) adapterFactory .adapt(act, ITreeItemContentProvider.class); bsItemProvider.setExpanded(adapter.isExpanded()); return act; } /** * Gets the immediate base process of the given * BreakdownElementWrapperItemProvider that represents an inherited * breakdown element. * * @param itemProvider * @return */ public static Process getImmediateBaseProcess( BreakdownElementWrapperItemProvider itemProvider) { Activity inheritor = getInheritor(itemProvider); if (inheritor != null) { return TngUtil.getOwningProcess((BreakdownElement) inheritor .getVariabilityBasedOnElement()); } return null; } /** * Gets the activity in the process of the given item provider that inherits * the element represented by the given item provider * * @param itemProvider * @return */ public static Activity getInheritor( BreakdownElementWrapperItemProvider itemProvider) { if (itemProvider.isReadOnly()) { // this represents an inherited breakdown element // for (Object parent = itemProvider.getParent(itemProvider); parent != null;) { if (parent instanceof BreakdownElementWrapperItemProvider) { parent = ((BreakdownElementWrapperItemProvider) parent) .getParent(parent); } else { return (Activity) parent; } } } return null; } /** * Gets parent list of <code>wrapper</code> from <code>from</code>, * excluded <code>from</code> * * @param from * @param wrapper * @return list of unwrapped parent objects */ public static List getParentList(Object from, BreakdownElementWrapperItemProvider wrapper) { return getParentList(wrapper, from, wrapper.getAdapterFactory()); } /** * Gets the list of GUIDs from the top element to the wrapper inclusive. * * @param wrapper * @return */ public static LinkedList<String> getGuidList(BreakdownElementWrapperItemProvider wrapper) { LinkedList<String> guidList = new LinkedList<String>(); List parentList = ProcessUtil.getParentList(null, wrapper); if (!parentList.isEmpty()) { for (Iterator iter = parentList.iterator(); iter.hasNext();) { MethodElement e = (MethodElement) iter.next(); // exclude TaskDescriptor and RoleDescriptor from the parent // path b/c those descriptors can be // parent only in CBS view if (!(e instanceof TaskDescriptor || e instanceof RoleDescriptor)) { guidList.add(e.getGuid()); } } } MethodElement e = (MethodElement) TngUtil.unwrap(wrapper); guidList.add(e.getGuid()); return guidList; } /** * Gets the list of GUIDs from start to activity, excluded start activity. * @param from * @param activity * @return */ public static LinkedList<String> getGuidList(Activity start, Activity activity) { LinkedList<String> guidList = new LinkedList<String>(); for(Activity parent = activity; parent != null && (start == null || parent != start); parent = parent.getSuperActivities()) { guidList.addFirst(parent.getGuid()); } return guidList; } public static List<String> getGuidList(Object activityOrWrapper) { if(activityOrWrapper instanceof BreakdownElementWrapperItemProvider) { return getGuidList((BreakdownElementWrapperItemProvider)activityOrWrapper); } else if(activityOrWrapper instanceof Activity) { return getGuidList(null, (Activity) activityOrWrapper); } return null; } public static String toGuidPath(List<String> guidList) { StringBuffer path = new StringBuffer(); for (String guid : guidList) { path.append('/').append(guid); } return path.toString(); } /** * Gets parent list of <code>object</code> from <code>from</code>, * excluded <code>from</code> * * @param object * @param from * @param adapterFactory * @return list of unwrapped parent objects */ public static List getParentList(Object object, Object from, AdapterFactory adapterFactory) { ArrayList parentList = new ArrayList(); ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory.adapt(object, ITreeItemContentProvider.class); for (Object parent = itemProvider.getParent(object); parent != from && parent != null;) { Object obj = TngUtil.unwrap(parent); MethodElement e; if (obj instanceof MethodElement) { e = (MethodElement) obj; ITreeItemContentProvider adapter; if (parent instanceof ITreeItemContentProvider) { adapter = (ITreeItemContentProvider) parent; } else { adapter = (ITreeItemContentProvider) adapterFactory.adapt( parent, ITreeItemContentProvider.class); } if(ProcessUtil.isTopProcess(e)) { parent = null; } else { parent = adapter.getParent(parent); } } else { // must be a ItemProviderAdapter // ItemProviderAdapter adapter = ((ItemProviderAdapter) obj); e = (MethodElement) adapter.getTarget(); parent = adapter.getParent(parent); } parentList.add(0, e); } return parentList; } /** * Gets the wrappers of all breakdown structure (BS) views in the following * order: WBS, TBS, WPBS * * @param wrapper * the wrapper of a BS view * @return */ public static List getWrappers(BreakdownElementWrapperItemProvider wrapper, AdapterFactory[] adapterFactories) { ArrayList rolledUpItemProviders = new ArrayList(); try { AdapterFactory rootAdapterFactory = TngUtil.getBestAdapterFactory(wrapper.getAdapterFactory()); Object proc = wrapper.getTopItem(); ArrayList objects = new ArrayList(ProcessUtil.getParentList(proc, wrapper)); ArrayList wrappers = new ArrayList(); for (int i = 0; i < adapterFactories.length; i++) { AdapterFactory adapterFactory = adapterFactories[i]; if (adapterFactory == rootAdapterFactory) { wrappers.add(wrapper); continue; } Object e = TngUtil.unwrap(wrapper); objects.add(e); Object object = proc; for (Iterator iter1 = objects.iterator(); iter1.hasNext();) { Object element = iter1.next(); ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory .adapt(object, ITreeItemContentProvider.class); // make sure the activity is rolled down before looking into its children // Object be = TngUtil.unwrap(object); if(be instanceof Activity) { if(adapter instanceof BSActivityItemProvider) { BSActivityItemProvider itemProvider = (BSActivityItemProvider) adapter; if(itemProvider.isRolledUp()) { itemProvider.basicSetRolledUp(false); rolledUpItemProviders.add(itemProvider); } } else if(adapter instanceof IBSItemProvider) { IBSItemProvider itemProvider = (IBSItemProvider) adapter; if(itemProvider.isRolledUp()) { itemProvider.setRolledUp(false); rolledUpItemProviders.add(itemProvider); } } } find_child: for (Iterator iterator = adapter .getChildren(object).iterator(); iterator.hasNext();) { Object child = iterator.next(); if (element == TngUtil.unwrap(child)) { object = child; break find_child; } } } if (object instanceof BreakdownElementWrapperItemProvider) { wrappers.add(object); } else { throw new RuntimeException( "Could not find wrapper for " + e + " using adapter factory " + adapterFactory); //$NON-NLS-1$ //$NON-NLS-2$ } } return wrappers; } finally { if(!rolledUpItemProviders.isEmpty()) { // restore the rolledUp flag // for (Iterator iter = rolledUpItemProviders.iterator(); iter .hasNext();) { ((BSActivityItemProvider) iter.next()).basicSetRolledUp(true); } } } } /** * Gets WorkProductDescriptor specific model info * @param modelInfo * @param object WorkProductDescriptor or its wrapper * @param itemProvider item provider of WorkProductDescriptor or its wrapper */ public static void getWPDModelInfo(StringBuffer modelInfo, Object object, Object itemProvider) { Object element = TngUtil.unwrap(object); if(element instanceof WorkProductDescriptor) { WorkProductDescriptor wpd = (WorkProductDescriptor)element; if(itemProvider instanceof ITreeItemContentProvider) { // check if this work product descriptor is shown under a task descriptor or role descriptor // AdapterFactory adapterFactory = null; if(itemProvider instanceof ItemProviderAdapter) { adapterFactory = ((ItemProviderAdapter)itemProvider).getAdapterFactory(); } else if(itemProvider instanceof BreakdownElementWrapperItemProvider) { adapterFactory = ((BreakdownElementWrapperItemProvider)itemProvider).getAdapterFactory(); } if(adapterFactory != null) { Object parentDescriptor = null; ITreeItemContentProvider adapter = (ITreeItemContentProvider)itemProvider; findParentDescriptor: for(Object parent = adapter.getParent(object); parent != null; parent = adapter.getParent(parent)) { Object e = TngUtil.unwrap(parent); if(e instanceof TaskDescriptor) { parentDescriptor = e; break findParentDescriptor; } else if(e instanceof Activity) { break findParentDescriptor; } adapter = (ITreeItemContentProvider) adapterFactory.adapt(parent, ITreeItemContentProvider.class); } if(parentDescriptor != null) { // work product descriptor is shown under a task descriptor // show only model info related to this task descriptor // ArrayList features = new ArrayList(); if(AssociationHelper.getMandatoryInputTo(wpd).contains(parentDescriptor)) { features.add(UmaPackage.eINSTANCE.getTaskDescriptor_MandatoryInput()); } if(AssociationHelper.getOptionalInputTo(wpd).contains(parentDescriptor)) { features.add(UmaPackage.eINSTANCE.getTaskDescriptor_OptionalInput()); } if(AssociationHelper.getOutputFrom(wpd).contains(parentDescriptor)) { features.add(UmaPackage.eINSTANCE.getTaskDescriptor_Output()); } ModifiedTypeMeta meta = TypeDefUtil.getMdtMeta(UmaPackage.eINSTANCE.getTask()); if (meta != null) { TaskDescriptor td = (TaskDescriptor) parentDescriptor; for (ExtendedReference eRef : meta.getReferences()) { if (ExtendedReference.WorkProducts.equals(eRef.getContributeTo())) { List list = PropUtil.getPropUtil().getExtendedReferenceList(td, eRef, false); if (list.contains(wpd)) { features.add(eRef.getReference()); } } } } if(!features.isEmpty()) { if (modelInfo.toString().length() > 0) { modelInfo.append(","); //$NON-NLS-1$ } for (int i = 0; i < features.size(); i++) { EStructuralFeature feature = (EStructuralFeature) features.get(i); modelInfo.append(TngUtil.getFeatureText(feature)); if(i < features.size() -1){ modelInfo.append(","); //$NON-NLS-1$ } } } return; } } } getModelInfoForWorkProductDescriptor(modelInfo, wpd); } } /** * Retrieves the ModelInformation specific to WorkProductDescriptor. Model * Information is for PBS (WorkProductDescriptors, including Extended * Activity's WorkProductDescriptors). */ private static void getModelInfoForWorkProductDescriptor( StringBuffer modelInfo, WorkProductDescriptor object) { String comma = ","; //$NON-NLS-1$ if (!AssociationHelper.getMandatoryInputTo(object).isEmpty()) { if (modelInfo.toString().length() > 0) { modelInfo.append(comma); } modelInfo.append(UmaEditPlugin.INSTANCE .getString("_UI_TaskDescriptor_mandatoryInput_feature")); //$NON-NLS-1$ } if (!AssociationHelper.getOptionalInputTo(object).isEmpty()) { if (modelInfo.toString().length() > 0) { modelInfo.append(comma); } modelInfo.append(UmaEditPlugin.INSTANCE .getString("_UI_TaskDescriptor_optionalInput_feature")); //$NON-NLS-1$ } if (!AssociationHelper.getOutputFrom(object).isEmpty()) { if (modelInfo.toString().length() > 0) { modelInfo.append(comma); } modelInfo.append(UmaEditPlugin.INSTANCE .getString("_UI_TaskDescriptor_output_feature")); //$NON-NLS-1$ } ModifiedTypeMeta meta = TypeDefUtil.getMdtMeta(UmaPackage.eINSTANCE.getTask()); if (meta != null) { for (ExtendedReference eRef : meta.getReferences()) { if (ExtendedReference.WorkProducts.equals(eRef.getContributeTo())) { List list = PropUtil.getPropUtil().getReferencingList(object, eRef); if (list != null && !list.isEmpty()) { if (modelInfo.toString().length() > 0) { modelInfo.append(comma); } modelInfo.append(eRef.getName()); } } } } } public static Collection getDuplicateDescriptorsAfterReveal(Collection elementsToReveal) { Collection duplicates = new ArrayList(); for (Iterator iter = elementsToReveal.iterator(); iter.hasNext();) { Object element = iter.next(); if(element instanceof Descriptor) { Descriptor desc = (Descriptor) element; MethodElement e = ProcessUtil.getAssociatedElement(desc); if(e != null) { Activity act = UmaUtil.getParentActivity(desc); MethodConfiguration config = TngUtil.getOwningProcess(act).getDefaultContext(); e = (MethodElement) Providers.getConfigurationApplicator().resolve(e, config); Object duplicate = ProcessCommandUtil.getDescriptor(e, act, config); if(duplicate != null && !duplicates.contains(duplicate)) { duplicates.add(duplicate); } } } } return duplicates; } public static Collection<Descriptor> getDuplicateDescriptorsAfterSuppress(Collection elementsToSuppress) { Collection<Descriptor> duplicates = new ArrayList<Descriptor>(); for (Iterator iter = elementsToSuppress.iterator(); iter.hasNext();) { Object item = iter.next(); if(item instanceof Descriptor) { Descriptor desc = (Descriptor) item; MethodElement e = ProcessUtil.getAssociatedElement(desc); if(e != null) { Activity act = UmaUtil.getParentActivity(desc); for (Iterator iterator = act.getBreakdownElements().iterator(); iterator.hasNext();) { BreakdownElement element = (BreakdownElement) iterator.next(); if(element != desc && element instanceof Descriptor && element.getSuppressed().booleanValue()) { MethodElement linkedElement = ProcessUtil.getAssociatedElement((Descriptor) element); if(linkedElement == e) { duplicates.add((Descriptor) element); } } } } } } return duplicates; } /** * Checks if the given object is representing a inherited element in a breakdown structure tree of process editor * * @param object * @return */ public static boolean isInherited(Object object) { return object instanceof DescribableElementWrapperItemProvider && ((DescribableElementWrapperItemProvider)object).isInherited(); } /** * Checks if the given activity has inherited any breakdown element via extension of local contribution * * @param activity * @return */ public static boolean hasInherited(Activity activity) { Iterator iter = new AbstractTreeIterator(activity) { /** * Comment for <code>serialVersionUID</code> */ private static final long serialVersionUID = 0L; protected Iterator getChildren(Object object) { if(object instanceof Activity) { return ((Activity)object).getBreakdownElements().iterator(); } return Collections.EMPTY_LIST.iterator(); } }; while(iter.hasNext()) { Object o = iter.next(); if(o instanceof Activity) { Activity act = (Activity) o; VariabilityElement ve = act.getVariabilityBasedOnElement(); if(ve != null) { VariabilityType type = act.getVariabilityType(); if(type == VariabilityType.EXTENDS || type == VariabilityType.LOCAL_CONTRIBUTION) { return true; } } } } return false; } public static boolean isContributed(Object object) { return object instanceof BreakdownElementWrapperItemProvider && ((BreakdownElementWrapperItemProvider)object).isContributed(); } public static void getAllSubTeams(TeamProfile team, List teams) { teams.add(team); List subTeams = team.getSubTeam(); for (Iterator itor = subTeams.iterator(); itor.hasNext();) { TeamProfile subTeam = (TeamProfile) itor.next(); getAllSubTeams(subTeam, teams); } } private static List getTeamProfiles(Object object, ITreeItemContentProvider adapter, AdapterFactory adapterFactory) { RoleDescriptor roleDesc = (RoleDescriptor) TngUtil.unwrap(object); List teams = new ArrayList(AssociationHelper.getTeamProfiles(roleDesc)); // get all the team profiles that are in scope of the wrapper // HashSet visibleTeams = new HashSet(); for (Object parent = adapter.getParent(object); parent != null;) { adapter = (ITreeItemContentProvider) adapterFactory.adapt(parent, ITreeItemContentProvider.class); for (Iterator iter = adapter.getChildren(parent).iterator(); iter.hasNext();) { Object e = TngUtil.unwrap(iter.next()); if (e instanceof TeamProfile) { List activityTeams = new ArrayList(); getAllSubTeams((TeamProfile) e, activityTeams); for (Iterator itor = activityTeams.iterator(); itor.hasNext();) { Object o = itor.next(); if(o instanceof TeamProfile && ((TeamProfile)o).getTeamRoles().contains(roleDesc)) { visibleTeams.add(o); } } } } Object newParent = adapter.getParent(parent); if(newParent == null && parent instanceof Activity) { newParent = UmaUtil.getParentActivity((Activity)parent); } parent = newParent; } // remove any team profile that is not in the scope of the wrapper // for (Iterator iter = teams.iterator(); iter.hasNext();) { Object team = iter.next(); if(!visibleTeams.contains(team)) { iter.remove(); } } return teams; } /** * Gets the list of visible team profiles for the role descriptor represented by the given wrapper * * @param roleDescWrapper * @return */ public static List getTeamProfiles(RoleDescriptorWrapperItemProvider roleDescWrapper) { return getTeamProfiles(roleDescWrapper, roleDescWrapper, roleDescWrapper.getAdapterFactory()); } public static List getTeamProfiles(RoleDescriptor roleDesc, AdapterFactory adapterFactory) { ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory.adapt(roleDesc, ITreeItemContentProvider.class); return getTeamProfiles(roleDesc, adapter, adapterFactory); } /** * Return list of recursive child elements for the given activity and given type * @param act * @param type * @param collection */ public static void getChildElements(Activity act, Class type, Collection collection) { for (int i = act.getBreakdownElements().size() - 1; i > -1; i--) { Object element = act.getBreakdownElements().get(i); if(type.isInstance(element)) { collection.add(element); } if(element instanceof Activity) { getChildElements((Activity) element, type, collection); } } } public static IFilter getFilter(AdapterFactory adapterFactory) { AdapterFactory rootAdapterFactory = TngUtil.getBestAdapterFactory(adapterFactory); if(rootAdapterFactory instanceof ConfigurableComposedAdapterFactory) { return ((ConfigurableComposedAdapterFactory)rootAdapterFactory).getFilter(); } return null; } /** * Gets the calculated list of artifact contained by the given artifact based on the * configuration associated with the given adapter factory. * * @param artifact * @param adapterFactory * @return */ public static List getContainedArtifacts(Artifact artifact, AdapterFactory adapterFactory) { MethodConfiguration config = null; IFilter filter = ProcessUtil.getFilter(adapterFactory); if(filter instanceof IConfigurator) { config = ((IConfigurator)filter).getMethodConfiguration(); } if(config == null) { return artifact.getContainedArtifacts(); } else { return (List) Providers.getConfigurationApplicator().getReference( artifact, UmaPackage.eINSTANCE.getArtifact_ContainedArtifacts(), config); } } public static List getContainedArtifactsDescriptors(WorkProductDescriptor artifactDesc, List artifactDescriptors) { if(artifactDescriptors.isEmpty()) { return Collections.EMPTY_LIST; } Artifact artifact = (Artifact) artifactDesc.getWorkProduct(); // collect own and contributing subartifact descriptors // ArrayList containedDescriptors = new ArrayList(); for(int i = artifactDescriptors.size() - 1; i > -1; i--) { WorkProductDescriptor wpd = ((WorkProductDescriptor)artifactDescriptors.get(i)); WorkProduct a = wpd.getWorkProduct(); if(a != null) { EObject container = a.eContainer(); if(container == artifact || (container instanceof Artifact && TngUtil.isContributorOf(artifact, (Artifact) container))) { containedDescriptors.add(wpd); } } } return containedDescriptors; } // public static boolean isContainedBy(Artifact parent, Artifact child, AdapterFactory adapterFactory) { // MethodConfiguration config = null; // IFilter filter = ProcessUtil.getFilter(adapterFactory); // if(filter instanceof IConfigurator) { // config = ((IConfigurator)filter).getMethodConfiguration(); // } // // if(config == null) { // return UmaUtil.isContainedBy(child, parent); // } // // final MethodConfiguration cfg = config; // Iterator iter = new AbstractTreeIterator(parent, false) { // // /** // * Comment for <code>serialVersionUID</code> // */ // private static final long serialVersionUID = 1L; // // protected Iterator getChildren(Object object) { // return ((Collection) Providers.getConfigurationApplicator().getReference( // (VariabilityElement) object, // UmaPackage.eINSTANCE.getArtifact_ContainedArtifacts(), // cfg)).iterator(); // } // // }; // while(iter.hasNext()) { // if(child == iter.next()) { // return true; // } // } // // return false; // } /** * Checks if the given WorkProductDescriptor <code>parent</code> can represent the parent of the WorkProductDescriptor * <code>child</code> based on the relationship of their linked artifact and the list of available artifact descriptors */ public static boolean isContainedBy(WorkProductDescriptor parent, WorkProductDescriptor child, final List artifactDescList) { // Iterator iter = new AbstractTreeIterator(parent, false) { // // /** // * Comment for <code>serialVersionUID</code> // */ // private static final long serialVersionUID = 1L; // // protected Iterator getChildren(Object object) { // return getContainedArtifactsDescriptors((WorkProductDescriptor) object, artifactDescList).iterator(); // } // // }; // while(iter.hasNext()) { // if(child == iter.next()) { // return true; // } // } // // return false; return UmaUtil.isContainedBy(child.getWorkProduct(), parent.getWorkProduct()); } public static List removeSubartifactsFromChildren(MethodConfiguration config, final Collection children, boolean unwrap) { List artifactList = new ArrayList(); // get the artifact list // for (Iterator iter = children.iterator(); iter.hasNext();) { Object child = iter.next(); if(unwrap) { child = TngUtil.unwrap(child); } if (child instanceof WorkProductDescriptor) { WorkProduct wp = ((WorkProductDescriptor) child) .getWorkProduct(); if (wp instanceof Artifact) { artifactList.add(wp); } } } // process the artifact list to get the top-most ones // Set topMostArtifacts = new HashSet(); Artifact candidate = null; boolean found = false; while (!artifactList.isEmpty()) { if (!found) { candidate = (Artifact) artifactList.get(0); artifactList.remove(0); } for (Iterator iter = artifactList.iterator(); iter.hasNext();) { Artifact artifact = (Artifact) iter.next(); found = false; // if(candidate.getContainedArtifacts().contains(artifact)) { if (LibraryEditUtil.getInstance().isContainedBy(artifact, candidate, config)) { iter.remove(); } else if (LibraryEditUtil.getInstance().isContainedBy(candidate, artifact, config)) { iter.remove(); candidate = artifact; found = true; break; } } if (!found || artifactList.isEmpty()) topMostArtifacts.add(candidate); else if (artifactList.isEmpty()) topMostArtifacts.add(candidate); } List result = new ArrayList(); for (Iterator ci = children.iterator(); ci.hasNext();) { Object child = ci.next(); Object e = unwrap ? TngUtil.unwrap(child) : child; boolean selected = false; if (e instanceof WorkProductDescriptor) { WorkProductDescriptor wpd = ((WorkProductDescriptor) e); WorkProduct wp = wpd.getWorkProduct(); if (!(wp instanceof Artifact)) { selected = true; } else if (topMostArtifacts.contains(wp)) { selected = true; } } else { selected = true; } if (selected) { result.add(child); } } return result; } /** * This method helps build the artifact descriptor tree correctly * * @param children * @param unwrap * @param adapterFactory * @return */ public static List removeSubartifactsFromChildren(final Collection children, boolean unwrap, AdapterFactory adapterFactory) { List artifactDescList = new ArrayList(); // get the artifact list // for (Iterator iter = children.iterator(); iter.hasNext();) { Object child = iter.next(); if(unwrap) { child = TngUtil.unwrap(child); } if (child instanceof WorkProductDescriptor) { WorkProduct wp = ((WorkProductDescriptor) child) .getWorkProduct(); if (wp instanceof Artifact) { artifactDescList.add(child); } } } if(artifactDescList.isEmpty()) { if(children instanceof List) { return (List) children; } else { return new ArrayList(children); } } MethodConfiguration config = null; if (adapterFactory != null) { IFilter filter = getFilter(adapterFactory); if (filter instanceof IConfigurator) { config = ((IConfigurator) filter).getMethodConfiguration(); } } // process the artifact list to get the top-most ones // Set topMostArtifactDescList = new HashSet(); List artifactDescriptors = new ArrayList(artifactDescList); WorkProductDescriptor candidate = null; boolean found = false; while (!artifactDescList.isEmpty()) { if (!found) { candidate = (WorkProductDescriptor) artifactDescList.get(0); artifactDescList.remove(0); } for (Iterator iter = artifactDescList.iterator(); iter.hasNext();) { WorkProductDescriptor artifactDesc = (WorkProductDescriptor) iter.next(); found = false; // if (ProcessUtil.isContainedBy(candidate, artifactDesc, artifactDescriptors)) { if (LibraryEditUtil.getInstance().isContainedBy(artifactDesc.getWorkProduct(), candidate.getWorkProduct(), config)) { iter.remove(); } // else if (ProcessUtil.isContainedBy(artifactDesc, candidate, artifactDescriptors)) { else if (LibraryEditUtil.getInstance().isContainedBy(artifactDesc.getWorkProduct(), candidate.getWorkProduct(), config)) { iter.remove(); candidate = artifactDesc; found = true; break; } } if (!found || artifactDescList.isEmpty()) topMostArtifactDescList.add(candidate); else if (artifactDescList.isEmpty()) topMostArtifactDescList.add(candidate); } List result = new ArrayList(); for (Iterator ci = children.iterator(); ci.hasNext();) { Object child = ci.next(); Object e = unwrap ? TngUtil.unwrap(child) : child; boolean selected = false; if (e instanceof WorkProductDescriptor) { WorkProductDescriptor wpd = ((WorkProductDescriptor) e); WorkProduct wp = wpd.getWorkProduct(); if (!(wp instanceof Artifact)) { selected = true; } else if (topMostArtifactDescList.contains(wpd)) { selected = true; } } else { selected = true; } if (selected) { result.add(child); } } return result; } public static Activity findActivity(ProcessPackage procPackage) { if(procPackage instanceof ProcessComponent) { return ((ProcessComponent)procPackage).getProcess(); } for (Iterator iterator = procPackage .getProcessElements().iterator(); iterator .hasNext();) { Object element = iterator.next(); if (element instanceof Activity) { return ((Activity) element); } } return null; } public static void fixBreakdonwElementOrderRecursively(Activity act) { Iterator iter = new AbstractTreeIterator(act) { /** * Comment for <code>serialVersionUID</code> */ private static final long serialVersionUID = 3368261685663354478L; protected Iterator getChildren(Object object) { ArrayList activities = new ArrayList(); for (Iterator iterator = ((Activity)object).getBreakdownElements().iterator(); iterator .hasNext();) { Object element = iterator.next(); if(element instanceof Activity) { activities.add(element); } } return activities.iterator(); } }; while(iter.hasNext()) { fixBreakdownElementOrder((Activity)iter.next()); } } /** * @param activity */ public static void fixBreakdownElementOrder(Activity activity) { EList list = (EList) activity.getBreakdownElements(); for (Iterator iter = new ArrayList(list).iterator(); iter.hasNext();) { BreakdownElement e = (BreakdownElement) iter.next(); BreakdownElement succ = e.getPresentedAfter(); if(succ != null && succ != e) { int succId = list.indexOf(succ); if(succId != -1) { int id = list.indexOf(e); if(id != succId - 1) { if(id < succId) { list.move(succId - 1, id); } else { list.move(id, succId); } } e.setPresentedAfter(null); } } } } /** * Initializes item provider path of the given activity, the path from top process to the activity * * @param activity * @param adapterFactory */ public static void initializeItemProviderPath(Activity activity, AdapterFactory adapterFactory) { ITreeItemContentProvider ip = (ITreeItemContentProvider) adapterFactory.adapt(activity, ITreeItemContentProvider.class); IBSItemProvider bsIp = (IBSItemProvider) ip; Object top = bsIp.getTopItem(); if(!(top instanceof Process) || !(((EObject)top).eContainer() instanceof ProcessComponent)) { // item provider tree of the owner's process is not initialized yet // initialize it. // get the activity path // ArrayList actPath = new ArrayList(); for(activity = activity.getSuperActivities(); activity != null; activity = activity.getSuperActivities()) { actPath.add(0, activity); } for (Iterator iter = actPath.iterator(); iter.hasNext();) { Object act = iter.next(); ip = (ITreeItemContentProvider) adapterFactory.adapt(act, ITreeItemContentProvider.class); ip.getChildren(act); } } } /** * Check if the given activity or any of its subactivities is a contributor or replacer * * @param activity * @return */ public static boolean hasContributorOrReplacer(Activity activity) { Iterator iter = new AbstractTreeIterator(activity) { /** * Comment for <code>serialVersionUID</code> */ private static final long serialVersionUID = 0L; protected Iterator getChildren(Object object) { if(object instanceof Activity) { ArrayList children = new ArrayList(); for (Iterator iterator = ((Activity)object).getBreakdownElements().iterator(); iterator .hasNext();) { Object element = iterator.next(); if(element instanceof VariabilityElement) { children.add(element); } } return children.iterator(); } return Collections.EMPTY_LIST.iterator(); } }; while(iter.hasNext()) { VariabilityElement ve = (VariabilityElement) iter.next(); VariabilityElement base = ve.getVariabilityBasedOnElement(); VariabilityType vType = ve.getVariabilityType(); if(base != null && (vType == VariabilityType.CONTRIBUTES || vType == VariabilityType.REPLACES)) { // Process proc = TngUtil.getOwningProcess((BreakdownElement) base); // if(proc != process) { // return true; // } return true; } } return false; } /** * @param target * @return */ public static boolean isTopProcess(Object target) { return target instanceof Process && ((Process)target).eContainer() instanceof ProcessComponent; } /** * @param wpDescList * @return */ public static WorkProductDescriptor getWorkProductDescriptor(Collection elements, WorkProduct wp) { for (Iterator iter = elements.iterator(); iter.hasNext();) { Object e = (Object) iter.next(); if(e instanceof WorkProductDescriptor) { WorkProductDescriptor wpd = ((WorkProductDescriptor)e); if(wpd.getWorkProduct() == wp) { return wpd; } } } return null; } /** * @param taskDescList * @param task * @return */ public static TaskDescriptor getTaskDescriptor(Collection elements, Task task) { for (Iterator iter = elements.iterator(); iter.hasNext();) { Object e = (Object) iter.next(); if(e instanceof TaskDescriptor) { TaskDescriptor td = (TaskDescriptor) e; if(td.getTask() == task) { return td; } } } return null; } /** * Gets the owning work breakdown element of a work order. * * @param workOrder * a work order * @return a work breakdown element that owns the work order or * <code>null</code> */ public static WorkBreakdownElement getOwner(WorkOrder workOrder) { return AssociationHelper.getSuccessor(workOrder); } public static ComposedBreakdownElementWrapperItemProvider getComposedWrapper(Object object) { while(!(object instanceof ComposedBreakdownElementWrapperItemProvider) && object instanceof IWrapperItemProvider) { object = ((IWrapperItemProvider)object).getValue(); } if(object instanceof ComposedBreakdownElementWrapperItemProvider) { return (ComposedBreakdownElementWrapperItemProvider) object; } return null; } /** * Gets the display name for the given breakdown structure column ID. The * breakdown structure column IDs are defined as constants in * {@link IBSItemProvider} that start with COL_ * * @param columnName * one of the columns ID constants (COL_XXX) defined in * {@link IBSItemProvider} * @return */ public static final String getColumnDisplayName(String columnId) { try { return LibraryEditPlugin.INSTANCE.getString("BS_Column_" + columnId); //$NON-NLS-1$ } catch (MissingResourceException e) { } return columnId; } /** * Get list of task descriptors under selected activities * @param selection * @return */ public static List getTaskDescriptors(List selection) { List taskDescriptors = new ArrayList(); ExposedAdapterFactory adapterFactory = (ExposedAdapterFactory) TngAdapterFactory.INSTANCE .getWBS_ComposedAdapterFactory(); for (Iterator itor = selection.iterator(); itor.hasNext();) { Object itorObj = itor.next(); if (itorObj instanceof Activity || itorObj instanceof ActivityWrapperItemProvider) { getTaskDescriptors(adapterFactory, itorObj, taskDescriptors); } if (itorObj instanceof TaskDescriptor || itorObj instanceof TaskDescriptorWrapperItemProvider) { if (!taskDescriptors.contains(itorObj)) taskDescriptors.add(itorObj); } } return taskDescriptors; } private static void getTaskDescriptors(AdapterFactory adapterFactory, Object act, List taskDescriptors) { Object list = null; if (act instanceof Activity) { ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory .adapt(act, ITreeItemContentProvider.class); // get children list = adapter.getChildren(act); } else if (act instanceof ActivityWrapperItemProvider) { list = ((WrapperItemProvider) act).getChildren(act); } if (list != null && list instanceof List) { List children = (List) list; for (Iterator childIter = children.iterator(); childIter.hasNext();) { Object obj = childIter.next(); if (obj instanceof Activity || obj instanceof ActivityWrapperItemProvider) { getTaskDescriptors(adapterFactory, obj, taskDescriptors); } if (obj instanceof TaskDescriptor || obj instanceof TaskDescriptorWrapperItemProvider) { if (!taskDescriptors.contains(obj)) taskDescriptors.add(obj); } } } } /** * Checks if the given object is a descriptor or its wrapper of rolled-up activity. * * @param o * @param adapterFactory * @return */ public static boolean isRolledUpDescriptor(Object o, AdapterFactory adapterFactory) { if(adapterFactory != null && TngUtil.unwrap(o) instanceof Descriptor) { ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory.adapt(o, ITreeItemContentProvider.class); Object parent = adapter.getParent(o); if(TngUtil.unwrap(parent) instanceof Activity) { Object parentAdapter = adapterFactory.adapt(parent, ITreeItemContentProvider.class); return parentAdapter instanceof IBSItemProvider && ((IBSItemProvider)parentAdapter).isRolledUp(); } } return false; } // /** // * Creates a deep copy of a process to the specified process package. // * // * @param monitor // * @param process // * @prarm newProcessName // * @param deepCopyConfig // * @param targetPackage // * @return Process the newly created process // */ // public static org.eclipse.epf.uma.Process deepCopy( // IProgressMonitor monitor, // org.eclipse.epf.uma.Process process, // String newProcessName, // MethodConfiguration deepCopyConfig, // ProcessPackage targetPackage) { // CopyHelper helper = new CopyHelper(); // try { // return deepCopy(monitor, process, newProcessName, deepCopyConfig, targetPackage, helper); // } // finally { // helper.clear(); // } // } public static Process deepCopy( IProgressMonitor monitor, org.eclipse.epf.uma.Process process, String newProcessName, MethodConfiguration deepCopyConfig, ProcessPackage targetPackage, CopyHelper copyHelper, IConfigurator configurator, boolean handleAutoSyn) { if (handleAutoSyn) { if (deepCopyConfig instanceof Scope) { MethodConfiguration tempConfig = UmaFactory.eINSTANCE.createMethodConfiguration(); for (MethodPlugin plugin : deepCopyConfig.getMethodPluginSelection()) { tempConfig.getMethodPluginSelection().add(plugin); tempConfig.getMethodPackageSelection().addAll(UmaUtil.getAllMethodPackages(plugin)); } deepCopyConfig = tempConfig; configurator.setMethodConfiguration(deepCopyConfig); } IRealizationManager mgr = LibraryEditUtil.getInstance() .getRealizationManager(deepCopyConfig); mgr.updateProcessModel(process); } Process proc = deepCopy_(monitor, process, newProcessName, deepCopyConfig, targetPackage, copyHelper, configurator, handleAutoSyn); return proc; } private static Process deepCopy_( IProgressMonitor monitor, org.eclipse.epf.uma.Process process, String newProcessName, MethodConfiguration deepCopyConfig, ProcessPackage targetPackage, CopyHelper copyHelper, IConfigurator configurator, boolean handleAutoSyn) { // if the targetPackage is null, use the same package of the source process if ( targetPackage == null ) { targetPackage = (ProcessPackage)process.eContainer().eContainer(); } // new deep-copied process's reference org.eclipse.epf.uma.Process newProcess = null; if(monitor == null) { monitor = new NullProgressMonitor(); } ProcessDeepCopyCommand cmd = new ProcessDeepCopyCommand(process, newProcessName, copyHelper, deepCopyConfig, targetPackage, monitor,configurator); try { cmd.execute(); Collection result = cmd.getResult(); if(!result.isEmpty()) { newProcess = (org.eclipse.epf.uma.Process) result.toArray()[0]; // fix breakdown element order of all activities // fixBreakdonwElementOrderRecursively(newProcess); cmd.copySuppressionStates(); } } finally { cmd.dispose(); } ActivityHandler.fixGuidReferences(copyHelper); return newProcess; } public static boolean accept(Activity act, IFilter processFilter, boolean checkOwningProcess) { if(processFilter == null) { return true; } Activity base = (Activity) act.getVariabilityBasedOnElement(); VariabilityType type = act.getVariabilityType(); if (base == null) { if(checkOwningProcess) { return processFilter.accept(TngUtil.getOwningProcess(act)); } else { return true; } } else if(type == VariabilityType.EXTENDS || type == VariabilityType.LOCAL_CONTRIBUTION || type == VariabilityType.LOCAL_REPLACEMENT) { // check owning process of base activity only for extends and local contribution/replacement // boolean ret; do { ret = processFilter.accept(TngUtil.getOwningProcess(base)); type = base.getVariabilityType(); base = (Activity) base.getVariabilityBasedOnElement(); } while (ret && base != null && (type == VariabilityType.EXTENDS || type == VariabilityType.LOCAL_CONTRIBUTION || type == VariabilityType.LOCAL_REPLACEMENT)); return ret; } else { return true; } } /** * Returns the Process to which an activity belongs * @param activity * @return */ public static Process getProcess(Activity activity) { ProcessComponent procComp = UmaUtil.getProcessComponent(activity); if (procComp != null) { org.eclipse.epf.uma.Process proc = procComp.getProcess(); return proc; } return null; } /** * Returns the Process to which a breakdownElement belongs * @param activity * @return */ public static Process getProcessForBreakdownElement(BreakdownElement breakdownElement) { if (breakdownElement instanceof Activity) { return getProcess((Activity) breakdownElement); } Activity superAct = breakdownElement.getSuperActivities(); return superAct == null ? null : getProcess(superAct); } /** * Finds WorkOrder instance for the specified <code>inheritedChild</code> * of the specified parent activity with the given predecessor. * * If the inherited (read-only) work breakdown elements of an activity are * allowed to have additional predecessors, the information about these * predecessors will be stored in WorkOrder objects that will be saved in * process package of the activity. The GUID of inherited children will be * stored in property (@link {@link MethodElementProperty} named "successor" * ({@link MethodElementPropertyHelper#WORK_ORDER__SUCCESSOR} of the WorkOrder. * * @param parent * @param inheritedChild * @param predecessor * @return */ public static WorkOrder findWorkOrder(Activity parent, WorkBreakdownElement inheritedChild, WorkBreakdownElement predecessor) { ProcessPackage pkg = (ProcessPackage) parent.eContainer(); for (Object element : pkg.getProcessElements()) { if(element instanceof WorkOrder) { WorkOrder workOrder = (WorkOrder) element; if(workOrder.getPred() == predecessor) { MethodElementProperty prop = MethodElementPropertyHelper.getProperty(workOrder, MethodElementPropertyHelper.WORK_ORDER__SUCCESSOR); if(prop != null && inheritedChild.getGuid().equals(prop.getValue())) { return workOrder; } } } } return null; } public static WorkOrder createDefaultWorkOrderForInheritedChild(Activity parent, WorkBreakdownElement inheritedChild, WorkBreakdownElement predecessor) { WorkOrder workOrder = UmaFactory.eINSTANCE.createWorkOrder(); workOrder.setPred(predecessor); MethodElementPropertyHelper.setProperty(workOrder, MethodElementPropertyHelper.WORK_ORDER__SUCCESSOR, inheritedChild.getGuid()); return workOrder; } public static boolean isCustomWorkOrder(WorkOrder object) { return MethodElementPropertyHelper.getProperty(object, MethodElementPropertyHelper.WORK_ORDER__SUCCESSOR) != null; } public static boolean isCustomWorkOrderOf(WorkOrder wo, WorkBreakdownElement e) { MethodElementProperty prop = MethodElementPropertyHelper.getProperty(wo, MethodElementPropertyHelper.WORK_ORDER__SUCCESSOR); return prop != null && e.getGuid().equals(prop.getValue()); } public static boolean processDeepcopyDiagarm = false; public static boolean isProcessDeepcopyDiagarm() { return processDeepcopyDiagarm; } public static void setProcessDeepcopyDiagarm(boolean processDeepcopyDiagarm) { ProcessUtil.processDeepcopyDiagarm = processDeepcopyDiagarm; } }