You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2015/08/27 13:46:14 UTC

[1/8] jena git commit: Print whole datatset for dataset formats.

Repository: jena
Updated Branches:
  refs/heads/master b93e38988 -> f62c53e64


Print whole datatset for dataset formats.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/5525039e
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/5525039e
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/5525039e

Branch: refs/heads/master
Commit: 5525039e268d655123d8947553922acb3e427792
Parents: b93e389
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Aug 25 09:43:05 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Aug 25 09:43:05 2015 +0100

----------------------------------------------------------------------
 jena-arq/src/main/java/riotcmd/CmdLangParse.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/5525039e/jena-arq/src/main/java/riotcmd/CmdLangParse.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/riotcmd/CmdLangParse.java b/jena-arq/src/main/java/riotcmd/CmdLangParse.java
index 6c939b8..d961f15 100644
--- a/jena-arq/src/main/java/riotcmd/CmdLangParse.java
+++ b/jena-arq/src/main/java/riotcmd/CmdLangParse.java
@@ -317,7 +317,7 @@ public abstract class CmdLangParse extends CmdGeneral
                 // Try as dataset, then as graph.
                 WriterDatasetRIOTFactory w = RDFWriterRegistry.getWriterDatasetFactory(fmt) ;
                 if ( w != null ) {
-                    RDFDataMgr.write(output, dsg.getDefaultGraph(), fmt) ;
+                    RDFDataMgr.write(output, dsg, fmt) ;
                     return ;
                 }
                 WriterGraphRIOTFactory wg = RDFWriterRegistry.getWriterGraphFactory(fmt) ;


[5/8] jena git commit: Deal cleanly with no datasets provide - devolve to individual commands.

Posted by an...@apache.org.
Deal cleanly with no datasets provide - devolve to individual commands.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/5c9092d4
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/5c9092d4
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/5c9092d4

Branch: refs/heads/master
Commit: 5c9092d4ff9d556ca1628cdcff67194f6a377aba
Parents: a2cc0ee
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Aug 25 12:31:35 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Aug 25 12:31:35 2015 +0100

----------------------------------------------------------------------
 jena-arq/src/main/java/arq/cmdline/CmdUpdate.java  | 10 +++++++---
 jena-arq/src/main/java/arq/cmdline/ModDataset.java |  7 +++++--
 jena-arq/src/main/java/arq/load.java               |  9 ++++++---
 jena-arq/src/main/java/arq/query.java              | 11 ++++++++++-
 jena-arq/src/main/java/arq/update.java             |  7 ++++++-
 5 files changed, 34 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/5c9092d4/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java b/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
index 0baed1b..9ff706c 100644
--- a/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
+++ b/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
@@ -30,14 +30,13 @@ public abstract class CmdUpdate extends CmdARQ
     protected CmdUpdate(String[] argv)
     {
         super(argv) ;
-        modDataset = setModGraphStore() ;
+        modDataset = setModeDataset() ;
         addModule(modDataset) ;
     }
     
-    protected ModDataset setModGraphStore() {
+    protected ModDataset setModeDataset() {
         return new ModDatasetGeneralAssembler() ;
     }
-    
 
     @Override
     protected void processModulesAndArgs()
@@ -50,10 +49,15 @@ public abstract class CmdUpdate extends CmdARQ
     @Override
     protected final void exec() {
         DatasetGraph dataset = modDataset.getDatasetGraph() ;
+        if ( dataset == null )
+            dataset = dealWithNoDataset() ;
+        
         if ( dataset.getDefaultGraph() == null )
             dataset.setDefaultGraph(ModelFactory.createDefaultModel().getGraph()) ;
         execUpdate(dataset) ;
     }
 
+    protected abstract DatasetGraph dealWithNoDataset() ;
+
     protected abstract void execUpdate(DatasetGraph graphStore) ;
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/5c9092d4/jena-arq/src/main/java/arq/cmdline/ModDataset.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/arq/cmdline/ModDataset.java b/jena-arq/src/main/java/arq/cmdline/ModDataset.java
index 089e1f1..01a0bb8 100644
--- a/jena-arq/src/main/java/arq/cmdline/ModDataset.java
+++ b/jena-arq/src/main/java/arq/cmdline/ModDataset.java
@@ -38,8 +38,11 @@ public abstract class ModDataset extends ModBase
         return dataset ;
     }
     
