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/05/22 01:48:08 UTC

svn commit: r1341275 - in /jena/Experimental/jena-client: ./ src/main/java/org/apache/jena/client/ src/main/java/org/apache/jena/client/graph/ src/main/java/org/apache/jena/client/http/ src/main/java/org/apache/jena/client/util/

Author: sallen
Date: Mon May 21 23:48:07 2012
New Revision: 1341275

URL: http://svn.apache.org/viewvc?rev=1341275&view=rev
Log:
jena-client 1) renamed SparqlHttp* to Http*.  2) Added DatasetGraph repo.

Added:
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphConnection.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphQueryStatement.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphRepository.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphService.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphUpdateStatement.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphUpdater.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpConnection.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpQueryService.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpQueryStatement.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpRepository.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdateService.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdateStatement.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdater.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/util/
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/util/RDFFormat.java
Removed:
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/BulkDataHandler.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/DatasetGraphConnection.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/GraphOperations.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/RDFFormat.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/SPARQLConnection.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/SPARQLException.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpConnection.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpQueryService.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpQueryStatement.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpRepository.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpUpdateService.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpUpdateStatement.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/SparqlHttpUpdater.java
Modified:
    jena/Experimental/jena-client/   (props changed)
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/Repository.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateQuerier.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateQuerierWrapper.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatement.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatementBase.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdaterBase.java
    jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdaterWrapper.java

Propchange: jena/Experimental/jena-client/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon May 21 23:48:07 2012
@@ -0,0 +1,2 @@
+.classpath
+.project

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/Repository.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/Repository.java?rev=1341275&r1=1341274&r2=1341275&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/Repository.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/Repository.java Mon May 21 23:48:07 2012
@@ -18,7 +18,6 @@
 
 package org.apache.jena.client;
 
-import org.apache.jena.client.service.Service;
 
 /**
  * Represents an RDF database.  This can be local or remote.

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateQuerier.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateQuerier.java?rev=1341275&r1=1341274&r2=1341275&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateQuerier.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateQuerier.java Mon May 21 23:48:07 2012
@@ -25,6 +25,8 @@ public interface UpdateQuerier extends C
      */
     void update(String updateQuery, String baseURI);
     
+    void update(UpdateStatement updateStmt);
+    
 //    void update(String updateQuery, Syntax syntax);
     
     void update(Update update);

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateQuerierWrapper.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateQuerierWrapper.java?rev=1341275&r1=1341274&r2=1341275&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateQuerierWrapper.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateQuerierWrapper.java Mon May 21 23:48:07 2012
@@ -30,6 +30,12 @@ class UpdateQuerierWrapper implements Up
     {
         wrappedObject.update(updateQuery, baseURI);
     }
+    
+    @Override
+    public void update(UpdateStatement updateStmt)
+    {
+        wrappedObject.update(updateStmt);
+    }
 
     @Override
     public void update(Update update)

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatement.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatement.java?rev=1341275&r1=1341274&r2=1341275&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatement.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatement.java Mon May 21 23:48:07 2012
@@ -1,6 +1,5 @@
 package org.apache.jena.client;
 
-import java.util.concurrent.TimeUnit;
 
 
 /**
@@ -17,38 +16,38 @@ public interface UpdateStatement extends
      */
     Connection getConnection();
     
