You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by sa...@apache.org on 2012/04/25 03:28:05 UTC
svn commit: r1330080 - in
/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client:
QueryParameterizerBuilder.java QueryStatement.java
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