-    public DatasetGraph getDatasetGraph() { 
-        return getDataset().asDatasetGraph() ;
+    public DatasetGraph getDatasetGraph() {
+        Dataset ds = getDataset() ;
+        if ( ds == null )
+            return null ;
+        return ds.asDatasetGraph() ;
     }
 
     public abstract Dataset createDataset() ; 

http://git-wip-us.apache.org/repos/asf/jena/blob/5c9092d4/jena-arq/src/main/java/arq/load.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/arq/load.java b/jena-arq/src/main/java/arq/load.java
index d74de5e..b5d75c8 100644
--- a/jena-arq/src/main/java/arq/load.java
+++ b/jena-arq/src/main/java/arq/load.java
@@ -21,9 +21,9 @@ package arq;
 import java.util.Iterator ;
 import java.util.List ;
 
+import arq.cmdline.CmdUpdate ;
 import jena.cmd.ArgDecl;
 import jena.cmd.CmdException;
-
 import org.apache.jena.atlas.io.IndentedWriter ;
 import org.apache.jena.atlas.lib.Lib ;
 import org.apache.jena.graph.Graph ;
@@ -35,8 +35,6 @@ import org.apache.jena.sparql.util.graph.GraphLoadMonitor ;
 import org.apache.jena.update.UpdateExecutionFactory ;
 import org.apache.jena.update.UpdateRequest ;
 
-import arq.cmdline.CmdUpdate ;
-
 public class load extends CmdUpdate
 {
     static private final ArgDecl graphNameArg = new ArgDecl(ArgDecl.HasValue, "--graph") ;
@@ -114,4 +112,9 @@ public class load extends CmdUpdate
         //m.setSummaryLabel(getCommandName()) ;
         graph.getEventManager().register(m)  ;
     }
+    
+    @Override
+    protected DatasetGraph dealWithNoDataset() {
+        throw new CmdException("No dataset provided") ;
+    }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/5c9092d4/jena-arq/src/main/java/arq/query.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/arq/query.java b/jena-arq/src/main/java/arq/query.java
index f119aba..76865e1 100644
--- a/jena-arq/src/main/java/arq/query.java
+++ b/jena-arq/src/main/java/arq/query.java
@@ -174,13 +174,22 @@ public class query extends CmdARQ
     protected String getSummary() { return getCommandName()+" --data=<file> --query=<query>" ; }
     
     protected Dataset getDataset()  { 
-        try { return modDataset.getDataset() ; }
+        try { 
+            Dataset ds = modDataset.getDataset() ;
+            if ( ds == null )
+                ds = dealWithNoDataset() ;
+            return ds ;
+        } 
         catch ( RiotException ex ) { 
             System.err.println("Failed to load data") ;
             throw new TerminationException(1) ;
         }
     }
     
+    protected Dataset dealWithNoDataset()  {
+        throw new CmdException("No dataset provided") ; 
+    }
+    
     protected long totalTime = 0 ;
     protected void queryExec(boolean timed, ResultsFormat fmt)
     {

http://git-wip-us.apache.org/repos/asf/jena/blob/5c9092d4/jena-arq/src/main/java/arq/update.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/arq/update.java b/jena-arq/src/main/java/arq/update.java
index f6bf5fd..650104b 100644
--- a/jena-arq/src/main/java/arq/update.java
+++ b/jena-arq/src/main/java/arq/update.java
@@ -29,6 +29,7 @@ import org.apache.jena.riot.Lang ;
 import org.apache.jena.riot.RDFDataMgr ;
 import org.apache.jena.sparql.SystemARQ ;
 import org.apache.jena.sparql.core.DatasetGraph ;
+import org.apache.jena.sparql.core.DatasetGraphFactory ;
 import org.apache.jena.sparql.core.Transactional ;
 import org.apache.jena.sparql.core.TransactionalNull ;
 import org.apache.jena.update.UpdateExecutionFactory ;
@@ -58,7 +59,6 @@ public class update extends CmdUpdate
     protected void processModulesAndArgs() {
         requestFiles = getValues(updateArg) ; // ????
         dump = contains(dumpArg) ;
-
         super.processModulesAndArgs() ;
     }
 
@@ -118,4 +118,9 @@ public class update extends CmdUpdate
         UpdateRequest req = UpdateFactory.create(requestString, updateSyntax) ;
         UpdateExecutionFactory.create(req, store).execute() ;
     }
+
+    @Override
+    protected DatasetGraph dealWithNoDataset() {
+        return DatasetGraphFactory.createMem() ;
+    }
 }


[4/8] jena git commit: Rename "graphStore" as "dataset"

Posted by an...@apache.org.
Rename "graphStore" as "dataset"

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/a2cc0ee4
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/a2cc0ee4
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/a2cc0ee4

Branch: refs/heads/master
Commit: a2cc0ee48c466bbcc0d3d021822af1d9bafcf3f2
Parents: 4876989
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Aug 25 12:17:53 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Aug 25 12:17:53 2015 +0100

----------------------------------------------------------------------
 jena-arq/src/main/java/arq/cmdline/CmdUpdate.java | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/a2cc0ee4/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java b/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
