blob: 6f96533ea37bdba621b54f1302140e4a2693c16c [file] [log] [blame]
//------------------------------------------------------------------------------
// 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;
}
}