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.
