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