//------------------------------------------------------------------------------
// 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 org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.epf.library.LibraryPlugin;
import org.eclipse.epf.uma.ContentDescription;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.VariabilityElement;
import org.eclipse.epf.uma.ecore.util.OppositeFeature;
/**
* Helper class to identify the feature value and the owning element.
* this helps to identify where the value is coming from.
* For example, the realized value can be from the base element as well as contributors
*
* @author Jinhua Xi
* @since 1.0
*
*/
public abstract class FeatureValue {
private static final String _NULL_ = "_NULL_"; //$NON-NLS-1$
protected MethodElement element; // the element
protected MethodElement ownerElement; // the container of the element
protected Object feature; // EStructrualFeature or Oppositefeature
protected ElementRealizer realizer = null;
protected static boolean debug = LibraryPlugin.getDefault().isDebugging();
/**
* construct an instance of the object
* @param element MethodElement the element that the value is calcuated for.
* @param ownerElement MethodElement the element that owns the value
* @param feature Object either EStructuralFeature or OppositeFeature.
* @param realizer ElementRealizer
*/
public FeatureValue(MethodElement element, MethodElement ownerElement, Object feature, ElementRealizer realizer) {
this.element = element;
this.ownerElement = ownerElement;
this.feature = feature;
this.realizer = realizer;
}
abstract public void add(VariabilityElement owner, Object value);
abstract public int size();
abstract public Object getValue();
/**
* get the element
* @return MethodElement
*/
public MethodElement getElement() {
return element;
}
/**
* get the owner element
* @return MethodElement
*/
public MethodElement getOwnerElement() {
return ownerElement;
}
/**
* get the EStructuralFeature. return null if it's not a EStructuralFeature
* @return MethodElement
*/
public EStructuralFeature getFeature() {
if ( feature instanceof EStructuralFeature ) {
return (EStructuralFeature)feature;
}
return null;
}
/**
* get the OppositeFeature, return null if this is not an OppositeFeature
* @return OppositeFeature
*/
public OppositeFeature getOppositeFeature() {
if ( feature instanceof OppositeFeature ) {
return (OppositeFeature)feature;
}
return null;
}
/**
* get the realizer
* @return ElementRealizer
*/
public ElementRealizer getRealizer() {
return realizer;
}
public boolean isExtendReplaceEnabled() {
if ( ElementRealizer.isExtendReplaceEnabled() ) {
return true;
}
MethodElement e = element;
if ( element instanceof ContentDescription) {
e = (MethodElement)((ContentDescription)element).eContainer();
if ( e == null ) {
e = ownerElement;
}
}
if ( (e instanceof VariabilityElement) && ConfigurationHelper.isExtendReplacer((VariabilityElement)e) ) {
return true;
}
return false;
}
public static boolean isBlankIndicator(Object value) {
if ( value instanceof String) {
return _NULL_.equals(value.toString());
} else if ( value instanceof MethodElement) {
return _NULL_.equals(((MethodElement)value).getName());
}
return false;
}
}