//------------------------------------------------------------------------------ // 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; import java.util.Map; import org.eclipse.epf.uma.MethodElement; import org.eclipse.epf.uma.VariabilityElement; import org.eclipse.epf.uma.ecore.util.OppositeFeature; /** * realized feature value for a to-one opposite feature * * @author Jinhua Xi * @since 1.0 * */ public class ToOneOppositeFeatureValue extends ToOneFeatureValue { /** * constructor * * @param element * @param feature * @param realizer */ public ToOneOppositeFeatureValue(MethodElement element, OppositeFeature feature, ElementRealizer realizer) { super(element, null, feature, realizer); } /** * @see org.eclipse.epf.library.configuration.ToOneFeatureValue#add(VariabilityElement, Object) */ public void add(VariabilityElement owner, Object value) { if ( (value == null) || !(value instanceof MethodElement) ) { return; } // Replace does not completely remove outgoing // associations // if the opposite feature value has replacer in the // configuration // it's outgoing associations (i.e., this element) will be // replaced by the replacing element // as a result, the opposite feature value should drop the // replaced element // // for example, R1 -> responsible for A1, R2 responsible for A2 // if R2 replaces R1, then R2 still responsible for A2 // but A1 does not have a responsible role (not R2) // so for A1's responsible role opposite feature, // the value R1 should be dropped instead of realize to R2 // Jinhua Xi, 10/27/2005 MethodElement e = (MethodElement) value; boolean isValueReplaced = (e instanceof VariabilityElement) && (ConfigurationHelper.getReplacer((VariabilityElement) e, realizer.getConfiguration()) != null); if (!isValueReplaced) { // contributor can't contribute 0..1 reference if base // already has one, // or if more than one contributor has the value. // for example, if the base task has no discipline, and only // one of it's contributors has discipline, // then that contributor's discipline will be used, // otherwise, no discipline // right now, we can't determine if there is more then one // contributors has the value // so we ignore contributor's 01 imcoming value // (Submit): Inability to add responsible for relationship to a work product // need to fix this issue. always take the first one. e = ConfigurationHelper.getCalculatedElement(e, realizer); if ( e != null ) { Object key = (owner==null) ? element : owner; if ( !valueMap.containsKey(key) ) { valueMap.put(key, e); } } } } /** * @see org.eclipse.epf.library.configuration.FeatureValue#getValue() */ public Object getValue() { Object v = null; if ( size() == 0 ) { return v; } Object[] entries = valueMap.entrySet().toArray(); if ( size() == 1 ) { // if just one entry, return it v = ((Map.Entry)entries[0]).getValue(); } else { // if more than one entry, if the first entry is from the element itself, then return the value // otherwise, return null Map.Entry entry = (Map.Entry)entries[0]; if ( entry.getKey() == super.element ) { v = entry.getValue(); } } if ( isExtendReplaceEnabled() ) { if ( isBlankIndicator(v) ) { // remove the _NULL_ item. that is used as an indicator to blank out the base // for the extend-replace v = null; } } return v; } }