This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git

commit fa1c64b74aa3ab0977e14cb8c4bc1aada0a94cae
Author: Andy Seaborne <[email protected]>
AuthorDate: Fri Apr 4 16:10:30 2025 +0100

    GH-3106: Prepare Fuseki config file for assemblers
---
 .../jena/sparql/core/assembler/AssemblerUtils.java | 17 ++++++++--
 .../org/apache/jena/fuseki/build/FusekiConfig.java |  5 ++-
 .../apache/jena/fuseki/main/cmds/FusekiMain.java   |  5 +++
 .../org/apache/jena/fuseki/mgt/ActionDatasets.java |  3 +-
 .../apache/jena/fuseki/main/TestConfigFile.java    |  9 +++++
 .../main/TestFusekiMainCmdCustomArguments.java     |  9 +++--
 .../testing/Config/configOfModels.ttl              | 39 ++++++++++++++++++++++
 .../org/apache/jena/fuseki/mgt/ActionDatasets.java |  4 +--
 8 files changed, 78 insertions(+), 13 deletions(-)

diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java
index b2cd64dfb3..9ebd2deda2 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java
@@ -111,6 +111,10 @@ public class AssemblerUtils
         // assemblerAssertions.add(r, RDFS.subClassOf, JA.Object);
     }
 
+    /**
+     * Read a file and make ready for use with assemblers.
+     * It calls {@link #prepareForAssembler}.
+     */
     public static Model readAssemblerFile(String assemblerFile) {
         Model spec = null;
         try {
@@ -118,22 +122,29 @@ public class AssemblerUtils
         } catch (Exception ex) {
             throw new ARQException("Failed reading assembler description: " + 
ex.getMessage());
         }
-        addRegistered(spec);
+        prepareForAssembler(spec);
         return spec;
     }
 
     /** Add any extra information to the model.
      * Such information includes registration of datasets (e.g. TDB1, TDB2)
-     * done by {@link #register} ({@link #registerDataset}, {@link 
#registerModel}.
+     * done by {@link #register} ({@link #registerDataset}, {@link 
#registerModel}
+     * and adding subclass relationship used for models.
      * It avoids directly modifying {@link Assembler#general}.
      * @param model
      * @return Model The same model after modification.
      */
