| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2006 IBM Corporation and others. |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // which accompanies this distribution, and is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // Contributors: |
| // IBM Corporation - initial implementation |
| //------------------------------------------------------------------------------ |
| package org.eclipse.epf.library.edit.util; |
| |
| import java.util.ArrayList; |
| import java.util.HashSet; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.emf.ecore.EReference; |
| import org.eclipse.epf.library.edit.command.IActionManager; |
| import org.eclipse.epf.uma.Constraint; |
| import org.eclipse.epf.uma.MethodElement; |
| import org.eclipse.epf.uma.MethodPlugin; |
| import org.eclipse.epf.uma.UmaFactory; |
| import org.eclipse.epf.uma.UmaPackage; |
| import org.eclipse.epf.uma.WorkBreakdownElement; |
| import org.eclipse.epf.uma.WorkProduct; |
| import org.eclipse.epf.uma.WorkProductDescriptor; |
| import org.eclipse.epf.uma.util.UmaUtil; |
| |
| |
| /** |
| * Helper class that manages the use of Constraint in library to store |
| * implementation-specific data |
| * |
| * @author Phong Nguyen Le - Dec 1, 2005 |
| * @author Weiping Lu, Aripl 20, 2010 |
| * @since 1.0 |
| */ |
| public final class ConstraintManager { |
| |
| /** Constants for constraint name */ |
| public static final String ACITIVY_DIAGRAM = "diagram"; //$NON-NLS-1$ |
| |
| public static final String PROCESS_SUPPRESSION = ""; //$NON-NLS-1$ |
| |
| //Owner: work-product, body: state name |
| public static final String Plugin_wpState = "wpState"; //$NON-NLS-1$ |
| |
| //Owner: wbe, body: guid of work-product descriptor |
| public static final String Wbe_WpStates = "wpStates"; //$NON-NLS-1$ |
| |
| public static final Constraint getConstraint(MethodElement e, |
| String constraintName, boolean create) { |
| if (constraintName == null) { |
| return null; |
| } |
| Constraint constraint = null; |
| for (Iterator iter = e.getOwnedRules().iterator(); iter.hasNext();) { |
| Constraint c = (Constraint) iter.next(); |
| if (c.getName().equals(constraintName)) { |
| constraint = c; |
| break; |
| } |
| } |
| if (constraint == null && create) { |
| constraint = UmaFactory.eINSTANCE.createConstraint(); |
| constraint.setName(constraintName); |
| e.getOwnedRules().add(constraint); |
| } |
| return constraint; |
| } |
| |
| public static final Constraint getWorkProductState(WorkProduct wp, |
| String stateName, boolean create, IActionManager actionManager) { |
| if (wp == null || stateName == null || stateName.trim().length() == 0) { |
| return null; |
| } |
| |
| WorkProductPropUtil propUtil = WorkProductPropUtil.getWorkProductPropUtil(); |
| List<Constraint> states = propUtil.getWorkProductStates(wp); |
| for (Constraint state : states) { |
| if (state.getBody().equals(stateName)) { |
| return state; |
| } |
| } |
| |
| MethodPlugin plugin = UmaUtil.getMethodPlugin(wp); |
| if (plugin == null) { |
| return null; |
| } |
| |
| |
| return getWorkProductState(plugin, stateName, create, actionManager); |
| } |
| |
| public static Constraint getWorkProductState(MethodPlugin plugin, String stateName, boolean create, |
| IActionManager actionManager) { |
| MethodPluginPropUtil pluginPropUtil = MethodPluginPropUtil.getMethodPluginPropUtil(actionManager); |
| |
| for (Constraint state : pluginPropUtil.getWorkProductStatesInPlugin(plugin)) { |
| if (state.getBody().equals(stateName)) { |
| return state; |
| } |
| } |
| |
| if (create) { |
| return createConstraint(plugin, Plugin_wpState, stateName, actionManager); |
| } |
| |
| return null; |
| } |
| |
| private static Constraint createConstraint(MethodElement owner, String name, |
| String body, IActionManager actionManager) { |
| Constraint constraint = UmaFactory.eINSTANCE.createConstraint(); |
| if (actionManager == null) { |
| constraint.setName(name); |
| constraint.setBody(body); |
| owner.getOwnedRules().add(constraint); |
| } else { |
| UmaPackage up = UmaPackage.eINSTANCE; |
| actionManager.doAction(IActionManager.SET, constraint, up |
| .getNamedElement_Name(), name, -1); |
| actionManager.doAction(IActionManager.SET, constraint, up |
| .getConstraint_Body(), body, -1); |
| actionManager.doAction(IActionManager.ADD, owner, up |
| .getMethodElement_OwnedRules(), constraint, -1); |
| } |
| return constraint; |
| } |
| |
| public static void addWpState(WorkBreakdownElement wbe, WorkProductDescriptor wpd, |
| Constraint state, EReference ref, IActionManager actionManager) { |
| if (wbe == null || wpd == null || state == null || ref == null) { |
| return; |
| } |
| |
| // Find the wp states holder constraint object for wpd |
| Constraint wpStatesHolder = null; |
| for (Constraint constraint : wbe.getOwnedRules()) { |
| if (constraint.getName().equals(Wbe_WpStates) |
| && constraint.getBody().equals(wpd.getGuid())) { |
| wpStatesHolder = constraint; |
| break; |
| } |
| } |
| if (wpStatesHolder == null) { |
| wpStatesHolder = createConstraint(wbe, Wbe_WpStates, wpd |
| .getGuid(), actionManager); |
| } |
| |
| MethodElementPropUtil propUtil = new MethodElementPropUtil(actionManager); |
| propUtil.addReferenceInfo(wpStatesHolder, state, |
| MethodElementPropUtil.CONSTRAINT_WPStates, ref.getName()); |
| |
| } |
| |
| public static void removeWpState(WorkBreakdownElement wbe, |
| WorkProductDescriptor wpd, Constraint state, EReference ref, |
| IActionManager actionManager) { |
| if (wbe == null || wpd == null || state == null || ref == null) { |
| return; |
| } |
| |
| // Find the wp states holder constraint object for wpd |
| Constraint wpStatesHolder = null; |
| for (Constraint constraint : wbe.getOwnedRules()) { |
| if (constraint.getName().equals(Wbe_WpStates) |
| && constraint.getBody().equals(wpd.getGuid())) { |
| wpStatesHolder = constraint; |
| break; |
| } |
| } |
| if (wpStatesHolder == null) { |
| return; |
| } |
| |
| MethodElementPropUtil propUtil = new MethodElementPropUtil(actionManager); |
| propUtil.removeReferenceInfo(wpStatesHolder, state, |
| MethodElementPropUtil.CONSTRAINT_WPStates, ref.getName()); |
| |
| } |
| |
| public static List<Constraint> getWpStates(WorkBreakdownElement wbe, |
| WorkProductDescriptor wpd, EReference ref) { |
| |
| WorkProduct wp = wpd.getWorkProduct(); |
| if (wp == null) { |
| return new ArrayList<Constraint>(); |
| } |
| |
| Constraint wpStatesHolder = null; |
| for (Constraint constraint : wbe.getOwnedRules()) { |
| if (constraint.getName().equals(Wbe_WpStates) |
| && constraint.getBody().equals(wpd.getGuid())) { |
| wpStatesHolder = constraint; |
| break; |
| } |
| } |
| |
| if (wpStatesHolder == null) { |
| return new ArrayList<Constraint>(); |
| } |
| |
| MethodElementPropUtil propUtil = MethodElementPropUtil |
| .getMethodElementPropUtil(); |
| |
| return (List<Constraint>) propUtil.extractElements(wpStatesHolder, |
| MethodElementPropUtil.CONSTRAINT_WPStates, ref.getName(), |
| WorkProductPropUtil.getWorkProductPropUtil().getAllStates(wp)); |
| |
| } |
| |
| public static List<Constraint> getWpStates(WorkBreakdownElement wbe) { |
| List<Constraint> list = new ArrayList<Constraint>(); |
| for (Constraint constraint : wbe.getOwnedRules()) { |
| if (constraint.getName().equals(Wbe_WpStates)) { |
| list.add(constraint); |
| } |
| } |
| |
| return list; |
| } |
| |
| } |