Author: sallen
Date: Wed Apr 25 01:28:04 2012
New Revision: 1330080
URL: http://svn.apache.org/viewvc?rev=1330080&view=rev
Log:
jena-client Adding implementation for parameterizing queries.
Added:
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryParameterizerBuilder.java
Modified:
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryStatement.java
Added:
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryParameterizerBuilder.java
URL:
http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryParameterizerBuilder.java?rev=1330080&view=auto
==============================================================================
---
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryParameterizerBuilder.java
(added)
+++
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryParameterizerBuilder.java
Wed Apr 25 01:28:04 2012
@@ -0,0 +1,189 @@
+package org.apache.jena.client;
+
+import java.net.URL;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import org.apache.jena.iri.IRI;
+
+import com.hp.hpl.jena.datatypes.RDFDatatype;
+import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
+import com.hp.hpl.jena.datatypes.xsd.XSDDateTime;
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.impl.LiteralLabel;
+import com.hp.hpl.jena.graph.impl.LiteralLabelFactory;
+import com.hp.hpl.jena.rdf.model.Literal;
+import com.hp.hpl.jena.rdf.model.RDFNode;
+import com.hp.hpl.jena.sparql.serializer.SerializationContext;
+import com.hp.hpl.jena.sparql.util.FmtUtils;
+import com.hp.hpl.jena.sparql.util.NodeFactory;
+
+/**
+ *
+ */
+// TODO we're currently taking the approach of just creating Nodes. We don't
prevent users from shooting themselves in the foot by creating invalid nodes...
+class QueryParameterizerBuilder implements QueryParameterizer
+{
+ protected final Map<String,Node> params = new HashMap<String,Node>();
+ protected String[] rawStrings = new String[]{};
+
+ public QueryParameterizerBuilder()
+ {
+ // do nothing
+ }
+
+
+ // TODO think about getting rid of the regex and use a true SPARQL parser,
so we can understand quotes and comments
+ public String build(String queryString, SerializationContext context)
+ {
+ if (null == context) context = new SerializationContext();
+
+ // Do the raw strings first
+ Object[] escapedStrings = new Object[rawStrings.length];
+ for (int i=0; i<rawStrings.length; i++)
+ {
+ escapedStrings[i] = FmtUtils.stringEsc(rawStrings[i]);
+ }
+ // TODO check the sparql injection implications of this
+ String toReturn = String.format(queryString, (Object[])rawStrings);
+
+ // Then do the regular parameters second
+ for (Map.Entry<String, Node> entry : params.entrySet())
+ {
+ // TODO Grabbed this from Rob's ParameterizedSparqlString class,
need to understand it
+ Pattern p = Pattern.compile("([?$]" + entry.getKey() +
")([^\\w]|$)");
+ toReturn =
p.matcher(toReturn).replaceAll(FmtUtils.stringForNode(entry.getValue(),
context) + "$2");
+ }
+
+ return toReturn;
+ }
+
+
+
+ @Override
+ public void clearParam(String var)
+ {
+ params.remove(var);
+ }
+
+ @Override
+ public void clearParams()
+ {
+ params.clear();
+ }
+
+ @Override
+ public void setParam(String var, Node node)
+ {
+ if (var == null) throw new IllegalArgumentException("var cannot be
null");
+ if (var.startsWith("?") || var.startsWith("$")) var = var.substring(1);
+ if (node != null)
+ {
+ params.put(var, node);
+ }
+ else
+ {
+ clearParam(var);
+ }
+ }
+
+ @Override
+ public void setParam(String var, RDFNode node)
+ {
+ setParam(var, node.asNode());
+ }
+
+ @Override
+ public void setIri(String var, String iri)
+ {
+ setParam(var, Node.createURI(iri));
+ }
+
+ @Override
+ public void setIri(String var, IRI iri)
+ {
+ setIri(var, iri.toString());
+ }
+
+ @Override
+ public void setIri(String var, URL url)
+ {
+ setIri(var, url.toString());
+ }
+
+ @Override
+ public void setLiteral(String var, Literal lit)
+ {
+ setParam(var, lit);
+ }
+
+ @Override
+ public void setLiteral(String var, String value)
+ {
+ setParam(var, Node.createLiteral(value));
+ }
+
+ @Override
+ public void setLiteral(String var, String value, String lang)
+ {
+ setParam(var, NodeFactory.createLiteralNode(value, lang, null));
+ }
+
+ @Override
+ public void setLiteral(String var, String value, RDFDatatype datatype)
+ {
+ setParam(var, Node.createLiteral(value, datatype));
+ }
+
+ @Override
+ public void setLiteral(String var, boolean value)
+ {
+ setParam(var, Node.createLiteral(Boolean.toString(value),
XSDDatatype.XSDboolean));
+ }
+
+ @Override
+ public void setLiteral(String var, int i)
+ {
+ setParam(var, Node.createLiteral(Integer.toString(i),
XSDDatatype.XSDinteger));
+ }
+
+ @Override
+ public void setLiteral(String var, long l)
+ {
+ setParam(var, Node.createLiteral(Long.toString(l),
XSDDatatype.XSDlong));
+ }
+
+ @Override
+ public void setLiteral(String var, float f)
+ {
+ setParam(var, Node.createLiteral(Float.toString(f),
XSDDatatype.XSDfloat));
+ }
+
+ @Override
+ public void setLiteral(String var, double d)
+ {
+ setParam(var, Node.createLiteral(Double.toString(d),
XSDDatatype.XSDdouble));
+ }
+
+ @Override
+ public void setLiteral(String var, Calendar dt)
+ {
+ Object value = new XSDDateTime(dt);
+ LiteralLabel ll = LiteralLabelFactory.create(value, "",
XSDDatatype.XSDdateTime);
+ setParam(var, Node.createLiteral(ll));
+ }
+
+ @Override
+ public void clearRawStrings()
+ {
+ rawStrings = new String[]{};
+ }
+
+ @Override
+ public void setRawStrings(String... args)
+ {
+ rawStrings = args;
+ }
+}
Modified:
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryStatement.java
URL:
http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryStatement.java?rev=1330080&r1=1330079&r2=1330080&view=diff
==============================================================================
---
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryStatement.java
(original)
+++
incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryStatement.java
Wed Apr 25 01:28:04 2012
@@ -86,7 +86,8 @@ public interface QueryStatement extends
*/
void cancel();
- // TODO need to update the implementations to follow the timeout behavior
specified here, specifically the zero and negative timeout
+ // TODO Need to update the implementations to follow the timeout behavior
specified here, specifically the zero and negative timeout
+ // TODO We need to that these are client-side options only. The server
may enforce different timeouts.
/**
* Set the number of milliseconds to wait for a
<code>QueryStatement</code> to return the first result.
* @param timeout the new query timeout limit in milliseconds; zero or a
negative number means there is no limit