From 5a95b3b9e2ecf11378221f6aaa75e23da59057e4 Mon Sep 17 00:00:00 2001 From: Simon Oakes Date: Mon, 3 Nov 2025 10:05:35 +0000 Subject: [PATCH 01/10] Update dependencies with major impact --- pom.xml | 49 +++++++----- .../com/epimorphics/appbase/core/App.java | 4 +- .../epimorphics/appbase/core/AppConfig.java | 7 +- .../appbase/core/PrefixService.java | 5 +- .../appbase/data/DatasetAccessor.java | 51 +++++++++++++ .../data/RDFConnectionDatasetAccessor.java | 74 +++++++++++++++++++ .../appbase/data/ResourceView.java | 2 +- .../appbase/data/ResourceViewFactory.java | 4 +- .../appbase/data/SparqlSource.java | 3 +- .../com/epimorphics/appbase/data/WNode.java | 3 +- .../com/epimorphics/appbase/data/WSource.java | 20 ++--- .../appbase/data/impl/BaseSparqlSource.java | 5 +- .../data/impl/DatasetSparqlSource.java | 25 ++----- .../appbase/data/impl/FileSparqlSource.java | 8 +- .../data/impl/LockingDatasetAccessor.java | 17 +---- .../data/impl/LoggingSparqlSource.java | 7 +- .../appbase/data/impl/ModelSparqlSource.java | 6 +- .../appbase/data/impl/RemoteSparqlSource.java | 28 ++++--- .../appbase/data/impl/SSResultSet.java | 19 +++++ .../appbase/data/impl/TDBSparqlSource.java | 16 ++-- .../impl/TransactionalDatasetAccessor.java | 17 +---- .../data/impl/UnionDatasetSparqlSource.java | 2 +- .../appbase/monitor/DatasetMonitor.java | 4 +- .../appbase/monitor/DirectoryMonitor.java | 1 + .../epimorphics/appbase/monitor/Scanner.java | 34 ++++----- .../appbase/tasks/ActionManager.java | 2 +- .../appbase/tasks/WebProgressMonitor.java | 9 +-- .../appbase/tasks/impl/JavaAction.java | 6 +- .../epimorphics/appbase/templates/Lib.java | 2 +- .../appbase/templates/VelocityRender.java | 18 ++--- .../appbase/webapi/BaseEndpoint.java | 12 +-- .../appbase/webapi/CorsFilter.java | 16 ++-- .../appbase/webapi/ExtensionFilter.java | 15 ++-- .../appbase/webapi/VelocityFilter.java | 16 ++-- .../appbase/webapi/WebApiException.java | 4 +- .../webapi/testing/TomcatTestBase.java | 28 +++---- .../marshalling/GenericJSONMarshaller.java | 13 ++-- .../webapi/marshalling/GenericJSONReader.java | 23 +++--- .../appbase/data/TestLoggingSource.java | 12 ++- .../appbase/data/TestQuadSource.java | 7 +- .../appbase/data/TestRemoteSource.java | 1 - .../epimorphics/appbase/data/TestSource.java | 2 +- .../appbase/data/TestUnionSource.java | 1 - .../appbase/monitor/TestFileMonitor.java | 2 +- .../appbase/monitor/TestMonitor.java | 7 +- .../appbase/webapi/TestBasicRender.java | 3 +- .../appbase/webapi/TestConfig.java | 11 ++- 47 files changed, 369 insertions(+), 252 deletions(-) create mode 100644 src/main/java/com/epimorphics/appbase/data/DatasetAccessor.java create mode 100644 src/main/java/com/epimorphics/appbase/data/RDFConnectionDatasetAccessor.java diff --git a/pom.xml b/pom.xml index 405e41b..9c7ed49 100644 --- a/pom.xml +++ b/pom.xml @@ -12,10 +12,12 @@ UTF-8 - 9.0.108 - 3.9.0 - 3.1.8 - 2.25.1 + 21 + 21 + 11.0.10 + 5.5.0 + 4.0.0-SNAPSHOT + 3.1.11 @@ -136,12 +138,12 @@ provided - - javax.servlet - javax.servlet-api - 3.1.0 - provided - + + + + + + commons-beanutils @@ -182,8 +184,8 @@ maven-compiler-plugin 3.3 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} @@ -249,11 +251,22 @@ - - - epi-public-repo - ftp://epimorphics.com - - + + + epi-public-s3-release + Epimorphics S3 release repository + s3://epi-repository/release + true + false + + + + epi-public-s3-snapshot + Epimorphics S3 snapshot repository + s3://epi-repository/snapshot + false + true + + diff --git a/src/main/java/com/epimorphics/appbase/core/App.java b/src/main/java/com/epimorphics/appbase/core/App.java index 2d29cd2..743fd3c 100644 --- a/src/main/java/com/epimorphics/appbase/core/App.java +++ b/src/main/java/com/epimorphics/appbase/core/App.java @@ -323,9 +323,9 @@ protected void processConfigLine(int lineNum, String line) { String name = value.toString(); Object component = null; if (classLoader == null) { - component = Class.forName(name).newInstance(); + component = Class.forName(name).getDeclaredConstructor().newInstance(); } else { - component = Class.forName(name, true, getLoader()).newInstance(); + component = Class.forName(name, true, getLoader()).getDeclaredConstructor().newInstance(); } if (component instanceof Named) { ((Named)component).setName(target); diff --git a/src/main/java/com/epimorphics/appbase/core/AppConfig.java b/src/main/java/com/epimorphics/appbase/core/AppConfig.java index a0c2314..d1f0e21 100644 --- a/src/main/java/com/epimorphics/appbase/core/AppConfig.java +++ b/src/main/java/com/epimorphics/appbase/core/AppConfig.java @@ -17,10 +17,9 @@ import java.util.List; import java.util.Map; -import javax.servlet.ServletContext; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; - +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletContextEvent; +import jakarta.servlet.ServletContextListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/epimorphics/appbase/core/PrefixService.java b/src/main/java/com/epimorphics/appbase/core/PrefixService.java index 35b5d8b..f3877d3 100644 --- a/src/main/java/com/epimorphics/appbase/core/PrefixService.java +++ b/src/main/java/com/epimorphics/appbase/core/PrefixService.java @@ -14,6 +14,7 @@ import java.util.HashMap; import java.util.Map; +import org.apache.jena.riot.RDFDataMgr; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,7 +40,7 @@ public class PrefixService extends ComponentBase { protected static final String DEFAULT_PREFIXES = "defaultPrefixes.ttl"; static { - globalDefault = FileManager.get().loadModel(DEFAULT_PREFIXES); + globalDefault = RDFDataMgr.loadModel(DEFAULT_PREFIXES); } protected PrefixMapping prefixes; @@ -57,7 +58,7 @@ public void setPrefixFile(String file) { File pf = asFile(file); if (pf.canRead()) { try { - prefixes = FileManager.get().loadModel(pf.getCanonicalPath()); + prefixes = RDFDataMgr.loadModel(pf.getCanonicalPath()); log.info("Loaded prefixes: " + pf); prefixes.setNsPrefixes(globalDefault); } catch (IOException e) { diff --git a/src/main/java/com/epimorphics/appbase/data/DatasetAccessor.java b/src/main/java/com/epimorphics/appbase/data/DatasetAccessor.java new file mode 100644 index 0000000..7a098e9 --- /dev/null +++ b/src/main/java/com/epimorphics/appbase/data/DatasetAccessor.java @@ -0,0 +1,51 @@ +package com.epimorphics.appbase.data; + +import org.apache.jena.rdf.model.Model; + +/** + * Replacement for the deprecated and removed org.apache.jena.query.DatasetAccessor. + * See here + * for the original. + */ +public interface DatasetAccessor { + /** + * Get the default model of a Dataset + */ + public Model getModel(); + + /** + * Get a named model of a Dataset + */ + public Model getModel(String graphUri); + + /** + * Put (replace) the default model of a Dataset + */ + public void putModel(Model data); + + /** + * Put (create/replace) a named model of a Dataset + */ + public void putModel(String graphUri, Model data); + + /** + * Delete (which means clear) the default model of a Dataset + */ + public void deleteDefault(); + + /** + * Delete a named model of a Dataset + */ + public void deleteModel(String graphUri); + + /** + * Add statements to the default model of a Dataset + */ + public void add(Model data); + + /** + * Add statements to a named model of a Dataset + */ + public void add(String graphUri, Model data); +} + diff --git a/src/main/java/com/epimorphics/appbase/data/RDFConnectionDatasetAccessor.java b/src/main/java/com/epimorphics/appbase/data/RDFConnectionDatasetAccessor.java new file mode 100644 index 0000000..ba45e39 --- /dev/null +++ b/src/main/java/com/epimorphics/appbase/data/RDFConnectionDatasetAccessor.java @@ -0,0 +1,74 @@ +package com.epimorphics.appbase.data; + +import org.apache.jena.rdf.model.Model; +import org.apache.jena.rdfconnection.RDFConnection; + +import java.util.function.Supplier; + +public class RDFConnectionDatasetAccessor implements DatasetAccessor { + public static RDFConnectionDatasetAccessor create(Supplier cxnFct) { + return new RDFConnectionDatasetAccessor(cxnFct); + } + + private final Supplier cxnFct; + + RDFConnectionDatasetAccessor(Supplier cxnFct) { + this.cxnFct = cxnFct; + } + + @Override + public Model getModel() { + try (RDFConnection cxn = cxnFct.get()) { + return cxn.fetch(); + } + } + + @Override + public Model getModel(String graphUri) { + try (RDFConnection cxn = cxnFct.get()) { + return cxn.fetch(graphUri); + } + } + + @Override + public void putModel(Model data) { + try (RDFConnection cxn = cxnFct.get()) { + cxn.put(data); + } + } + + @Override + public void putModel(String graphUri, Model data) { + try (RDFConnection cxn = cxnFct.get()) { + cxn.put(graphUri, data); + } + } + + @Override + public void deleteDefault() { + try (RDFConnection cxn = cxnFct.get()) { + cxn.delete(); + } + } + + @Override + public void deleteModel(String graphUri) { + try (RDFConnection cxn = cxnFct.get()) { + cxn.delete(graphUri); + } + } + + @Override + public void add(Model data) { + try (RDFConnection cxn = cxnFct.get()) { + cxn.load(data); + } + } + + @Override + public void add(String graphUri, Model data) { + try (RDFConnection cxn = cxnFct.get()) { + cxn.load(graphUri, data); + } + } +} diff --git a/src/main/java/com/epimorphics/appbase/data/ResourceView.java b/src/main/java/com/epimorphics/appbase/data/ResourceView.java index c46bf71..729c55b 100644 --- a/src/main/java/com/epimorphics/appbase/data/ResourceView.java +++ b/src/main/java/com/epimorphics/appbase/data/ResourceView.java @@ -334,7 +334,7 @@ public List getConnectedResourceViews(String path, C List result = new ArrayList<>( resources.size() ); for (Resource r : resources) { try { - T view = cls.newInstance(); + T view = cls.getDeclaredConstructor().newInstance(); view.setRoot( r ); result.add( view ); } catch (Exception e) { diff --git a/src/main/java/com/epimorphics/appbase/data/ResourceViewFactory.java b/src/main/java/com/epimorphics/appbase/data/ResourceViewFactory.java index 16a8398..b5e8e90 100644 --- a/src/main/java/com/epimorphics/appbase/data/ResourceViewFactory.java +++ b/src/main/java/com/epimorphics/appbase/data/ResourceViewFactory.java @@ -40,7 +40,7 @@ public static ResourceView getView(SparqlSource source, String uri) { */ public static T getView(SparqlSource source, String uri, Class cls) { try { - T view = cls.newInstance(); + T view = cls.getDeclaredConstructor().newInstance(); view.init(source, uri); return view; } catch (Exception e) { @@ -67,7 +67,7 @@ public static List getViews(SparqlSource source, ResultSet rs = exec.execSelect(); String var = rs.getResultVars().get(0); while (rs.hasNext()) { - T result = cls.newInstance(); + T result = cls.getDeclaredConstructor().newInstance(); result.setRoot( rs.next().getResource(var) ); result.setSource(source); results.add( result ); diff --git a/src/main/java/com/epimorphics/appbase/data/SparqlSource.java b/src/main/java/com/epimorphics/appbase/data/SparqlSource.java index 6dcd40c..d61a955 100644 --- a/src/main/java/com/epimorphics/appbase/data/SparqlSource.java +++ b/src/main/java/com/epimorphics/appbase/data/SparqlSource.java @@ -12,7 +12,6 @@ import java.util.List; import org.apache.jena.graph.Graph; -import org.apache.jena.query.DatasetAccessor; import org.apache.jena.query.ResultSet; import org.apache.jena.shared.PrefixMapping; import org.apache.jena.update.UpdateRequest; @@ -100,4 +99,4 @@ public interface SparqlSource { * Typically default or app wide mappings */ public PrefixMapping getPrefixes(); -} +} \ No newline at end of file diff --git a/src/main/java/com/epimorphics/appbase/data/WNode.java b/src/main/java/com/epimorphics/appbase/data/WNode.java index a6f9978..0e8a56b 100644 --- a/src/main/java/com/epimorphics/appbase/data/WNode.java +++ b/src/main/java/com/epimorphics/appbase/data/WNode.java @@ -15,6 +15,7 @@ import com.epimorphics.rdfutil.RDFUtil; import com.epimorphics.util.EpiException; import com.epimorphics.vocabs.SKOS; +import org.apache.jena.graph.GraphMemFactory; import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; import org.apache.jena.graph.Triple; @@ -209,7 +210,7 @@ protected NodeDescription getDescription() { source.ensureDescribed(this); } if (description == null) { - description = new NodeDescription(node, new CollectionGraph()); + description = new NodeDescription(node, GraphMemFactory.createGraphMemForModel()); } } return description; diff --git a/src/main/java/com/epimorphics/appbase/data/WSource.java b/src/main/java/com/epimorphics/appbase/data/WSource.java index e5e64b7..6b70f8a 100644 --- a/src/main/java/com/epimorphics/appbase/data/WSource.java +++ b/src/main/java/com/epimorphics/appbase/data/WSource.java @@ -22,10 +22,7 @@ import com.epimorphics.rdfutil.QueryUtil; import com.epimorphics.util.EpiException; import com.epimorphics.util.PrefixUtils; -import org.apache.jena.graph.Graph; -import org.apache.jena.graph.Node; -import org.apache.jena.graph.NodeFactory; -import org.apache.jena.graph.Triple; +import org.apache.jena.graph.*; import org.apache.jena.mem.GraphMem; import org.apache.jena.query.ParameterizedSparqlString; import org.apache.jena.query.QuerySolutionMap; @@ -194,6 +191,7 @@ protected NodeDescription describe(Node node) { /** * @deprecated */ + @Deprecated protected void ensureLabeled(WNode... nodes) { final String labelQuery = " OPTIONAL {?uri skos:prefLabel ?skos_prefLabel}\n" + " OPTIONAL {?uri skos:altLabel ?skos_altLabel}\n" @@ -354,7 +352,7 @@ public DatasetGraph constructViews(String queryBody, String... uris) { Node n = binding.get(var); Graph view = views.getGraph(n); if (view == null) { - view = new GraphMem(); + view = GraphMemFactory.createGraphMemForModel(); views.addGraph(n, view); } for (Iterator i = binding.vars(); i.hasNext();) { @@ -364,7 +362,7 @@ public DatasetGraph constructViews(String queryBody, String... uris) { if (vname.contains("_")) { String puri = getApp().getPrefixes().expandPrefix( vname.replace("_", ":") ); Node prop = NodeFactory.createURI(puri); - view.add( new Triple(n, prop, binding.get(v)) ); + view.add(Triple.create(n, prop, binding.get(v)) ); } } } @@ -373,10 +371,10 @@ public DatasetGraph constructViews(String queryBody, String... uris) { } protected String makeViewQuery(String queryBody, String... uris) { - StringBuffer query = new StringBuffer(); + StringBuilder query = new StringBuilder(); query.append("SELECT * WHERE { VALUES ?uri {\n"); for (String uri : uris) { - query.append("<" + uri + "> "); + query.append("<").append(uri).append("> "); } query.append(" }\n"); query.append(queryBody); @@ -412,11 +410,7 @@ public Map> getView(String queryString, Strin while (rs.hasNext()) { Binding binding = rs.nextBinding(); WNode node = get( binding.get(var) ); - OneToManyMap propValues = results.get( node ); - if (propValues == null) { - propValues = new OneToManyMap<>(); - results.put(node, propValues); - } + OneToManyMap propValues = results.computeIfAbsent(node, k -> new OneToManyMap<>()); for (Iterator i = binding.vars(); i.hasNext();) { Var v = i.next(); if (! var.equals(v)) { diff --git a/src/main/java/com/epimorphics/appbase/data/impl/BaseSparqlSource.java b/src/main/java/com/epimorphics/appbase/data/impl/BaseSparqlSource.java index d6b32ba..d21079b 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/BaseSparqlSource.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/BaseSparqlSource.java @@ -17,6 +17,7 @@ import com.epimorphics.appbase.data.SparqlSource; import com.epimorphics.appbase.util.SQueryUtil; import org.apache.jena.graph.Graph; +import org.apache.jena.graph.GraphMemFactory; import org.apache.jena.graph.Triple; import org.apache.jena.mem.GraphMem; import org.apache.jena.query.QueryExecution; @@ -75,7 +76,7 @@ public Graph describeAll(String... uris) { public Graph describe(String query) { QueryExecution qexec = start(query); try { - Graph graph = new GraphMem(); + Graph graph = GraphMemFactory.createGraphMemForModel(); for (Iterator i = qexec.execDescribeTriples(); i.hasNext();) { graph.add(i.next()); } @@ -100,7 +101,7 @@ public Graph[] describeEach(String... uris) { public Graph construct(String queryString) { QueryExecution qexec = start(queryString); try { - Graph graph = new GraphMem(); + Graph graph = GraphMemFactory.createGraphMemForModel(); for (Iterator i = qexec.execConstructTriples(); i.hasNext();) { graph.add(i.next()); } diff --git a/src/main/java/com/epimorphics/appbase/data/impl/DatasetSparqlSource.java b/src/main/java/com/epimorphics/appbase/data/impl/DatasetSparqlSource.java index 18cf23c..5974285 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/DatasetSparqlSource.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/DatasetSparqlSource.java @@ -9,12 +9,12 @@ package com.epimorphics.appbase.data.impl; +import com.epimorphics.appbase.data.DatasetAccessor; +import com.epimorphics.appbase.data.RDFConnectionDatasetAccessor; import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; import org.apache.jena.query.Dataset; -import org.apache.jena.query.DatasetAccessor; -import org.apache.jena.query.DatasetAccessorFactory; import org.apache.jena.query.DatasetFactory; import org.apache.jena.query.Query; import org.apache.jena.query.QueryExecution; @@ -24,15 +24,16 @@ import org.apache.jena.query.text.TextDatasetFactory; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; +import org.apache.jena.rdfconnection.RDFConnection; import org.apache.jena.sparql.core.DatasetGraph; import org.apache.jena.sparql.core.DatasetGraphFactory; +import org.apache.jena.sparql.exec.UpdateExec; import org.apache.jena.sparql.util.Closure; -import org.apache.jena.update.UpdateExecutionFactory; import org.apache.jena.update.UpdateRequest; import org.apache.jena.vocabulary.RDFS; import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.store.ByteBuffersDirectory; import org.apache.lucene.store.Directory; -import org.apache.lucene.store.RAMDirectory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,8 +47,6 @@ * @see FileSparqlSource */ public class DatasetSparqlSource extends BaseSparqlSource implements SparqlSource, Startup { - static Logger log = LoggerFactory.getLogger( FileSparqlSource.class ); - protected Dataset dataset = DatasetFactory.createGeneral(); protected DatasetGraph graphStore; protected DatasetAccessor accessor; @@ -67,7 +66,7 @@ public void setTextIndex(String indexSpec) { public void startup(App app) { super.startup(app); if (indexSpec != null) { - Directory dir = new RAMDirectory(); + Directory dir = new ByteBuffersDirectory(); // We have a choice of a single index of all predicates or separate indexes, could make this configurable // Currently default to a single joint index EntityDefinition entDef = new EntityDefinition("uri", "text", RDFS.label.asNode()) ; @@ -80,14 +79,6 @@ public void startup(App app) { } } } - // Alterantive would be -// for (String spec : indexSpec.split(",")) { -// String uri = getApp().getPrefixes().expandPrefix(spec.trim()); -// if ( ! uri.equals("default") ) { -// Node predicate = NodeFactory.createURI(uri); -// entDef.set(NameUtils.safeName(predicate.getURI()), predicate); -// } -// } dataset = TextDatasetFactory.createLucene(dataset, dir, entDef, new StandardAnalyzer()) ; } @@ -134,7 +125,7 @@ protected void finish(QueryExecution qexec) { @Override public void update(UpdateRequest update) { dataset.getLock().enterCriticalSection(true); - UpdateExecutionFactory.create(update, getGraphStore()).execute(); + UpdateExec.dataset(getGraphStore()).update(update).execute(); dataset.getLock().leaveCriticalSection(); } @@ -146,7 +137,7 @@ public boolean isUpdateable() { @Override public DatasetAccessor getAccessor() { if (accessor == null) { - accessor = DatasetAccessorFactory.create(dataset); + accessor = RDFConnectionDatasetAccessor.create(() -> RDFConnection.connect(dataset)); } return accessor; } diff --git a/src/main/java/com/epimorphics/appbase/data/impl/FileSparqlSource.java b/src/main/java/com/epimorphics/appbase/data/impl/FileSparqlSource.java index df8efc5..4d8dc13 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/FileSparqlSource.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/FileSparqlSource.java @@ -11,8 +11,10 @@ import java.io.File; import java.io.FilenameFilter; +import java.util.Objects; import java.util.regex.Pattern; +import org.apache.jena.riot.RDFDataMgr; import org.apache.jena.util.FileManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,8 +47,8 @@ public void startup(App app) { } private void load(File f) { - FileManager.get().readModel(dataset.getDefaultModel(), f.getPath()); - log.info("Loaded file: " + f); + RDFDataMgr.read(dataset.getDefaultModel(), f.getPath()); + log.info("Loaded file: {}", f); } /** @@ -58,7 +60,7 @@ public void reload() { for (String fname : fileSpec.split(",")) { File f = asFile(fname); if (f.isDirectory()) { - for (String file : f.list(new RDFFileNames())) { + for (String file : Objects.requireNonNull(f.list(new RDFFileNames()))) { load( new File(f, file) ); } } else { diff --git a/src/main/java/com/epimorphics/appbase/data/impl/LockingDatasetAccessor.java b/src/main/java/com/epimorphics/appbase/data/impl/LockingDatasetAccessor.java index 71940b2..f42195f 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/LockingDatasetAccessor.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/LockingDatasetAccessor.java @@ -9,11 +9,12 @@ package com.epimorphics.appbase.data.impl; +import com.epimorphics.appbase.data.DatasetAccessor; +import com.epimorphics.appbase.data.RDFConnectionDatasetAccessor; import org.apache.jena.query.Dataset; -import org.apache.jena.query.DatasetAccessor; -import org.apache.jena.query.DatasetAccessorFactory; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; +import org.apache.jena.rdfconnection.RDFConnection; /** * Provides transaction-safe version of DatasetAccessor for the given dataset. @@ -25,7 +26,7 @@ public class LockingDatasetAccessor implements DatasetAccessor { public LockingDatasetAccessor(Dataset dataset) { this.dataset = dataset; - this.wrapped = DatasetAccessorFactory.create(dataset); + this.wrapped = RDFConnectionDatasetAccessor.create(() -> RDFConnection.connect(dataset)); } @Override @@ -52,16 +53,6 @@ public Model getModel(String graphUri) { } } - @Override - public boolean containsModel(String graphURI) { - dataset.getLock().enterCriticalSection(true); - try { - return wrapped.containsModel(graphURI); - } finally { - dataset.getLock().leaveCriticalSection(); - } - } - @Override public void putModel(Model data) { dataset.getLock().enterCriticalSection(false); diff --git a/src/main/java/com/epimorphics/appbase/data/impl/LoggingSparqlSource.java b/src/main/java/com/epimorphics/appbase/data/impl/LoggingSparqlSource.java index 875547e..b48ebae 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/LoggingSparqlSource.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/LoggingSparqlSource.java @@ -19,9 +19,9 @@ import java.util.Date; import java.util.List; +import com.epimorphics.appbase.data.DatasetAccessor; import org.apache.jena.atlas.io.IndentedWriter; import org.apache.jena.graph.Graph; -import org.apache.jena.query.DatasetAccessor; import org.apache.jena.query.ResultSet; import org.apache.jena.rdf.model.Model; import org.apache.jena.shared.PrefixMapping; @@ -174,11 +174,6 @@ public Model getModel(String graphUri) { return source.getAccessor().getModel(graphUri); } - @Override - public boolean containsModel(String graphURI) { - return source.getAccessor().containsModel(graphURI); - } - @Override public void putModel(Model data) { source.getAccessor().putModel(data); diff --git a/src/main/java/com/epimorphics/appbase/data/impl/ModelSparqlSource.java b/src/main/java/com/epimorphics/appbase/data/impl/ModelSparqlSource.java index 3007f24..d3c0158 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/ModelSparqlSource.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/ModelSparqlSource.java @@ -9,13 +9,13 @@ package com.epimorphics.appbase.data.impl; -import org.apache.jena.query.DatasetAccessor; +import com.epimorphics.appbase.data.DatasetAccessor; import org.apache.jena.query.QueryExecution; import org.apache.jena.query.QueryExecutionFactory; import org.apache.jena.rdf.model.Model; import org.apache.jena.sparql.core.DatasetGraph; import org.apache.jena.sparql.core.DatasetGraphFactory; -import org.apache.jena.update.UpdateExecutionFactory; +import org.apache.jena.sparql.exec.UpdateExec; import org.apache.jena.update.UpdateRequest; import com.epimorphics.appbase.data.SparqlSource; @@ -69,7 +69,7 @@ public DatasetAccessor getAccessor() { @Override public void update(UpdateRequest update) { model.enterCriticalSection(true); - UpdateExecutionFactory.create(update, getGraphStore()).execute(); + UpdateExec.dataset(getGraphStore()).update(update).execute(); model.leaveCriticalSection(); } diff --git a/src/main/java/com/epimorphics/appbase/data/impl/RemoteSparqlSource.java b/src/main/java/com/epimorphics/appbase/data/impl/RemoteSparqlSource.java index 45c0794..e01a8c3 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/RemoteSparqlSource.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/RemoteSparqlSource.java @@ -9,19 +9,23 @@ package com.epimorphics.appbase.data.impl; +import java.net.http.HttpClient; +import java.time.Duration; import java.util.HashMap; import java.util.Map; +import com.epimorphics.appbase.data.DatasetAccessor; +import com.epimorphics.appbase.data.RDFConnectionDatasetAccessor; +import org.apache.jena.rdfconnection.RDFConnectionRemote; import org.apache.jena.riot.WebContent; +import org.apache.jena.sparql.exec.http.QueryExecutionHTTP; +import org.apache.jena.sparql.exec.http.QueryExecutionHTTPBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.epimorphics.appbase.data.SparqlSource; -import org.apache.jena.query.DatasetAccessor; -import org.apache.jena.query.DatasetAccessorFactory; import org.apache.jena.query.QueryExecution; import org.apache.jena.query.QueryExecutionFactory; -import org.apache.jena.sparql.engine.http.QueryEngineHTTP; import org.apache.jena.update.UpdateExecutionFactory; import org.apache.jena.update.UpdateRequest; @@ -96,21 +100,25 @@ public void setRemoteTimeout(long remoteTimeout) { public void setContentType(String type) { contentType = typeMap.get(type); if (contentType == null){ - log.error("Illegal contentType for remote source (" + type + ")"); + log.error("Illegal contentType for remote source ({})", type); } } @Override protected QueryExecution start(String queryString) { - QueryEngineHTTP hs = (QueryEngineHTTP) QueryExecutionFactory.sparqlService(endpoint, queryString); + QueryExecutionHTTPBuilder hs = QueryExecutionHTTP.service(endpoint).query(queryString); if (contentType != null) { - hs.setSelectContentType(contentType); + hs.acceptHeader(contentType); } - hs.setTimeout(readTimeout, connectTimeout); + HttpClient.Builder clientBldr = HttpClient.newBuilder(); + clientBldr.connectTimeout(Duration.ofMillis(connectTimeout)); + HttpClient client = clientBldr.build(); + hs.httpClient(client); + if (remoteTimeout != null) { - hs.addParam("timeout", Long.toString(remoteTimeout)); + hs.timeout(remoteTimeout); } - return hs; + return hs.build(); } @Override @@ -131,7 +139,7 @@ public boolean isUpdateable() { @Override public DatasetAccessor getAccessor() { if (accessor == null) { - accessor = DatasetAccessorFactory.createHTTP(graphEndpoint); + accessor = RDFConnectionDatasetAccessor.create(() -> RDFConnectionRemote.newBuilder().gspEndpoint(graphEndpoint).build()); } return accessor; } diff --git a/src/main/java/com/epimorphics/appbase/data/impl/SSResultSet.java b/src/main/java/com/epimorphics/appbase/data/impl/SSResultSet.java index eb404b3..60e84de 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/SSResultSet.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/SSResultSet.java @@ -10,11 +10,13 @@ package com.epimorphics.appbase.data.impl; import java.util.List; +import java.util.function.Consumer; import com.epimorphics.appbase.data.ClosableResultSet; import org.apache.jena.query.QueryExecution; import org.apache.jena.query.QuerySolution; import org.apache.jena.query.ResultSet; +import org.apache.jena.query.ResultSetRewindable; import org.apache.jena.rdf.model.Model; import org.apache.jena.sparql.engine.binding.Binding; @@ -55,6 +57,13 @@ public QuerySolution next() { return results.next(); } + @Override + public void forEachRemaining(Consumer consumer) { + while(hasNext()) { + consumer.accept(results.next()); + } + } + @Override public QuerySolution nextSolution() { return results.nextSolution(); @@ -80,6 +89,16 @@ public Model getResourceModel() { return results.getResourceModel(); } + @Override + public ResultSetRewindable rewindable() { + return ClosableResultSet.super.rewindable(); + } + + @Override + public ResultSet materialise() { + return ClosableResultSet.super.materialise(); + } + @Override public void remove() { results.remove(); diff --git a/src/main/java/com/epimorphics/appbase/data/impl/TDBSparqlSource.java b/src/main/java/com/epimorphics/appbase/data/impl/TDBSparqlSource.java index 098df14..f775eaa 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/TDBSparqlSource.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/TDBSparqlSource.java @@ -16,11 +16,11 @@ import java.io.OutputStream; import java.util.zip.GZIPOutputStream; +import com.epimorphics.appbase.data.DatasetAccessor; import org.apache.jena.atlas.json.JsonObject; import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; import org.apache.jena.query.Dataset; -import org.apache.jena.query.DatasetAccessor; import org.apache.jena.query.Query; import org.apache.jena.query.QueryExecution; import org.apache.jena.query.QueryExecutionFactory; @@ -32,9 +32,7 @@ import org.apache.jena.riot.RDFDataMgr; import org.apache.jena.sparql.core.DatasetGraph; import org.apache.jena.sparql.core.DatasetGraphFactory; -import org.apache.jena.tdb.TDB; -import org.apache.jena.tdb.TDBFactory; -import org.apache.jena.update.UpdateExecutionFactory; +import org.apache.jena.sparql.exec.UpdateExec; import org.apache.jena.update.UpdateRequest; import org.apache.jena.vocabulary.RDFS; import org.apache.lucene.analysis.standard.StandardAnalyzer; @@ -106,10 +104,10 @@ public void setUnionDefault(boolean flag) { isUnionDefault = flag; } - @Override + @Override @SuppressWarnings({"removal"}) public void startup(App app) { super.startup(app); - dataset = TDBFactory.createDataset( tdbDir.getPath() ); + dataset = org.apache.jena.tdb1.TDB1Factory.createDataset( tdbDir.getPath() ); if (textIndex != null) { try { Directory dir = FSDirectory.open(textIndex.toPath()); @@ -132,12 +130,12 @@ public void startup(App app) { } } - @Override + @Override @SuppressWarnings({"removal"}) protected QueryExecution start(String queryString) { Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, dataset) ; if (isUnionDefault) { - qexec.getContext().set(TDB.symUnionDefaultGraph, true) ; + qexec.getContext().set(org.apache.jena.tdb1.TDB1.symUnionDefaultGraph, true) ; } dataset.begin(ReadWrite.READ); return qexec; @@ -152,7 +150,7 @@ protected void finish(QueryExecution qexec) { @Override public void update(UpdateRequest update) { dataset.begin(ReadWrite.WRITE); - UpdateExecutionFactory.create(update, getGraphStore()).execute(); + UpdateExec.dataset(getGraphStore()).update(update).execute(); dataset.commit(); } diff --git a/src/main/java/com/epimorphics/appbase/data/impl/TransactionalDatasetAccessor.java b/src/main/java/com/epimorphics/appbase/data/impl/TransactionalDatasetAccessor.java index 10e854d..7f194f5 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/TransactionalDatasetAccessor.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/TransactionalDatasetAccessor.java @@ -9,12 +9,13 @@ package com.epimorphics.appbase.data.impl; +import com.epimorphics.appbase.data.DatasetAccessor; +import com.epimorphics.appbase.data.RDFConnectionDatasetAccessor; import org.apache.jena.query.Dataset; -import org.apache.jena.query.DatasetAccessor; -import org.apache.jena.query.DatasetAccessorFactory; import org.apache.jena.query.ReadWrite; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; +import org.apache.jena.rdfconnection.RDFConnection; /** * Provides transaction-safe version of DatasetAccessor for the given dataset. @@ -27,7 +28,7 @@ public class TransactionalDatasetAccessor implements DatasetAccessor { public TransactionalDatasetAccessor(Dataset dataset) { this.dataset = dataset; - this.wrapped = DatasetAccessorFactory.create(dataset); + this.wrapped = RDFConnectionDatasetAccessor.create(() -> RDFConnection.connect(dataset)); } @Override @@ -54,16 +55,6 @@ public Model getModel(String graphUri) { } } - @Override - public boolean containsModel(String graphURI) { - dataset.begin(ReadWrite.READ); - try { - return wrapped.containsModel(graphURI); - } finally { - dataset.end(); - } - } - @Override public void putModel(Model data) { dataset.begin(ReadWrite.WRITE); diff --git a/src/main/java/com/epimorphics/appbase/data/impl/UnionDatasetSparqlSource.java b/src/main/java/com/epimorphics/appbase/data/impl/UnionDatasetSparqlSource.java index 3548ae8..61619fd 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/UnionDatasetSparqlSource.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/UnionDatasetSparqlSource.java @@ -9,8 +9,8 @@ package com.epimorphics.appbase.data.impl; +import com.epimorphics.appbase.data.DatasetAccessor; import org.apache.jena.graph.Graph; -import org.apache.jena.query.DatasetAccessor; import org.apache.jena.query.DatasetFactory; import org.apache.jena.sparql.core.DatasetGraph; import org.apache.jena.sparql.core.DatasetGraphMap; diff --git a/src/main/java/com/epimorphics/appbase/monitor/DatasetMonitor.java b/src/main/java/com/epimorphics/appbase/monitor/DatasetMonitor.java index e9aa5e7..a68707a 100644 --- a/src/main/java/com/epimorphics/appbase/monitor/DatasetMonitor.java +++ b/src/main/java/com/epimorphics/appbase/monitor/DatasetMonitor.java @@ -14,13 +14,13 @@ import java.util.Collections; import java.util.regex.Pattern; +import com.epimorphics.appbase.data.DatasetAccessor; import org.apache.jena.riot.RDFDataMgr; import com.epimorphics.appbase.core.App; import com.epimorphics.appbase.data.SparqlSource; import com.epimorphics.appbase.data.WSource; import com.epimorphics.util.EpiException; -import org.apache.jena.query.DatasetAccessor; import org.apache.jena.rdf.model.Model; /** @@ -103,7 +103,7 @@ protected void doAddEntry(MonitoredGraph entry) { if (wsource != null) wsource.resetCache(); addModelHook(entry.getName(), model); } catch (Throwable t) { - log.error("Failed add monitored graph: " + entry.getName(), t); + log.error("Failed add monitored graph: {}", entry.getName(), t); } } diff --git a/src/main/java/com/epimorphics/appbase/monitor/DirectoryMonitor.java b/src/main/java/com/epimorphics/appbase/monitor/DirectoryMonitor.java index 26dd14d..b1be3bc 100644 --- a/src/main/java/com/epimorphics/appbase/monitor/DirectoryMonitor.java +++ b/src/main/java/com/epimorphics/appbase/monitor/DirectoryMonitor.java @@ -30,6 +30,7 @@ * later modifications or removal. * @deprecated Issues with java8 and unused in production code */ +@Deprecated public abstract class DirectoryMonitor implements FileRecord.Process { public static final String DIRECTORY_PARAM = "dir"; public static final String WAIT_TIME_PARAM = "waitTime"; diff --git a/src/main/java/com/epimorphics/appbase/monitor/Scanner.java b/src/main/java/com/epimorphics/appbase/monitor/Scanner.java index 71c3d1f..222547b 100644 --- a/src/main/java/com/epimorphics/appbase/monitor/Scanner.java +++ b/src/main/java/com/epimorphics/appbase/monitor/Scanner.java @@ -106,25 +106,23 @@ public void initialize(Map checksums) * be reported as modified. * * @param reportImmediately report all files immediately without waiting for the checksum to be stable - * @return a list of changes on the files included in the directory + * @return a set of changes on the files included in the directory */ public Set scan(boolean reportImmediately) { log.debug("Scanning " + directory); Set removed = new HashSet(storedChecksums.keySet()); Set results = scanDir(directory, removed, reportImmediately); - for (Iterator it = removed.iterator(); it.hasNext();) - { - File file = (File) it.next(); + for (File file : removed) { // Make sure we'll handle a file that has been deleted - results.add( new FileRecord(file, FileState.DELETED) ); + results.add(new FileRecord(file, FileState.DELETED)); // Remove no longer used checksums lastChecksums.remove(file); storedChecksums.remove(file); } if (! results.isEmpty()) - log.debug(" ... found " + results.size() + " changes"); + log.debug(" ... found {} changes", results.size()); return results; } @@ -136,22 +134,20 @@ private Set scanDir(File dir, Set removed, boolean reportImmed return results; } - - for (int i = 0; i < list.length; i++) { - File file = list[i]; + + for (File file : list) { if (file.isDirectory()) { - results.addAll( scanDir(file, removed, reportImmediately) ); + results.addAll(scanDir(file, removed, reportImmediately)); } else { - long lastChecksum = lastChecksums.get(file) != null ? ((Long) lastChecksums.get(file)).longValue() : 0; - long storedChecksum = storedChecksums.get(file) != null ? ((Long) storedChecksums.get(file)).longValue() : 0; + long lastChecksum = lastChecksums.get(file) != null ? (Long) lastChecksums.get(file) : 0; + long storedChecksum = storedChecksums.get(file) != null ? (Long) storedChecksums.get(file) : 0; long newChecksum = checksum(file); - lastChecksums.put(file, new Long(newChecksum)); + lastChecksums.put(file, newChecksum); // Only handle file when it does not change anymore and it has changed since last reported - log.debug( String.format("Checksums: new(%d), last(%d), stored(%d)", newChecksum, lastChecksum, storedChecksum) ); - if ((newChecksum == lastChecksum || reportImmediately) && newChecksum != storedChecksum) - { - storedChecksums.put(file, new Long(newChecksum)); - results.add( new FileRecord(file, (storedChecksum == 0) ? FileState.NEW : FileState.MODIFIED) ); + log.debug("Checksums: new({}), last({}), stored({})", newChecksum, lastChecksum, storedChecksum); + if ((newChecksum == lastChecksum || reportImmediately) && newChecksum != storedChecksum) { + storedChecksums.put(file, newChecksum); + results.add(new FileRecord(file, (storedChecksum == 0) ? FileState.NEW : FileState.MODIFIED)); } removed.remove(file); } @@ -181,7 +177,7 @@ private static File canon(File file) public long getChecksum(File file) { Long c = storedChecksums.get(file); - return c != null ? c.longValue() : 0; + return c != null ? c : 0; } /** diff --git a/src/main/java/com/epimorphics/appbase/tasks/ActionManager.java b/src/main/java/com/epimorphics/appbase/tasks/ActionManager.java index 6405d5c..7c90187 100644 --- a/src/main/java/com/epimorphics/appbase/tasks/ActionManager.java +++ b/src/main/java/com/epimorphics/appbase/tasks/ActionManager.java @@ -225,7 +225,7 @@ protected void doRemoveEntry(Action entry) { public void setFactories(String factories) { for (String factoryName : factories.split(",")) { try { - ActionFactory.Factorylet factory = (ActionFactory.Factorylet) Class.forName(factoryName).newInstance(); + ActionFactory.Factorylet factory = (ActionFactory.Factorylet) Class.forName(factoryName).getDeclaredConstructor().newInstance(); ActionFactory.register(factory); } catch (Exception e) { throw new EpiException("Problem instantiating action factory", e); diff --git a/src/main/java/com/epimorphics/appbase/tasks/WebProgressMonitor.java b/src/main/java/com/epimorphics/appbase/tasks/WebProgressMonitor.java index 7e456c8..8c91af9 100644 --- a/src/main/java/com/epimorphics/appbase/tasks/WebProgressMonitor.java +++ b/src/main/java/com/epimorphics/appbase/tasks/WebProgressMonitor.java @@ -15,11 +15,10 @@ import java.util.List; import java.util.ListIterator; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.apache.jena.atlas.json.JSON; import org.apache.jena.atlas.json.JsonArray; import org.apache.jena.atlas.json.JsonObject; diff --git a/src/main/java/com/epimorphics/appbase/tasks/impl/JavaAction.java b/src/main/java/com/epimorphics/appbase/tasks/impl/JavaAction.java index 6ab2273..6e4d0f1 100644 --- a/src/main/java/com/epimorphics/appbase/tasks/impl/JavaAction.java +++ b/src/main/java/com/epimorphics/appbase/tasks/impl/JavaAction.java @@ -14,6 +14,8 @@ import com.epimorphics.appbase.tasks.Action; import com.epimorphics.tasks.ProgressMonitorReporter; +import java.lang.reflect.InvocationTargetException; + /** * Action that calls a java class with some additional configuration * parameters bound in. @@ -21,8 +23,8 @@ public class JavaAction extends BaseAction implements Action { protected Action baseAction; - public void setAction(String classname) throws InstantiationException, IllegalAccessException, ClassNotFoundException { - baseAction = (Action)Class.forName(classname).newInstance(); + public void setAction(String classname) throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException { + baseAction = (Action)Class.forName(classname).getDeclaredConstructor().newInstance(); mergeBaseConfiguration(baseAction); } diff --git a/src/main/java/com/epimorphics/appbase/templates/Lib.java b/src/main/java/com/epimorphics/appbase/templates/Lib.java index d4a2223..5bf346b 100644 --- a/src/main/java/com/epimorphics/appbase/templates/Lib.java +++ b/src/main/java/com/epimorphics/appbase/templates/Lib.java @@ -33,7 +33,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.text.StringEscapeUtils; import org.apache.jena.atlas.json.JsonValue; diff --git a/src/main/java/com/epimorphics/appbase/templates/VelocityRender.java b/src/main/java/com/epimorphics/appbase/templates/VelocityRender.java index 0629321..c1cf15c 100644 --- a/src/main/java/com/epimorphics/appbase/templates/VelocityRender.java +++ b/src/main/java/com/epimorphics/appbase/templates/VelocityRender.java @@ -30,14 +30,14 @@ import java.util.*; import java.util.Map.Entry; -import javax.servlet.FilterRegistration; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.StreamingOutput; +import jakarta.servlet.FilterRegistration; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.StreamingOutput; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; @@ -258,8 +258,8 @@ public void write(OutputStream output) throws IOException, } catch (VelocityException ve) { // If the client stops reading we get an io or socket exception but often caught in the depths of velocity String message = ve.getMessage(); - if (ve.getWrappedThrowable() != null) { - message = message + ": " + ve.getWrappedThrowable().getMessage(); + if (ve.getCause() != null) { + message = message + ": " + ve.getCause().getMessage(); } log.warn("Problem rendering velocity response: " + message); } diff --git a/src/main/java/com/epimorphics/appbase/webapi/BaseEndpoint.java b/src/main/java/com/epimorphics/appbase/webapi/BaseEndpoint.java index 84c1b96..a89b08d 100644 --- a/src/main/java/com/epimorphics/appbase/webapi/BaseEndpoint.java +++ b/src/main/java/com/epimorphics/appbase/webapi/BaseEndpoint.java @@ -25,13 +25,13 @@ import java.io.InputStream; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.util.FileUtils; diff --git a/src/main/java/com/epimorphics/appbase/webapi/CorsFilter.java b/src/main/java/com/epimorphics/appbase/webapi/CorsFilter.java index c41465e..af008e1 100644 --- a/src/main/java/com/epimorphics/appbase/webapi/CorsFilter.java +++ b/src/main/java/com/epimorphics/appbase/webapi/CorsFilter.java @@ -31,15 +31,9 @@ import java.util.List; import java.util.Set; -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 jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -141,7 +135,7 @@ public CorsFilter() { @Override public void doFilter(final ServletRequest servletRequest, - final ServletResponse servletResponse, final FilterChain filterChain) + final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException { if (!(servletRequest instanceof HttpServletRequest) || !(servletResponse instanceof HttpServletResponse)) { @@ -231,7 +225,7 @@ public void init(final FilterConfig filterConfig) throws ServletException { * Cross-Origin Request, Actual Request, and Redirects */ protected void handleSimpleCORS(final HttpServletRequest request, - final HttpServletResponse response, final FilterChain filterChain) + final HttpServletResponse response, final FilterChain filterChain) throws IOException, ServletException { CorsFilter.CORSRequestType requestType = checkRequestType(request); diff --git a/src/main/java/com/epimorphics/appbase/webapi/ExtensionFilter.java b/src/main/java/com/epimorphics/appbase/webapi/ExtensionFilter.java index 0f2e1b6..982e154 100644 --- a/src/main/java/com/epimorphics/appbase/webapi/ExtensionFilter.java +++ b/src/main/java/com/epimorphics/appbase/webapi/ExtensionFilter.java @@ -8,21 +8,16 @@ *****************************************************************/ package com.epimorphics.appbase.webapi; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletResponse; + import java.io.IOException; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Vector; - -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.HttpServletRequestWrapper; -import javax.servlet.http.HttpServletResponse; /** * Modifies Accept headers and allows URL extensions to improve JAX-RS content negotiation diff --git a/src/main/java/com/epimorphics/appbase/webapi/VelocityFilter.java b/src/main/java/com/epimorphics/appbase/webapi/VelocityFilter.java index c01ab23..26b1703 100644 --- a/src/main/java/com/epimorphics/appbase/webapi/VelocityFilter.java +++ b/src/main/java/com/epimorphics/appbase/webapi/VelocityFilter.java @@ -25,14 +25,14 @@ import java.util.ArrayList; import java.util.List; -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 jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/epimorphics/appbase/webapi/WebApiException.java b/src/main/java/com/epimorphics/appbase/webapi/WebApiException.java index 39dd4f8..9e8d0be 100644 --- a/src/main/java/com/epimorphics/appbase/webapi/WebApiException.java +++ b/src/main/java/com/epimorphics/appbase/webapi/WebApiException.java @@ -21,8 +21,8 @@ package com.epimorphics.appbase.webapi; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; /** * Signal an application error response with a specifiable HTTP status code diff --git a/src/main/java/com/epimorphics/appbase/webapi/testing/TomcatTestBase.java b/src/main/java/com/epimorphics/appbase/webapi/testing/TomcatTestBase.java index fb9915e..0ff386f 100644 --- a/src/main/java/com/epimorphics/appbase/webapi/testing/TomcatTestBase.java +++ b/src/main/java/com/epimorphics/appbase/webapi/testing/TomcatTestBase.java @@ -22,19 +22,19 @@ package com.epimorphics.appbase.webapi.testing; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.File; import java.io.InputStream; import java.io.StringWriter; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Form; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.client.WebTarget; +import jakarta.ws.rs.core.Form; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.apache.catalina.Context; import org.apache.catalina.startup.Tomcat; import org.apache.jena.atlas.json.JSON; @@ -43,7 +43,7 @@ import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.Property; import org.apache.jena.rdf.model.Resource; -import org.apache.jena.util.FileManager; +import org.apache.jena.riot.RDFDataMgr; import org.glassfish.jersey.client.ClientConfig; import org.junit.After; import org.junit.Before; @@ -217,7 +217,7 @@ protected JsonObject getJSONResponse(String uri) { protected Model checkModelResponse(String fetch, String rooturi, String file, Property...omit) { Model m = getModelResponse(fetch); Resource actual = m.getResource(rooturi); - Resource expected = FileManager.get().loadModel(file).getResource(rooturi); + Resource expected = RDFDataMgr.loadModel(file).getResource(rooturi); assertTrue(expected.listProperties().hasNext()); // guard against wrong rooturi in config TestUtil.testResourcesMatch(expected, actual, omit); return m; @@ -225,14 +225,14 @@ protected Model checkModelResponse(String fetch, String rooturi, String file, Pr protected Model checkModelResponse(Model m, String rooturi, String file, Property...omit) { Resource actual = m.getResource(rooturi); - Resource expected = FileManager.get().loadModel(file).getResource(rooturi); + Resource expected = RDFDataMgr.loadModel(file).getResource(rooturi); assertTrue(expected.listProperties().hasNext()); // guard against wrong rooturi in config TestUtil.testResourcesMatch(expected, actual, omit); return m; } protected Model checkModelResponse(Model m, String file, Property...omit) { - Model expected = FileManager.get().loadModel(file); + Model expected = RDFDataMgr.loadModel(file); for (Resource root : expected.listSubjects().toList()) { if (root.isURIResource()) { TestUtil.testResourcesMatch(root, m.getResource(root.getURI()), omit); @@ -259,10 +259,10 @@ protected void checkLive(int targetStatus) { try { Thread.sleep(500); } catch (InterruptedException e) { - assertTrue("Interrupted", false); + fail("Interrupted"); } if (count++ > 120 ) { - assertTrue("Too many tries", false); + fail("Too many tries"); } } else { tomcatLive = true; diff --git a/src/main/java/com/epimorphics/server/webapi/marshalling/GenericJSONMarshaller.java b/src/main/java/com/epimorphics/server/webapi/marshalling/GenericJSONMarshaller.java index 89dc49c..48e6de5 100644 --- a/src/main/java/com/epimorphics/server/webapi/marshalling/GenericJSONMarshaller.java +++ b/src/main/java/com/epimorphics/server/webapi/marshalling/GenericJSONMarshaller.java @@ -25,15 +25,14 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; - import com.epimorphics.json.JSFullWriter; import com.epimorphics.json.JSONWritable; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; /** * Support serialization to JSON for JSONRepresentations. diff --git a/src/main/java/com/epimorphics/server/webapi/marshalling/GenericJSONReader.java b/src/main/java/com/epimorphics/server/webapi/marshalling/GenericJSONReader.java index 4f177b5..ebfb4ab 100644 --- a/src/main/java/com/epimorphics/server/webapi/marshalling/GenericJSONReader.java +++ b/src/main/java/com/epimorphics/server/webapi/marshalling/GenericJSONReader.java @@ -14,14 +14,13 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.ws.rs.Consumes; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Provider; - +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.Provider; import org.apache.jena.atlas.json.JSON; import org.apache.jena.atlas.json.JsonObject; @@ -29,7 +28,7 @@ @Provider @Consumes("application/json") -public class GenericJSONReader implements MessageBodyReader{ +public class GenericJSONReader implements MessageBodyReader { @Override public boolean isReadable(Class type, Type genericType, @@ -39,14 +38,14 @@ public boolean isReadable(Class type, Type genericType, @Override public JsonObject readFrom(Class type, Type genericType, - Annotation[] annotations, MediaType mediaType, - MultivaluedMap httpHeaders, InputStream entityStream) + Annotation[] annotations, MediaType mediaType, + MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { try { return JSON.parse(entityStream); } catch (Exception e) { - throw new WebApiException(Status.BAD_REQUEST, e.getMessage()); + throw new WebApiException(Response.Status.BAD_REQUEST, e.getMessage()); } } diff --git a/src/test/java/com/epimorphics/appbase/data/TestLoggingSource.java b/src/test/java/com/epimorphics/appbase/data/TestLoggingSource.java index 9adde50..858e161 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestLoggingSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestLoggingSource.java @@ -15,11 +15,9 @@ import java.nio.file.Path; import java.util.Arrays; -import org.apache.jena.query.DatasetAccessor; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.update.UpdateFactory; -import org.apache.jena.util.FileManager; import org.apache.jena.vocabulary.RDFS; import org.junit.Before; import org.junit.Test; @@ -77,8 +75,14 @@ public static void compareDirectories(File expectedDir, File actualDir) { Arrays.sort(actualFiles); assertEquals(expectedFiles.length, actualFiles.length); for (int i = 0; i < expectedFiles.length; i++) { - String expected = FileManager.get().readWholeFileAsUTF8( new File(expectedDir, expectedFiles[i]).getPath() ); - String actual = FileManager.get().readWholeFileAsUTF8( new File(actualDir, actualFiles[i]).getPath() ); + String expected; + String actual; + try { + expected = Files.readString(new File(expectedDir, expectedFiles[i]).toPath()); + actual = Files.readString(new File(actualDir, actualFiles[i]).toPath()); + } catch (IOException e) { + throw new RuntimeException(e); + } assertEquals(expected, actual); } } diff --git a/src/test/java/com/epimorphics/appbase/data/TestQuadSource.java b/src/test/java/com/epimorphics/appbase/data/TestQuadSource.java index 356c30a..3c77aac 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestQuadSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestQuadSource.java @@ -15,7 +15,6 @@ import java.util.ArrayList; import java.util.List; -import org.apache.jena.query.DatasetAccessor; import org.apache.jena.query.ResultSet; import org.junit.Before; import org.junit.Test; @@ -46,9 +45,9 @@ public void testQuadSource() { TestUtil.testArray(checkGraphs(source), new String[]{"graph1", "graph2"}); // Check graphs DatasetAccessor accessor = source.getAccessor(); - assertTrue( accessor.containsModel(TEST + "graph1") ); - assertTrue( accessor.containsModel(TEST + "graph2") ); - assertFalse( accessor.containsModel(TEST + "graph3") ); + assertFalse(accessor.getModel(TEST + "graph1").isEmpty()); + assertFalse(accessor.getModel(TEST + "graph2").isEmpty()); + assertTrue(accessor.getModel(TEST + "graph3").isEmpty()); } public static List checkGraphs(SparqlSource source) { diff --git a/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java b/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java index a36464a..fc93f5c 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java @@ -15,7 +15,6 @@ import com.epimorphics.appbase.core.App; import com.epimorphics.appbase.data.impl.RemoteSparqlSource; -import org.apache.jena.query.DatasetAccessor; import org.apache.jena.query.QuerySolution; import org.apache.jena.query.ResultSet; import org.apache.jena.rdf.model.Model; diff --git a/src/test/java/com/epimorphics/appbase/data/TestSource.java b/src/test/java/com/epimorphics/appbase/data/TestSource.java index bd70b94..c157593 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestSource.java @@ -192,7 +192,7 @@ private void checkLabel(DatasetGraph dsg, String iN, String label) { Node i1 = NodeFactory.createURI(TEST_NS + iN); Graph g1 = dsg.getGraph(i1); assertNotNull(g1); - assertTrue(g1.contains(i1, RDFS.label.asNode(), NodeFactory.createLiteral(label))); + assertTrue(g1.contains(i1, RDFS.label.asNode(), NodeFactory.createLiteralString(label))); } private void checkConnections(List ans, String[] expected) { diff --git a/src/test/java/com/epimorphics/appbase/data/TestUnionSource.java b/src/test/java/com/epimorphics/appbase/data/TestUnionSource.java index 1feec2f..7d6be2d 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestUnionSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestUnionSource.java @@ -18,7 +18,6 @@ import com.epimorphics.appbase.core.App; import com.epimorphics.appbase.data.impl.UnionDatasetSparqlSource; import com.epimorphics.util.TestUtil; -import org.apache.jena.query.DatasetAccessor; import org.apache.jena.query.ResultSet; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; diff --git a/src/test/java/com/epimorphics/appbase/monitor/TestFileMonitor.java b/src/test/java/com/epimorphics/appbase/monitor/TestFileMonitor.java index 3c81056..88dda7a 100644 --- a/src/test/java/com/epimorphics/appbase/monitor/TestFileMonitor.java +++ b/src/test/java/com/epimorphics/appbase/monitor/TestFileMonitor.java @@ -50,7 +50,7 @@ public void tearDown() { } @Test - public void testMonitor() throws IOException, InterruptedException { + public void testMonitor() throws InterruptedException { DirectoryMonitor monitor = new TestMonitor(); monitor.addWatch(testDir.getPath(), JsonUtil.makeJson(DirectoryMonitor.WAIT_TIME_PARAM, 100, "test", "foobar")); File testFile = new File(testDir, "test1"); diff --git a/src/test/java/com/epimorphics/appbase/monitor/TestMonitor.java b/src/test/java/com/epimorphics/appbase/monitor/TestMonitor.java index cb2c03a..eaf5bc5 100644 --- a/src/test/java/com/epimorphics/appbase/monitor/TestMonitor.java +++ b/src/test/java/com/epimorphics/appbase/monitor/TestMonitor.java @@ -190,7 +190,12 @@ protected void waitFor(String file, boolean present) throws InterruptedException public static class TMonitor extends ConfigMonitor { @Override protected Collection configure(File file) { - String content = FileManager.get().readWholeFileAsUTF8(file.getPath()); + String content; + try { + content = Files.readString(file.toPath()); + } catch (IOException e) { + throw new RuntimeException(e); + } TestInstance i = new TestInstance( content ); i.setName( file.getName() ); List results = new ArrayList<>(); diff --git a/src/test/java/com/epimorphics/appbase/webapi/TestBasicRender.java b/src/test/java/com/epimorphics/appbase/webapi/TestBasicRender.java index 22f0d4f..d5f5f95 100644 --- a/src/test/java/com/epimorphics/appbase/webapi/TestBasicRender.java +++ b/src/test/java/com/epimorphics/appbase/webapi/TestBasicRender.java @@ -16,8 +16,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.ws.rs.core.Response; - +import jakarta.ws.rs.core.Response; import org.junit.Test; import com.epimorphics.appbase.webapi.testing.TomcatTestBase; diff --git a/src/test/java/com/epimorphics/appbase/webapi/TestConfig.java b/src/test/java/com/epimorphics/appbase/webapi/TestConfig.java index 166006d..7891e75 100644 --- a/src/test/java/com/epimorphics/appbase/webapi/TestConfig.java +++ b/src/test/java/com/epimorphics/appbase/webapi/TestConfig.java @@ -9,9 +9,6 @@ package com.epimorphics.appbase.webapi; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - import java.util.List; import org.junit.Test; @@ -21,6 +18,8 @@ import com.epimorphics.appbase.core.GenericConfig; import com.epimorphics.appbase.webapi.testing.TomcatTestBase; +import static org.junit.Assert.*; + public class TestConfig extends TomcatTestBase { @@ -33,17 +32,17 @@ public String getWebappRoot() { public void testConfig() { App app = AppConfig.getApp(); assertEquals("This is a string", app.getParam("stringParam")); - assertEquals(new Long(42), app.getParam("intParam")); + assertEquals(42L, app.getParam("intParam")); TrialBean component1 = app.getComponentAs("component1", TrialBean.class); assertEquals("name 1", component1.getProp1()); assertEquals(1, component1.getProplong()); - assertEquals(true, component1.isProp()); + assertTrue(component1.isProp()); TrialBean component2 = app.getComponentAs("component2", TrialBean.class); assertEquals("name 2", component2.getProp1()); assertEquals(component1, component2.getRef()); - assertEquals(false, component2.isProp()); + assertFalse(component2.isProp()); TrialBean component3 = app.getComponentAs("component3", TrialBean.class); List xref = component3.getXref(); From 5232a163cf5549d3aa07c9cc6a7a4c46387bcac8 Mon Sep 17 00:00:00 2001 From: Simon Oakes Date: Mon, 3 Nov 2025 10:46:15 +0000 Subject: [PATCH 02/10] v4 change notes --- v4_0_0.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 v4_0_0.md diff --git a/v4_0_0.md b/v4_0_0.md new file mode 100644 index 0000000..7d29ebf --- /dev/null +++ b/v4_0_0.md @@ -0,0 +1,16 @@ +Appbase Version 4.0.0 + +* Appbase is compiled by JDK 21 and is compatible only with Java versions 21 and above. +* This version upgrades the following dependencies with major impact. + This may cause backwards compatibility issues for applications using Appbase: + * Tomcat 9.0 -> 11.0 + * Jena 3.9 -> 5.5 + * Lib 3.1 -> 4.0 + * Jersey 2.25 -> 3.1 +* Replaced all usages of javax servlet infrastructure with jakarta. +* Maven artifacts for Appbase version 4.0.0 and onwards are published to the Epimorphics public S3 Maven repository. +* The `DatasetAccessor` interface from Jena 3 is replaced by `com.epimorphics.appbase.data.DatasetAccessor`: + * It is directly implemented by RDFConnectionDatasetAccessor and indirectly by various wrapper classes which are unchanged from the previous version. + * It has removed the `containsModel` method since no Jena 5 equivalent exists. + Instead, use `getModel` to obtain the model, then `isEmpty` on the model. + From e1fd5128ae637c2f0a3a92135608652c17850f26 Mon Sep 17 00:00:00 2001 From: Simon Oakes Date: Mon, 10 Nov 2025 15:19:00 +0000 Subject: [PATCH 03/10] Upgrade JUnit 4 to Jupiter --- pom.xml | 24 +++++++++++++------ .../appbase/core/ComponentBase.java | 2 +- .../webapi/testing/TomcatTestBase.java | 12 +++++----- .../appbase/core/TestDynamicLoad.java | 14 +++++------ .../appbase/data/BaseSourceTest.java | 4 ++-- .../appbase/data/TestLoggingSource.java | 8 +++---- .../appbase/data/TestQuadSource.java | 10 ++++---- .../appbase/data/TestRemoteSource.java | 8 +++---- .../epimorphics/appbase/data/TestSearch.java | 8 +++---- .../epimorphics/appbase/data/TestSource.java | 10 ++++---- .../appbase/data/TestUnionSource.java | 6 ++--- .../appbase/monitor/TestDatasetMonitor.java | 14 +++++------ .../appbase/monitor/TestFileMonitor.java | 18 +++++++------- .../appbase/monitor/TestMonitor.java | 18 +++++++------- .../appbase/task/TestActionManager.java | 8 +++---- .../appbase/task/TestJsonActions.java | 20 ++++++++-------- .../appbase/task/TestRunShell.java | 6 ++--- .../appbase/task/TestStatusReports.java | 4 ++-- .../appbase/webapi/TestBasicRender.java | 4 ++-- .../appbase/webapi/TestConfig.java | 4 ++-- .../epimorphics/appbase/webapi/TestLib.java | 4 ++-- 21 files changed, 107 insertions(+), 99 deletions(-) diff --git a/pom.xml b/pom.xml index 9c7ed49..7a21e1f 100644 --- a/pom.xml +++ b/pom.xml @@ -71,12 +71,12 @@ - - junit - junit - 4.13.1 - provided - + + org.junit.jupiter + junit-jupiter-api + 5.12.2 + provided + com.epimorphics lib @@ -121,7 +121,7 @@ org.yaml snakeyaml - 2.0 + 2.3 @@ -203,6 +203,16 @@ maven-release-plugin 2.5.3 + + org.apache.maven.plugins + maven-surefire-plugin + 3.5.3 + + + slow + + + diff --git a/src/main/java/com/epimorphics/appbase/core/ComponentBase.java b/src/main/java/com/epimorphics/appbase/core/ComponentBase.java index 335a79c..ed121fb 100644 --- a/src/main/java/com/epimorphics/appbase/core/ComponentBase.java +++ b/src/main/java/com/epimorphics/appbase/core/ComponentBase.java @@ -43,7 +43,7 @@ public static String expandFileLocation(String filename) { public void require(Object value, String valuename) { if (value == null) { - log.error(String.format("Missing parameter %s on component %s.%s", valuename, app.getName(), componentName)); + log.error("Missing parameter {} on component {}.{}", valuename, app.getName(), componentName); } } diff --git a/src/main/java/com/epimorphics/appbase/webapi/testing/TomcatTestBase.java b/src/main/java/com/epimorphics/appbase/webapi/testing/TomcatTestBase.java index 0ff386f..f92dbee 100644 --- a/src/main/java/com/epimorphics/appbase/webapi/testing/TomcatTestBase.java +++ b/src/main/java/com/epimorphics/appbase/webapi/testing/TomcatTestBase.java @@ -21,8 +21,8 @@ package com.epimorphics.appbase.webapi.testing; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; import java.io.File; import java.io.InputStream; @@ -45,11 +45,11 @@ import org.apache.jena.rdf.model.Resource; import org.apache.jena.riot.RDFDataMgr; import org.glassfish.jersey.client.ClientConfig; -import org.junit.After; -import org.junit.Before; import com.epimorphics.util.NameUtils; import com.epimorphics.util.TestUtil; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; public abstract class TomcatTestBase { @@ -75,7 +75,7 @@ protected void configureContext(Context context) { // do nothing by default } - @Before + @BeforeEach public void containerStart() throws Exception { String root = getWebappRoot(); tomcat = new Tomcat(); @@ -108,7 +108,7 @@ public void containerStart() throws Exception { checkLive(200); } - @After + @AfterEach public void containerStop() throws Exception { tomcat.stop(); tomcat.destroy(); diff --git a/src/test/java/com/epimorphics/appbase/core/TestDynamicLoad.java b/src/test/java/com/epimorphics/appbase/core/TestDynamicLoad.java index 1978dcd..e9e27cd 100644 --- a/src/test/java/com/epimorphics/appbase/core/TestDynamicLoad.java +++ b/src/test/java/com/epimorphics/appbase/core/TestDynamicLoad.java @@ -9,14 +9,14 @@ package com.epimorphics.appbase.core; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import java.io.IOException; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.epimorphics.appbase.test.LoaderTest; @@ -28,14 +28,14 @@ public class TestDynamicLoad { App testapp; - @Before + @BeforeEach public void startup() throws IOException { AppConfig.startApp("test", "src/test/loaderTestApp/app.conf"); testapp = AppConfig.getApp(); testapp.startup(); } - @After + @AfterEach public void shutdown() { if (testapp != null) { testapp.shutdown(); diff --git a/src/test/java/com/epimorphics/appbase/data/BaseSourceTest.java b/src/test/java/com/epimorphics/appbase/data/BaseSourceTest.java index 9278013..e088897 100644 --- a/src/test/java/com/epimorphics/appbase/data/BaseSourceTest.java +++ b/src/test/java/com/epimorphics/appbase/data/BaseSourceTest.java @@ -9,7 +9,7 @@ package com.epimorphics.appbase.data; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; import com.epimorphics.appbase.core.App; import com.epimorphics.appbase.core.PrefixService; @@ -33,7 +33,7 @@ public abstract class BaseSourceTest { protected abstract String getTestFileDir(); - @Before + @BeforeEach public void setup() { app = new App("testing"); diff --git a/src/test/java/com/epimorphics/appbase/data/TestLoggingSource.java b/src/test/java/com/epimorphics/appbase/data/TestLoggingSource.java index 858e161..370258b 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestLoggingSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestLoggingSource.java @@ -19,9 +19,9 @@ import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.update.UpdateFactory; import org.apache.jena.vocabulary.RDFS; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; import com.epimorphics.appbase.core.App; import com.epimorphics.appbase.data.impl.DatasetSparqlSource; @@ -39,7 +39,7 @@ public class TestLoggingSource { LoggingSparqlSource lsource; File logDir; - @Before + @BeforeEach public void setup() throws IOException { Path path = Files.createTempDirectory("loggingSourceTest"); logDir = path.toFile(); diff --git a/src/test/java/com/epimorphics/appbase/data/TestQuadSource.java b/src/test/java/com/epimorphics/appbase/data/TestQuadSource.java index 3c77aac..9e12dd3 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestQuadSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestQuadSource.java @@ -9,15 +9,15 @@ package com.epimorphics.appbase.data; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; import java.util.List; import org.apache.jena.query.ResultSet; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.epimorphics.appbase.core.App; import com.epimorphics.appbase.data.impl.QuadFileSparqlSource; @@ -29,7 +29,7 @@ public class TestQuadSource { App app; QuadFileSparqlSource source; - @Before + @BeforeEach public void setup() { app = new App("test"); source = new QuadFileSparqlSource(); diff --git a/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java b/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java index fc93f5c..3de6125 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java @@ -9,9 +9,9 @@ package com.epimorphics.appbase.data; -import org.junit.Ignore; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; import com.epimorphics.appbase.core.App; import com.epimorphics.appbase.data.impl.RemoteSparqlSource; @@ -49,7 +49,7 @@ protected void setup() { } // This test is normally excluded - @Ignore + @Disabled @Test public void testRemoteSource() { setup(); diff --git a/src/test/java/com/epimorphics/appbase/data/TestSearch.java b/src/test/java/com/epimorphics/appbase/data/TestSearch.java index 12a3684..559e85e 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestSearch.java +++ b/src/test/java/com/epimorphics/appbase/data/TestSearch.java @@ -9,13 +9,13 @@ package com.epimorphics.appbase.data; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.File; import java.io.IOException; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.epimorphics.appbase.core.App; import com.epimorphics.util.PrefixUtils; @@ -30,7 +30,7 @@ public class TestSearch { App testapp; SparqlSource src; - @Before + @BeforeEach public void startup() throws IOException { testapp = new App("testapp", new File("src/test/textSearch/app.conf")); src = testapp.getComponentAs("ssource", SparqlSource.class); diff --git a/src/test/java/com/epimorphics/appbase/data/TestSource.java b/src/test/java/com/epimorphics/appbase/data/TestSource.java index c157593..a782661 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestSource.java @@ -9,16 +9,16 @@ package com.epimorphics.appbase.data; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.HashSet; import java.util.List; import java.util.Set; -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.epimorphics.appbase.util.SQueryUtil; import com.epimorphics.util.PrefixUtils; diff --git a/src/test/java/com/epimorphics/appbase/data/TestUnionSource.java b/src/test/java/com/epimorphics/appbase/data/TestUnionSource.java index 7d6be2d..ff8eed1 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestUnionSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestUnionSource.java @@ -12,8 +12,8 @@ import java.util.ArrayList; import java.util.List; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.epimorphics.appbase.core.App; import com.epimorphics.appbase.data.impl.UnionDatasetSparqlSource; @@ -29,7 +29,7 @@ public class TestUnionSource { App app; SparqlSource source; - @Before + @BeforeEach public void setup() { app = new App("test"); source = new UnionDatasetSparqlSource(); diff --git a/src/test/java/com/epimorphics/appbase/monitor/TestDatasetMonitor.java b/src/test/java/com/epimorphics/appbase/monitor/TestDatasetMonitor.java index 3e8f97a..0326a13 100644 --- a/src/test/java/com/epimorphics/appbase/monitor/TestDatasetMonitor.java +++ b/src/test/java/com/epimorphics/appbase/monitor/TestDatasetMonitor.java @@ -9,7 +9,7 @@ package com.epimorphics.appbase.monitor; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import java.io.File; import java.io.FileOutputStream; @@ -18,9 +18,9 @@ import java.util.ArrayList; import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.epimorphics.appbase.core.App; import com.epimorphics.appbase.data.SparqlSource; @@ -42,7 +42,7 @@ public class TestDatasetMonitor { private static final int MONITOR_CHECK_DELAY = 15; private static final int NTRIES = 100; - @Before + @BeforeEach public void setup() throws IOException { testDir = Files.createTempDirectory("testmonitor").toFile(); app = new App("TestMonitor"); @@ -64,7 +64,7 @@ public void setup() throws IOException { app.startup(); } - @After + @AfterEach public void cleanUp() { FileUtil.deleteDirectory(testDir); } @@ -104,7 +104,7 @@ protected void waitFor(DatasetMonitor dsmon, String graphname, boolean present) return; } } - assertTrue("Failed to detected " + (present ? "addition" : "removal") + " of " + graphname, false); + fail("Failed to detected " + (present ? "addition" : "removal") + " of " + graphname); } protected void addFile(String marker, String filename) throws IOException { diff --git a/src/test/java/com/epimorphics/appbase/monitor/TestFileMonitor.java b/src/test/java/com/epimorphics/appbase/monitor/TestFileMonitor.java index 88dda7a..6abd778 100644 --- a/src/test/java/com/epimorphics/appbase/monitor/TestFileMonitor.java +++ b/src/test/java/com/epimorphics/appbase/monitor/TestFileMonitor.java @@ -10,8 +10,8 @@ package com.epimorphics.appbase.monitor; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import java.io.File; import java.io.IOException; @@ -19,31 +19,31 @@ import java.nio.file.Files; import org.apache.jena.atlas.json.JsonObject; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import com.epimorphics.json.JsonUtil; import com.epimorphics.util.EpiException; import com.epimorphics.util.FileUtil; // Directory monitor is deprecated and this tests does not work under java8 -@Ignore +@Disabled public class TestFileMonitor { protected File triggeredFile; protected JsonObject triggeredParameters; protected File testDir; - @Before + @BeforeEach public void setup() throws IOException { testDir = Files.createTempDirectory("watchtest").toFile(); FileUtil.ensureDir(testDir.getPath()); ConfigWatcher.start(); } - @After + @AfterEach public void tearDown() { ConfigWatcher.stop(); FileUtil.deleteDirectory(testDir); diff --git a/src/test/java/com/epimorphics/appbase/monitor/TestMonitor.java b/src/test/java/com/epimorphics/appbase/monitor/TestMonitor.java index eaf5bc5..82c641e 100644 --- a/src/test/java/com/epimorphics/appbase/monitor/TestMonitor.java +++ b/src/test/java/com/epimorphics/appbase/monitor/TestMonitor.java @@ -9,10 +9,6 @@ package com.epimorphics.appbase.monitor; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertTrue; - import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -21,15 +17,17 @@ import java.util.Collection; import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.epimorphics.appbase.core.App; import com.epimorphics.util.FileUtil; import com.epimorphics.util.TestUtil; import org.apache.jena.util.FileManager; +import static org.junit.jupiter.api.Assertions.*; + public class TestMonitor { protected App app; protected TMonitor monitor; @@ -41,7 +39,7 @@ public class TestMonitor { private static final int MONITOR_CHECK_DELAY = 15; private static final int NTRIES = 20; - @Before + @BeforeEach public void setup() throws IOException { testDir = Files.createTempDirectory("testmonitor").toFile(); fubarFile = touchFile("fubar", "fubar1"); @@ -49,7 +47,7 @@ public void setup() throws IOException { app = new App("TestMonitor"); } - @After + @AfterEach public void cleanUp() { FileUtil.deleteDirectory(testDir); ConfigWatcher.stop(); @@ -184,7 +182,7 @@ protected void waitFor(String file, boolean present) throws InterruptedException return; } } - assertTrue("Failed to detected " + (present ? "addition" : "removal") + " of " + file, false); + fail("Failed to detected " + (present ? "addition" : "removal") + " of " + file); } public static class TMonitor extends ConfigMonitor { diff --git a/src/test/java/com/epimorphics/appbase/task/TestActionManager.java b/src/test/java/com/epimorphics/appbase/task/TestActionManager.java index 722bf23..be1bcd5 100644 --- a/src/test/java/com/epimorphics/appbase/task/TestActionManager.java +++ b/src/test/java/com/epimorphics/appbase/task/TestActionManager.java @@ -10,9 +10,9 @@ package com.epimorphics.appbase.task; import static com.epimorphics.json.JsonUtil.getPath; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -22,7 +22,7 @@ import java.util.concurrent.ExecutionException; import org.apache.jena.atlas.json.JsonObject; -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.epimorphics.appbase.tasks.Action; import com.epimorphics.appbase.tasks.ActionExecution; diff --git a/src/test/java/com/epimorphics/appbase/task/TestJsonActions.java b/src/test/java/com/epimorphics/appbase/task/TestJsonActions.java index 82d27ca..6b961a5 100644 --- a/src/test/java/com/epimorphics/appbase/task/TestJsonActions.java +++ b/src/test/java/com/epimorphics/appbase/task/TestJsonActions.java @@ -10,11 +10,11 @@ package com.epimorphics.appbase.task; import static com.epimorphics.appbase.task.TestActionManager.createParams; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.File; import java.io.IOException; @@ -22,9 +22,9 @@ import java.util.ArrayList; import java.util.List; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import com.epimorphics.appbase.core.App; import com.epimorphics.appbase.core.AppConfig; @@ -45,7 +45,7 @@ public class TestJsonActions { ActionManager am; File testDir; - @Before + @BeforeEach public void startup() throws IOException { testapp = new App("testapp", new File("src/test/actionApp/app.conf")); AppConfig.theConfig.setDefaultApp(testapp); @@ -56,7 +56,7 @@ public void startup() throws IOException { testapp.startup(); } - @After + @AfterEach public void shutdown() { if (testapp != null) { testapp.shutdown(); diff --git a/src/test/java/com/epimorphics/appbase/task/TestRunShell.java b/src/test/java/com/epimorphics/appbase/task/TestRunShell.java index 38e6b79..de821cc 100644 --- a/src/test/java/com/epimorphics/appbase/task/TestRunShell.java +++ b/src/test/java/com/epimorphics/appbase/task/TestRunShell.java @@ -1,12 +1,12 @@ package com.epimorphics.appbase.task; import com.epimorphics.appbase.tasks.RunShell; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.concurrent.ExecutionException; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; public class TestRunShell { diff --git a/src/test/java/com/epimorphics/appbase/task/TestStatusReports.java b/src/test/java/com/epimorphics/appbase/task/TestStatusReports.java index 49f78f5..c5e9bf8 100644 --- a/src/test/java/com/epimorphics/appbase/task/TestStatusReports.java +++ b/src/test/java/com/epimorphics/appbase/task/TestStatusReports.java @@ -9,7 +9,7 @@ package com.epimorphics.appbase.task; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -17,7 +17,7 @@ import org.apache.jena.atlas.json.JSON; import org.apache.jena.atlas.json.JsonArray; import org.apache.jena.atlas.json.JsonObject; -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.epimorphics.json.JSFullWriter; import com.epimorphics.tasks.SimpleProgressMonitor; diff --git a/src/test/java/com/epimorphics/appbase/webapi/TestBasicRender.java b/src/test/java/com/epimorphics/appbase/webapi/TestBasicRender.java index d5f5f95..34c3884 100644 --- a/src/test/java/com/epimorphics/appbase/webapi/TestBasicRender.java +++ b/src/test/java/com/epimorphics/appbase/webapi/TestBasicRender.java @@ -9,7 +9,7 @@ package com.epimorphics.appbase.webapi; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.ArrayList; import java.util.List; @@ -17,7 +17,7 @@ import java.util.regex.Pattern; import jakarta.ws.rs.core.Response; -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.epimorphics.appbase.webapi.testing.TomcatTestBase; diff --git a/src/test/java/com/epimorphics/appbase/webapi/TestConfig.java b/src/test/java/com/epimorphics/appbase/webapi/TestConfig.java index 7891e75..6a38f76 100644 --- a/src/test/java/com/epimorphics/appbase/webapi/TestConfig.java +++ b/src/test/java/com/epimorphics/appbase/webapi/TestConfig.java @@ -11,14 +11,14 @@ import java.util.List; -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.epimorphics.appbase.core.App; import com.epimorphics.appbase.core.AppConfig; import com.epimorphics.appbase.core.GenericConfig; import com.epimorphics.appbase.webapi.testing.TomcatTestBase; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class TestConfig extends TomcatTestBase { diff --git a/src/test/java/com/epimorphics/appbase/webapi/TestLib.java b/src/test/java/com/epimorphics/appbase/webapi/TestLib.java index bf0816e..573068c 100644 --- a/src/test/java/com/epimorphics/appbase/webapi/TestLib.java +++ b/src/test/java/com/epimorphics/appbase/webapi/TestLib.java @@ -9,8 +9,8 @@ package com.epimorphics.appbase.webapi; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; import com.epimorphics.appbase.templates.Lib; import com.epimorphics.appbase.templates.URLBuilder; From 8596614be1ebd605d280af483e5821071045bfc3 Mon Sep 17 00:00:00 2001 From: der Date: Tue, 11 Nov 2025 13:02:12 +0000 Subject: [PATCH 04/10] Fix RemoteSparqlSource Jena uses -1 on timeouts to mean "no timeout" and the defaut settings in RemoveSparqlSource follow that convention. This was resulting in illegal Duration parameters. Fix that, and added an EmbeddedFuseki option so can no leave the test enabled. --- pom.xml | 15 +++- .../appbase/data/impl/RemoteSparqlSource.java | 9 +- .../appbase/data/EmbeddedFuseki.java | 90 +++++++++++++++++++ .../appbase/data/TestRemoteSource.java | 24 ++--- 4 files changed, 119 insertions(+), 19 deletions(-) create mode 100644 src/test/java/com/epimorphics/appbase/data/EmbeddedFuseki.java diff --git a/pom.xml b/pom.xml index 7a21e1f..dae4f2b 100644 --- a/pom.xml +++ b/pom.xml @@ -174,7 +174,20 @@ - + + + org.apache.jena + jena-fuseki-main + ${jena.version} + + + org.eclipse.jetty.orbit + javax.servlet + + + test + + diff --git a/src/main/java/com/epimorphics/appbase/data/impl/RemoteSparqlSource.java b/src/main/java/com/epimorphics/appbase/data/impl/RemoteSparqlSource.java index e01a8c3..f92b828 100644 --- a/src/main/java/com/epimorphics/appbase/data/impl/RemoteSparqlSource.java +++ b/src/main/java/com/epimorphics/appbase/data/impl/RemoteSparqlSource.java @@ -75,7 +75,8 @@ public void setUpdateEndpoint(String endpoint) { public void setGraphEndpoint(String endpoint) { this.graphEndpoint = endpoint; } - + + // Note that this is now ignored and only connect timeout is settable. public void setReadTimeout(long readTimeout) { this.readTimeout = readTimeout; } @@ -87,7 +88,7 @@ public void setConnectTimeout(long connectTimeout) { /** * The remote timeout is passed to the client on the assumption it's a Fuseki endpoint * configured to access a timeout query parameter. - * @param remoteTimeout timeout in seconds + * @param remoteTimeout timeout in seconds, -1 for no timeout */ public void setRemoteTimeout(long remoteTimeout) { this.remoteTimeout = remoteTimeout; @@ -111,7 +112,9 @@ protected QueryExecution start(String queryString) { hs.acceptHeader(contentType); } HttpClient.Builder clientBldr = HttpClient.newBuilder(); - clientBldr.connectTimeout(Duration.ofMillis(connectTimeout)); + if (connectTimeout != -1) { + clientBldr.connectTimeout(Duration.ofMillis(connectTimeout)); + } HttpClient client = clientBldr.build(); hs.httpClient(client); diff --git a/src/test/java/com/epimorphics/appbase/data/EmbeddedFuseki.java b/src/test/java/com/epimorphics/appbase/data/EmbeddedFuseki.java new file mode 100644 index 0000000..9f3a784 --- /dev/null +++ b/src/test/java/com/epimorphics/appbase/data/EmbeddedFuseki.java @@ -0,0 +1,90 @@ +package com.epimorphics.appbase.data; + +import com.epimorphics.appbase.data.impl.RemoteSparqlSource; +import org.apache.jena.fuseki.main.FusekiServer; +import org.apache.jena.sparql.core.DatasetGraph; +import org.apache.jena.sparql.core.DatasetGraphFactory; +import org.apache.jena.vocabulary.RDF; + +public class EmbeddedFuseki { + protected static final String datasetPath = "/ds"; + + protected FusekiServer server; + protected int port; + protected String serverBase; + protected String tdbLocation; + DatasetGraph dsg; + + public EmbeddedFuseki() { + this(3333); + } + + public EmbeddedFuseki(int port) { + setPort(port); + } + + public void setPort(int port) { + this.port = port; + serverBase = "http://localhost:" + port + datasetPath; + } + + public void setTdbLocation(String location) { + this.tdbLocation = location; + } + + public void start() { + dsg = DatasetGraphFactory.create(); + + server = FusekiServer.create() + .port(port) + .add(datasetPath, dsg) + .loopback(true) + .build(); + + server.start(); + waitForServer(); + } + + protected void waitForServer() { + SparqlSource source = getAsSource(); + for (int i = 0; i < 100; i++) { + try { + source.describeAll(RDF.nil.getURI()); + return; + } catch (Exception e) { + } + try { + Thread.sleep(100); + } catch (InterruptedException e) { + return; + } + } + } + + public void stop() { + if (server != null) { + server.stop(); + } + } + + public String getServerBase() { + return serverBase; + } + + public String getUpdateEndpoint() { + return serverBase + "/update"; + } + + public String getGraphEndpoint() { + return serverBase + "/data"; + } + + public SparqlSource getAsSource() { + RemoteSparqlSource source = new RemoteSparqlSource(); + source.setEndpoint( serverBase + "/query" ); + source.setGraphEndpoint( getGraphEndpoint() ); + source.setUpdateEndpoint( getUpdateEndpoint() ); + return source; + } + +} diff --git a/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java b/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java index 3de6125..cf3163f 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java @@ -27,29 +27,23 @@ public class TestRemoteSource { App app; SparqlSource source; + EmbeddedFuseki fuseki; - /** - * Override to change the source to be tested. - * Assumes there is a test fuseki on 4040 - *
-     *   fuseki-server --update --mem --port=4040 /test
-     * 
- */ // Not an @Before because we don't want it to run if the test is suppressed protected void setup() { app = new App("remote source test"); RemoteSparqlSource source = new RemoteSparqlSource(); - source.setEndpoint("http://localhost:4040/test/query"); - source.setUpdateEndpoint("http://localhost:4040/test/update"); - source.setGraphEndpoint("http://localhost:4040/test/data"); + source.setEndpoint("http://localhost:4040/ds/query"); + source.setUpdateEndpoint("http://localhost:4040/ds/update"); + source.setGraphEndpoint("http://localhost:4040/ds/data"); app.addComponent("source", source); app.startup(); - + + fuseki = new EmbeddedFuseki(4040); + fuseki.start(); this.source = source; } - // This test is normally excluded - @Disabled @Test public void testRemoteSource() { setup(); @@ -85,6 +79,7 @@ public void testRemoteSource() { accessor.deleteModel(TEST + "g" + i); } app.shutdown(); + fuseki.stop(); } private void checkLabels(String[] labels) { @@ -104,6 +99,5 @@ private void checkLabels(String[] labels) { s.setEndpoint("eh:/endpoint"); assertEquals("eh:/endpoint", s.getEndpoint()); } - - + } From 430ce48ee5560c4203248d30ff9b50d46feb8515 Mon Sep 17 00:00:00 2001 From: Kal Ahmed Date: Tue, 25 Nov 2025 10:00:24 +0000 Subject: [PATCH 05/10] Bump Jena and Tomcat versions Jena 5.5 -> 5.6 Tomcat 11.0.10 -> 11.0.12 Both updates are to address reported vulnerabilities in the older versions --- pom.xml | 4 ++-- v4_0_0.md | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index dae4f2b..171b242 100644 --- a/pom.xml +++ b/pom.xml @@ -14,8 +14,8 @@ UTF-8 21 21 - 11.0.10 - 5.5.0 + 11.0.12 + 5.6.0 4.0.0-SNAPSHOT 3.1.11 diff --git a/v4_0_0.md b/v4_0_0.md index 7d29ebf..17c3f66 100644 --- a/v4_0_0.md +++ b/v4_0_0.md @@ -4,7 +4,7 @@ Appbase Version 4.0.0 * This version upgrades the following dependencies with major impact. This may cause backwards compatibility issues for applications using Appbase: * Tomcat 9.0 -> 11.0 - * Jena 3.9 -> 5.5 + * Jena 3.9 -> 5.6 * Lib 3.1 -> 4.0 * Jersey 2.25 -> 3.1 * Replaced all usages of javax servlet infrastructure with jakarta. @@ -13,4 +13,3 @@ Appbase Version 4.0.0 * It is directly implemented by RDFConnectionDatasetAccessor and indirectly by various wrapper classes which are unchanged from the previous version. * It has removed the `containsModel` method since no Jena 5 equivalent exists. Instead, use `getModel` to obtain the model, then `isEmpty` on the model. - From 0ff8747ec7671cbf0282b688282a0d113a653587 Mon Sep 17 00:00:00 2001 From: Kal Ahmed Date: Fri, 5 Dec 2025 11:01:37 +0000 Subject: [PATCH 06/10] Update lib to 4.0.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 171b242..4f41190 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ 21 11.0.12 5.6.0 - 4.0.0-SNAPSHOT + 4.0.0 3.1.11 From f9ae8ac0636645028630aef31ffcc8ae37b70730 Mon Sep 17 00:00:00 2001 From: Kal Ahmed Date: Fri, 5 Dec 2025 11:05:45 +0000 Subject: [PATCH 07/10] Remove commented out sections and reformat for consistency --- pom.xml | 241 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 120 insertions(+), 121 deletions(-) diff --git a/pom.xml b/pom.xml index 4f41190..8000adb 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 com.epimorphics appbase @@ -39,7 +40,7 @@ true - + true @@ -52,31 +53,39 @@ https://repository.epimorphics.com - - epi-public-s3-release - Epimorphics S3 release repository - https://epi-repository.s3-eu-west-1.amazonaws.com/release - true - false - - - - epi-public-s3-snapshot - Epimorphics S3 snapshot repository - https://epi-repository.s3-eu-west-1.amazonaws.com/snapshot - false - true - - + + epi-public-s3-release + Epimorphics S3 release repository + https://epi-repository.s3-eu-west-1.amazonaws.com/release + + true + + + false + + + + + epi-public-s3-snapshot + Epimorphics S3 snapshot repository + https://epi-repository.s3-eu-west-1.amazonaws.com/snapshot + + false + + + true + + + - - org.junit.jupiter - junit-jupiter-api - 5.12.2 - provided - + + org.junit.jupiter + junit-jupiter-api + 5.12.2 + provided + com.epimorphics lib @@ -87,18 +96,6 @@ org.apache.jena jena-text ${jena.version} - @@ -108,21 +105,22 @@ - org.apache.velocity - velocity-engine-core - 2.4.1 + org.apache.velocity + velocity-engine-core + 2.4.1 + + + + org.apache.commons + commons-lang3 + 3.18.0 - - org.apache.commons - commons-lang3 - 3.18.0 - org.yaml snakeyaml 2.3 - + org.apache.tomcat.embed @@ -138,55 +136,48 @@ provided - - - - - - - - commons-beanutils - commons-beanutils - 1.11.0 + commons-beanutils + commons-beanutils + 1.11.0 - + - org.glassfish.jersey.media - jersey-media-multipart - ${jersey.version} + org.glassfish.jersey.media + jersey-media-multipart + ${jersey.version} - + - org.glassfish.jersey.core - jersey-client - ${jersey.version} + org.glassfish.jersey.core + jersey-client + ${jersey.version} - + - org.glassfish.jersey.connectors - jersey-apache-connector - ${jersey.version} - - - org.apache.httpcomponents - httpclient - - + org.glassfish.jersey.connectors + jersey-apache-connector + ${jersey.version} + + + org.apache.httpcomponents + httpclient + + - - org.apache.jena - jena-fuseki-main - ${jena.version} - - - org.eclipse.jetty.orbit - javax.servlet - - - test - + + org.apache.jena + jena-fuseki-main + ${jena.version} + + + org.eclipse.jetty.orbit + javax.servlet + + + test + @@ -202,7 +193,7 @@ - + org.apache.maven.plugins maven-scm-plugin 1.9.4 @@ -216,31 +207,31 @@ maven-release-plugin 2.5.3 - - org.apache.maven.plugins - maven-surefire-plugin - 3.5.3 - - - slow - - - + + org.apache.maven.plugins + maven-surefire-plugin + 3.5.3 + + + slow + + + - + org.apache.maven.wagon wagon-ftp 2.12 - - org.springframework.build - aws-maven - 5.0.0.RELEASE - - + + org.springframework.build + aws-maven + 5.0.0.RELEASE + + @@ -263,7 +254,7 @@ - + @@ -274,22 +265,30 @@
- - - epi-public-s3-release - Epimorphics S3 release repository - s3://epi-repository/release - true - false - - - - epi-public-s3-snapshot - Epimorphics S3 snapshot repository - s3://epi-repository/snapshot - false - true - - + + + epi-public-s3-release + Epimorphics S3 release repository + s3://epi-repository/release + + true + + + false + + + + + epi-public-s3-snapshot + Epimorphics S3 snapshot repository + s3://epi-repository/snapshot + + false + + + true + + + From 575095a997dbf8305e2f4a90bac90c05fc3d5dc6 Mon Sep 17 00:00:00 2001 From: Kal Ahmed Date: Fri, 5 Dec 2025 11:09:56 +0000 Subject: [PATCH 08/10] Update plugins --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 8000adb..da52514 100644 --- a/pom.xml +++ b/pom.xml @@ -186,7 +186,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.3 + 3.14.1 ${maven.compiler.source} ${maven.compiler.target} @@ -196,7 +196,7 @@ org.apache.maven.plugins maven-scm-plugin - 1.9.4 + 2.2.1 developerConnection @@ -205,12 +205,12 @@ org.apache.maven.plugins maven-release-plugin - 2.5.3 + 3.1.1 org.apache.maven.plugins maven-surefire-plugin - 3.5.3 + 3.5.4 slow @@ -224,7 +224,7 @@ org.apache.maven.wagon wagon-ftp - 2.12 + 3.5.3 org.springframework.build From 55d78e5d6684b404e57c4766d7ebbf7eee140970 Mon Sep 17 00:00:00 2001 From: Kal Ahmed Date: Fri, 5 Dec 2025 11:12:09 +0000 Subject: [PATCH 09/10] Merge 4.0 notes into changelog --- README.md | 14 ++++++++++++++ v4_0_0.md | 15 --------------- 2 files changed, 14 insertions(+), 15 deletions(-) delete mode 100644 v4_0_0.md diff --git a/README.md b/README.md index 0b4f245..8c586ea 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,20 @@ Reusable foundation for java RDF applications that provide a web UI or web API o ## Changelog +**4.0.0** + * Appbase is compiled by JDK 21 and is compatible only with Java versions 21 and above. + * This version upgrades the following dependencies with major impact. + This may cause backwards compatibility issues for applications using Appbase: + * Tomcat 9.0 -> 11.0 + * Jena 3.9 -> 5.6 + * Lib 3.1 -> 4.0 + * Jersey 2.25 -> 3.1 + * Replaced all usages of javax servlet infrastructure with jakarta. + * Maven artifacts for Appbase version 4.0.0 and onwards are published to the Epimorphics public S3 Maven repository. + * The `DatasetAccessor` interface from Jena 3 is replaced by `com.epimorphics.appbase.data.DatasetAccessor`: + * It is directly implemented by `RDFConnectionDatasetAccessor` and indirectly by various wrapper classes which are unchanged from the previous version. + * It has removed the `containsModel` method since no Jena 5 equivalent exists. Instead, use `getModel` to obtain the model, then `isEmpty` on the model. + **3.1.12** * Fix log level in output of RunShell to be ERROR level if process returns failed status diff --git a/v4_0_0.md b/v4_0_0.md deleted file mode 100644 index 17c3f66..0000000 --- a/v4_0_0.md +++ /dev/null @@ -1,15 +0,0 @@ -Appbase Version 4.0.0 - -* Appbase is compiled by JDK 21 and is compatible only with Java versions 21 and above. -* This version upgrades the following dependencies with major impact. - This may cause backwards compatibility issues for applications using Appbase: - * Tomcat 9.0 -> 11.0 - * Jena 3.9 -> 5.6 - * Lib 3.1 -> 4.0 - * Jersey 2.25 -> 3.1 -* Replaced all usages of javax servlet infrastructure with jakarta. -* Maven artifacts for Appbase version 4.0.0 and onwards are published to the Epimorphics public S3 Maven repository. -* The `DatasetAccessor` interface from Jena 3 is replaced by `com.epimorphics.appbase.data.DatasetAccessor`: - * It is directly implemented by RDFConnectionDatasetAccessor and indirectly by various wrapper classes which are unchanged from the previous version. - * It has removed the `containsModel` method since no Jena 5 equivalent exists. - Instead, use `getModel` to obtain the model, then `isEmpty` on the model. From 290b67c50d6a92d2f9cb7ec8a369bdedd2e90393 Mon Sep 17 00:00:00 2001 From: Kal Ahmed Date: Fri, 5 Dec 2025 12:08:48 +0000 Subject: [PATCH 10/10] Implement PR feedback --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c586ea..172ab0b 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Reusable foundation for java RDF applications that provide a web UI or web API o * Maven artifacts for Appbase version 4.0.0 and onwards are published to the Epimorphics public S3 Maven repository. * The `DatasetAccessor` interface from Jena 3 is replaced by `com.epimorphics.appbase.data.DatasetAccessor`: * It is directly implemented by `RDFConnectionDatasetAccessor` and indirectly by various wrapper classes which are unchanged from the previous version. - * It has removed the `containsModel` method since no Jena 5 equivalent exists. Instead, use `getModel` to obtain the model, then `isEmpty` on the model. + * It has removed the `containsModel` method since no Jena 5 equivalent exists. **3.1.12** * Fix log level in output of RunShell to be ERROR level if process returns failed status