diff --git a/pom.xml b/pom.xml index b4b9049e..eccbad94 100644 --- a/pom.xml +++ b/pom.xml @@ -41,12 +41,10 @@ 0 17 - 4.2.0 + 5.1.0 UTF-8 17 17 - - 2.19.0 @@ -76,38 +74,48 @@ ch.qos.logback logback-classic - 1.4.14 + 1.5.6 + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.17.2 com.fasterxml.jackson.dataformat jackson-dataformat-yaml - 2.12.5 + 2.17.2 - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - 2.12.5 + com.fasterxml.jackson.core + jackson-annotations + 2.17.2 + + + com.fasterxml.jackson.core + jackson-databind + 2.17.2 + + + com.fasterxml.jackson.core + jackson-core + 2.17.2 com.networknt json-schema-validator 1.0.78 - - com.googlecode.json-simple - json-simple - 1.1.1 - org.junit.jupiter junit-jupiter - 5.9.2 + 5.10.3 test com.opencsv opencsv - 5.7.1 + 5.9 org.lz4 @@ -117,7 +125,7 @@ org.apache.hbase hbase-common - 2.5.5 + 2.6.0 com.beust @@ -127,13 +135,13 @@ com.github.tomakehurst wiremock-jre8-standalone - 2.35.1 + 2.35.2 test org.apache.httpcomponents.client5 httpclient5 - 5.3 + 5.3.1 @@ -142,7 +150,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.1 + 3.13.0 17 17 @@ -159,7 +167,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.1.2 + 3.3.1 -Xmx16384M @@ -169,7 +177,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.4.1 + 3.6.0 false iguana @@ -195,17 +203,16 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.4.0 + 3.8.0 -html javadoc/${revision}/ - maven-resources-plugin - 3.1.0 + 3.3.1 copy-resources @@ -239,7 +246,7 @@ org.junit.platform junit-platform-launcher - 1.9.2 + 1.10.3 test @@ -248,7 +255,7 @@ org.codehaus.mojo exec-maven-plugin - 1.6.0 + 3.4.1 run-script @@ -283,7 +290,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.1.2 + 3.2.5 org.graalvm.buildtools diff --git a/src/main/java/org/aksw/iguana/cc/lang/impl/SaxSparqlJsonResultCountingParser.java b/src/main/java/org/aksw/iguana/cc/lang/impl/SaxSparqlJsonResultCountingParser.java index 94277c06..3645ec9e 100644 --- a/src/main/java/org/aksw/iguana/cc/lang/impl/SaxSparqlJsonResultCountingParser.java +++ b/src/main/java/org/aksw/iguana/cc/lang/impl/SaxSparqlJsonResultCountingParser.java @@ -1,20 +1,14 @@ package org.aksw.iguana.cc.lang.impl; +import com.fasterxml.jackson.core.JsonFactory; import org.aksw.iguana.cc.lang.LanguageProcessor; -import org.json.simple.parser.ContentHandler; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; import org.slf4j.Logger; -import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -import static org.json.simple.parser.ParseException.ERROR_UNEXPECTED_EXCEPTION; /** * SAX Parser for SPARQL JSON Results. @@ -30,22 +24,31 @@ public class SaxSparqlJsonResultCountingParser extends LanguageProcessor { @Override public LanguageProcessingData process(InputStream inputStream, long hash) { - var parser = new JSONParser(); var handler = new SaxSparqlJsonResultContentHandler(); - try { - parser.parse(new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)), handler); - if (handler.isAskResult()) - return new BooleanResultData(hash, handler.booleanResult(), handler.links(), null); - return new ResultCountData(hash, handler.solutions(), handler.boundValues(), handler.variables(), handler.links(), null); + JsonFactory factory = new JsonFactory(); + try (var parser = factory.createParser(inputStream)) { + while (parser.nextToken() != null) { + switch (parser.getCurrentToken()) { + case START_OBJECT -> handler.startObject(); + case END_OBJECT -> handler.endObject(); + case START_ARRAY -> handler.startArray(); + case END_ARRAY -> handler.endArray(); + case FIELD_NAME -> handler.startObjectEntry(parser.getCurrentName()); + case VALUE_STRING, VALUE_NUMBER_INT, VALUE_NUMBER_FLOAT, VALUE_NULL -> handler.primitive(parser.getValueAsString()); + case VALUE_TRUE, VALUE_FALSE -> handler.primitive(parser.getBooleanValue()); + } + } } catch (IOException e) { - throw new RuntimeException(e); - } catch (ParseException e) { - LOGGER.error("Error while parsing SPARQL XML Results.", e); + LOGGER.error("Error while parsing SPARQL JSON Results.", e); return new ResultCountData(hash, -1, -1, null, null, e); } + + if (handler.isAskResult()) + return new BooleanResultData(hash, handler.booleanResult(), handler.links(), null); + return new ResultCountData(hash, handler.solutions(), handler.boundValues(), handler.variables(), handler.links(), null); } - private static class SaxSparqlJsonResultContentHandler implements ContentHandler { + private static class SaxSparqlJsonResultContentHandler { // TODO: code is unnecessary complicated private boolean headFound = false; @@ -64,18 +67,6 @@ private static class SaxSparqlJsonResultContentHandler implements ContentHandler private final List variables = new ArrayList<>(); private final List links = new ArrayList<>(); - - @Override - public void startJSON() { - } - - @Override - public void endJSON() throws ParseException { - if (inResults || inBindings || inBindingsArray || !headFound || objectDepth != 0) - throw new ParseException(ERROR_UNEXPECTED_EXCEPTION, "SPARQL Json Response was malformed."); - } - - @Override public boolean startObject() { objectDepth += 1; if (inBindingsArray) { @@ -87,7 +78,6 @@ public boolean startObject() { return true; } - @Override public boolean endObject() { switch (objectDepth) { case 1: @@ -104,7 +94,6 @@ public boolean endObject() { return true; } - @Override public boolean startArray() { if (objectDepth == 2 && inResults && inBindings && !inBindingsArray) { inBindingsArray = true; @@ -112,7 +101,6 @@ public boolean startArray() { return true; } - @Override public boolean endArray() { if (inVars) inVars = false; @@ -125,7 +113,6 @@ public boolean endArray() { } - @Override public boolean startObjectEntry(String key) { switch (objectDepth) { case 1 -> { @@ -156,11 +143,6 @@ public boolean startObjectEntry(String key) { return true; } - @Override - public boolean endObjectEntry() { - return true; - } - public boolean primitive(Object value) { if (inVars) variables.add(value.toString()); diff --git a/src/main/java/org/aksw/iguana/cc/lang/impl/SaxSparqlXmlResultCountingParser.java b/src/main/java/org/aksw/iguana/cc/lang/impl/SaxSparqlXmlResultCountingParser.java index afde5513..1cff6a03 100644 --- a/src/main/java/org/aksw/iguana/cc/lang/impl/SaxSparqlXmlResultCountingParser.java +++ b/src/main/java/org/aksw/iguana/cc/lang/impl/SaxSparqlXmlResultCountingParser.java @@ -1,13 +1,6 @@ package org.aksw.iguana.cc.lang.impl; import org.aksw.iguana.cc.lang.LanguageProcessor; -import org.aksw.iguana.cc.storage.Storable; -import org.aksw.iguana.commons.rdf.IPROP; -import org.aksw.iguana.commons.rdf.IRES; -import org.apache.jena.rdf.model.Model; -import org.apache.jena.rdf.model.ModelFactory; -import org.apache.jena.rdf.model.Resource; -import org.apache.jena.rdf.model.ResourceFactory; import org.slf4j.Logger; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -22,8 +15,6 @@ import java.util.List; import java.util.Objects; -import static org.json.simple.parser.ParseException.ERROR_UNEXPECTED_EXCEPTION; - /** * SAX Parser for SPARQL XML Results. * For correct SPARQL XML Results it returns the number of solutions, bound values, the names of the variables and links. diff --git a/src/main/java/org/aksw/iguana/cc/metrics/impl/AvgQPS.java b/src/main/java/org/aksw/iguana/cc/metrics/impl/AvgQPS.java index cb27e55b..3a271a20 100644 --- a/src/main/java/org/aksw/iguana/cc/metrics/impl/AvgQPS.java +++ b/src/main/java/org/aksw/iguana/cc/metrics/impl/AvgQPS.java @@ -22,7 +22,7 @@ public Number calculateTaskMetric(List workers, List workers, List (BigDecimal) this.calculateWorkerMetric(worker.config(), data[(int) worker.getWorkerID()])) .reduce(BigDecimal.ZERO, BigDecimal::add); - return sum; + return sum.stripTrailingZeros(); } @Override @@ -39,7 +39,7 @@ public Number calculateWorkerMetric(HttpWorker.Config worker, List workers, List data) { BigDecimal tt = (new BigDecimal(BigInteger.valueOf(totalTime.toNanos()), 9)); try { - return numberOfExecutions.divide(tt, 10, RoundingMode.HALF_UP); + return numberOfExecutions.divide(tt, 10, RoundingMode.HALF_UP).stripTrailingZeros(); } catch (ArithmeticException e) { return BigDecimal.ZERO; } diff --git a/src/main/java/org/aksw/iguana/cc/metrics/impl/QMPH.java b/src/main/java/org/aksw/iguana/cc/metrics/impl/QMPH.java index d2ae1914..ab60be12 100644 --- a/src/main/java/org/aksw/iguana/cc/metrics/impl/QMPH.java +++ b/src/main/java/org/aksw/iguana/cc/metrics/impl/QMPH.java @@ -22,7 +22,7 @@ public Number calculateTaskMetric(List workers, List (BigDecimal) this.calculateWorkerMetric(worker.config(), data[(int) worker.getWorkerID()])) .reduce(BigDecimal.ZERO, BigDecimal::add); - return sum; + return sum.stripTrailingZeros(); } @Override @@ -41,7 +41,7 @@ public Number calculateWorkerMetric(HttpWorker.Config worker, List data) { } BigDecimal tt = (new BigDecimal(BigInteger.valueOf(totalTime.toNanos()), 9)); try { - return successes.divide(tt, 10, RoundingMode.HALF_UP); + return successes.divide(tt, 10, RoundingMode.HALF_UP).stripTrailingZeros(); } catch (ArithmeticException e) { return BigDecimal.ZERO; } diff --git a/src/main/java/org/aksw/iguana/cc/query/handler/QueryHandler.java b/src/main/java/org/aksw/iguana/cc/query/handler/QueryHandler.java index 6930d3f1..eca7cbf6 100644 --- a/src/main/java/org/aksw/iguana/cc/query/handler/QueryHandler.java +++ b/src/main/java/org/aksw/iguana/cc/query/handler/QueryHandler.java @@ -17,6 +17,10 @@ import org.aksw.iguana.cc.query.source.impl.FileSeparatorQuerySource; import org.aksw.iguana.cc.query.source.impl.FolderQuerySource; import org.apache.jena.query.*; +import org.apache.jena.sparql.exec.http.QueryExecutionHTTP; +import org.apache.jena.sparql.exec.http.QueryExecutionHTTPBuilder; +import org.apache.jena.sparql.service.single.ServiceExecutor; +import org.apache.jena.sparql.service.single.ServiceExecutorHttp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -358,7 +362,7 @@ private static List instantiateTemplateQueries(QuerySource querySource, selectQueryString.setNsPrefixes(templateQuery.getPrefixMapping()); // send request to SPARQL endpoint and instantiate the template based on results - try (QueryExecution exec = QueryExecutionFactory.createServiceRequest(config.endpoint().toString(), selectQueryString.asQuery())) { + try (QueryExecution exec = QueryExecutionHTTP.service(config.endpoint().toString(), selectQueryString.asQuery())) { ResultSet resultSet = exec.execSelect(); if (!resultSet.hasNext()) { LOGGER.warn("No results for query template: {}", templateQueryString); diff --git a/src/main/java/org/aksw/iguana/cc/storage/impl/TriplestoreStorage.java b/src/main/java/org/aksw/iguana/cc/storage/impl/TriplestoreStorage.java index d391d3b2..cebb01ab 100644 --- a/src/main/java/org/aksw/iguana/cc/storage/impl/TriplestoreStorage.java +++ b/src/main/java/org/aksw/iguana/cc/storage/impl/TriplestoreStorage.java @@ -4,25 +4,20 @@ import org.aksw.iguana.cc.config.elements.StorageConfig; import org.aksw.iguana.cc.controller.MainController; import org.aksw.iguana.cc.storage.Storage; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.Credentials; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.client.HttpClient; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.apache.http.impl.client.HttpClients; import org.apache.jena.rdf.model.Model; import org.apache.jena.riot.Lang; import org.apache.jena.riot.RDFDataMgr; -import org.apache.jena.update.UpdateExecutionFactory; +import org.apache.jena.sparql.exec.http.UpdateExecutionHTTP; import org.apache.jena.update.UpdateFactory; import org.apache.jena.update.UpdateProcessor; import org.apache.jena.update.UpdateRequest; -import org.mortbay.jetty.Main; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.StringWriter; +import java.net.Authenticator; +import java.net.PasswordAuthentication; +import java.net.http.HttpClient; /** @@ -79,8 +74,7 @@ public void storeResult(Model data) { blockRequest.add(update); //submit Block to Triple Store - UpdateProcessor processor = UpdateExecutionFactory - .createRemote(blockRequest, endpoint, createHttpClient()); + UpdateProcessor processor = UpdateExecutionHTTP.service(endpoint).update(blockRequest).httpClient(createHttpClient()).build(); // If dry run is enabled, the data will not be sent to an existing triplestore, // therefore we catch the exception and log it instead of letting the program crash. @@ -99,15 +93,16 @@ public void storeResult(Model data) { } private HttpClient createHttpClient() { - CredentialsProvider credsProvider = new BasicCredentialsProvider(); + final var httpClient = HttpClient.newBuilder(); if(user != null && password != null){ - Credentials credentials = new UsernamePasswordCredentials(user, password); - credsProvider.setCredentials(AuthScope.ANY, credentials); + httpClient.authenticator(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(user, password.toCharArray()); + } + }); } - HttpClient httpclient = HttpClients.custom() - .setDefaultCredentialsProvider(credsProvider) - .build(); - return httpclient; + return httpClient.build(); } @Override