index fd3113b..0baed1b 100644
--- a/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
+++ b/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
@@ -24,14 +24,14 @@ import org.apache.jena.sparql.core.DatasetGraph ;
 
 public abstract class CmdUpdate extends CmdARQ
 {
-    protected ModDataset modGraphStore = null ;
+    protected ModDataset modDataset = null ;
     protected Syntax updateSyntax = Syntax.defaultUpdateSyntax ;
 
     protected CmdUpdate(String[] argv)
     {
         super(argv) ;
-        modGraphStore = setModGraphStore() ;
-        addModule(modGraphStore) ;
+        modDataset = setModGraphStore() ;
+        addModule(modDataset) ;
     }
     
     protected ModDataset setModGraphStore() {
@@ -49,10 +49,10 @@ public abstract class CmdUpdate extends CmdARQ
     
     @Override
     protected final void exec() {
-        DatasetGraph graphStore = modGraphStore.getDatasetGraph() ;
-        if ( graphStore.getDefaultGraph() == null )
-            graphStore.setDefaultGraph(ModelFactory.createDefaultModel().getGraph()) ;
-        execUpdate(graphStore) ;
+        DatasetGraph dataset = modDataset.getDatasetGraph() ;
+        if ( dataset.getDefaultGraph() == null )
+            dataset.setDefaultGraph(ModelFactory.createDefaultModel().getGraph()) ;
+        execUpdate(dataset) ;
     }
 
     protected abstract void execUpdate(DatasetGraph graphStore) ;


[2/8] jena git commit: Cleanly handle pasre errors in transactional updates.

Posted by an...@apache.org.
Cleanly handle pasre errors in transactional updates.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/bb2e683c
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/bb2e683c
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/bb2e683c

Branch: refs/heads/master
Commit: bb2e683c9184d5f9559ea65df4417d3a121573b8
Parents: 5525039
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Aug 25 12:12:16 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Aug 25 12:12:16 2015 +0100

----------------------------------------------------------------------
 jena-arq/src/main/java/arq/update.java | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/bb2e683c/jena-arq/src/main/java/arq/update.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/arq/update.java b/jena-arq/src/main/java/arq/update.java
index 5e15c93..f6bf5fd 100644
--- a/jena-arq/src/main/java/arq/update.java
+++ b/jena-arq/src/main/java/arq/update.java
@@ -82,9 +82,11 @@ public class update extends CmdUpdate
                 execOneFile(filename, graphStore) ;
                 transactional.commit() ;
             }
-            finally {
-                transactional.end() ;
+            catch (Throwable ex) { 
+                try { transactional.abort() ; } catch (Exception ex2) {}
+                throw ex ;
             }
+            finally { transactional.end() ; }
         }
 
         for ( String requestString : super.getPositional() ) {
@@ -95,10 +97,11 @@ public class update extends CmdUpdate
                 execOne(requestString, graphStore) ;
                 transactional.commit() ;
             }
-            finally {
-                transactional.end() ;
+            catch (Throwable ex) { 
+                try { transactional.abort() ; } catch (Exception ex2) {}
+                throw ex ;
             }
-
+            finally { transactional.end() ; }
         }
         SystemARQ.sync(graphStore) ;
 


[8/8] jena git commit: JENA-1014: Copy of CrossOriginFilter from Jetty.

Posted by an...@apache.org.
JENA-1014: Copy of CrossOriginFilter from Jetty.

Needed so that Fuseki can provide CORS from a WAR file when Jetty jars
not on the classpath.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/f62c53e6
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/f62c53e6
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/f62c53e6

Branch: refs/heads/master
Commit: f62c53e64a3db005c482fdb8e8a27695a33dda81
Parents: 3b2de09
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Aug 27 12:45:34 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Aug 27 12:45:34 2015 +0100

----------------------------------------------------------------------
 .../jena/fuseki/servlets/CrossOriginFilter.java | 466 +++++++++++++++++++
 1 file changed, 466 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/f62c53e6/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/CrossOriginFilter.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/CrossOriginFilter.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/CrossOriginFilter.java
new file mode 100644
index 0000000..b68c7f4
--- /dev/null
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/CrossOriginFilter.java
@@ -0,0 +1,466 @@
+/**
+ * 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.fuseki.servlets;
+
+// This is a copy of Jettys CrossOriginFilter - Fuseki need something
+// that works without Jetty on the classpath when running as a WAR file.
+
+
+// We elect to use and distribute under The Apache License v2.0.
+
+// Changes:
+//   Logger switched to SLF4j
+//   Add @Overides
+//   Suppress warnings.
+//   POST removed from SIMPLE_HTTP_HEADERS (NB it's the same code effect either way). 
+
+//========================================================================
+//Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
+//------------------------------------------------------------------------
+//All rights reserved. This program and the accompanying materials
+//are made available under the terms of the Eclipse Public License v1.0
+//and Apache License v2.0 which accompanies this distribution.
+//
+//  The Eclipse Public License is available at
+//  http://www.eclipse.org/legal/epl-v10.html
+//
+//  The Apache License v2.0 is available at
+//  http://www.opensource.org/licenses/apache2.0.php
+//
+//You may elect to redistribute this code under either of these licenses.
+//========================================================================
+//
+
+//package org.eclipse.jetty.servlets;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger ;
+import org.slf4j.LoggerFactory ;
+
+//import org.eclipse.jetty.util.log.Log;
+//import org.eclipse.jetty.util.log.Logger;
+
+/**
+* <p>Implementation of the
+* <a href="http://www.w3.org/TR/cors/">cross-origin resource sharing</a>.</p>
+* <p>A typical example is to use this filter to allow cross-domain
+* <a href="http://cometd.org">cometd</a> communication using the standard
+* long polling transport instead of the JSONP transport (that is less
+* efficient and less reactive to failures).</p>
+* <p>This filter allows the following configuration parameters:
+* <ul>
+* <li><b>allowedOrigins</b>, a comma separated list of origins that are
+* allowed to access the resources. Default value is <b>*</b>, meaning all
+* origins.<br />
+* If an allowed origin contains one or more * characters (for example
+* http://*.domain.com), then "*" characters are converted to ".*", "."
+* characters are escaped to "\." and the resulting allowed origin
+* interpreted as a regular expression.<br />
+* Allowed origins can therefore be more complex expressions such as
+* https?://*.domain.[a-z]{3} that matches http or https, multiple subdomains
+* and any 3 letter top-level domain (.com, .net, .org, etc.).</li>
+* <li><b>allowedMethods</b>, a comma separated list of HTTP methods that
+* are allowed to be used when accessing the resources. Default value is
+* <b>GET,POST,HEAD</b></li>
+* <li><b>allowedHeaders</b>, a comma separated list of HTTP headers that
+* are allowed to be specified when accessing the resources. Default value
+* is <b>X-Requested-With,Content-Type,Accept,Origin</b></li>
+* <li><b>preflightMaxAge</b>, the number of seconds that preflight requests
+* can be cached by the client. Default value is <b>1800</b> seconds, or 30
+* minutes</li>
+* <li><b>allowCredentials</b>, a boolean indicating if the resource allows
+* requests with credentials. Default value is <b>false</b></li>
+* <li><b>exposeHeaders</b>, a comma separated list of HTTP headers that
+* are allowed to be exposed on the client. Default value is the
+* <b>empty list</b></li>
+* <li><b>chainPreflight</b>, if true preflight requests are chained to their
+* target resource for normal handling (as an OPTION request).  Otherwise the
+* filter will response to the preflight. Default is true.</li>
+* </ul></p>
+* <p>A typical configuration could be:
+* <pre>
+* &lt;web-app ...&gt;
+*     ...
+*     &lt;filter&gt;
+*         &lt;filter-name&gt;cross-origin&lt;/filter-name&gt;
+*         &lt;filter-class&gt;org.eclipse.jetty.servlets.CrossOriginFilter&lt;/filter-class&gt;
+*     &lt;/filter&gt;
+*     &lt;filter-mapping&gt;
+*         &lt;filter-name&gt;cross-origin&lt;/filter-name&gt;
+*         &lt;url-pattern&gt;/cometd/*&lt;/url-pattern&gt;
+*     &lt;/filter-mapping&gt;
+*     ...
+* &lt;/web-app&gt;
+* </pre></p>
+*/
+public class CrossOriginFilter implements Filter
+{
+    //private static final Logger LOG = Log.getLogger(CrossOriginFilter.class);
+    private static final Logger LOG = LoggerFactory.getLogger(CrossOriginFilter.class) ;
+
+    // Request headers
+    private static final String ORIGIN_HEADER = "Origin";
+    public static final String ACCESS_CONTROL_REQUEST_METHOD_HEADER = "Access-Control-Request-Method";
+    public static final String ACCESS_CONTROL_REQUEST_HEADERS_HEADER = "Access-Control-Request-Headers";
+    // Response headers
+    public static final String ACCESS_CONTROL_ALLOW_ORIGIN_HEADER = "Access-Control-Allow-Origin";
+    public static final String ACCESS_CONTROL_ALLOW_METHODS_HEADER = "Access-Control-Allow-Methods";
+    public static final String ACCESS_CONTROL_ALLOW_HEADERS_HEADER = "Access-Control-Allow-Headers";
+    public static final String ACCESS_CONTROL_MAX_AGE_HEADER = "Access-Control-Max-Age";
+    public static final String ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER = "Access-Control-Allow-Credentials";
+    public static final String ACCESS_CONTROL_EXPOSE_HEADERS_HEADER = "Access-Control-Expose-Headers";
+    // Implementation constants
+    public static final String ALLOWED_ORIGINS_PARAM = "allowedOrigins";
+    public static final String ALLOWED_METHODS_PARAM = "allowedMethods";
+    public static final String ALLOWED_HEADERS_PARAM = "allowedHeaders";
+    public static final String PREFLIGHT_MAX_AGE_PARAM = "preflightMaxAge";
+    public static final String ALLOW_CREDENTIALS_PARAM = "allowCredentials";
+    public static final String EXPOSED_HEADERS_PARAM = "exposedHeaders";
+    public static final String OLD_CHAIN_PREFLIGHT_PARAM = "forwardPreflight";
+    public static final String CHAIN_PREFLIGHT_PARAM = "chainPreflight";
+    private static final String ANY_ORIGIN = "*";
+    private static final List<String> SIMPLE_HTTP_METHODS = Arrays.asList("GET", /*"POST",*/ "HEAD");
+
+    private boolean anyOriginAllowed;
+    private List<String> allowedOrigins = new ArrayList<String>();
+    private List<String> allowedMethods = new ArrayList<String>();
+    private List<String> allowedHeaders = new ArrayList<String>();
+    private List<String> exposedHeaders = new ArrayList<String>();
+    private int preflightMaxAge;
+    private boolean allowCredentials;
+    private boolean chainPreflight;
+
+    @Override
+    public void init(FilterConfig config) throws ServletException
+    {
+        String allowedOriginsConfig = config.getInitParameter(ALLOWED_ORIGINS_PARAM);
+        if (allowedOriginsConfig == null)
+            allowedOriginsConfig = "*";
+        String[] allowedOrigins = allowedOriginsConfig.split(",");
+        for (String allowedOrigin : allowedOrigins)
+        {
+            allowedOrigin = allowedOrigin.trim();
+            if (allowedOrigin.length() > 0)
+            {
+                if (ANY_ORIGIN.equals(allowedOrigin))
+                {
+                    anyOriginAllowed = true;
+                    this.allowedOrigins.clear();
+                    break;
+                }
+                else
+                {
+                    this.allowedOrigins.add(allowedOrigin);
+                }
+            }
+        }
+
+        String allowedMethodsConfig = config.getInitParameter(ALLOWED_METHODS_PARAM);
+        if (allowedMethodsConfig == null)
+            allowedMethodsConfig = "GET,POST,HEAD";
+        allowedMethods.addAll(Arrays.asList(allowedMethodsConfig.split(",")));
+
+        String allowedHeadersConfig = config.getInitParameter(ALLOWED_HEADERS_PARAM);
+        if (allowedHeadersConfig == null)
+            allowedHeadersConfig = "X-Requested-With,Content-Type,Accept,Origin";
+        allowedHeaders.addAll(Arrays.asList(allowedHeadersConfig.split(",")));
+
+        String preflightMaxAgeConfig = config.getInitParameter(PREFLIGHT_MAX_AGE_PARAM);
+        if (preflightMaxAgeConfig == null)
+            preflightMaxAgeConfig = "1800"; // Default is 30 minutes
+        try
+        {
+            preflightMaxAge = Integer.parseInt(preflightMaxAgeConfig);
+        }
+        catch (NumberFormatException x)
+        {
+            LOG.info("Cross-origin filter, could not parse '{}' parameter as integer: {}", PREFLIGHT_MAX_AGE_PARAM, preflightMaxAgeConfig);
+        }
+
+        String allowedCredentialsConfig = config.getInitParameter(ALLOW_CREDENTIALS_PARAM);
+        if (allowedCredentialsConfig == null)
+            allowedCredentialsConfig = "true";
+        allowCredentials = Boolean.parseBoolean(allowedCredentialsConfig);
+
+        String exposedHeadersConfig = config.getInitParameter(EXPOSED_HEADERS_PARAM);
+        if (exposedHeadersConfig == null)
+            exposedHeadersConfig = "";
+        exposedHeaders.addAll(Arrays.asList(exposedHeadersConfig.split(",")));
+
+        String chainPreflightConfig = config.getInitParameter(OLD_CHAIN_PREFLIGHT_PARAM);
+        if (chainPreflightConfig!=null) // TODO remove this
+            LOG.warn("DEPRECATED CONFIGURATION: Use "+CHAIN_PREFLIGHT_PARAM+ " instead of "+OLD_CHAIN_PREFLIGHT_PARAM);
+        else
+            chainPreflightConfig = config.getInitParameter(CHAIN_PREFLIGHT_PARAM);
+        if (chainPreflightConfig == null)
+            chainPreflightConfig = "true";
+        chainPreflight = Boolean.parseBoolean(chainPreflightConfig);
+
+        if (LOG.isDebugEnabled())
+        {
+            LOG.debug("Cross-origin filter configuration: " +
+                ALLOWED_ORIGINS_PARAM + " = " + allowedOriginsConfig + ", " +
+                ALLOWED_METHODS_PARAM + " = " + allowedMethodsConfig + ", " +
+                ALLOWED_HEADERS_PARAM + " = " + allowedHeadersConfig + ", " +
+                PREFLIGHT_MAX_AGE_PARAM + " = " + preflightMaxAgeConfig + ", " +
+                ALLOW_CREDENTIALS_PARAM + " = " + allowedCredentialsConfig + "," +
+                EXPOSED_HEADERS_PARAM + " = " + exposedHeadersConfig + "," +
+                CHAIN_PREFLIGHT_PARAM + " = " + chainPreflightConfig
+                );
+        }
+    }
+    
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
+    {
+        handle((HttpServletRequest)request, (HttpServletResponse)response, chain);
+    }
+
+    private void handle(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException
+    {
+        String origin = request.getHeader(ORIGIN_HEADER);
+        // Is it a cross origin request ?
+        if (origin != null && isEnabled(request))
+        {
+            if (originMatches(origin))
+            {
+                if (isSimpleRequest(request))
+                {
+                    LOG.debug("Cross-origin request to {} is a simple cross-origin request", request.getRequestURI());
+                    handleSimpleResponse(request, response, origin);
+                }
+                else if (isPreflightRequest(request))
+                {
+                    LOG.debug("Cross-origin request to {} is a preflight cross-origin request", request.getRequestURI());
+                    handlePreflightResponse(request, response, origin);
+                    if (chainPreflight)
+                        LOG.debug("Preflight cross-origin request to {} forwarded to application", request.getRequestURI());
+                    else
+                        return;
+                }
+                else
+                {
+                    LOG.debug("Cross-origin request to {} is a non-simple cross-origin request", request.getRequestURI());
+                    handleSimpleResponse(request, response, origin);
+                }
+            }
+            else
+            {
+                LOG.debug("Cross-origin request to " + request.getRequestURI() + " with origin " + origin + " does not match allowed origins " + allowedOrigins);
+            }
+        }
+
+        chain.doFilter(request, response);
+    }
+
+    @SuppressWarnings("rawtypes")
+    protected boolean isEnabled(HttpServletRequest request)
+    {
+        // WebSocket clients such as Chrome 5 implement a version of the WebSocket
+        // protocol that does not accept extra response headers on the upgrade response
+        for (Enumeration connections = request.getHeaders("Connection"); connections.hasMoreElements();)
+        {
+            String connection = (String)connections.nextElement();
+            if ("Upgrade".equalsIgnoreCase(connection))
+            {
+                for (Enumeration upgrades = request.getHeaders("Upgrade"); upgrades.hasMoreElements();)
+                {
+                    String upgrade = (String)upgrades.nextElement();
+                    if ("WebSocket".equalsIgnoreCase(upgrade))
+                        return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    private boolean originMatches(String originList)
+    {
+        if (anyOriginAllowed)
+            return true;
+
+        if (originList.trim().length() == 0)
+            return false;
+
+        String[] origins = originList.split(" ");
+        for (String origin : origins)
+        {
+            if (origin.trim().length() == 0)
+                continue;
+
+            for (String allowedOrigin : allowedOrigins)
+            {
+                if (allowedOrigin.contains("*"))
+                {
+                    Matcher matcher = createMatcher(origin,allowedOrigin);
+                    if (matcher.matches())
+                        return true;
+                }
+                else if (allowedOrigin.equals(origin))
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private Matcher createMatcher(String origin, String allowedOrigin)
+    {
+        String regex = parseAllowedWildcardOriginToRegex(allowedOrigin);
+        Pattern pattern = Pattern.compile(regex);
+        return pattern.matcher(origin);
+    }
+
+    private String parseAllowedWildcardOriginToRegex(String allowedOrigin)
+    {
+        String regex = allowedOrigin.replace(".","\\.");
+        return regex.replace("*",".*"); // we want to be greedy here to match multiple subdomains, thus we use .*
+    }
+
+    private boolean isSimpleRequest(HttpServletRequest request)
+    {
+        String method = request.getMethod();
+        if (SIMPLE_HTTP_METHODS.contains(method))
+        {
+            // TODO: implement better detection of simple headers
+            // The specification says that for a request to be simple, custom request headers must be simple.
+            // Here for simplicity I just check if there is a Access-Control-Request-Method header,
+            // which is required for preflight requests
+            return request.getHeader(ACCESS_CONTROL_REQUEST_METHOD_HEADER) == null;
+        }
+        return false;
+    }
+
+    private boolean isPreflightRequest(HttpServletRequest request)
+    {
+        String method = request.getMethod();
+        if (!"OPTIONS".equalsIgnoreCase(method))
+            return false;
+        if (request.getHeader(ACCESS_CONTROL_REQUEST_METHOD_HEADER) == null)
+            return false;
+        return true;
+    }
+
+    private void handleSimpleResponse(HttpServletRequest request, HttpServletResponse response, String origin)
+    {
+        response.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, origin);
+        if (allowCredentials)
+            response.setHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER, "true");
+        if (!exposedHeaders.isEmpty())
+            response.setHeader(ACCESS_CONTROL_EXPOSE_HEADERS_HEADER, commify(exposedHeaders));
+    }
+
+    private void handlePreflightResponse(HttpServletRequest request, HttpServletResponse response, String origin)
+    {
+        boolean methodAllowed = isMethodAllowed(request);
+        if (!methodAllowed)
+            return;
+        boolean headersAllowed = areHeadersAllowed(request);
+        if (!headersAllowed)
+            return;
+        response.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, origin);
+        if (allowCredentials)
+            response.setHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER, "true");
+        if (preflightMaxAge > 0)
+            response.setHeader(ACCESS_CONTROL_MAX_AGE_HEADER, String.valueOf(preflightMaxAge));
+        response.setHeader(ACCESS_CONTROL_ALLOW_METHODS_HEADER, commify(allowedMethods));
+        response.setHeader(ACCESS_CONTROL_ALLOW_HEADERS_HEADER, commify(allowedHeaders));
+    }
+
+    private boolean isMethodAllowed(HttpServletRequest request)
+    {
+        String accessControlRequestMethod = request.getHeader(ACCESS_CONTROL_REQUEST_METHOD_HEADER);
+        LOG.debug("{} is {}", ACCESS_CONTROL_REQUEST_METHOD_HEADER, accessControlRequestMethod);
+        boolean result = false;
+        if (accessControlRequestMethod != null)
+            result = allowedMethods.contains(accessControlRequestMethod);
+        LOG.debug("Method {} is" + (result ? "" : " not") + " among allowed methods {}", accessControlRequestMethod, allowedMethods);
+        return result;
+    }
+
+    private boolean areHeadersAllowed(HttpServletRequest request)
+    {
+        String accessControlRequestHeaders = request.getHeader(ACCESS_CONTROL_REQUEST_HEADERS_HEADER);
+        LOG.debug("{} is {}", ACCESS_CONTROL_REQUEST_HEADERS_HEADER, accessControlRequestHeaders);
+        boolean result = true;
+        if (accessControlRequestHeaders != null)
+        {
+            String[] headers = accessControlRequestHeaders.split(",");
+            for (String header : headers)
+            {
+                boolean headerAllowed = false;
+                for (String allowedHeader : allowedHeaders)
+                {
+                    if (header.trim().equalsIgnoreCase(allowedHeader.trim()))
+                    {
+                        headerAllowed = true;
+                        break;
+                    }
+                }
+                if (!headerAllowed)
+                {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        LOG.debug("Headers [{}] are" + (result ? "" : " not") + " among allowed headers {}", accessControlRequestHeaders, allowedHeaders);
+        return result;
+    }
+
+    private String commify(List<String> strings)
+    {
+        StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < strings.size(); ++i)
+        {
+            if (i > 0) builder.append(",");
+            String string = strings.get(i);
+            builder.append(string);
+        }
+        return builder.toString();
+    }
+
+    @Override
+    public void destroy()
+    {
+        anyOriginAllowed = false;
+        allowedOrigins.clear();
+        allowedMethods.clear();
+        allowedHeaders.clear();
+        preflightMaxAge = 0;
+        allowCredentials = false;
+    }
+}


[6/8] jena git commit: Deal cleanly with no datasets provide - devolve to individual commands.

Posted by an...@apache.org.
Deal cleanly with no datasets provide - devolve to individual commands.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/b8aba8b1
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/b8aba8b1
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/b8aba8b1

Branch: refs/heads/master
Commit: b8aba8b1c88b3784eb6d9e704f1b622f29e38d71
Parents: 5c9092d
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Aug 25 12:31:49 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Aug 25 12:31:49 2015 +0100

----------------------------------------------------------------------
 jena-tdb/src/main/java/tdb/tdbupdate.java | 35 ++++++++++++++++++--------
 1 file changed, 24 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/b8aba8b1/jena-tdb/src/main/java/tdb/tdbupdate.java
----------------------------------------------------------------------
diff --git a/jena-tdb/src/main/java/tdb/tdbupdate.java b/jena-tdb/src/main/java/tdb/tdbupdate.java
index 2d25620..464ec2e 100644
--- a/jena-tdb/src/main/java/tdb/tdbupdate.java
+++ b/jena-tdb/src/main/java/tdb/tdbupdate.java
@@ -18,31 +18,44 @@
 
 package tdb;
 
+import arq.cmdline.ModDataset ;
+import jena.cmd.CmdException ;
+import org.apache.jena.sparql.core.DatasetGraph ;
 import org.apache.jena.tdb.TDB ;
 import org.apache.jena.tdb.transaction.TransactionManager ;
 import tdb.cmdline.CmdTDB ;
+import tdb.cmdline.ModTDBDataset ;
 
 public class tdbupdate extends arq.update
 {
     // Inherits from arq.update so is not a CmdTDB.  Mixins for Java!
     public static void main(String...argv)
-    {
-        CmdTDB.init() ;
+ {
+        CmdTDB.init();
         // Do everything with flushing transactions.
-        TransactionManager.QueueBatchSize = 0 ;
-        new tdbupdate(argv).mainRun() ;
+        TransactionManager.QueueBatchSize = 0;
+        new tdbupdate(argv).mainRun();
     }
-    
-    public tdbupdate(String[] argv) 
-    {
-        super(argv) ;
+
+    public tdbupdate(String[] argv) {
+        super(argv);
         // Because this inherits from an ARQ command
-        CmdTDB.init() ;
-        super.modVersion.addClass(TDB.class) ;
+        CmdTDB.init();
+        super.modVersion.addClass(TDB.class);
     }
 
     @Override
     protected void processModulesAndArgs() {
-        super.processModulesAndArgs() ;
+        super.processModulesAndArgs();
+    }
+
+    @Override
+    protected ModDataset setModeDataset() {
+        return new ModTDBDataset();
+    }
+    
+    @Override
+    protected DatasetGraph dealWithNoDataset() {
+        throw new CmdException("No dataset provided") ;
     }
 }


[7/8] jena git commit: JENA-1014: CORS Filter

Posted by an...@apache.org.
JENA-1014: CORS Filter


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/3b2de096
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/3b2de096
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/3b2de096

Branch: refs/heads/master
Commit: 3b2de09605f4cad193c55104c3a42bd608386e2c
Parents: b8aba8b
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Aug 27 12:44:30 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Aug 27 12:44:51 2015 +0100

----------------------------------------------------------------------
 .../src/main/webapp/WEB-INF/web.xml             | 39 ++++++++++++++++++--
 1 file changed, 35 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/3b2de096/jena-fuseki2/jena-fuseki-core/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/webapp/WEB-INF/web.xml b/jena-fuseki2/jena-fuseki-core/src/main/webapp/WEB-INF/web.xml
index 4c3c415..b3ba1c3 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/webapp/WEB-INF/web.xml
+++ b/jena-fuseki2/jena-fuseki-core/src/main/webapp/WEB-INF/web.xml
@@ -30,12 +30,42 @@
 
   <!-- Apache Shiro setup -->
   <listener>
-    <!--<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>-->
-    <!-- Support multiple locations, looks in Fuseki-relevant places -->
+    <!-- This replaces org.apache.shiro.web.env.EnvironmentLoaderListener
+         Support multiple locations and looks in Fuseki-relevant places.
+     -->
     <listener-class>org.apache.jena.fuseki.server.ShiroEnvironmentLoader</listener-class>
   </listener>
 
-  <!-- First filter -->
+  <!-- CORS -->
+  <filter>
+    <filter-name>cross-origin</filter-name>
+    <!-- Ported and standalone version of org.eclipse.jetty.servlets.CrossOriginFilter -->
+    <filter-class>org.apache.jena.fuseki.servlets.CrossOriginFilter</filter-class>
+    <!-- Defaults may be fine --> 
+    <init-param>
+      <param-name>allowedOrigins</param-name>
+      <param-value>*</param-value>
+    </init-param>
+    <init-param>
+      <param-name>allowedMethods</param-name>
+      <param-value>GET,POST,DELETE,PUT,HEAD,OPTIONS,PATCH</param-value>
+    </init-param>
+    <init-param>
+      <param-name>allowedHeaders</param-name>
+      <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified, Authorization</param-value>
+    </init-param>
+    <init-param>
+      <param-name>exposedHeaders</param-name>
+      <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
+    </init-param>
+  </filter>
+  
+  <filter-mapping>
+    <filter-name>cross-origin</filter-name>
+    <url-pattern>/*</url-pattern>
+  </filter-mapping>
+
+  <!-- Before FusekiFilter -->
   <filter>
     <filter-name>ShiroFilter</filter-name>
     <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
@@ -57,13 +87,14 @@
     -->
     <param-value>shiro.ini</param-value>
   </context-param>
-
+  
   <!-- Apache Jena Fuseki setup -->
 
   <listener>
     <listener-class>org.apache.jena.fuseki.server.FusekiServerListener</listener-class>
   </listener>
 
+  <!-- Fuseki datatset serviced calls -->
   <filter>
     <filter-name>Fuseki</filter-name>
     <filter-class>org.apache.jena.fuseki.servlets.FusekiFilter</filter-class>


[3/8] jena git commit: Add "--loc" support to tdbupdate.

Posted by an...@apache.org.
Add "--loc" support to tdbupdate.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/48769892
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/48769892
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/48769892

Branch: refs/heads/master
Commit: 48769892c1102257ded9a661a358e51ec66a5e44
Parents: bb2e683
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Aug 25 12:12:29 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Aug 25 12:12:29 2015 +0100

----------------------------------------------------------------------
 jena-arq/src/main/java/arq/cmdline/CmdUpdate.java  | 8 +++-----
 jena-arq/src/main/java/arq/cmdline/ModDataset.java | 9 +++++----
 2 files changed, 8 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/48769892/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java b/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
index d06f480..fd3113b 100644
--- a/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
+++ b/jena-arq/src/main/java/arq/cmdline/CmdUpdate.java
@@ -24,7 +24,7 @@ import org.apache.jena.sparql.core.DatasetGraph ;
 
 public abstract class CmdUpdate extends CmdARQ
 {
-    protected ModDatasetGeneralAssembler modGraphStore = new ModDatasetGeneralAssembler() ;
+    protected ModDataset modGraphStore = null ;
     protected Syntax updateSyntax = Syntax.defaultUpdateSyntax ;
 
     protected CmdUpdate(String[] argv)
@@ -32,11 +32,9 @@ public abstract class CmdUpdate extends CmdARQ
         super(argv) ;
         modGraphStore = setModGraphStore() ;
         addModule(modGraphStore) ;
-        
     }
     
-    protected ModDatasetGeneralAssembler setModGraphStore()
-    {
+    protected ModDataset setModGraphStore() {
         return new ModDatasetGeneralAssembler() ;
     }
     
@@ -54,7 +52,7 @@ public abstract class CmdUpdate extends CmdARQ
         DatasetGraph graphStore = modGraphStore.getDatasetGraph() ;
         if ( graphStore.getDefaultGraph() == null )
             graphStore.setDefaultGraph(ModelFactory.createDefaultModel().getGraph()) ;
-   execUpdate(graphStore) ;
+        execUpdate(graphStore) ;
     }
 
     protected abstract void execUpdate(DatasetGraph graphStore) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/48769892/jena-arq/src/main/java/arq/cmdline/ModDataset.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/arq/cmdline/ModDataset.java b/jena-arq/src/main/java/arq/cmdline/ModDataset.java
index 7a7db0d..089e1f1 100644
--- a/jena-arq/src/main/java/arq/cmdline/ModDataset.java
+++ b/jena-arq/src/main/java/arq/cmdline/ModDataset.java
@@ -31,15 +31,16 @@ public abstract class ModDataset extends ModBase
     public ModDataset() {}
     
     final
-    public Dataset getDataset()
-    { if ( ! createAttempted )
+    public Dataset getDataset() { 
+        if ( ! createAttempted )
             dataset = createDataset() ;
         createAttempted = true ;
         return dataset ;
     }
     
-    public DatasetGraph getDatasetGraph()
-    { return dataset.asDatasetGraph() ; }
+    public DatasetGraph getDatasetGraph() { 
+        return getDataset().asDatasetGraph() ;
+    }
 
     public abstract Dataset createDataset() ; 
 }