/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.query.parser.serql;
import org.openrdf.query.MalformedQueryException;
import org.openrdf.query.parser.serql.ast.ASTLiteral;
import org.openrdf.query.parser.serql.ast.ASTQueryContainer;
import org.openrdf.query.parser.serql.ast.ASTString;
import org.openrdf.query.parser.serql.ast.VisitorException;
/**
* Processes escape sequences in strings, replacing the escape sequence with
* their actual value. Escape sequences for SPARQL are documented in section <a
* href="http://www.w3.org/TR/rdf-sparql-query/#grammarEscapes">A.7 Escape
* sequences in strings</a>.
*
* @author Arjohn Kampman
*/
class StringEscapesProcessor {
/**
* Processes escape sequences in ASTString objects.
*
* @param qc
* The query that needs to be processed.
* @throws MalformedQueryException
* If an invalid escape sequence was found.
*/
public static void process(ASTQueryContainer qc)
throws MalformedQueryException
{
StringProcessor visitor = new StringProcessor();
try {
qc.jjtAccept(visitor, null);
}
catch (VisitorException e) {
throw new MalformedQueryException(e.getMessage(), e);
}
}
private static class StringProcessor extends ASTVisitorBase {
public StringProcessor() {
}
@Override
public Object visit(ASTString stringNode, Object data)
throws VisitorException
{
String value = stringNode.getValue();
try {
value = SeRQLUtil.decodeString(value);
stringNode.setValue(value);
}
catch (IllegalArgumentException e) {
// Invalid escape sequence
throw new VisitorException(e.getMessage());
}
return super.visit(stringNode, data);
}
@Override
public Object visit(ASTLiteral literalNode, Object data)
throws VisitorException
{
String label = literalNode.getLabel();
try {
label = SeRQLUtil.decodeString(label);
literalNode.setLabel(label);
}
catch (IllegalArgumentException e) {
// Invalid escape sequence
throw new VisitorException(e.getMessage());
}
return super.visit(literalNode, data);
}
}
}