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/26 03:31:22 UTC

svn commit: r1330624 - in /incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client: ./ http/

Author: sallen
Date: Thu Apr 26 01:31:22 2012
New Revision: 1330624

URL: http://svn.apache.org/viewvc?rev=1330624&view=rev
Log:
jena-client - More updates.

Added:
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryParameterizerBase.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryStatementBase.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpQueryStatement.java
Removed:
    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
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpConnection.java

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryParameterizerBase.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryParameterizerBase.java?rev=1330624&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryParameterizerBase.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryParameterizerBase.java Thu Apr 26 01:31:22 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.query.Query;
+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...
+abstract class QueryParameterizerBase implements QueryParameterizer
+{
+    protected final Map<String,Node> params = new HashMap<String,Node>();
+    protected String[] rawStrings = new String[]{};
+    
+    // TODO think about getting rid of the regex and use a true SPARQL parser, so we can understand quotes and comments
+    protected String buildFromString(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, doesn't limit itself to only variables (which is bad)...
+            Pattern p = Pattern.compile("([?$]" + entry.getKey() + ")([^\\w]|$)");
+            toReturn = p.matcher(toReturn).replaceAll(FmtUtils.stringForNode(entry.getValue(), context) + "$2");
+        }
+        
+        return toReturn;
+    }
+    
+    protected Query buildFromQuery(Query query)
+    {
+        
+        
+        return null;
+    }
+
+    @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=1330624&r1=1330623&r2=1330624&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 Thu Apr 26 01:31:22 2012
@@ -6,6 +6,7 @@ import java.util.concurrent.TimeUnit;
 import com.hp.hpl.jena.graph.Triple;
 import com.hp.hpl.jena.query.ResultSet;
 import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.Statement;
 
 
 /**
@@ -45,6 +46,19 @@ public interface QueryStatement extends 
     Model execConstruct(Model model);
     
     /**
+     * Execute a CONSTRUCT query, returning the results as an iterator of {@link Statement}.  The
+     * statements are <b>NOT</b> added to the model passed as a context for creating the statements.
+     * <p/>
+     * <b>Caution:</b> This method may return duplicate Statements (which could be useful if you only
+     * need the results for stream processing, as it can avoid having to place the results in a Model).
+     * 
+     * @param refModel the model context in which to create the statements; note that the statements are <b>NOT</b> added to the model
+     * @return An iterator of Triple objects (possibly containing duplicates) generated
+     * by applying the CONSTRUCT template of the query to the bindings in the WHERE clause.
+     */
+    Iterator<Statement> execConstructStatements(Model refModel);
+    
+    /**
      * Execute a CONSTRUCT query, returning the results as an iterator of {@link Triple}.
      * <p/>
      * <b>Caution:</b> This method may return duplicate Triples (which could be useful if you only
@@ -72,6 +86,30 @@ public interface QueryStatement extends 
     Model execDescribe(Model model);
     
     /**
+     * Execute a DESCRIBE query, returning the results as an iterator of {@link Statement}.  The
+     * statements are <b>NOT</b> added to the model passed as a context for creating the statements.
+     * <p/>
+     * <b>Caution:</b> This method may return duplicate Statements (which could be useful if you only
+     * need the results for stream processing, as it can avoid having to place the results in a Model).
+     * 
+     * @param refModel the model context in which to create the statements; note that the statements are <b>NOT</b> added to the model
+     * @return An iterator of Statement objects (possibly containing duplicates) generated
+     * by executing the DESCRIBE query.
+     */
+    Iterator<Statement> execDescribeStatements(Model refModel);
+
+    /**
+     * Execute a DESCRIBE query, returning the results as an iterator of {@link Triple}.
+     * <p/>
+     * <b>Caution:</b> This method may return duplicate Triples (which could be useful if you only
+     * need the results for stream processing, as it can avoid having to place the results in a Model).
+     * 
+     * @return An iterator of Triple objects (possibly containing duplicates) generated
+     * by executing the DESCRIBE query.
+     */
+    Iterator<Triple> execDescribeTriples();
+    
+    /**
      * Execute an ASK query.
      * @return a <code>boolean</code> corresponding to the result of the ASK query 
      */

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryStatementBase.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryStatementBase.java?rev=1330624&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryStatementBase.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/QueryStatementBase.java Thu Apr 26 01:31:22 2012
@@ -0,0 +1,158 @@
+package org.apache.jena.client;
+
+import java.util.Iterator;
+import java.util.concurrent.TimeUnit;
+
+import org.openjena.atlas.iterator.Iter;
+import org.openjena.atlas.iterator.Transform;
+
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.query.ResultSet;
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.ModelFactory;
+import com.hp.hpl.jena.rdf.model.Statement;
+import com.hp.hpl.jena.rdf.model.impl.StmtIteratorImpl;
+
+public abstract class QueryStatementBase extends QueryParameterizerBase implements QueryStatement
+{
+    private final Connection connection;
+    private long timeout1;
+    private long timeout2;
+    
+    public QueryStatementBase(Connection connection)
+    {
+        this.connection = connection;
+    }
+    
+    public abstract ResultSet doExecSelect();
+    public abstract Iterator<Triple> doExecConstructTriples();
+    public abstract Iterator<Triple> doExecDescribeTriples();
+    public abstract boolean doExecAsk();
+    
+    @Override
+    public abstract void cancel();
+    
+
+    @Override
+    public Connection getConnection()
+    {
+        return connection;
+    }
+
+    @Override
+    public ResultSet execSelect()
+    {
+        startTimer();
+        return doExecSelect();
+    }
+
+    @Override
+    public Model execConstruct()
+    {
+        return execConstruct(ModelFactory.createDefaultModel());
+    }
+
+    @Override
+    public Model execConstruct(Model model)
+    {
+        return model.add(new StmtIteratorImpl(execConstructStatements(model)));
+    }
+    
+    @Override
+    public Iterator<Statement> execConstructStatements(final Model refModel)
+    {
+        return Iter.map(execConstructTriples(), new Transform<Triple,Statement>()
+        {
+            @Override
+            public Statement convert(Triple item)
+            {
+                return refModel.asStatement(item);
+            }
+        });
+    }
+
+    @Override
+    public Iterator<Triple> execConstructTriples()
+    {
+        startTimer();
+        return doExecConstructTriples();
+    }
+
+    @Override
+    public Model execDescribe()
+    {
+        return execDescribe(ModelFactory.createDefaultModel());
+    }
+
+    @Override
+    public Model execDescribe(Model model)
+    {
+        return model.add(new StmtIteratorImpl(execDescribeStatements(model)));
+    }
+    
+    @Override
+    public Iterator<Statement> execDescribeStatements(final Model refModel)
+    {
+        return Iter.map(execDescribeTriples(), new Transform<Triple,Statement>()
+        {
+            @Override
+            public Statement convert(Triple item)
+            {
+                return refModel.asStatement(item);
+            }
+        });
+    }
+
+    @Override
+    public Iterator<Triple> execDescribeTriples()
+    {
+        startTimer();
+        return doExecDescribeTriples();
+    }
+
+    @Override
+    public boolean execAsk()
+    {
+        startTimer();
+        return doExecAsk();
+    }
+
+    @Override
+    public void setTimeout(long timeout)
+    {
+        setTimeout(timeout, TimeUnit.MILLISECONDS);
+    }
+
+    @Override
+    public void setTimeout(long timeout, TimeUnit timeoutUnits)
+    {
+        setTimeout(timeout, timeoutUnits, 0, TimeUnit.MILLISECONDS);
+    }
+
+    @Override
+    public void setTimeout(long timeout1, long timeout2)
+    {
+        setTimeout(timeout1, TimeUnit.MILLISECONDS, timeout2, TimeUnit.MILLISECONDS);
+    }
+
+    @Override
+    public void setTimeout(long timeout1, TimeUnit timeUnit1, long timeout2, TimeUnit timeUnit2)
+    {
+        timeout1 = asMillis(timeout1, timeUnit1);
+        timeout2 = asMillis(timeout2, timeUnit2);
+    }
+    
+    protected void startTimer()
+    {
+        // TODO what are the semantics of the timeouts?  Do they get reset each time we get a new result?
+        // Look at QueryExecutionBase to see how it's currently being done
+        
+        //if (timeoutExpired) cancel();
+    }
+    
+    
+    private static long asMillis(long duration, TimeUnit timeUnit)
+    {
+        return (duration < 0 ) ? duration : timeUnit.toMillis(duration) ;
+    }
+}

