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/21 02:40:23 UTC

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

Author: sallen
Date: Sat Apr 21 00:40:22 2012
New Revision: 1328549

URL: http://svn.apache.org/viewvc?rev=1328549&view=rev
Log:
jena-client - Lots of changes on the the update side of things.

Added:
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/ModifierWrapper.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateDeleter.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateDeleterWrapper.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateInserter.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateInserterWrapper.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateQuerier.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateQuerierWrapper.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpQueryService.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpRepository.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpUpdateService.java
Removed:
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Deleter.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Inserter.java
Modified:
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/BulkDataHandler.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Connection.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/ConnectionBase.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Repository.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Updater.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdaterBase.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpConnection.java
    incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpUpdater.java

Modified: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/BulkDataHandler.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/BulkDataHandler.java?rev=1328549&r1=1328548&r2=1328549&view=diff
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/BulkDataHandler.java (original)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/BulkDataHandler.java Sat Apr 21 00:40:22 2012
@@ -20,7 +20,7 @@ package org.apache.jena.client;
 
 import org.openjena.atlas.lib.Closeable ;
 
-public interface BulkDataHandler extends Deleter, Closeable
+public interface BulkDataHandler extends UpdateDeleter, Closeable
 {
 
 }

Modified: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Connection.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Connection.java?rev=1328549&r1=1328548&r2=1328549&view=diff
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Connection.java (original)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Connection.java Sat Apr 21 00:40:22 2012
@@ -69,5 +69,14 @@ public interface Connection extends Tran
     // TODO make ParameterizedQueryExecution and ParameterizedUpdateProcessor
     QueryExecution createParameterizedQuery(String query);
     UpdateProcessor createPparameterizedUpdate(String updateQuery);
+
+
+    Updater createBulkUpdater();
+
+    UpdateInserter createBulkUpdateInserter();
+    
+    UpdateDeleter createBulkUpdateDeleter();
+
+    UpdateQuerier createBulkUpdateQuerier();
 }
 

Modified: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/ConnectionBase.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/ConnectionBase.java?rev=1328549&r1=1328548&r2=1328549&view=diff
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/ConnectionBase.java (original)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/ConnectionBase.java Sat Apr 21 00:40:22 2012
@@ -1,17 +1,143 @@
 package org.apache.jena.client;
 
-import java.io.InputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.util.Iterator;
 
-import com.hp.hpl.jena.graph.Graph;
-import com.hp.hpl.jena.graph.Node;
-import com.hp.hpl.jena.graph.Triple;
-import com.hp.hpl.jena.sparql.core.DatasetGraph;
 import com.hp.hpl.jena.sparql.core.Quad;
