This is an automated email from the ASF dual-hosted git repository. afs pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit 286a68955d54651f93fa8aaee195b064ef0379c3 Author: Andy Seaborne <[email protected]> AuthorDate: Wed Oct 7 09:32:39 2026 +0100 GH-4292: GSP - Correctly determine graph existence --- .../apache/jena/fuseki/servlets/GraphTarget.java | 27 +++++----- .../jena/sparql/exec/http/TS_SparqlExecHttp.java | 1 + .../org/apache/jena/sparql/exec/http/TestGSP.java | 1 - .../org/apache/jena/sparql/exec/http/TestGSP2.java | 63 ++++++++++++++++++++++ .../jena/sparql/exec/http/TestModelStore2.java | 2 +- 5 files changed, 79 insertions(+), 15 deletions(-) diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/GraphTarget.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/GraphTarget.java index 9effce1f5b..fc7e20f27a 100644 --- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/GraphTarget.java +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/GraphTarget.java @@ -77,21 +77,21 @@ public class GraphTarget { ServletOps.errorBadRequest("Direct name does not have the dataset name as a prefix: "+requestURI); Node gn = NodeFactory.createURI(directName); - return createNamed(dsg, gn); + return createTargetNamed(dsg, gn); } if ( dftGraph ) - return createDefault(dsg); + return createTargetDefault(dsg); // Named graph as default if ( uri.equals(HttpNames.graphTargetDefault) ) // But "named" default - return createDefault(dsg); + return createTargetDefault(dsg); // Named graph - union if ( uri.equals(HttpNames.graphTargetUnion) ) - return createUnion(dsg); + return createTargetUnion(dsg); // This logs bad URIs. String absUri = resolve0(uri, action); - return createNamed(dsg, absUri); + return createTargetNamed(dsg, absUri); } // Resolving a relative URI in ?graph= is a bit murky. @@ -157,19 +157,19 @@ public class GraphTarget { final private DatasetGraph dsg; final private Node graphName; - static GraphTarget createNamed(DatasetGraph dsg, String graphName) { - return createNamed(dsg, NodeFactory.createURI(graphName)); + static GraphTarget createTargetNamed(DatasetGraph dsg, String graphName) { + return createTargetNamed(dsg, NodeFactory.createURI(graphName)); } - static GraphTarget createNamed(DatasetGraph dsg, Node graphName) { + static GraphTarget createTargetNamed(DatasetGraph dsg, Node graphName) { return new GraphTarget(false, false, dsg, graphName); } - static GraphTarget createDefault(DatasetGraph dsg) { + static GraphTarget createTargetDefault(DatasetGraph dsg) { return new GraphTarget(true, false, dsg, null); } - static GraphTarget createUnion(DatasetGraph dsg) { + static GraphTarget createTargetUnion(DatasetGraph dsg) { return new GraphTarget(false, true, dsg, null); } @@ -211,7 +211,7 @@ public class GraphTarget { public Node graphName() { return graphName; } /** - * Get a graph for the action - this is not a test for graph existence. + * Get a graph for the action - this is not a test for graph existence. * May return null or an empty graph. */ public Graph graph() { @@ -225,8 +225,9 @@ public class GraphTarget { public boolean exists() { if ( isDefault || isUnion ) return true; - Graph g = graph(); - return g != null && ! g.isEmpty(); + return dsg.containsGraph(graphName); +// Graph g = graph(); +// return g != null && ! g.isEmpty(); } public String label() { diff --git a/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TS_SparqlExecHttp.java b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TS_SparqlExecHttp.java index fa19024e83..ff83e12919 100644 --- a/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TS_SparqlExecHttp.java +++ b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TS_SparqlExecHttp.java @@ -27,6 +27,7 @@ import org.junit.platform.suite.api.Suite; @Suite @SelectClasses({ TestGSP.class + , TestGSP2.class , TestDSP.class , TestGSPDirect.class , TestModelStore.class diff --git a/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestGSP.java b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestGSP.java index dd2331c7f1..7b7db060d8 100644 --- a/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestGSP.java +++ b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestGSP.java @@ -72,7 +72,6 @@ public class TestGSP { server.stop(); } - private String url(String path) { return server.datasetURL(path); } diff --git a/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestGSP2.java b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestGSP2.java new file mode 100644 index 0000000000..8bb525f034 --- /dev/null +++ b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestGSP2.java @@ -0,0 +1,63 @@ +/* + * 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 + * + * https://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. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.apache.jena.sparql.exec.http; + +import static org.junit.jupiter.api.Assertions.assertFalse; + +import org.junit.jupiter.api.Test; + +import org.apache.jena.fuseki.main.FusekiServer; +import org.apache.jena.fuseki.main.FusekiTestLib; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.sparql.core.DatasetGraph; +import org.apache.jena.sparql.core.DatasetGraphFactory; +import org.apache.jena.sparql.exec.QueryExec; +import org.apache.jena.sparql.exec.RowSet; + +/** GSP tests with specific server setup */ +public class TestGSP2 { + @Test public void gsp_config_general_dataset() { + // Issue GH-4292 + // DatasetGraphMapLink + DatasetGraph dsg = DatasetGraphFactory.createGeneral(); + FusekiServer server = FusekiServer.create().port(0).add("/ds", dsg).build(); + server.start(); + String URL = server.datasetURL("/ds"); + Node gn = NodeFactory.createURI("urn:ns:missing"); + try { + // Expect 404 + FusekiTestLib.expect404(()-> + GSP.service(URL+"/data").graphName(gn).DELETE() + ); + // GET 400 + //GSP.service(URL+"/data").graphName(gn).GET(); + + QueryExec qExec = QueryExecHTTP.service(URL).query("SELECT * { GRAPH ?g { } }").build(); + RowSet rowSet = qExec.select(); + // No named graphs expected + assertFalse(rowSet.hasNext(), "No named graphs expected"); + } finally { + server.stop(); + } + } +} diff --git a/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestModelStore2.java b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestModelStore2.java index 24f9a1501b..f00b845f9d 100644 --- a/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestModelStore2.java +++ b/jena-integration-tests/src/test/java/org/apache/jena/sparql/exec/http/TestModelStore2.java @@ -44,7 +44,7 @@ import org.apache.jena.riot.WebContent; import org.apache.jena.sparql.sse.SSE; import org.apache.jena.test.conn.EnvTest; -// From TestModelStore - these tests are ones that occassionaly fail. +// From TestModelStore - these tests are ones that occasional fail. public class TestModelStore2 { static String DIR = "testing/RDFLink/";