Modified: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpConnection.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpConnection.java?rev=1330624&r1=1330623&r2=1330624&view=diff
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpConnection.java (original)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpConnection.java Thu Apr 26 01:31:22 2012
@@ -96,6 +96,20 @@ public class SparqlHttpConnection extend
     }
     
     
+    @Override
+    public QueryStatement createQueryStatement(String queryString)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public QueryStatement createQueryStatement(Query query)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+    
 
     @Override
     public Service getServices()
@@ -237,18 +251,4 @@ public class SparqlHttpConnection extend
 
     }
 
-    @Override
-    public QueryStatement createQueryStatement(String queryString)
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public QueryStatement createQueryStatement(Query query)
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
 }

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpQueryStatement.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpQueryStatement.java?rev=1330624&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpQueryStatement.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpQueryStatement.java Thu Apr 26 01:31:22 2012
@@ -0,0 +1,62 @@
+package org.apache.jena.client.http;
+
+import java.util.Iterator;
+
+import org.apache.jena.client.Connection;
+import org.apache.jena.client.QueryStatement;
+import org.apache.jena.client.QueryStatementBase;
+
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.query.ResultSet;
+
+class SparqlHttpQueryStatement extends QueryStatementBase implements QueryStatement
+{
+    private final SparqlHttpConnection connection;
+    private final String queryString;
+    
+    SparqlHttpQueryStatement(String queryString, SparqlHttpConnection connection)
+    {
+        super(connection);
+        this.connection = connection;
+        this.queryString = queryString;
+    }
+
+    @Override
+    public ResultSet doExecSelect()
+    {
+        String sparql = buildFromString(queryString, null);
+        
+        
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Iterator<Triple> doExecConstructTriples()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Iterator<Triple> doExecDescribeTriples()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean doExecAsk()
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void cancel()
+    {
+        // TODO Auto-generated method stub
+
+    }
+
+}