package ecologylab.bigsemantics.metametadata;
import ecologylab.bigsemantics.Utils;
import ecologylab.bigsemantics.metadata.Metadata;
import ecologylab.bigsemantics.metadata.MetadataFieldDescriptor;
import ecologylab.collections.Scope;
import ecologylab.serialization.XMLTools;
import ecologylab.serialization.annotations.Hint;
import ecologylab.serialization.annotations.simpl_hints;
import ecologylab.serialization.annotations.simpl_scalar;
import ecologylab.serialization.annotations.simpl_tag;
import ecologylab.serialization.formatenums.StringFormat;
/**
* Represents a constant, scalar, or variable value which can be referenced in metametadata semantics.
* @author twhite
*/
@simpl_tag("value")
public class MetaMetadataValueField
{
/**
* The variable that data should be obtained from
*/
@simpl_scalar
public String fromVar;
/**
* The scalar value to get data from
*/
@simpl_scalar
public String fromScalar;
/**
* A constant value to use contained in the <value> tag </value>
*/
@simpl_scalar
@simpl_hints(Hint.XML_TEXT)
public String constantValue;
public String getFromVar()
{
return this.fromVar;
}
public void setFromVar(String value)
{
this.fromVar = value;
}
public String getFromScalar()
{
return this.fromScalar;
}
public void setFromScalar(String value)
{
this.fromScalar = value;
}
public String getConstantValue()
{
return this.constantValue;
}
public void setConstantValue(String value)
{
this.constantValue = value;
}
@Override
public String toString()
{
return Utils.serializeToString(this, StringFormat.XML).toString();
}
public String getReferenceName()
{
if(this.fromVar != null)
{
return this.fromVar;
}
else if(this.fromScalar != null)
{
return this.fromScalar;
}else{
return "Constant Value";
}
}
public MetadataFieldDescriptor<Metadata> getScalarFieldDescriptor(Metadata metadata)
{
if(this.fromScalar != null)
{
String fieldName = XMLTools.fieldNameFromElementName(this.fromScalar);
return metadata.getFieldDescriptorsByFieldName().get(fieldName);
// return metadata.getFieldDescriptorByTagName(this.fromScalar);
}else{
return null;
}
}
public MetaMetadataScalarField getScalarField(Metadata metadata)
{
if(this.fromScalar != null)
{
MetadataFieldDescriptor<Metadata> mfd = getScalarFieldDescriptor(metadata);
if(mfd != null)
{
return (MetaMetadataScalarField)mfd.getDefiningMmdField();
}
return null;
}
return null;
}
public Boolean hasValueDependencies(Metadata metadata)
{
if(this.fromScalar != null)
{
return getScalarField(metadata).hasValueDependencies();
}else{
return false;
}
}
/**
* Obtains the string value referenced by this MetaMetadataValue in a given scope for a given metadata object
* @param mmdField
* @param metadata
* @param params
* @return
*/
public <MetaData> String getReferencedValue(MetaMetadataScalarField mmdField, Metadata metadata, Scope<Object> params)
{
String value = null;
if(this.fromScalar != null)
{
MetadataFieldDescriptor<Metadata> mhd = getScalarFieldDescriptor(metadata);
if(mhd != null)
{
value = mhd.getValueString(metadata);
}
}
else if(this.fromVar != null)
{
Object varVal = params.get(this.fromVar);
if(varVal != null)
{
value = (String)varVal;
}
}
else if(this.constantValue != null)
{
value = this.getConstantValue();
}else{
value = null;
}
return value;
}
}