-    /**
-     * Execute an UPDATE query.
-     */
-    void execUpdate();
-    
-    /**
-     * Cancels this <code>UpdateStatement</code> object mid-execution if the implementation supports it.
-     * This method can be called by a different thread than is currently executing the query.  There
-     * is no guarantee that the concrete implementation actually will stop or that it will do so immediately.
-     * <p/>
-     * If the connection is not Transactional, then there are also no guarantees that implementation will honor
-     * atomicity requirements.  It may be possible for the update to be partially applied to the database.
-     * <p/>
-     * No operations on the statement are permitted after this call and may cause exceptions to be thrown.
-     */
-    void cancel();
-    
-    // TODO Need to update the implementations to follow the timeout behavior specified here, specifically the zero and negative timeout
-    // TODO We need to emphasize that these are client-side options only.  The server may enforce different timeouts.
-    /**
-     * Set the number of milliseconds to wait for an Update to be applied.
-     * @param timeout the new query timeout limit in milliseconds; zero or a negative number means there is no limit
-     * @see #setTimeout(long, TimeUnit)
-     */
-    void setTimeout(long timeout);
-    
-    /**
-     * Set the number of milliseconds to wait for an Update to be applied.
-     * @param timeout the new query timeout limit in <code>timeoutUnits</code>; zero or a negative number means there is no limit
-     * @param timeoutUnits the time units in which <code>timeout</code> is specified
-     */
-    void setTimeout(long timeout, TimeUnit timeoutUnits);
+//    /**
+//     * Execute an UPDATE query.
+//     */
+//    void execUpdate();
+//    
+//    /**
+//     * Cancels this <code>UpdateStatement</code> object mid-execution if the implementation supports it.
+//     * This method can be called by a different thread than is currently executing the query.  There
+//     * is no guarantee that the concrete implementation actually will stop or that it will do so immediately.
+//     * <p/>
+//     * If the connection is not Transactional, then there are also no guarantees that implementation will honor
+//     * atomicity requirements.  It may be possible for the update to be partially applied to the database.
+//     * <p/>
+//     * No operations on the statement are permitted after this call and may cause exceptions to be thrown.
+//     */
+//    void cancel();
+//    
+//    // TODO Need to update the implementations to follow the timeout behavior specified here, specifically the zero and negative timeout
+//    // TODO We need to emphasize that these are client-side options only.  The server may enforce different timeouts.
+//    /**
+//     * Set the number of milliseconds to wait for an Update to be applied.
+//     * @param timeout the new query timeout limit in milliseconds; zero or a negative number means there is no limit
+//     * @see #setTimeout(long, TimeUnit)
+//     */
+//    void setTimeout(long timeout);
+//    
+//    /**
+//     * Set the number of milliseconds to wait for an Update to be applied.
+//     * @param timeout the new query timeout limit in <code>timeoutUnits</code>; zero or a negative number means there is no limit
+//     * @param timeoutUnits the time units in which <code>timeout</code> is specified
+//     */
+//    void setTimeout(long timeout, TimeUnit timeoutUnits);
     
     
     /**

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatementBase.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatementBase.java?rev=1341275&r1=1341274&r2=1341275&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatementBase.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdateStatementBase.java Mon May 21 23:48:07 2012
@@ -12,10 +12,10 @@ public abstract class UpdateStatementBas
         this.connection = connection;
     }
     
-    public abstract void doExecUpdate();
-    
-    @Override
-    public abstract void cancel();
+//    public abstract void doExecUpdate();
+//    
+//    @Override
+//    public abstract void cancel();
     
 
     @Override
@@ -23,37 +23,38 @@ public abstract class UpdateStatementBas
     {
         return connection;
     }
-
-    @Override
-    public void execUpdate()
-    {
-        startTimer();
-        doExecUpdate();
-    }
-
-    @Override
-    public void setTimeout(long timeout)
-    {
-        setTimeout(timeout, TimeUnit.MILLISECONDS);
-    }
-
-    @Override
-    public void setTimeout(long timeout, TimeUnit timeoutUnits)
-    {
-        timeout1 = asMillis(timeout, timeoutUnits);
-    }
-    
-    protected void startTimer()
-    {
-        // TODO what are the semantics of the timeouts?  Does it even make sense for Update queries?
-        
-        //if (timeoutExpired) cancel();
-    }
-    
     
-    private static long asMillis(long duration, TimeUnit timeUnit)
-    {
-        return (duration < 0 ) ? duration : timeUnit.toMillis(duration) ;
-    }
+
+//    @Override
+//    public void execUpdate()
+//    {
+//        startTimer();
+//        doExecUpdate();
+//    }
+//
+//    @Override
+//    public void setTimeout(long timeout)
+//    {
+//        setTimeout(timeout, TimeUnit.MILLISECONDS);
+//    }
+//
+//    @Override
+//    public void setTimeout(long timeout, TimeUnit timeoutUnits)
+//    {
+//        timeout1 = asMillis(timeout, timeoutUnits);
+//    }
+//    
+//    protected void startTimer()
+//    {
+//        // TODO what are the semantics of the timeouts?  Does it even make sense for Update queries?
+//        
+//        //if (timeoutExpired) cancel();
+//    }
+//    
+//    
+//    private static long asMillis(long duration, TimeUnit timeUnit)
+//    {
+//        return (duration < 0 ) ? duration : timeUnit.toMillis(duration) ;
+//    }
     
 }

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdaterBase.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdaterBase.java?rev=1341275&r1=1341274&r2=1341275&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdaterBase.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdaterBase.java Mon May 21 23:48:07 2012
@@ -71,6 +71,12 @@ public abstract class UpdaterBase implem
         update(UpdateFactory.create(updateQuery, baseURI));
     }
     
+    @Override
+    public void update(UpdateStatement updateStmt)
+    {
+        update(updateStmt.toString());
+    }
+    
 //    @Override
 //    public void update(String updateQuery, Syntax syntax)
 //    {
@@ -104,7 +110,7 @@ public abstract class UpdaterBase implem
         {
             graphName = Quad.defaultGraphIRI;
         }
-        insert(new Quad(graphName, t));
+        insert(Quad.create(graphName, t));
     }
 
     @Override
@@ -145,7 +151,7 @@ public abstract class UpdaterBase implem
             @Override
             public Quad convert(Triple item)
             {
-                return new Quad(graphName, item);
+                return Quad.create(graphName, item);
             }
         }));
     }
@@ -194,7 +200,7 @@ public abstract class UpdaterBase implem
                 @Override
                 public Quad convert(Triple item)
                 {
-                    return new Quad(graphName, item);
+                    return Quad.create(graphName, item);
                 }
             });
         }
@@ -209,7 +215,7 @@ public abstract class UpdaterBase implem
                 @Override
                 public Quad convert(Quad item)
                 {
-                    return new Quad(graphName, item.getSubject(), item.getPredicate(), item.getObject());
+                    return Quad.create(graphName, item.getSubject(), item.getPredicate(), item.getObject());
                 }
             });
         }
@@ -247,7 +253,7 @@ public abstract class UpdaterBase implem
         {
             graphName = Quad.defaultGraphIRI;
         }
-        delete(new Quad(graphName, t));
+        delete(Quad.create(graphName, t));
     }
 
     @Override
@@ -287,7 +293,7 @@ public abstract class UpdaterBase implem
             @Override
             public Quad convert(Triple item)
             {
-                return new Quad(graphName, item);
+                return Quad.create(graphName, item);
             }
         }));
     }
@@ -336,7 +342,7 @@ public abstract class UpdaterBase implem
                 @Override
                 public Quad convert(Triple item)
                 {
-                    return new Quad(graphName, item);
+                    return Quad.create(graphName, item);
                 }
             });
         }
@@ -351,7 +357,7 @@ public abstract class UpdaterBase implem
                 @Override
                 public Quad convert(Quad item)
                 {
-                    return new Quad(graphName, item.getSubject(), item.getPredicate(), item.getObject());
+                    return Quad.create(graphName, item.getSubject(), item.getPredicate(), item.getObject());
                 }
             });
         }

Modified: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdaterWrapper.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdaterWrapper.java?rev=1341275&r1=1341274&r2=1341275&view=diff
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdaterWrapper.java (original)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/UpdaterWrapper.java Mon May 21 23:48:07 2012
@@ -194,6 +194,12 @@ class UpdaterWrapper implements Updater
     {
         wrappedObject.update(updateQuery, baseURI);
     }
+    
+    @Override
+    public void update(UpdateStatement updateStmt)
+    {
+        wrappedObject.update(updateStmt);
+    }
 
     @Override
     public void update(Update update)

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphConnection.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphConnection.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphConnection.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphConnection.java Mon May 21 23:48:07 2012
@@ -0,0 +1,115 @@
+package org.apache.jena.client.graph;
+
+import org.apache.jena.client.ConnectionBase;
+import org.apache.jena.client.QueryStatement;
+import org.apache.jena.client.Repository;
+import org.apache.jena.client.UpdateStatement;
+import org.apache.jena.client.Updater;
+
+import com.hp.hpl.jena.query.Query;
+import com.hp.hpl.jena.query.ReadWrite;
+import com.hp.hpl.jena.update.Update;
+
+public class DatasetGraphConnection extends ConnectionBase
+{
+    private final DatasetGraphRepository repo;
+    
+    private DatasetGraphService activeService;
+    
+    DatasetGraphConnection(DatasetGraphRepository repo, DatasetGraphService service)
+    {
+        if (null == repo)
+        {
+            throw new IllegalArgumentException("repo must not be null");
+        }
+        
+        this.repo = repo;
+        this.activeService = service;
+        
+    }
+    
+    @Override
+    public boolean hasBulkUpdater()
+    {
+        return true;
+    }
+    
+    @Override
+    protected Updater doCreateBulkUpdater()
+    {
+        DatasetGraphUpdater updater = new DatasetGraphUpdater(activeService);
+        updater.open();
+        return updater;
+    }
+    
+    @Override
+    public Repository getRepository()
+    {
+        return repo;
+    }
+    
+    @Override
+    public QueryStatement createQueryStatement(String queryString)
+    {
+        return new DatasetGraphQueryStatement(queryString, activeService, this);
+    }
+
+    @Override
+    public QueryStatement createQueryStatement(Query query)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+    
+    @Override
+    public UpdateStatement createUpdateStatement(String updateString)
+    {
+        return new DatasetGraphUpdateStatement(updateString, this);
+    }
+
+    @Override
+    public UpdateStatement createUpdateStatement(Update update)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+    
+    @Override
+    public boolean supportsTransactions()
+    {
+        // We don't support transactions
+        return false;
+    }
+
+    @Override
+    public void begin(ReadWrite readWrite)
+    {
+        // We don't support transactions
+    }
+
+    @Override
+    public void commit()
+    {
+        // We don't support transactions
+    }
+
+    @Override
+    public void abort()
+    {
+        // We don't support transactions
+    }
+    
+    @Override
+    public void end()
+    {
+        // We don't support transactions
+    }
+
+    @Override
+    public boolean isInTransaction()
+    {
+        // We don't support transactions
+        return false;
+    }
+    
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphQueryStatement.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphQueryStatement.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphQueryStatement.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphQueryStatement.java Mon May 21 23:48:07 2012
@@ -0,0 +1,78 @@
+package org.apache.jena.client.graph;
+
+import java.util.Iterator;
+
+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.QueryExecution;
+import com.hp.hpl.jena.query.QueryExecutionFactory;
+import com.hp.hpl.jena.query.ResultSet;
+import com.hp.hpl.jena.sparql.core.DatasetImpl;
+
+class DatasetGraphQueryStatement extends QueryStatementBase implements QueryStatement
+{
+    private final String queryString;
+    private final DatasetGraphService queryService;
+    
+    private Object lock = new Object();
+    private QueryExecution qe;
+    
+    DatasetGraphQueryStatement(String queryString, DatasetGraphService queryService, DatasetGraphConnection connection)
+    {
+        super(connection);
+        this.queryString = queryString;
+        this.queryService = queryService;
+    }
+    
+    private QueryExecution createQueryExecution()
+    {
+        // TODO Handle Query object in addition to QueryString
+        String sparql = buildFromString(queryString, null);
+        QueryExecution qe = QueryExecutionFactory.create(sparql, DatasetImpl.wrap(queryService.getDatasetGraph()));
+        // TODO Set the options on qe, such as timeouts
+        synchronized (lock)
+        {
+            this.qe = qe;
+        }
+        return qe;
+    }
+    
+    @Override
+    public ResultSet doExecSelect()
+    {
+        return createQueryExecution().execSelect();
+    }
+
+    @Override
+    public Iterator<Triple> doExecConstructTriples()
+    {
+        return createQueryExecution().execConstructTriples();
+    }
+
+    @Override
+    public Iterator<Triple> doExecDescribeTriples()
+    {
+        return createQueryExecution().execDescribeTriples();
+    }
+
+    @Override
+    public boolean doExecAsk()
+    {
+        return createQueryExecution().execAsk();
+    }
+
+    @Override
+    public void cancel()
+    {
+        synchronized (lock)
+        {
+            if (null != qe)
+            {
+                qe.abort();
+            }
+        }
+    }
+
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphRepository.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphRepository.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphRepository.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphRepository.java Mon May 21 23:48:07 2012
@@ -0,0 +1,23 @@
+package org.apache.jena.client.graph;
+
+import org.apache.jena.client.Connection;
+import org.apache.jena.client.Repository;
+
+import com.hp.hpl.jena.sparql.core.DatasetGraph;
+
+public class DatasetGraphRepository implements Repository
+{
+    private final DatasetGraphService service;
+    
+    public DatasetGraphRepository(DatasetGraph dsg)
+    {
+        this.service = new DatasetGraphService(dsg);
+    }
+
+    @Override
+    public Connection getConnection()
+    {
+        return new DatasetGraphConnection(this, service);
+    }
+    
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphService.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphService.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphService.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphService.java Mon May 21 23:48:07 2012
@@ -0,0 +1,30 @@
+package org.apache.jena.client.graph;
+
+import org.apache.jena.client.service.QueryService;
+import org.apache.jena.client.service.ServiceDescription;
+import org.apache.jena.client.service.UpdateService;
+
+import com.hp.hpl.jena.sparql.core.DatasetGraph;
+
+public class DatasetGraphService implements QueryService, UpdateService
+{
+    private final DatasetGraph dsg;
+    
+    public DatasetGraphService(DatasetGraph dsg)
+    {
+        this.dsg = dsg;
+    }
+    
+    public DatasetGraph getDatasetGraph()
+    {
+        return dsg;
+    }
+
+    @Override
+    public ServiceDescription getDescription()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphUpdateStatement.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphUpdateStatement.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphUpdateStatement.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphUpdateStatement.java Mon May 21 23:48:07 2012
@@ -0,0 +1,34 @@
+package org.apache.jena.client.graph;
+
+import org.apache.jena.client.UpdateStatement;
+import org.apache.jena.client.UpdateStatementBase;
+
+class DatasetGraphUpdateStatement extends UpdateStatementBase implements UpdateStatement
+{
+    private final String updateString;
+    
+    DatasetGraphUpdateStatement(String updateString, DatasetGraphConnection connection)
+    {
+        super(connection);
+        this.updateString = updateString;
+    }
+    
+//    @Override
+//    public void doExecUpdate()
+//    {
+//        String sparql = buildFromString(updateString, null);
+//        connection.update(sparql);
+//    }
+//
+//    @Override
+//    public void cancel()
+//    {
+//        // TODO
+//    }
+
+    @Override
+    public String toString()
+    {
+        return buildFromString(updateString, null);
+    }
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphUpdater.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphUpdater.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphUpdater.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/graph/DatasetGraphUpdater.java Mon May 21 23:48:07 2012
@@ -0,0 +1,83 @@
+package org.apache.jena.client.graph;
+
+import java.util.Iterator;
+
+import org.apache.jena.client.UpdaterBase;
+
+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.UpdateAction;
+import com.hp.hpl.jena.update.UpdateRequest;
+
+// TODO This is not atomic!  But the underlying DatasetGraph isn't atomic anyway...
+public class DatasetGraphUpdater extends UpdaterBase
+{
+    private final DatasetGraphService service;
+    
+    private DatasetGraph dsg;
+    private boolean opened = false;
+    
+    public DatasetGraphUpdater(DatasetGraphService service)
+    {
+        this.service = service;
+    }
+    
+    public void open()
+    {
+        dsg = service.getDatasetGraph();
+        opened = true;
+    }
+    
+    private void checkOpen()
+    {
+        if (!opened)
+        {
+            throw new IllegalStateException("DatasetGraphUpdater is not opened.  Call open() first.");
+        }
+    }
+
+    @Override
+    protected void doInsert(Iterator<? extends Quad> it)
+    {
+        checkOpen();
+        while (it.hasNext())
+        {
+            dsg.add(it.next());
+        }
+    }
+
+    @Override
+    protected void doDelete(Iterator<? extends Quad> it)
+    {
+        checkOpen();
+        while (it.hasNext())
+        {
+            dsg.delete(it.next());
+        }
+    }
+    
+    @Override
+    protected void doUpdate(Iterator<? extends Update> it)
+    {
+        checkOpen();
+        
+        // TODO make this streaming
+        UpdateRequest req = new UpdateRequest();
+        while (it.hasNext())
+        {
+            req.add(it.next());
+        }
+        UpdateAction.execute(req, dsg);
+    }
+    
+    @Override
+    public void close()
+    {
+        if (opened)
+        {
+            dsg = null;
+            opened = false;
+        }
+    }
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpConnection.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpConnection.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpConnection.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpConnection.java Mon May 21 23:48:07 2012
@@ -0,0 +1,212 @@
+package org.apache.jena.client.http;
+
+import org.apache.jena.client.ConnectionBase;
+import org.apache.jena.client.QueryStatement;
+import org.apache.jena.client.Repository;
+import org.apache.jena.client.UpdateStatement;
+import org.apache.jena.client.Updater;
+
+import com.hp.hpl.jena.query.Query;
+import com.hp.hpl.jena.query.ReadWrite;
+import com.hp.hpl.jena.update.Update;
+
+public class HttpConnection extends ConnectionBase
+{
+    private final HttpRepository repo;
+    
+    private HttpQueryService activeQueryService;
+    private HttpUpdateService activeUpdateService;
+    
+    HttpConnection(HttpRepository repo, HttpQueryService queryService, HttpUpdateService updateService)
+    {
+        if (null == repo)
+        {
+            throw new IllegalArgumentException("repo must not be null");
+        }
+        
+        this.repo = repo;
+        this.activeQueryService = queryService;
+        this.activeUpdateService = updateService;
+        
+    }
+    
+    @Override
+    public boolean hasBulkUpdater()
+    {
+        return true;
+    }
+    
+    @Override
+    protected Updater doCreateBulkUpdater()
+    {
+        HttpUpdater updater = new HttpUpdater(activeUpdateService);
+        updater.open();
+        return updater;
+    }
+    
+//    @Override
+//    protected UpdateInserter doCreateBulkUpdateInserter()
+//    {
+//        return doCreateBulkUpdater();
+//    }
+//    
+//    @Override
+//    protected UpdateDeleter doCreateBulkUpdateDeleter()
+//    {
+//        return doCreateBulkUpdater();
+//    }
+//    
+//    @Override
+//    protected UpdateQuerier doCreateBulkUpdateQuerier()
+//    {
+//        return doCreateBulkUpdater();
+//    }
+    
+    
+    @Override
+    public Repository getRepository()
+    {
+        return repo;
+    }
+    
+    @Override
+    public QueryStatement createQueryStatement(String queryString)
+    {
+        return new HttpQueryStatement(queryString, activeQueryService, this);
+    }
+
+    @Override
+    public QueryStatement createQueryStatement(Query query)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+    
+    @Override
+    public UpdateStatement createUpdateStatement(String updateString)
+    {
+        return new HttpUpdateStatement(updateString, this);
+    }
+
+    @Override
+    public UpdateStatement createUpdateStatement(Update update)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+    
+    @Override
+    public boolean supportsTransactions()
+    {
+        // We don't support transactions
+        return false;
+    }
+
+    @Override
+    public void begin(ReadWrite readWrite)
+    {
+        // We don't support transactions
+    }
+
+    @Override
+    public void commit()
+    {
+        // We don't support transactions
+    }
+
+    @Override
+    public void abort()
+    {
+        // We don't support transactions
+    }
+    
+    @Override
+    public void end()
+    {
+        // We don't support transactions
+    }
+
+    @Override
+    public boolean isInTransaction()
+    {
+        // We don't support transactions
+        return false;
+    }
+    
+//    @Override
+//    public Service getServices()
+//    {
+//        // TODO Auto-generated method stub
+//        return null;
+//    }
+//
+//
+//    @Override
+//    public void setQueryService(QueryService service)
+//    {
+//        // TODO Auto-generated method stub
+//
+//    }
+//
+//    @Override
+//    public void setUpdateService(UpdateService service)
+//    {
+//        // TODO Auto-generated method stub
+//
+//    }
+//
+//    @Override
+//    public void setBulkService(UpdateService service)
+//    {
+//        // TODO Auto-generated method stub
+//
+//    }
+//
+//    @Override
+//    public QueryService getQueryService()
+//    {
+//        // TODO Auto-generated method stub
+//        return null;
+//    }
+//
+//    @Override
+//    public UpdateService getUpdateService()
+//    {
+//        // TODO Auto-generated method stub
+//        return null;
+//    }
+//
+//    @Override
+//    public UpdateService getBulkService()
+//    {
+//        // TODO Auto-generated method stub
+//        return null;
+//    }
+
+    
+//  /**
+//  * @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;
+// }
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpQueryService.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpQueryService.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpQueryService.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpQueryService.java Mon May 21 23:48:07 2012
@@ -0,0 +1,27 @@
+package org.apache.jena.client.http;
+
+import org.apache.jena.client.service.QueryService;
+import org.apache.jena.client.service.ServiceDescription;
+
+public class HttpQueryService implements QueryService
+{
+    private final String endpointUrl;
+    
+    public HttpQueryService(String endpointUrl)
+    {
+        this.endpointUrl = endpointUrl;
+    }
+    
+    public String getEndpointUrl()
+    {
+        return endpointUrl;
+    }
+
+    @Override
+    public ServiceDescription getDescription()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpQueryStatement.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpQueryStatement.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpQueryStatement.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpQueryStatement.java Mon May 21 23:48:07 2012
@@ -0,0 +1,63 @@
+package org.apache.jena.client.http;
+
+import java.util.Iterator;
+
+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;
+import com.hp.hpl.jena.sparql.engine.http.QueryEngineHTTP;
+
+class HttpQueryStatement extends QueryStatementBase implements QueryStatement
+{
+    private final String queryString;
+    private final HttpQueryService queryService;
+    
+    HttpQueryStatement(String queryString, HttpQueryService queryService, HttpConnection connection)
+    {
+        super(connection);
+        this.queryString = queryString;
+        this.queryService = queryService;
+    }
+    
+    private QueryEngineHTTP createQueryExecution()
+    {
+        // TODO Handle Query object in addition to QueryString
+        String sparql = buildFromString(queryString, null);
+        QueryEngineHTTP qe = new QueryEngineHTTP(queryService.getEndpointUrl(), sparql);
+        // TODO Set the options on qe, such as timeouts
+        return qe;
+    }
+    
+    @Override
+    public ResultSet doExecSelect()
+    {
+        return createQueryExecution().execSelect();
+    }
+
+    @Override
+    public Iterator<Triple> doExecConstructTriples()
+    {
+        return createQueryExecution().execConstructTriples();
+    }
+
+    @Override
+    public Iterator<Triple> doExecDescribeTriples()
+    {
+        return createQueryExecution().execDescribeTriples();
+    }
+
+    @Override
+    public boolean doExecAsk()
+    {
+        return createQueryExecution().execAsk();
+    }
+
+    @Override
+    public void cancel()
+    {
+        // TODO
+    }
+
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpRepository.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpRepository.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpRepository.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpRepository.java Mon May 21 23:48:07 2012
@@ -0,0 +1,24 @@
+package org.apache.jena.client.http;
+
+import org.apache.jena.client.Connection;
+import org.apache.jena.client.Repository;
+
+public class HttpRepository implements Repository
+{
+    private final HttpQueryService defaultQueryService;
+    private final HttpUpdateService defaultUpdateService;
+    
+    
+    public HttpRepository(String queryEndpoint, String updateEndpoint)
+    {
+        this.defaultQueryService = new HttpQueryService(queryEndpoint);
+        this.defaultUpdateService = new HttpUpdateService(updateEndpoint);
+    }
+
+    @Override
+    public Connection getConnection()
+    {
+        return new HttpConnection(this, defaultQueryService, defaultUpdateService);
+    }
+    
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdateService.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdateService.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdateService.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdateService.java Mon May 21 23:48:07 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 HttpUpdateService implements UpdateService
+{
+    private final String endpointUrl;
+    
+    public HttpUpdateService(String endpointUrl)
+    {
+        this.endpointUrl = endpointUrl;
+    }
+    
+    public String getEndpointUrl()
+    {
+        return endpointUrl;
+    }
+
+    @Override
+    public ServiceDescription getDescription()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdateStatement.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdateStatement.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdateStatement.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdateStatement.java Mon May 21 23:48:07 2012
@@ -0,0 +1,34 @@
+package org.apache.jena.client.http;
+
+import org.apache.jena.client.UpdateStatement;
+import org.apache.jena.client.UpdateStatementBase;
+
+class HttpUpdateStatement extends UpdateStatementBase implements UpdateStatement
+{
+    private final String updateString;
+    
+    HttpUpdateStatement(String updateString, HttpConnection connection)
+    {
+        super(connection);
+        this.updateString = updateString;
+    }
+    
+//    @Override
+//    public void doExecUpdate()
+//    {
+//        String sparql = buildFromString(updateString, null);
+//        connection.update(sparql);
+//    }
+//
+//    @Override
+//    public void cancel()
+//    {
+//        // TODO
+//    }
+
+    @Override
+    public String toString()
+    {
+        return buildFromString(updateString, null);
+    }
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdater.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdater.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdater.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/http/HttpUpdater.java Mon May 21 23:48:07 2012
@@ -0,0 +1,146 @@
+package org.apache.jena.client.http;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Iterator;
+
+import org.apache.jena.client.UpdaterBase;
+import org.openjena.atlas.io.IndentedWriter;
+import org.openjena.riot.WebContent;
+
+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 HttpUpdater extends UpdaterBase
+{
+    private final HttpUpdateService updateService;
+    private final SerializationContext sCxt;
+    
+    private HttpURLConnection conn;
+    private OutputStream out;
+    private UpdateWriter writer;
+    private boolean opened = false;
+    
+    public HttpUpdater(HttpUpdateService updateService)
+    {
+        this(updateService, null);
+    }
+    
+    public HttpUpdater(HttpUpdateService updateService, SerializationContext sCxt)
+    {
+        this.updateService = updateService;
+        this.sCxt = sCxt;
+    }
+    
+    public void open()
+    {
+        URL url;
+        try
+        {
+            url = new URL(updateService.getEndpointUrl());
+            URLConnection urlConn = url.openConnection();
+            if (!(urlConn instanceof HttpURLConnection))
+            {
+                throw new IllegalArgumentException("Must use an HTTP endpoint URL");
+            }
+            conn = (HttpURLConnection)urlConn;
+            conn.setDoOutput(true);
+            conn.setRequestMethod("POST");
+            conn.setRequestProperty("Content-Type", WebContent.contentTypeSPARQLUpdate);
+            //conn.setRequestProperty("Content-Type", WebContent.contentTypeForm);
+            // TODO Potential optimization: allow gzip when we know we're dealing with Fuseki (also update Fuseki to allow this!)
+            //conn.setRequestProperty("Content-Encoding", "gzip");
+            conn.setChunkedStreamingMode(4096);
+            conn.connect();
+            
+            out = conn.getOutputStream();
+            //out = new GZIPOutputStream(conn.getOutputStream());
+            
+            IndentedWriter iw = new IndentedWriter(out);
+            //iw.print("update=");
+            
+            writer = new UpdateWriter(iw, sCxt);
+            writer.open();
+            
+            opened = true;
+        }
+        catch (MalformedURLException e)
+        {
+            throw new UpdateException(e);
+        }
+        catch (IOException e)
+        {
+            throw new UpdateException(e);
+        }
+    }
+    
+    private void checkOpen()
+    {
+        if (!opened)
+        {
+            throw new IllegalStateException("SparqlHttpUpdater is not opened.  Call open() first.");
+        }
+    }
+
+    @Override
+    protected void doInsert(Iterator<? extends Quad> it)
+    {
+        checkOpen();
+        writer.insert(it);
+    }
+
+    @Override
+    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()
+    {
+        if (opened)
+        {
+            writer.close();
+            try
+            {
+                out.close();
+                
+                // Get the response
+                int responseCode = conn.getResponseCode();
+                String responseMessage = conn.getResponseMessage();
+                conn.disconnect();
+                
+                if (responseCode == 204) // No content
+                {
+                    return;
+                }
+                if (responseCode == 200) // OK
+                {
+                    // But what was the content?
+                    // TODO read body 
+                    return;
+                }
+                throw new UpdateException(responseCode+" "+responseMessage) ;
+            }
+            catch (IOException e)
+            {
+                throw new UpdateException(e);
+            }
+        }
+    }
+}

Added: jena/Experimental/jena-client/src/main/java/org/apache/jena/client/util/RDFFormat.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-client/src/main/java/org/apache/jena/client/util/RDFFormat.java?rev=1341275&view=auto
==============================================================================
--- jena/Experimental/jena-client/src/main/java/org/apache/jena/client/util/RDFFormat.java (added)
+++ jena/Experimental/jena-client/src/main/java/org/apache/jena/client/util/RDFFormat.java Mon May 21 23:48:07 2012
@@ -0,0 +1,234 @@
+/**
+ * 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.util ;
+
+
+/**
+ * Enum that specifies the various RDF formats Jena can handle. The .toString()
+ * method will return a string that can be used for Jena methods requiring a <code>lang</code> string.
+ */
+public enum RDFFormat
+{
+    /** RDF/XML format */
+    RDFXML   (true,  new String[] { "RDF/XML", "rdfxml", "rdf/xml-abbrev" }, new String[] { "rdf", "xml", "owl" }),
+
+    /** N-Triples format */
+    NTRIPLES (true,  new String[] { "N-TRIPLES", "ntriples", "nt"         }, new String[] { "nt"                }),
+
+    /** N3 format */
+    N3       (true,  new String[] { "N3"                                  }, new String[] { "n3"                }),
+
+    /** Turtle format */
+    TURTLE   (true,  new String[] { "TURTLE", "ttl"                       }, new String[] { "ttl"               }),
+
+    /** Trig format */
+    TRIG     (false, new String[] { "TURTLE"                              }, new String[] { "trig"              }),
+
+    /** NQuads format */
+    NQUADS   (false, new String[] { "NQUADS", "nq"                        }, new String[] { "nquads", "nq"      });
+    
+    // TODO Design question: should we use null or UNKNOWN for the parse* methods?
+    //UNKNOWN  (new String[] { "UNKNOWN"                             }, new String[] { "unknown"           });
+    
+    private final String[] formatStrings;
+    private final String[] fileNameExtensions;
+    private final boolean isTripleLang;
+
+    /**
+     * @param isTripleLang Whether or not this language is a triple language
+     * @param formatStrings The format strings.  The first item is the canonical format string.
+     * @param fileNameExtensions The filename extensions.  The first item is the canonical extension.
+     */
+    private RDFFormat(boolean isTripleLang, String[] formatStrings, String[] fileNameExtensions)
+    {
+        this.isTripleLang = isTripleLang;
+        this.formatStrings = formatStrings;
+        this.fileNameExtensions = fileNameExtensions;
+    }
+
+    /**
+     * Parses a string into the proper enum type. This can handle slightly non-standard variations.
+     * 
+     * @param formatStr The string containing the format.
+     * @return An enum corresponding to the given string.
+     * @throws IllegalArgumentException if the format string does not correspond to a known RDF format
+     */
+    public static RDFFormat parse(String formatStr)
+    {
+        RDFFormat toReturn = tryParse(formatStr);
+        if (null != toReturn)
+        {
+            return toReturn;
+        }
+        throw new IllegalArgumentException("Unknown RDF format: " + formatStr);
+    }
+    
+    /**
+     * Tries to parses a string into the proper enum type. This can handle slightly non-standard variations.
+     * 
+     * @param formatStr The string containing the format.
+     * @return An enum corresponding to the given string, or null if the format string does not correspond to a known RDF format
+     */
+    public static RDFFormat tryParse(String formatStr)
+    {
+        if (null != formatStr)
+        {
+            for (RDFFormat f : RDFFormat.values())
+            {
+                for (String s : f.formatStrings)
+                {
+                    if (s.equalsIgnoreCase(formatStr))
+                    {
+                        return f;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * Parses a given filename, examines its extension and returns an RDFFormat
+     * that matches that extension.
+     * 
+     * @param filename The filename to parse
+     * @return The RDFFormat that matches the filename extension
+     * @throws IllegalArgumentException if the filename does not have an extension that corresponds to a known RDF format
+     */
+    public static RDFFormat parseFilename(String filename)
+    {
+        RDFFormat toReturn = tryParseFilename(filename);
+        if (null != toReturn)
+        {
+            return toReturn;
+        }
+        throw new IllegalArgumentException("Unknown RDF extension for file: " + filename);
+    }
+    
+    /**
+     * Tries to parses a given filename, examines its extension and returns an RDFFormat
+     * that matches that extension.
+     * 
+     * @param filename The filename to parse
+     * @return The RDFFormat that matches the filename extension, or null if the filename does not have an extension that corresponds to a known RDF format
+     */
+    public static RDFFormat tryParseFilename(String filename)
+    {
+        if (null != filename)
+        {
+            int dotIndex = filename.lastIndexOf('.') ;
+            if ((dotIndex >= 0) && (dotIndex + 1 < filename.length()))
+            {
+                return tryParseExtension(filename.substring(dotIndex + 1));
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Parses a given extension string and returns the proper RDFFormat.
+     * 
+     * @param extensionStr The extension string to parse
+     * @return The RDFFormat that matches the given extension string
+     * @throws IllegalArgumentException if the extension does not correspond to a known RDF format
+     */
+    public static RDFFormat parseExtension(String extensionStr)
+    {
+        RDFFormat toReturn = tryParseExtension(extensionStr);
+        if (null != toReturn)
+        {
+            return toReturn;
+        }
+        throw new IllegalArgumentException("Unknown RDF extension: " + extensionStr);
+    }
+    
+    /**
+     * Tries to parse a given extension string and return the proper RDFFormat.
+     * 
+     * @param extensionStr The extension string to parse
+     * @return The RDFFormat that matches the given extension string, or null if the extension does not correspond to a known RDF format
+     */
+    public static RDFFormat tryParseExtension(String extensionStr)
+    {
+        if (null != extensionStr)
+        {
+            for (RDFFormat f : RDFFormat.values())
+            {
+                for (String s : f.fileNameExtensions)
+                {
+                    if (s.equalsIgnoreCase(extensionStr))
+                    {
+                        return f;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * Returns whether or not this lang is a quad language.
+     * 
+     * @return true if this is a quad language.
+     */
+    public boolean isQuadLang()
+    {
+        return !isTripleLang;
+    }
+    
+    /**
+     * Returns whether or not this lang is a triple language.
+     * 
+     * @return true if this is a triple language.
+     */
+    public boolean isTripleLang()
+    {
+        return isTripleLang;
+    }
+
+    /**
+     * Returns a filename extension string that matches this RDFFormat.
+     * 
+     * @return Returns a filename extension string that matches this RDFFormat
+     */
+    public String getExtension()
+    {
+        return this.fileNameExtensions[0];
+    }
+    
+    /**
+     * Returns a String that is suitable for passing into Jena methods that call
+     * for a <code>lang</code> parameter.
+     */
+    public String getFormatString()
+    {
+        return this.formatStrings[0];
+    }
+    
+    /**
+     * Returns a String that is suitable for passing into Jena methods that call
+     * for a <code>lang</code> parameter.
+     */
+    @Override
+    public String toString()
+    {
+        return getFormatString();
+    }
+
+}