-    public static Model addRegistered(Model model) {
+    public static Model prepareForAssembler(Model model) {
         model.add(modelExtras);
         return model;
     }
 
+    /** @deprecated Use {@link #prepareForAssembler(Model)} */
+    @Deprecated(forRemoval = true)
+    public static Model addRegistered(Model model) {
+        return prepareForAssembler(model);
+    }
+
     public static Object build(String assemblerFile, String typeURI) {
         Resource type = ResourceFactory.createResource(typeURI);
         return build(assemblerFile, type);
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/build/FusekiConfig.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/build/FusekiConfig.java
index b6eb248204..aff8113213 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/build/FusekiConfig.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/build/FusekiConfig.java
@@ -394,7 +394,7 @@ public class FusekiConfig {
     /**
      * Read a configuration in a model.
      * Allow dataset descriptions to be carried over from another place.
-     * Add to a list.
+     * Add the {@link DataAccessPoint} to a list.
      */
     private static void readConfiguration(Graph configuration, 
DatasetDescriptionMap dsDescMap, List<DataAccessPoint> dataServiceRef) {
         List<Node> services = G.nodesOfTypeAsList(configuration, 
FusekiVocabG.fusekiService);
@@ -666,7 +666,7 @@ public class FusekiConfig {
         endpoints.add(endpoint);
     }
 
-    @Deprecated
+    @Deprecated(forRemoval = true)
     public static Dataset getDataset(Resource datasetDesc, 
DatasetDescriptionMap dsDescMap) {
         DatasetGraph dsg = getDataset(datasetDesc.getModel().getGraph(), 
datasetDesc.asNode(), dsDescMap);
         return DatasetFactory.wrap(dsg);
@@ -688,7 +688,6 @@ public class FusekiConfig {
             throw new FusekiConfigException("No rdf:type for dataset " + 
displayStr(configuration, datasetDesc));
 
         // Should have been done already. e.g. 
ActionDatasets.execPostContainer,
-        // AssemblerUtils.readAssemblerFile < FusekiServer.parseConfigFile.
         //AssemblerUtils.addRegistered(datasetDesc.getModel());
 
         Resource r = resource(configuration, datasetDesc);
diff --git 
a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java
 
b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java
index 1e2947dca2..015d97f9b0 100644
--- 
a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java
+++ 
b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java
@@ -48,6 +48,7 @@ import org.apache.jena.fuseki.validation.*;
 import org.apache.jena.query.ARQ;
 import org.apache.jena.riot.RDFDataMgr;
 import org.apache.jena.riot.RDFParser;
+import org.apache.jena.sparql.core.assembler.AssemblerUtils;
 import org.apache.jena.sys.JenaSystem;
 import org.slf4j.Logger;
 
@@ -731,8 +732,12 @@ public class FusekiMain extends CmdARQ {
                     file = file.substring("file:".length());
                 Path path = Path.of(file);
                 IOX.checkReadableFile(file, msg->new CmdException(msg));
+
                 serverArgs.datasetDescription = "Configuration: 
"+path.toAbsolutePath();
                 serverArgs.serverConfigModel = 
RDFParser.source(path).toModel();
+                // Add dataset and model declarations.
+                
AssemblerUtils.prepareForAssembler(serverArgs.serverConfigModel);
+
                 // ... and perform server configuration
                 builder.parseConfig(serverArgs.serverConfigModel);
             } else {
diff --git 
a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
 
b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
index 80eba44b6f..bc5a541c5a 100644
--- 
a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
+++ 
b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
@@ -151,8 +151,7 @@ public class ActionDatasets extends ActionContainerItem {
                 // Add the dataset and graph wiring for assemblers
                 Model model = ModelFactory.createDefaultModel();
                 model.add(descriptionModel);
-                // See AssemblerUtils.readAssemblerFile(String filename)
-                AssemblerUtils.addRegistered(model);
+                model = AssemblerUtils.prepareForAssembler(model);
 
                 // ----
                 // Process configuration.
diff --git 
a/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/TestConfigFile.java
 
b/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/TestConfigFile.java
index 1711cb5d5a..5617b63f9d 100644
--- 
a/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/TestConfigFile.java
+++ 
b/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/TestConfigFile.java
@@ -321,6 +321,15 @@ public class TestConfigFile {
         }
     }
 
+    // GH-3106.
+    // Several types of Model.
+    // Requires that the configuration file has had the assembler 
registrations added correctly.
+    @Test public void setupDatasetOfModels() {
+        FusekiServer server = FusekiServer.construct("--port=0", "--conf", 
DIR+"configOfModels.ttl");
+        server.start();
+        server.stop();
+    }
+
     private static String NL = "\n";
 
     private void unionGraph(String fnConfig, String dbName) {
diff --git 
a/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/TestFusekiMainCmdCustomArguments.java
 
b/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/TestFusekiMainCmdCustomArguments.java
index aa64bc5f77..3e5d41255a 100644
--- 
a/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/TestFusekiMainCmdCustomArguments.java
+++ 
b/jena-fuseki2/jena-fuseki-main/src/test/java/org/apache/jena/fuseki/main/TestFusekiMainCmdCustomArguments.java
@@ -22,8 +22,8 @@ import static org.junit.jupiter.api.Assertions.*;
 
 import java.util.function.Consumer;
 
-import org.junit.After;
 import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
@@ -70,13 +70,15 @@ public class TestFusekiMainCmdCustomArguments {
     @AfterAll public static void afterClass() {
         if ( level != null )
             LogCtl.setLevel(Fuseki.serverLog, level);
+        // Clear up!
     }
 
     private FusekiServer server = null;
 
-    @After public void after() {
+    @AfterEach public void after() {
         if ( server != null )
             server.stop();
+        FusekiMain.resetCustomisers();
     }
 
     @Test
@@ -139,6 +141,7 @@ public class TestFusekiMainCmdCustomArguments {
         });
         
assertTrue(server.getDataAccessPointRegistry().isRegistered("/dataset"));
         assertFalse(server.getDataAccessPointRegistry().isRegistered("/ds"));
+        FusekiMain.resetCustomisers();
     }
 
     @Test
@@ -223,7 +226,7 @@ public class TestFusekiMainCmdCustomArguments {
         }
     };
 
-    // --fixed triggers replacing the comfiguration model.
+    // --fixed triggers replacing the configuration model.
     static class TestArgsCustomModelAltArg implements 
FusekiServerArgsCustomiser {
         final ArgDecl argDecl;
         final Model fixedModel;
diff --git a/jena-fuseki2/jena-fuseki-main/testing/Config/configOfModels.ttl 
b/jena-fuseki2/jena-fuseki-main/testing/Config/configOfModels.ttl
new file mode 100644
index 0000000000..ebc9cabc05
--- /dev/null
+++ b/jena-fuseki2/jena-fuseki-main/testing/Config/configOfModels.ttl
@@ -0,0 +1,39 @@
+# Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0
+
+## Fuseki Server configuration file.
+## Teh dataset has inf models that depend on TDB graph models.
+
+PREFIX :        <#>
+PREFIX fuseki:  <http://jena.apache.org/fuseki#>
+PREFIX rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+PREFIX rdfs:    <http://www.w3.org/2000/01/rdf-schema#>
+PREFIX ja:      <http://jena.hpl.hp.com/2005/11/Assembler#>
+PREFIX tdb2:    <http://jena.apache.org/2016/tdb#>
+PREFIX res:     <http://jena.hpl.hp.com/2003/>
+
+:serviceData rdf:type fuseki:Service ;
+    fuseki:name "Data" ;
+    fuseki:dataset :dsData ;
+    .
+
+:dsData rdf:type ja:RDFDataset ;
+  ja:defaultGraph :graphDefault ;
+  .
+
+:graphDefault rdf:type tdb2:GraphTDB2 ;
+    tdb2:dataset :ds_tdb2_Data ;
+    .
+
+:ds_tdb2_Data rdf:type tdb2:DatasetTDB2 ;
+    rdfs:label "Data TDB2 Dataset" ;
+    tdb2:location "--mem--" ;
+    .
+
+## GH-3106 - use :graphDefault interfered with dataset creation.
+:graphInfData rdf:type ja:InfModel ;
+     ja:baseModel :graphDefault ;
+     ja:reasoner [
+         rdf:type ja:Reasoner ;
+         ja:reasonerURL res:OWLMicroFBRuleReasoner
+     ];
+     .
diff --git 
a/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
 
b/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
index 11019e0b72..e6fed0c5da 100644
--- 
a/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
+++ 
b/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
@@ -151,8 +151,8 @@ public class ActionDatasets extends ActionContainerItem {
 
                 Model model = ModelFactory.createDefaultModel();
                 model.add(modelData);
-                // Add the dataset and graph wiring.
-                AssemblerUtils.addRegistered(model);
+                // Add dataset and model declarations.
+                model = AssemblerUtils.prepareForAssembler(model);
 
                 // ----
                 // Process configuration.

Reply via email to