diff --git a/README.md b/README.md index 0b4f245..172ab0b 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. + **3.1.12** * Fix log level in output of RunShell to be ERROR level if process returns failed status diff --git a/pom.xml b/pom.xml index c6fa633..da52514 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 com.epimorphics appbase @@ -12,10 +13,12 @@ UTF-8 - 9.0.110 - 3.9.0 - 3.1.8 - 2.25.1 + 21 + 21 + 11.0.12 + 5.6.0 + 4.0.0 + 3.1.11 @@ -37,7 +40,7 @@ true - + true @@ -50,29 +53,37 @@ 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 + + + - junit - junit - 4.13.1 + org.junit.jupiter + junit-jupiter-api + 5.12.2 provided @@ -85,18 +96,6 @@ org.apache.jena jena-text ${jena.version} - @@ -106,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.0 - + 2.3 + org.apache.tomcat.embed @@ -137,42 +137,48 @@ - javax.servlet - javax.servlet-api - 3.1.0 - 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 - + @@ -180,17 +186,17 @@ org.apache.maven.plugins maven-compiler-plugin - 3.3 + 3.14.1 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} - + org.apache.maven.plugins maven-scm-plugin - 1.9.4 + 2.2.1 developerConnection @@ -199,23 +205,33 @@ org.apache.maven.plugins maven-release-plugin - 2.5.3 + 3.1.1 + + + org.apache.maven.plugins + maven-surefire-plugin + 3.5.4 + + + slow + + - + org.apache.maven.wagon wagon-ftp - 2.12 + 3.5.3 - - org.springframework.build - aws-maven - 5.0.0.RELEASE - - + + org.springframework.build + aws-maven + 5.0.0.RELEASE + + @@ -238,7 +254,7 @@ - + @@ -251,9 +267,28 @@ - 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/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/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..f92b828 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; @@ -71,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; } @@ -83,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; @@ -96,21 +101,27 @@ 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(); + if (connectTimeout != -1) { + 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 +142,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..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,20 +21,20 @@ package com.epimorphics.appbase.webapi.testing; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.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,13 +43,13 @@ 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; 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(); @@ -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/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/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/TestLoggingSource.java b/src/test/java/com/epimorphics/appbase/data/TestLoggingSource.java index 9adde50..370258b 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestLoggingSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestLoggingSource.java @@ -15,15 +15,13 @@ 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; -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; @@ -41,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(); @@ -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..9e12dd3 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestQuadSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestQuadSource.java @@ -9,16 +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.DatasetAccessor; 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; @@ -30,7 +29,7 @@ public class TestQuadSource { App app; QuadFileSparqlSource source; - @Before + @BeforeEach public void setup() { app = new App("test"); source = new QuadFileSparqlSource(); @@ -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..cf3163f 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestRemoteSource.java @@ -9,13 +9,12 @@ 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; -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; @@ -28,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 - @Ignore @Test public void testRemoteSource() { setup(); @@ -86,6 +79,7 @@ public void testRemoteSource() { accessor.deleteModel(TEST + "g" + i); } app.shutdown(); + fuseki.stop(); } private void checkLabels(String[] labels) { @@ -105,6 +99,5 @@ private void checkLabels(String[] labels) { s.setEndpoint("eh:/endpoint"); assertEquals("eh:/endpoint", s.getEndpoint()); } - - + } 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 bd70b94..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; @@ -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..ff8eed1 100644 --- a/src/test/java/com/epimorphics/appbase/data/TestUnionSource.java +++ b/src/test/java/com/epimorphics/appbase/data/TestUnionSource.java @@ -12,13 +12,12 @@ 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; 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; @@ -30,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 3c81056..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,38 +19,38 @@ 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); } @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..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,13 +182,18 @@ 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 { @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/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 22f0d4f..34c3884 100644 --- a/src/test/java/com/epimorphics/appbase/webapi/TestBasicRender.java +++ b/src/test/java/com/epimorphics/appbase/webapi/TestBasicRender.java @@ -9,16 +9,15 @@ 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; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.ws.rs.core.Response; - -import org.junit.Test; +import jakarta.ws.rs.core.Response; +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 166006d..6a38f76 100644 --- a/src/test/java/com/epimorphics/appbase/webapi/TestConfig.java +++ b/src/test/java/com/epimorphics/appbase/webapi/TestConfig.java @@ -9,18 +9,17 @@ 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; +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.jupiter.api.Assertions.*; + 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(); 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;