+import com.hp.hpl.jena.update.Update;
 
 public abstract class ConnectionBase extends UpdaterBase implements Connection
 {
+    protected boolean bulkOperationOngoing = false;
 
+    protected abstract boolean hasBulkUpdater();
+    protected abstract Updater doCreateBulkUpdater();
+    protected abstract UpdateInserter doCreateBulkUpdateInserter();
+    protected abstract UpdateDeleter doCreateBulkUpdateDeleter();
+    protected abstract UpdateQuerier doCreateBulkUpdateQuerier();
     
+    
+    protected void checkBulkOperationOngoing()
+    {
+        if (bulkOperationOngoing)
+        {
+            throw new IllegalStateException("You must close any open bulk operations before other operations are allowed on this Connection");
+        }
+    }
 
+    @Override
+    public final Updater createBulkUpdater()
+    {
+        if (!hasBulkUpdater())
+        {
+            throw new IllegalAccessError("This Connection does not support retreiving a bulk Modifier.  You can check this with hasBulkModifier()");
+        }
+        checkBulkOperationOngoing();
+        bulkOperationOngoing = true;
+        return new ModifierWrapper(doCreateBulkUpdater())
+        {
+            @Override
+            public void close()
+            {
+                super.close();
+                bulkOperationOngoing = false;
+            }
+        };
+    }
+    
+    @Override
+    public final UpdateInserter createBulkUpdateInserter()
+    {
+        checkBulkOperationOngoing();
+        bulkOperationOngoing = true;
+        //return getProxy(Inserter.class, doCreateBulkInserter());
+        return new UpdateInserterWrapper(doCreateBulkUpdater())
+        {
+            @Override
+            public void close()
+            {
+                super.close();
+                bulkOperationOngoing = false;
+            }
+        };
+    }
+    
+    @Override
+    public final UpdateDeleter createBulkUpdateDeleter()
+    {
+        checkBulkOperationOngoing();
+        bulkOperationOngoing = true;
+        return new UpdateDeleterWrapper(doCreateBulkUpdater())
+        {
+            @Override
+            public void close()
+            {
+                super.close();
+                bulkOperationOngoing = false;
+            }
+        };
+    }
+    
+    @Override
+    public final UpdateQuerier createBulkUpdateQuerier()
+    {
+        checkBulkOperationOngoing();
+        bulkOperationOngoing = true;
+        return new UpdateQuerierWrapper(doCreateBulkUpdater())
+        {
+            @Override
+            public void close()
+            {
+                super.close();
+                bulkOperationOngoing = false;
+            }
+        };
+    }
+    
+    @Override
+    protected void doInsert(Iterator<? extends Quad> it)
+    {
+        checkBulkOperationOngoing();
+        UpdateInserter inserter = doCreateBulkUpdateInserter();
+        inserter.insert(it);
+        inserter.close();
+    }
+    
+    @Override
+    protected void doDelete(Iterator<? extends Quad> it)
+    {
+        checkBulkOperationOngoing();
+        UpdateDeleter deleter = doCreateBulkUpdateDeleter();
+        deleter.delete(it);
+        deleter.close();
+    }
+    
+    @Override
+    protected void doUpdate(Iterator<? extends Update> it)
+    {
+        checkBulkOperationOngoing();
+        UpdateQuerier updater = doCreateBulkUpdateQuerier();
+        updater.update(it);
+        updater.close();
+    }
+    
+    
+    // Cool idea to prevent having to create *Wrapper classes.  But it uses reflection, which will be slower (by how much?)
+    @SuppressWarnings({ "unchecked", "unused" })
+    private <T> T getProxy(Class<T> intf, final T obj)
+    {
+        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), new Class[] { intf }, new InvocationHandler()
+        {
+            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
+            {
+                if ("close".equals(method.getName()))
+                {
+                    bulkOperationOngoing = false;
+                }
+                return method.invoke(obj, args);
+            }
+        });
+    }
 }

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/ModifierWrapper.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/ModifierWrapper.java?rev=1328549&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/ModifierWrapper.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/ModifierWrapper.java Sat Apr 21 00:40:22 2012
@@ -0,0 +1,204 @@
+package org.apache.jena.client;
+
+import java.io.InputStream;
+import java.util.Iterator;
+
+import org.openjena.riot.Lang;
+
+import com.hp.hpl.jena.graph.Graph;
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.sparql.core.DatasetGraph;
+import com.hp.hpl.jena.sparql.core.Quad;
+import com.hp.hpl.jena.update.Update;
+
+class ModifierWrapper implements Updater
+{
+    private final Updater wrappedObject;
+
+    public ModifierWrapper(Updater modifier)
+    {
+        this.wrappedObject = modifier;
+    }
+
+    @Override
+    public void close()
+    {
+        wrappedObject.close();
+    }
+
+    @Override
+    public void delete(Quad q)
+    {
+        wrappedObject.delete(q);
+    }
+
+    @Override
+    public void insert(Quad q)
+    {
+        wrappedObject.insert(q);
+    }
+
+    @Override
+    public void delete(Iterable<? extends Quad> quads)
+    {
+        wrappedObject.delete(quads);
+    }
+
+    @Override
+    public void insert(Iterable<? extends Quad> quads)
+    {
+        wrappedObject.insert(quads);
+    }
+
+    @Override
+    public void delete(Iterator<? extends Quad> quadIter)
+    {
+        wrappedObject.delete(quadIter);
+    }
+
+    @Override
+    public void insert(Iterator<? extends Quad> quadIter)
+    {
+        wrappedObject.insert(quadIter);
+    }
+
+    @Override
+    public void delete(DatasetGraph dsg)
+    {
+        wrappedObject.delete(dsg);
+    }
+
+    @Override
+    public void insert(DatasetGraph dsg)
+    {
+        wrappedObject.insert(dsg);
+    }
+
+    @Override
+    public void delete(InputStream in, Lang lang)
+    {
+        wrappedObject.delete(in, lang);
+    }
+
+    @Override
+    public void insert(InputStream in, Lang lang)
+    {
+        wrappedObject.insert(in, lang);
+    }
+
+    @Override
+    public void delete(InputStream in, Lang lang, String base)
+    {
+        wrappedObject.delete(in, lang, base);
+    }
+
+    @Override
+    public void insert(InputStream in, Lang lang, String base)
+    {
+        wrappedObject.insert(in, lang, base);
+    }
+
+    @Override
+    public void delete(Node graphName, Triple t)
+    {
+        wrappedObject.delete(graphName, t);
+    }
+
+    @Override
+    public void insert(Node graphName, Triple t)
+    {
+        wrappedObject.insert(graphName, t);
+    }
+
+    @Override
+    public void delete(Node graphName, Iterable<? extends Triple> triples)
+    {
+        wrappedObject.delete(graphName, triples);
+    }
+
+    @Override
+    public void insert(Node graphName, Iterable<? extends Triple> triples)
+    {
+        wrappedObject.insert(graphName, triples);
+    }
+
+    @Override
+    public void delete(Node graphName, Iterator<? extends Triple> tripleIter)
+    {
+        wrappedObject.delete(graphName, tripleIter);
+    }
+
+    @Override
+    public void insert(Node graphName, Iterator<? extends Triple> tripleIter)
+    {
+        wrappedObject.insert(graphName, tripleIter);
+    }
+
+    @Override
+    public void delete(Node graphName, Graph g)
+    {
+        wrappedObject.delete(graphName, g);
+    }
+
+    @Override
+    public void insert(Node graphName, Graph g)
+    {
+        wrappedObject.insert(graphName, g);
+    }
+
+    @Override
+    public void delete(Node graphName, InputStream in, Lang lang)
+    {
+        wrappedObject.delete(graphName, in, lang);
+    }
+
+    @Override
+    public void insert(Node graphName, InputStream in, Lang lang)
+    {
+        wrappedObject.insert(graphName, in, lang);
+    }
+
+    @Override
+    public void delete(Node graphName, InputStream in, Lang lang, String base)
+    {
+        wrappedObject.delete(graphName, in, lang, base);
+    }
+
+    @Override
+    public void insert(Node graphName, InputStream in, Lang lang, String base)
+    {
+        wrappedObject.insert(graphName, in, lang, base);
+    }
+
+    @Override
+    public void update(String updateQuery)
+    {
+        wrappedObject.update(updateQuery);
+    }
+
+    @Override
+    public void update(String updateQuery, String baseURI)
+    {
+        wrappedObject.update(updateQuery, baseURI);
+    }
+
+    @Override
+    public void update(Update update)
+    {
+        wrappedObject.update(update);
+    }
+
+    @Override
+    public void update(Iterator<? extends Update> updateIter)
+    {
+        wrappedObject.update(updateIter);
+    }
+
+    @Override
+    public void update(Iterable<? extends Update> updates)
+    {
+        wrappedObject.update(updates);
+    }
+    
+}

