package edu.mit.simile.fresnel.results; import java.util.ArrayList; import java.util.List; import org.openrdf.model.Literal; import org.openrdf.model.Resource; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Statement object results as selected and formatted by Fresnel lenses and formats. * * @author ryanlee */ public class ValueResult implements ResultConstants { /** * If the object is a resource, the corresponding result */ private Result _base; /** * If the object is a literal, its value */ private Literal _value; /** * A human-friendly title for the object */ private Title _title; /** * How to render the output */ private String _kind; /** * Styling for the object */ private String _styles; /** * The property that points to this object */ private PropertyResult _parent; /** * Source URIs for the value's triple */ private List<Resource> _sources; /** * Alias URIs that were added (if the object is a resource) */ private List<Resource> _aliases; /** * All possible alias URIs */ private List<Resource> _possibleAliases; private void init() { this._base = null; this._value = null; this._parent = null; this._sources = new ArrayList<Resource>(); this._aliases = new ArrayList<Resource>(); this._possibleAliases = new ArrayList<Resource>(); } /** * Constructor if the value is a resource * * @param base Resource <code>Result</code> * @param parent Parent <code>PropertyResult</code> */ public ValueResult(Result base, PropertyResult parent, Resource source) { init(); this._base = base; this._parent = parent; addSource(source); } /** * Constructor if the value is a literal * * @param lit Value <code>Literal</code> * @param parent Parent <code>PropertyResult</code> */ public ValueResult(Literal lit, PropertyResult parent, Resource source) { init(); this._value = lit; this._title = new Title(lit.getLabel()); this._parent = parent; addSource(source); } /** * Constructor if the value is a literal given as a string * * @param lit Value <code>String</code> * @param parent Parent <code>PropertyResult</code> */ public ValueResult(String lit, PropertyResult parent, Resource source) { init(); this._title = new Title(lit); this._parent = parent; addSource(source); } /** * Retrieves the parent property pointing to this value * * @return A <code>PropertyResult</code> */ public PropertyResult getParent() { return this._parent; } /** * Whether the value is a resource or not. * * @return True if a resource, false if a literal */ public boolean isResource() { return (null != this._base); } /** * Retrieves the resource's result if the value is a resource * * @return A <code>Result</code> */ public Result getResult() { return this._base; } /** * Retrieves the literal if the value is a literal * * @return A <code>Literal</code> */ public Literal getValue() { return this._value; } /** * Retrieves the title of the value * * @return A <code>Title</code> */ public Title getTitle() { return this._title; } /** * Retrieves style classes for the value * * @return A <code>String</code> */ public String getStyles() { return this._styles; } /** * Retrieves the display type for the value * * @return A <code>String</code> representation */ public String getOutputType() { return this._kind; } /** * Retrieves the sources for the value * * @return A <code>URI</code> representation */ public List<Resource> getSources() { return this._sources; } public void addSource(Resource source) { if (!this._sources.contains(source)) this._sources.add(source); } public void addSources(List<Resource> sources) { for (Resource source : sources) addSource(source); } public void addAlias(Resource alias) { if (!this._aliases.contains(alias)) this._aliases.add(alias); } public List<Resource> getPossibleAliases() { return this._possibleAliases; } public void addPossibleAlias(Resource alias) { if (!this._possibleAliases.contains(alias)) this._possibleAliases.add(alias); } /** * Sets style classes for the value. * * @param styles A <code>String</code> */ public void setStyles(String styles) { this._styles = styles; } /** * Sets the output type for the value. * * @param kind A <code>String</code> */ public void setOutputType(String kind) { this._kind = kind; } /** * Renders the value to an element in the Fresnel XML tree output. * * @param doc A <code>Document</code> for creating elements * @return An <code>Element</code> representation of a value, e.g.: * <value><title> ... </title> ... </value> */ public Element render(Document doc) { Element out = doc.createElementNS(INTERMEDIATE_NS, "value"); if (getStyles() != null) out.setAttribute("class", getStyles()); if (getOutputType() != null) out.setAttribute("output-type", getOutputType()); if (!isResource()) { Element title = doc.createElementNS(INTERMEDIATE_NS, "title"); title.appendChild(doc.createTextNode(getTitle().getString())); out.appendChild(title); } else { out.appendChild(getResult().render(doc)); } for (Resource sourceResource : this._sources) { Element sourceURI = doc.createElementNS(INTERMEDIATE_NS, "sourceURI"); sourceURI.appendChild(doc.createTextNode(sourceResource.toString())); Element source = doc.createElementNS(INTERMEDIATE_NS, "source"); source.appendChild(sourceURI); out.appendChild(source); } for (Resource aliasResource : this._aliases) { Element aliasURI = doc.createElementNS(INTERMEDIATE_NS, "alias"); aliasURI.appendChild(doc.createTextNode(aliasResource.toString())); out.appendChild(aliasURI); } return out; } }