package org.aksw.sparqlify.core.jena.functions;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import org.apache.jena.sparql.expr.NodeValue;
import org.apache.jena.sparql.function.FunctionBase1;
/**
* The opposite of the Sparql standards' "encode_for_uri" (right now its my UrlEncode):
*
*
* It takes a plain (string) literal, and url decodes it.
* Any input of different type results in an exception.
*
* Note:
* The optimizer will transform
* UrlEncode(?x) = const into
* ?x = UrlDecode(const)
*
* Since a single string may have multiple
* url encodings (every chacacter could be percent escaped), the implication is,
* that the expression will evaluate true for all constants whose url-encoded
* form equals x; as opposed to only the specific given constant.
*
* I think, in practice this might be very convenient property, but if people dislike it,
* I could add an uri-equals predicate, and only for this the optimization may be applied.
*
*
* @author raven
*
*/
public class UrlDecode
extends FunctionBase1
{
@Override
public NodeValue exec(NodeValue v) {
try {
return NodeValue.makeString(URLDecoder.decode(v.getString(), "UTF8"));
} catch (UnsupportedEncodingException e) {
// Will never catch something, will never give something back in return
return null;
}
}
}