Modified: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Repository.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Repository.java?rev=1328549&r1=1328548&r2=1328549&view=diff
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Repository.java (original)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Repository.java Sat Apr 21 00:40:22 2012
@@ -18,7 +18,7 @@
 
 package org.apache.jena.client;
 
-import org.apache.jena.client.service.Service ;
+import org.apache.jena.client.service.Service;
 
 /**
  * Represents an RDF database.  This can be local or remote.

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateDeleter.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateDeleter.java?rev=1328549&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateDeleter.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateDeleter.java Sat Apr 21 00:40:22 2012
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.client;
+
+import java.io.InputStream;
+import java.util.Iterator;
+
+import org.openjena.atlas.lib.Closeable;
+import org.openjena.riot.Lang;
+
+import com.hp.hpl.jena.graph.Graph;
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.sparql.core.DatasetGraph;
+import com.hp.hpl.jena.sparql.core.Quad;
+
+public interface UpdateDeleter extends Closeable
+{
+    // Quads
+    void delete(Quad q);
+    void delete(Iterable<? extends Quad> quads);
+    void delete(Iterator<? extends Quad> quadIter);
+    void delete(DatasetGraph dsg);
+    void delete(InputStream in, Lang lang);  // Lang must be NQUADS or TRIG
+    void delete(InputStream in, Lang lang, String base);  // Lang must be NQUADS or TRIG
+    
+    // Triples
+    void delete(Node graphName, Triple t);
+    void delete(Node graphName, Iterable<? extends Triple> triples);
+    void delete(Node graphName, Iterator<? extends Triple> tripleIter);
+    void delete(Node graphName, Graph g);
+    void delete(Node graphName, InputStream in, Lang lang);
+    void delete(Node graphName, InputStream in, Lang lang, String base);
+}
+

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateDeleterWrapper.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateDeleterWrapper.java?rev=1328549&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateDeleterWrapper.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateDeleterWrapper.java Sat Apr 21 00:40:22 2012
@@ -0,0 +1,100 @@
+package org.apache.jena.client;
+
+import java.io.InputStream;
+import java.util.Iterator;
+
+import org.openjena.riot.Lang;
+
+import com.hp.hpl.jena.graph.Graph;
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.sparql.core.DatasetGraph;
+import com.hp.hpl.jena.sparql.core.Quad;
+
+class UpdateDeleterWrapper implements UpdateDeleter
+{
+    private final UpdateDeleter wrappedObject;
+
+    public UpdateDeleterWrapper(UpdateDeleter wrappedObject)
+    {
+        this.wrappedObject = wrappedObject;
+    }
+
+    @Override
+    public void close()
+    {
+        wrappedObject.close();
+    }
+
+    @Override
+    public void delete(Quad q)
+    {
+        wrappedObject.delete(q);
+    }
+
+    @Override
+    public void delete(Iterable<? extends Quad> quads)
+    {
+        wrappedObject.delete(quads);
+    }
+
+    @Override
+    public void delete(Iterator<? extends Quad> quadIter)
+    {
+        wrappedObject.delete(quadIter);
+    }
+
+    @Override
+    public void delete(DatasetGraph dsg)
+    {
+        wrappedObject.delete(dsg);
+    }
+
+    @Override
+    public void delete(InputStream in, Lang lang)
+    {
+        wrappedObject.delete(in, lang);
+    }
+
+    @Override
+    public void delete(InputStream in, Lang lang, String base)
+    {
+        wrappedObject.delete(in, lang, base);
+    }
+
+    @Override
+    public void delete(Node graphName, Triple t)
+    {
+        wrappedObject.delete(graphName, t);
+    }
+
+    @Override
+    public void delete(Node graphName, Iterable<? extends Triple> triples)
+    {
+        wrappedObject.delete(graphName, triples);
+    }
+
+    @Override
+    public void delete(Node graphName, Iterator<? extends Triple> tripleIter)
+    {
+        wrappedObject.delete(graphName, tripleIter);
+    }
+
+    @Override
+    public void delete(Node graphName, Graph g)
+    {
+        wrappedObject.delete(graphName, g);
+    }
+
+    @Override
+    public void delete(Node graphName, InputStream in, Lang lang)
+    {
+        wrappedObject.delete(graphName, in, lang);
+    }
+
+    @Override
+    public void delete(Node graphName, InputStream in, Lang lang, String base)
+    {
+        wrappedObject.delete(graphName, in, lang, base);
+    }
+}

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateInserter.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateInserter.java?rev=1328549&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateInserter.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateInserter.java Sat Apr 21 00:40:22 2012
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.client;
+
+import java.io.InputStream;
+import java.util.Iterator;
+
+import org.openjena.atlas.lib.Closeable;
+import org.openjena.riot.Lang;
+
+import com.hp.hpl.jena.graph.Graph;
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.sparql.core.DatasetGraph;
+import com.hp.hpl.jena.sparql.core.Quad;
+
+public interface UpdateInserter extends Closeable
+{
+    // Quads
+    void insert(Quad q);
+    void insert(Iterable<? extends Quad> quads);
+    void insert(Iterator<? extends Quad> quadIter);
+    void insert(DatasetGraph dsg);
+    void insert(InputStream in, Lang lang);  // Lang must be NQUADS or TRIG
+    void insert(InputStream in, Lang lang, String base);  // Lang must be NQUADS or TRIG
+    
+    // Triples
+    void insert(Node graphName, Triple t);
+    void insert(Node graphName, Iterable<? extends Triple> triples);
+    void insert(Node graphName, Iterator<? extends Triple> tripleIter);
+    void insert(Node graphName, Graph g);
+    void insert(Node graphName, InputStream in, Lang lang);
+    void insert(Node graphName, InputStream in, Lang lang, String base);
+    //void insert(Node graphName, IRI sourceDocument);
+    
+}
+

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateInserterWrapper.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateInserterWrapper.java?rev=1328549&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateInserterWrapper.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateInserterWrapper.java Sat Apr 21 00:40:22 2012
@@ -0,0 +1,101 @@
+package org.apache.jena.client;
+
+import java.io.InputStream;
+import java.util.Iterator;
+
+import org.openjena.riot.Lang;
+
+import com.hp.hpl.jena.graph.Graph;
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.sparql.core.DatasetGraph;
+import com.hp.hpl.jena.sparql.core.Quad;
+
+class UpdateInserterWrapper implements UpdateInserter
+{
+    private final UpdateInserter wrappedObject;
+
+    public UpdateInserterWrapper(UpdateInserter wrappedObject)
+    {
+        this.wrappedObject = wrappedObject;
+    }
+
+    @Override
+    public void close()
+    {
+        wrappedObject.close();
+    }
+
+    @Override
+    public void insert(Quad q)
+    {
+        wrappedObject.insert(q);
+    }
+
+    @Override
+    public void insert(Iterable<? extends Quad> quads)
+    {
+        wrappedObject.insert(quads);
+    }
+
+    @Override
+    public void insert(Iterator<? extends Quad> quadIter)
+    {
+        wrappedObject.insert(quadIter);
+    }
+
+    @Override
+    public void insert(DatasetGraph dsg)
+    {
+        wrappedObject.insert(dsg);
+    }
+
+    @Override
+    public void insert(InputStream in, Lang lang)
+    {
+        wrappedObject.insert(in, lang);
+    }
+
+    @Override
+    public void insert(InputStream in, Lang lang, String base)
+    {
+        wrappedObject.insert(in, lang, base);
+    }
+
+    @Override
+    public void insert(Node graphName, Triple t)
+    {
+        wrappedObject.insert(graphName, t);
+    }
+
+    @Override
+    public void insert(Node graphName, Iterable<? extends Triple> triples)
+    {
+        wrappedObject.insert(graphName, triples);
+    }
+
+    @Override
+    public void insert(Node graphName, Iterator<? extends Triple> tripleIter)
+    {
+        wrappedObject.insert(graphName, tripleIter);
+    }
+
+    @Override
+    public void insert(Node graphName, Graph g)
+    {
+        wrappedObject.insert(graphName, g);
+    }
+
+    @Override
+    public void insert(Node graphName, InputStream in, Lang lang)
+    {
+        wrappedObject.insert(graphName, in, lang);
+    }
+
+    @Override
+    public void insert(Node graphName, InputStream in, Lang lang, String base)
+    {
+        wrappedObject.insert(graphName, in, lang, base);
+    }
+    
+}

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateQuerier.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateQuerier.java?rev=1328549&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateQuerier.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateQuerier.java Sat Apr 21 00:40:22 2012
@@ -0,0 +1,35 @@
+package org.apache.jena.client;
+
+import java.util.Iterator;
+
+import org.openjena.atlas.lib.Closeable;
+
+import com.hp.hpl.jena.update.Update;
+
+// TODO I don't like this name... The idea of this class is it can do all SPARQL 1.1 Update operations,
+// but they all must be contained in an object, so it isn't suitable for streaming large quads.
+public interface UpdateQuerier extends Closeable
+{
+    /**
+     * Execute an update query by parsing from a string.
+     * 
+     * @param updateQuery The update request as a string.
+     */
+    void update(String updateQuery);
+    
+    /**
+     * Execute an update query by parsing from a string.
+     * 
+     * @param updateQuery The update request as a string.
+     * @param baseURI The base URI for resolving relative URIs. 
+     */
+    void update(String updateQuery, String baseURI);
+    
+//    void update(String updateQuery, Syntax syntax);
+    
+    void update(Update update);
+    
+    void update(Iterator<? extends Update> updateIter);
+    
+    void update(Iterable<? extends Update> updates);
+}

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateQuerierWrapper.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateQuerierWrapper.java?rev=1328549&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateQuerierWrapper.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdateQuerierWrapper.java Sat Apr 21 00:40:22 2012
@@ -0,0 +1,52 @@
+package org.apache.jena.client;
+
+import java.util.Iterator;
+
+import com.hp.hpl.jena.update.Update;
+
+class UpdateQuerierWrapper implements UpdateQuerier
+{
+    private final UpdateQuerier wrappedObject;
+
+    public UpdateQuerierWrapper(UpdateQuerier wrappedObject)
+    {
+        this.wrappedObject = wrappedObject;
+    }
+
+    @Override
+    public void close()
+    {
+        wrappedObject.close();
+    }
+
+    @Override
+    public void update(String updateQuery)
+    {
+        wrappedObject.update(updateQuery);
+    }
+
+    @Override
+    public void update(String updateQuery, String baseURI)
+    {
+        wrappedObject.update(updateQuery, baseURI);
+    }
+
+    @Override
+    public void update(Update update)
+    {
+        wrappedObject.update(update);
+    }
+
+    @Override
+    public void update(Iterator<? extends Update> updateIter)
+    {
+        wrappedObject.update(updateIter);
+    }
+
+    @Override
+    public void update(Iterable<? extends Update> updates)
+    {
+        wrappedObject.update(updates);
+    }
+    
+}

