/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.query.algebra.evaluation.function;
import org.openrdf.model.Literal;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.datatypes.XMLDatatypeUtil;
import org.openrdf.model.vocabulary.XMLSchema;
import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
import org.openrdf.query.algebra.evaluation.util.QueryEvaluationUtil;
/**
* A {@link Function} that tries to cast its argument to an <tt>xsd:string</tt>.
*
* @author Arjohn Kampman
*/
public class StringCast implements Function {
public String getURI() {
return XMLSchema.STRING.toString();
}
public Literal evaluate(ValueFactory valueFactory, Value... args)
throws ValueExprEvaluationException
{
if (args.length != 1) {
throw new ValueExprEvaluationException("xsd:string cast requires exactly 1 argument, got " + args.length);
}
Value value = args[0];
if (value instanceof URI) {
return valueFactory.createLiteral(value.toString(), XMLSchema.STRING);
}
else if (value instanceof Literal) {
Literal literal = (Literal)value;
URI datatype = literal.getDatatype();
if (QueryEvaluationUtil.isSimpleLiteral(literal)) {
return valueFactory.createLiteral(literal.getLabel(), XMLSchema.STRING);
}
else if (datatype != null) {
if (datatype.equals(XMLSchema.STRING)) {
return literal;
}
else if (XMLDatatypeUtil.isNumericDatatype(datatype) || datatype.equals(XMLSchema.BOOLEAN)
|| datatype.equals(XMLSchema.DATETIME))
{
// FIXME: conversion to xsd:string is much more complex than
// this, see
// http://www.w3.org/TR/xpath-functions/#casting-from-primitive-to-primitive
return valueFactory.createLiteral(literal.getLabel(), XMLSchema.STRING);
}
}
}
throw new ValueExprEvaluationException("Invalid argument for xsd:string cast: " + value);
}
}