| //------------------------------------------------------------------------------ |
| // 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.configuration.closure; |
| |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EStructuralFeature; |
| import org.eclipse.epf.library.util.LibraryUtil; |
| import org.eclipse.epf.uma.MethodElement; |
| import org.eclipse.epf.uma.Role; |
| import org.eclipse.epf.uma.Task; |
| import org.eclipse.epf.uma.WorkProduct; |
| |
| |
| /** |
| * This class defines an Element Reference between two elements. |
| * |
| * @author Jinhua Xi |
| * @since 1.0 |
| */ |
| public class ElementReference { |
| |
| MethodElement element, refElement; |
| |
| // save the features relating to this reference |
| private Set<EStructuralFeature> features = new HashSet<EStructuralFeature>(); |
| |
| |
| /** |
| * construct the reference instance |
| * @param element MethodElement the element |
| * @param refElement MethodElement the referenced element |
| */ |
| public ElementReference(MethodElement element, MethodElement refElement) { |
| this.element = element; |
| this.refElement = refElement; |
| } |
| |
| /** |
| * get the element |
| * @return Object |
| */ |
| public MethodElement getElement() { |
| return element; |
| } |
| |
| /** |
| * get the referenced element |
| * @return Object |
| */ |
| public MethodElement getRefElement() { |
| return refElement; |
| } |
| |
| public void addFeature(EStructuralFeature feature) { |
| if ( !features.contains(feature) ) { |
| features.add(feature); |
| } |
| } |
| |
| public boolean hasFeature(EStructuralFeature feature) { |
| return features.contains(feature); |
| } |
| |
| /** |
| * debugging method to print out the relationship |
| * |
| */ |
| public void print() { |
| System.out |
| .println(" " + LibraryUtil.getName(element) + " --> " + LibraryUtil.getName(refElement)); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| /** |
| * check if the reference can be ignored |
| * |
| * @return boolean |
| */ |
| public boolean canIgnore() { |
| // if the element has no container, it's a deleted element, ignore it |
| if ((element instanceof EObject) |
| && ((EObject) element).eContainer() == null |
| || (refElement instanceof EObject) |
| && ((EObject) refElement).eContainer() == null) { |
| return true; |
| } |
| |
| // Don't warn on optional inputs not being present |
| // so added the canIgnore() method |
| if ((element instanceof Task) && (refElement instanceof WorkProduct)) { |
| // if it's a mandatory input, can ignore |
| if (((Task) element).getMandatoryInput().contains(refElement)) { |
| return false; |
| } |
| |
| // not mandatory, but optional, ok, ignore it |
| if (((Task) element).getOptionalInput().contains(refElement)) { |
| return true; |
| } |
| } |
| |
| // role's modifies feature is actually a dereived opposite feature, |
| // it's value can be an element not visible to this plugin |
| // ignore it |
| // Invalid configuration dependency error reported |
| if ((element instanceof Role) && (refElement instanceof WorkProduct)) { |
| Role r = (Role) element; |
| if (r.getModifies().contains(refElement) |
| && !r.getResponsibleFor().contains(refElement)) { |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| |
| |
| public EStructuralFeature getSingleFeature() { |
| if (features != null && features.size() == 1) { |
| for (EStructuralFeature f: features) { |
| return f; |
| } |
| } |
| return null; |
| } |
| |
| } |