Modified: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Updater.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Updater.java?rev=1328549&r1=1328548&r2=1328549&view=diff
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Updater.java (original)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/Updater.java Sat Apr 21 00:40:22 2012
@@ -21,7 +21,7 @@ package org.apache.jena.client;
 import org.openjena.atlas.lib.Closeable;
 
 
-public interface Updater extends Inserter, Deleter, Closeable
+public interface Updater extends UpdateInserter, UpdateDeleter, UpdateQuerier, Closeable
 {
     
 }

Modified: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdaterBase.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdaterBase.java?rev=1328549&r1=1328548&r2=1328549&view=diff
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdaterBase.java (original)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/UpdaterBase.java Sat Apr 21 00:40:22 2012
@@ -32,20 +32,66 @@ import com.hp.hpl.jena.graph.Node;
 import com.hp.hpl.jena.graph.Triple;
 import com.hp.hpl.jena.sparql.core.DatasetGraph;
 import com.hp.hpl.jena.sparql.core.Quad;
+import com.hp.hpl.jena.update.Update;
+import com.hp.hpl.jena.update.UpdateFactory;
 
 public abstract class UpdaterBase implements Updater
 {
     
+    protected abstract void doInsert(Iterator<? extends Quad> quadIter);
+    
+    protected abstract void doDelete(Iterator<? extends Quad> quadIter);
+    
+    protected abstract void doUpdate(Iterator<? extends Update> updateIter);
+    
+    
+    // -- Querier -----------------------
+    
     @Override
-    public abstract void insert(Iterator<? extends Quad> quadIter);
+    public void update(Iterator<? extends Update> updateIter)
+    {
+        doUpdate(updateIter);
+    }
     
     @Override
-    public abstract void delete(Iterator<? extends Quad> quadIter);
+    public void update(Iterable<? extends Update> updates)
+    {
+        update(updates.iterator());
+    }
     
+    @Override
+    public void update(String updateQuery)
+    {
+        update(UpdateFactory.create(updateQuery));
+    }
+    
+    @Override
+    public void update(String updateQuery, String baseURI)
+    {
+        update(UpdateFactory.create(updateQuery, baseURI));
+    }
+    
+//    @Override
+//    public void update(String updateQuery, Syntax syntax)
+//    {
+//        update(UpdateFactory.create(updateQuery, syntax));
+//    }
+    
+    @Override
+    public void update(Update update)
+    {
+        update(Arrays.asList(update));
+    }
     
     // -- Inserter ----------------------
     
     @Override
+    public void insert(Iterator<? extends Quad> quadIter)
+    {
+        doInsert(quadIter);
+    }
+    
+    @Override
     public void insert(Quad q)
     {
         insert(Arrays.asList(q));
@@ -173,6 +219,12 @@ public abstract class UpdaterBase implem
     // -- Deleter -----------------
     
     @Override
+    public void delete(Iterator<? extends Quad> quadIter)
+    {
+        doDelete(quadIter);
+    }
+    
+    @Override
     public void delete(Quad q)
     {
         delete(Arrays.asList(q));

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=1328549&r1=1328548&r2=1328549&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 Sat Apr 21 00:40:22 2012
@@ -1,38 +1,96 @@
 package org.apache.jena.client.http;
 
-import java.io.InputStream;
-import java.util.Iterator;
-
 import org.apache.jena.client.BulkDataHandler;
 import org.apache.jena.client.ConnectionBase;
-import org.apache.jena.client.UpdaterBase;
-import org.apache.jena.client.RDFFormat;
 import org.apache.jena.client.Repository;
+import org.apache.jena.client.UpdateDeleter;
+import org.apache.jena.client.UpdateInserter;
+import org.apache.jena.client.UpdateQuerier;
+import org.apache.jena.client.Updater;
 import org.apache.jena.client.service.QueryService;
 import org.apache.jena.client.service.Service;
 import org.apache.jena.client.service.UpdateService;
-import org.apache.jena.iri.IRI;
 
-import com.hp.hpl.jena.graph.Node;
-import com.hp.hpl.jena.graph.Triple;
 import com.hp.hpl.jena.query.QueryExecution;
 import com.hp.hpl.jena.query.ReadWrite;
-import com.hp.hpl.jena.sparql.core.Quad;
 import com.hp.hpl.jena.update.UpdateProcessor;
 
 public class SparqlHttpConnection extends ConnectionBase
 {
+    private final SparqlHttpRepository repo;
+    
+    private SparqlHttpQueryService activeQueryService;
+    private SparqlHttpUpdateService activeUpdateService;
+    
+    public SparqlHttpConnection(SparqlHttpRepository repo)
+    {
+        if (null == repo)
+        {
+            throw new IllegalArgumentException("repo must not be null");
+        }
+        
+        this.repo = repo;
+        this.activeQueryService = repo.getDefaultQueryService();
+        this.activeUpdateService =repo.getDefaultUpdateService();
+        
+    }
+    
+//    /**
+//     * @throws IllegalArgumentException if the QueryService is not a SparqlHttpQueryService
+//     */
+//    private SparqlHttpQueryService castUp(QueryService queryService)
+//    {
+//        if (!(queryService instanceof SparqlHttpUpdateService))
+//        {
+//            throw new IllegalArgumentException(String.format("%1$s only accepts %2$s for %3$s",
+//                    SparqlHttpConnection.class.getSimpleName(), SparqlHttpQueryService.class.getSimpleName(), QueryService.class.getSimpleName()));
+//        }
+//        return (SparqlHttpQueryService)queryService;
+//    }
+//    
+//    /**
+//     * @throws IllegalArgumentException if the UpdateService is not a SparqlHttpUpdateService
+//     */
+//    private SparqlHttpUpdateService castUp(UpdateService updateService)
+//    {
+//        if (!(updateService instanceof SparqlHttpUpdateService))
+//        {
+//            throw new IllegalArgumentException(String.format("%1$s only accepts %2$s for %3$s",
+//                    SparqlHttpConnection.class.getSimpleName(), SparqlHttpUpdateService.class.getSimpleName(), UpdateService.class.getSimpleName()));
+//        }
+//        return (SparqlHttpUpdateService)updateService;
+//    }
+    
+    @Override
+    public boolean hasBulkUpdater()
+    {
+        return true;
+    }
+    
+    @Override
+    protected Updater doCreateBulkUpdater()
+    {
+        SparqlHttpUpdater updater = new SparqlHttpUpdater(activeUpdateService);
+        updater.open();
+        return updater;
+    }
+    
+    @Override
+    protected UpdateInserter doCreateBulkUpdateInserter()
+    {
+        return doCreateBulkUpdater();
+    }
     
     @Override
-    public void insert(Iterator<? extends Quad> it)
+    protected UpdateDeleter doCreateBulkUpdateDeleter()
     {
-        // TODO
+        return doCreateBulkUpdater();
     }
     
     @Override
-    public void delete(Iterator<? extends Quad> it)
+    protected UpdateQuerier doCreateBulkUpdateQuerier()
     {
-        // TODO
+        return doCreateBulkUpdater();
     }
     
     

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpQueryService.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpQueryService.java?rev=1328549&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpQueryService.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpQueryService.java Sat Apr 21 00:40:22 2012
@@ -0,0 +1,27 @@
+package org.apache.jena.client.http;
+
+import org.apache.jena.client.service.ServiceDescription;
+import org.apache.jena.client.service.UpdateService;
+
+public class SparqlHttpQueryService implements UpdateService
+{
+    private final String endpointUrl;
+    
+    public SparqlHttpQueryService(String endpointUrl)
+    {
+        this.endpointUrl = endpointUrl;
+    }
+    
+    public String getEndpointUrl()
+    {
+        return endpointUrl;
+    }
+
+    @Override
+    public ServiceDescription getDescription()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpRepository.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpRepository.java?rev=1328549&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpRepository.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpRepository.java Sat Apr 21 00:40:22 2012
@@ -0,0 +1,34 @@
+package org.apache.jena.client.http;
+
+import org.apache.jena.client.Connection;
+import org.apache.jena.client.Repository;
+import org.apache.jena.client.service.Service;
+
+public class SparqlHttpRepository implements Repository
+{
+
+    @Override
+    public Connection getConnection()
+    {
+        return new SparqlHttpConnection(this);
+    }
+
+    @Override
+    public Service getServices()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+    
+    public SparqlHttpQueryService getDefaultQueryService()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public SparqlHttpUpdateService getDefaultUpdateService()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+}

Added: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpUpdateService.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpUpdateService.java?rev=1328549&view=auto
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpUpdateService.java (added)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpUpdateService.java Sat Apr 21 00:40:22 2012
@@ -0,0 +1,27 @@
+package org.apache.jena.client.http;
+
+import org.apache.jena.client.service.ServiceDescription;
+import org.apache.jena.client.service.UpdateService;
+
+public class SparqlHttpUpdateService implements UpdateService
+{
+    private final String endpointUrl;
+    
+    public SparqlHttpUpdateService(String endpointUrl)
+    {
+        this.endpointUrl = endpointUrl;
+    }
+    
+    public String getEndpointUrl()
+    {
+        return endpointUrl;
+    }
+
+    @Override
+    public ServiceDescription getDescription()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Modified: incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpUpdater.java
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpUpdater.java?rev=1328549&r1=1328548&r2=1328549&view=diff
==============================================================================
--- incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpUpdater.java (original)
+++ incubator/jena/Experimental/jena-client/trunk/src/main/java/org/apache/jena/client/http/SparqlHttpUpdater.java Sat Apr 21 00:40:22 2012
@@ -14,25 +14,27 @@ import org.openjena.atlas.io.IndentedWri
 import com.hp.hpl.jena.sparql.core.Quad;
 import com.hp.hpl.jena.sparql.modify.request.UpdateWriter;
 import com.hp.hpl.jena.sparql.serializer.SerializationContext;
+import com.hp.hpl.jena.update.Update;
 import com.hp.hpl.jena.update.UpdateException;
 
 public class SparqlHttpUpdater extends UpdaterBase
 {
-    private final String sparqlUpdateEndpoint;
+    private final SparqlHttpUpdateService updateService;
     private final SerializationContext sCxt;
     
     private HttpURLConnection conn;
     private OutputStream out;
     private UpdateWriter writer;
+    private boolean opened = false;
     
-    public SparqlHttpUpdater(String sparqlUpdateEndpoint)
+    public SparqlHttpUpdater(SparqlHttpUpdateService updateService)
     {
-        this(sparqlUpdateEndpoint, null);
+        this(updateService, null);
     }
     
-    public SparqlHttpUpdater(String sparqlUpdateEndpoint, SerializationContext sCxt)
+    public SparqlHttpUpdater(SparqlHttpUpdateService updateService, SerializationContext sCxt)
     {
-        this.sparqlUpdateEndpoint = sparqlUpdateEndpoint;
+        this.updateService = updateService;
         this.sCxt = sCxt;
     }
     
@@ -41,7 +43,7 @@ public class SparqlHttpUpdater extends U
         URL url;
         try
         {
-            url = new URL(sparqlUpdateEndpoint);
+            url = new URL(updateService.getEndpointUrl());
             URLConnection urlConn = url.openConnection();
             if (!(urlConn instanceof HttpURLConnection))
             {
@@ -51,12 +53,14 @@ public class SparqlHttpUpdater extends U
             conn.setDoOutput(true);
             
             // TODO Need to enable chunking mode to support streaming.  Otherwise it is all buffered up in memory.
-            //conn.setChunkedStreamingMode(chunklen);
+            //conn.setChunkedStreamingMode(0);
             
             out = conn.getOutputStream();
             
             writer = new UpdateWriter(new IndentedWriter(out), sCxt);
             writer.open();
+            
+            opened = true;
         }
         catch (MalformedURLException e)
         {
@@ -67,46 +71,66 @@ public class SparqlHttpUpdater extends U
             throw new UpdateException(e);
         }
     }
+    
+    private void checkOpen()
+    {
+        if (!opened)
+        {
+            throw new IllegalStateException("SparqlHttpUpdater is not opened.  Call open() first.");
+        }
+    }
 
     @Override
-    public void insert(Iterator<? extends Quad> it)
+    protected void doInsert(Iterator<? extends Quad> it)
     {
+        checkOpen();
         writer.insert(it);
     }
 
     @Override
-    public void delete(Iterator<? extends Quad> it)
+    protected void doDelete(Iterator<? extends Quad> it)
     {
+        checkOpen();
         writer.delete(it);
     }
     
     @Override
+    protected void doUpdate(Iterator<? extends Update> it)
+    {
+        checkOpen();
+        writer.update(it);
+    }
+    
+    @Override
     public void close()
     {
-        writer.close();
-        try
+        if (opened)
         {
-            out.close();
-            
-            // Get the response
-            int responseCode = conn.getResponseCode();
-            String responseMessage = conn.getResponseMessage();
-            
-            if (responseCode == 204) // No content
+            writer.close();
+            try
             {
-                return;
+                out.close();
+                
+                // Get the response
+                int responseCode = conn.getResponseCode();
+                String responseMessage = conn.getResponseMessage();
+                
+                if (responseCode == 204) // No content
+                {
+                    return;
+                }
+                if (responseCode == 200) // OK
+                {
+                    // But what was the content?
+                    // TODO read body 
+                    return;
+                }
+                throw new UpdateException(responseCode+" "+responseMessage) ;
             }
-            if (responseCode == 200) // OK
+            catch (IOException e)
             {
-                // But what was the content?
-                // TODO read body 
-                return;
+                throw new UpdateException(e);
             }
-            throw new UpdateException(responseCode+" "+responseMessage) ;
-        }
-        catch (IOException e)
-        {
-            throw new UpdateException(e);
         }
     }
 }