From 2d45ca14832ba5fecb500a08426842cf04838577 Mon Sep 17 00:00:00 2001 From: Luca Roffia Date: Sun, 28 Apr 2024 16:59:19 +0200 Subject: [PATCH] feat: UUID class --- .../properties/SPARQL11Properties.java | 4 - .../wot/sepa/commons/sparql/Bindings.java | 1 - .../sepa/commons/sparql/BindingsResults.java | 89 +++--- .../wot/sepa/commons/sparql/RDFTerm.java | 2 +- .../arces/wot/sepa/commons/sparql/UUID.java | 17 ++ .../unibo/arces/wot/sepa/logging/Timings.java | 2 +- .../arces/wot/sepa/pattern/Aggregator.java | 8 +- .../it/unibo/arces/wot/sepa/pattern/JSAP.java | 272 +++++++++++++----- .../sepa/pattern/MultipleForcedBindings.java | 13 +- .../arces/wot/sepa/pattern/Producer.java | 14 +- .../arces/wot/sepa/ConfigurationProvider.java | 7 +- .../arces/wot/sepa/pattern/ITPattern.java | 7 +- engine/pom.xml | 30 -- .../engine/scheduling/ScheduledRequest.java | 2 +- engine/src/main/resources/log4j2-debug.xml | 8 +- engine/src/main/resources/log4j2.xml | 2 +- pom.xml | 29 ++ 17 files changed, 344 insertions(+), 163 deletions(-) create mode 100644 client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/UUID.java diff --git a/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/properties/SPARQL11Properties.java b/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/properties/SPARQL11Properties.java index 861dabb6..f18273ef 100644 --- a/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/properties/SPARQL11Properties.java +++ b/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/properties/SPARQL11Properties.java @@ -19,9 +19,7 @@ package it.unibo.arces.wot.sepa.commons.properties; import java.io.*; -import java.net.MalformedURLException; import java.net.URI; -import java.net.URL; import java.nio.file.Path; import java.util.Map; import java.util.Objects; @@ -141,8 +139,6 @@ public SPARQL11Properties(String args[]) { public SPARQL11Properties(String uri,String[] args) throws SEPAPropertiesException { this(); - Path path = Path.of(uri); - Reader in = getReaderFromUri(uri); parseJSAP(in); try { diff --git a/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/Bindings.java b/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/Bindings.java index fee03431..57de2e8c 100644 --- a/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/Bindings.java +++ b/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/Bindings.java @@ -26,7 +26,6 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; import it.unibo.arces.wot.sepa.commons.exceptions.SEPABindingsException; /** diff --git a/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/BindingsResults.java b/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/BindingsResults.java index 60ae5f52..e0111410 100644 --- a/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/BindingsResults.java +++ b/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/BindingsResults.java @@ -20,6 +20,8 @@ import java.util.ArrayList; import java.util.List; +import org.apache.logging.log4j.core.appender.rolling.action.IfAccumulatedFileCount; + import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -47,8 +49,7 @@ public class BindingsResults { /** * Instantiates a new bindings results. * - * @param results - * the results + * @param results the results */ public BindingsResults(JsonObject results) { this.results = results; @@ -57,10 +58,8 @@ public BindingsResults(JsonObject results) { /** * Instantiates a new bindings results. * - * @param varSet - * the var set - * @param solutions - * the solutions + * @param varSet the var set + * @param solutions the solutions */ public BindingsResults(ArrayList varSet, List solutions) { results = new JsonObject(); @@ -86,8 +85,7 @@ public BindingsResults(ArrayList varSet, List solutions) { /** * Instantiates a new bindings results. * - * @param newBindings - * the new bindings + * @param newBindings the new bindings */ public BindingsResults(BindingsResults newBindings) { results = new JsonObject(); @@ -113,12 +111,11 @@ public BindingsResults(BindingsResults newBindings) { public boolean isAskResult() { return (results.has("boolean") && results.has("head")); } - + public boolean getAskBoolean() { return results.get("boolean").getAsBoolean(); } - - + /** * Gets the variables. * @@ -180,7 +177,8 @@ public boolean isEmpty() { if (bindings == null) return true; if (bindings.size() == 1) { - if (bindings.get(0).getAsJsonObject().entrySet().isEmpty()) return true; + if (bindings.get(0).getAsJsonObject().entrySet().isEmpty()) + return true; } return (bindings.size() == 0); } @@ -188,8 +186,7 @@ public boolean isEmpty() { /** * Adds the. * - * @param binding - * the binding + * @param binding the binding */ public void add(Bindings binding) { if (binding == null) @@ -204,46 +201,66 @@ public void add(Bindings binding) { /** * Contains. * - * @param solution - * the solution + * @param solution the solution * @return true, if successful */ public boolean contains(Bindings solution) { +// JsonArray solutionSet = getBindingsArray(); +// JsonObject bindings = solution.toJson(); +// +// for (int i = 0; i < solutionSet.size(); i++) { +// JsonObject solutionX = solutionSet.get(i).getAsJsonObject(); +// boolean match = true; +// +// for (String key : bindings.keySet()) { +// if (!solutionX.has(key) || !solutionX.get(key).getAsString().equals(bindings.get(key).getAsString())) { +// match = false; +// break; +// } +// } +// +// if (match) { +// return true; +// } +// } +// return false; + if (solution == null) return false; JsonArray bindings = getBindingsArray(); - if (bindings == null) return false; + if (bindings == null) return false; + if (bindings.size() == 0) return false; + + if(getVariables().size() != solution.getVariables().size()) return false; + if(!getVariables().containsAll(solution.getVariables())) return false; + for (JsonElement b : bindings) { Bindings temp = new Bindings(b.getAsJsonObject()); - if (solution.getVariables().size() == temp.getVariables().size()) { - if(solution.getVariables().containsAll(temp.getVariables())) { - boolean found = true; - for(String var : solution.getVariables()) { - try { - // Comparing BNODE between two different queries is not possible - if (solution.isBNode(var) && temp.isBNode(var)) continue; - if(!solution.getRDFTerm(var).equals(temp.getRDFTerm(var))) { - found = false; - break; - } - } catch (SEPABindingsException e) { - Logging.logger.error(e.getMessage()); - return false; - } + boolean found = true; + for(String var : solution.getVariables()) { + try { + // Comparing BNODE between two different queries is not possible + if (solution.isBNode(var) && temp.isBNode(var)) continue; + if(!solution.getRDFTerm(var).equals(temp.getRDFTerm(var))) { + found = false; + break; } - if (found) return true; - } + } catch (SEPABindingsException e) { + Logging.logger.error(e.getMessage()); + return false; + } } + if (found) return true; } + return false; } /** * Removes the. * - * @param solution - * the solution + * @param solution the solution */ public void remove(Bindings solution) { if (solution == null) diff --git a/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/RDFTerm.java b/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/RDFTerm.java index 273e44ab..24490e29 100644 --- a/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/RDFTerm.java +++ b/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/RDFTerm.java @@ -31,7 +31,7 @@ public abstract class RDFTerm { protected JsonObject json = null; public boolean isURI() { - return this.getClass().equals(RDFTermURI.class); + return this.getClass().equals(RDFTermURI.class) || this.getClass().equals(UUID.class); } public boolean isLiteral() { diff --git a/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/UUID.java b/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/UUID.java new file mode 100644 index 00000000..1c352e8a --- /dev/null +++ b/client-api/src/main/java/it/unibo/arces/wot/sepa/commons/sparql/UUID.java @@ -0,0 +1,17 @@ +package it.unibo.arces.wot.sepa.commons.sparql; + +public class UUID extends RDFTermURI{ + public UUID() { + super("urn:uuid:"+java.util.UUID.randomUUID().toString()); + } + + @Override + public boolean equals(Object t) { + if (t == this) + return true; + if (!t.getClass().equals(UUID.class)) + return false; + + return this.getValue().equals(((UUID) t).getValue()); + } +} diff --git a/client-api/src/main/java/it/unibo/arces/wot/sepa/logging/Timings.java b/client-api/src/main/java/it/unibo/arces/wot/sepa/logging/Timings.java index 423fd4e1..c3ee695c 100644 --- a/client-api/src/main/java/it/unibo/arces/wot/sepa/logging/Timings.java +++ b/client-api/src/main/java/it/unibo/arces/wot/sepa/logging/Timings.java @@ -27,7 +27,7 @@ public static long getTime() { } public synchronized static void log(String tag,long start,long stop) { - String message = String.format("%d,%d,%s",System.currentTimeMillis(),stop-start,tag); + String message = String.format("%d,%d,%d,%d,%s",System.currentTimeMillis(),(stop-start)/1000000,(stop-start)/1000,stop-start,tag); org.apache.logging.log4j.Level level =Logging.getLevel("timing"); if(level==null) { //default diff --git a/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/Aggregator.java b/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/Aggregator.java index 77066ed9..e8f72c35 100644 --- a/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/Aggregator.java +++ b/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/Aggregator.java @@ -20,6 +20,7 @@ import it.unibo.arces.wot.sepa.commons.sparql.RDFTerm; import it.unibo.arces.wot.sepa.logging.Logging; +import it.unibo.arces.wot.sepa.logging.Timings; import it.unibo.arces.wot.sepa.api.SPARQL11Protocol; import it.unibo.arces.wot.sepa.commons.exceptions.SEPABindingsException; import it.unibo.arces.wot.sepa.commons.exceptions.SEPAPropertiesException; @@ -81,6 +82,7 @@ public final Response update(long timeout,long nRetry) throws SEPASecurityExcept public final Response multipleUpdate(long timeout,long nRetry) throws SEPASecurityException, SEPAPropertiesException, SEPABindingsException, SEPAProtocolException { + long start = Timings.getTime(); UpdateRequest req = new UpdateRequest(appProfile.getUpdateMethod(updateId), appProfile.getUpdateProtocolScheme(updateId), appProfile.getUpdateHost(updateId), appProfile.getUpdatePort(updateId), appProfile.getUpdatePath(updateId), @@ -88,7 +90,9 @@ public final Response multipleUpdate(long timeout,long nRetry) addDefaultDatatype(multipleForcedBindings.getBindings(), updateId, false)), appProfile.getUsingGraphURI(updateId), appProfile.getUsingNamedGraphURI(updateId), (appProfile.isSecure() ? appProfile.getAuthenticationProperties().getBearerAuthorizationHeader() : null), timeout,nRetry); - + long stop = Timings.getTime(); + Timings.log("multipleUpdate create UpdateRequest", start, stop); + Logging.logger.trace(req); Response retResponse = sparql11.update(req); @@ -108,6 +112,6 @@ public final void setUpdateBindingValue(String variable, RDFTerm value) throws S } public final void setUpdateMultipleBindings(ArrayList variables, ArrayList> values) throws SEPABindingsException { - multipleForcedBindings.setUpdateBindings(variables,values); + multipleForcedBindings.add(variables,values); } } diff --git a/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/JSAP.java b/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/JSAP.java index b6b5eabf..3cb28469 100644 --- a/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/JSAP.java +++ b/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/JSAP.java @@ -27,6 +27,26 @@ import java.util.Map.Entry; import org.apache.commons.lang.StringEscapeUtils; +import org.apache.jena.atlas.io.IndentedLineBuffer; +import org.apache.jena.atlas.io.IndentedWriter; +import org.apache.jena.query.QueryParseException; +import org.apache.jena.sparql.graph.PrefixMappingMem; +import org.apache.jena.sparql.modify.request.UpdateAdd; +import org.apache.jena.sparql.modify.request.UpdateClear; +import org.apache.jena.sparql.modify.request.UpdateCopy; +import org.apache.jena.sparql.modify.request.UpdateCreate; +import org.apache.jena.sparql.modify.request.UpdateDataDelete; +import org.apache.jena.sparql.modify.request.UpdateDataInsert; +import org.apache.jena.sparql.modify.request.UpdateDeleteWhere; +import org.apache.jena.sparql.modify.request.UpdateDrop; +import org.apache.jena.sparql.modify.request.UpdateLoad; +import org.apache.jena.sparql.modify.request.UpdateModify; +import org.apache.jena.sparql.modify.request.UpdateMove; +import org.apache.jena.sparql.modify.request.UpdateWriterVisitor; +import org.apache.jena.sparql.serializer.SerializationContext; +import org.apache.jena.update.Update; +import org.apache.jena.update.UpdateFactory; +import org.apache.jena.update.UpdateRequest; import com.google.gson.Gson; import com.google.gson.JsonArray; @@ -50,6 +70,7 @@ import it.unibo.arces.wot.sepa.commons.sparql.RDFTermLiteral; import it.unibo.arces.wot.sepa.commons.sparql.RDFTermURI; import it.unibo.arces.wot.sepa.logging.Logging; +import it.unibo.arces.wot.sepa.logging.Timings; import it.unibo.arces.wot.sepa.pattern.JSAPPrimitive.ForcedBinding; /** @@ -172,7 +193,8 @@ */ public class JSAP extends SPARQL11SEProperties { private static Set numbersOrBoolean = new HashSet(); - private String prefixes = ""; + private PrefixMappingMem prefixes; + // private String prefixes = ""; // Members protected HashMap queries = null;// new HashMap(); @@ -180,7 +202,8 @@ public class JSAP extends SPARQL11SEProperties { protected HashMap namespaces = new HashMap(); protected JsonObject extended = null;// new JsonObject(); protected JsonArray include = null; // new JsonArray() - + private String prologue; + private void defaultNamespaces() { // Numbers or boolean numbersOrBoolean.add("xsd:integer"); @@ -194,7 +217,8 @@ private void defaultNamespaces() { numbersOrBoolean.add("http://www.w3.org/2001/XMLSchema#boolean"); // Default namespaces - if (namespaces == null) namespaces = new HashMap(); + if (namespaces == null) + namespaces = new HashMap(); namespaces.put("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); namespaces.put("rdfs", "http://www.w3.org/2000/01/rdf-schema#"); namespaces.put("owl", "http://www.w3.org/2002/07/owl#"); @@ -202,12 +226,14 @@ private void defaultNamespaces() { } public JSAP(String uri) throws SEPAPropertiesException, SEPASecurityException { - this(uri,null); + this(uri, null); } - public JSAP(String uri,String[] args) throws SEPAPropertiesException, SEPASecurityException { + public JSAP(String uri, String[] args) throws SEPAPropertiesException, SEPASecurityException { super(uri); + prefixes = new PrefixMappingMem(); + load(uri, true); override(args); @@ -220,7 +246,7 @@ public JSAP(String uri,String[] args) throws SEPAPropertiesException, SEPASecuri private void load(String uri, boolean replace) throws SEPAPropertiesException, SEPASecurityException { read(uri, replace); - //Include + // Include ArrayList uriList = new ArrayList<>(); if (include != null) { @@ -234,17 +260,19 @@ private void load(String uri, boolean replace) throws SEPAPropertiesException, S Path path; try { path = Path.of(child); - } - catch (InvalidPathException e) { - load(child,false); + } catch (InvalidPathException e) { + load(child, false); continue; } - if(path.isAbsolute()) load(child,false); + if (path.isAbsolute()) + load(child, false); else { Path childPath = Path.of(uri); - if (childPath.getParent()!= null) load (childPath.getParent().toString()+File.separator+child,false); - else load(child,false); + if (childPath.getParent() != null) + load(childPath.getParent().toString() + File.separator + child, false); + else + load(child, false); } } @@ -278,7 +306,7 @@ public void read(Reader in, boolean replace) { */ public void read(String uri, boolean replace) throws SEPAPropertiesException { Reader in = getReaderFromUri(uri); - read(in,replace); + read(in, replace); try { in.close(); } catch (IOException e) { @@ -287,26 +315,32 @@ public void read(String uri, boolean replace) throws SEPAPropertiesException { } public void read(String filename) throws SEPAPropertiesException, SEPASecurityException { - read(filename,true); + read(filename, true); } private void merge(JSAP temp) { host = (temp.host != null ? temp.host : this.host); - if (sparql11protocol != null) sparql11protocol.merge(temp.sparql11protocol); - else sparql11protocol = temp.sparql11protocol; - if (sparql11seprotocol != null) sparql11seprotocol.merge(temp.sparql11seprotocol); - else sparql11seprotocol = temp.sparql11seprotocol; - if (graphs != null) graphs.merge(temp.graphs); - else graphs = temp.graphs; - + if (sparql11protocol != null) + sparql11protocol.merge(temp.sparql11protocol); + else + sparql11protocol = temp.sparql11protocol; + if (sparql11seprotocol != null) + sparql11seprotocol.merge(temp.sparql11seprotocol); + else + sparql11seprotocol = temp.sparql11seprotocol; + if (graphs != null) + graphs.merge(temp.graphs); + else + graphs = temp.graphs; + extended = mergeExtended(extended, temp.extended); namespaces = mergeNamespaces(namespaces, temp.namespaces); queries = mergeQueries(queries, temp.queries); updates = mergeUpdates(updates, temp.updates); } - private JsonObject mergeExtended(JsonObject extended,JsonObject temp) { + private JsonObject mergeExtended(JsonObject extended, JsonObject temp) { if (extended == null) return temp; if (temp == null) @@ -336,7 +370,8 @@ private JsonObject mergeExtended(JsonObject extended,JsonObject temp) { return extended; } - private HashMap mergeUpdates(HashMap jsap, HashMap temp) { + private HashMap mergeUpdates(HashMap jsap, + HashMap temp) { if (jsap == null) return temp; if (temp == null) @@ -345,7 +380,8 @@ private HashMap mergeUpdates(HashMap mergeQueries(HashMap jsap, HashMap temp) { + private HashMap mergeQueries(HashMap jsap, + HashMap temp) { if (jsap == null) return temp; if (temp == null) @@ -368,7 +404,7 @@ public JsonObject getExtendedData() { } // TODO: add the query as parameter and get just the namespaces required - public String getPrefixes() { + public PrefixMappingMem getPrefixes() { return prefixes; } @@ -377,11 +413,20 @@ public HashMap getNamespaces() { } private void buildSPARQLPrefixes() { - prefixes = ""; - if (namespaces == null) return; + // prefixes = ""; + if (namespaces == null) + return; for (String prefix : namespaces.keySet()) { - prefixes += "PREFIX " + prefix + ":<" + namespaces.get(prefix) + "> "; + prefixes.setNsPrefix(prefix, namespaces.get(prefix)); + // prefixes += "PREFIX " + prefix + ":<" + namespaces.get(prefix) + "> "; + } + Logging.logger.trace("Prefixes map: " + prefixes.toString()); + prologue = ""; + for (String pre : getPrefixes().getNsPrefixMap().keySet()) { + prologue += "PREFIX " + pre + ":<" + getPrefixes().getNsPrefixURI(pre) + "> "; } + Logging.logger.trace("Prefixes SPARQL: " + prologue); + } public OAuthProperties getAuthenticationProperties() { @@ -455,7 +500,8 @@ public Set getUsingNamedGraphURI(String id) { try { return updates.get(id).graphs.using_named_graph_uri; } catch (Exception e) { - if (graphs == null) return null; + if (graphs == null) + return null; return graphs.using_named_graph_uri; } } @@ -464,7 +510,8 @@ public Set getUsingGraphURI(String id) { try { return updates.get(id).graphs.using_graph_uri; } catch (Exception e) { - if (graphs == null) return null; + if (graphs == null) + return null; return graphs.using_graph_uri; } } @@ -581,7 +628,8 @@ public Set getNamedGraphURI(String id) { try { return queries.get(id).graphs.named_graph_uri; } catch (Exception e) { - if (graphs == null) return null; + if (graphs == null) + return null; return graphs.named_graph_uri; } } @@ -590,7 +638,8 @@ public Set getDefaultGraphURI(String id) { try { return queries.get(id).graphs.default_graph_uri; } catch (Exception e) { - if (graphs == null) return null; + if (graphs == null) + return null; return graphs.default_graph_uri; } } @@ -603,25 +652,25 @@ public void setSPARQLQuery(String id, String sparql) { public void setQueryHost(String id, String host) { if (queries.get(id) == null) return; - queries.get(id).sparql11protocol.host= host; + queries.get(id).sparql11protocol.host = host; } public void setQueryAcceptHeader(String id, QueryResultsFormat format) { if (queries.get(id) == null) return; - queries.get(id).sparql11protocol.query.format=format; + queries.get(id).sparql11protocol.query.format = format; } public void setQueryMethod(String id, QueryHTTPMethod method) { if (queries.get(id) == null) return; - queries.get(id).sparql11protocol.query.method= method; + queries.get(id).sparql11protocol.query.method = method; } public void setQueryProtocolScheme(String id, ProtocolScheme scheme) { if (queries.get(id) == null) return; - queries.get(id).sparql11protocol.protocol= scheme; + queries.get(id).sparql11protocol.protocol = scheme; } public void setQueryPath(String id, String path) { @@ -670,7 +719,8 @@ public void setSubscribeHost(String id, String host) { public int getSubscribePort(String id) { try { - return queries.get(id).sparql11seprotocol.availableProtocols.get(queries.get(id).sparql11seprotocol.protocol).port; + return queries.get(id).sparql11seprotocol.availableProtocols + .get(queries.get(id).sparql11seprotocol.protocol).port; } catch (Exception e) { return sparql11seprotocol.getPort(); } @@ -681,12 +731,14 @@ public void setSubscribePort(String id, int port) { return; // if (queries.get(id).sparql11seprotocol == null) // queries.get(id).sparql11seprotocol = new SPARQL11SEProperties(); - queries.get(id).sparql11seprotocol.availableProtocols.get(queries.get(id).sparql11seprotocol.protocol).port = port; + queries.get(id).sparql11seprotocol.availableProtocols + .get(queries.get(id).sparql11seprotocol.protocol).port = port; } public String getSubscribePath(String id) { try { - return queries.get(id).sparql11seprotocol.availableProtocols.get(queries.get(id).sparql11seprotocol.protocol).path; + return queries.get(id).sparql11seprotocol.availableProtocols + .get(queries.get(id).sparql11seprotocol.protocol).path; } catch (Exception e) { return sparql11seprotocol.getPath(); } @@ -697,7 +749,8 @@ public void setSubscribePath(String id, String path) { return; // if (queries.get(id).sparql11seprotocol == null) // queries.get(id).sparql11seprotocol = new SPARQL11SEProperties(); - queries.get(id).sparql11seprotocol.availableProtocols.get(queries.get(id).sparql11seprotocol.protocol).path = path; + queries.get(id).sparql11seprotocol.availableProtocols + .get(queries.get(id).sparql11seprotocol.protocol).path = path; } public SubscriptionProtocolProperties getSubscribeProtocol(String id) { @@ -808,21 +861,21 @@ public MultipleForcedBindings getUpdateMultipleBindings(String id) throws Illega String value = binding.getValue().value; switch (binding.getValue().type) { - case "literal": - String datatype = (binding.getValue().datatype == null ? null : binding.getValue().datatype); - String language = (binding.getValue().language == null ? null : binding.getValue().language); - - bindingValue = new RDFTermLiteral(value, datatype, language); - break; - case "uri": - bindingValue = new RDFTermURI(value); - break; - case "bnode": - bindingValue = new RDFTermBNode(value); - break; - default: - Logging.logger.error("JSAP unknown type: " + binding); - continue; + case "literal": + String datatype = (binding.getValue().datatype == null ? null : binding.getValue().datatype); + String language = (binding.getValue().language == null ? null : binding.getValue().language); + + bindingValue = new RDFTermLiteral(value, datatype, language); + break; + case "uri": + bindingValue = new RDFTermURI(value); + break; + case "bnode": + bindingValue = new RDFTermBNode(value); + break; + default: + Logging.logger.error("JSAP unknown type: " + binding); + continue; } ret.addBinding(binding.getKey(), bindingValue); @@ -833,6 +886,7 @@ public MultipleForcedBindings getUpdateMultipleBindings(String id) throws Illega return ret; } + public ForcedBindings getQueryBindings(String id) throws IllegalArgumentException { if (queries.get(id) == null) throw new IllegalArgumentException("Query ID not found: " + id); @@ -903,7 +957,8 @@ public String getSubscribeUrl(String id) throws IllegalArgumentException { if (queries.get(id) == null) throw new IllegalArgumentException("Subscribe ID not found: " + id); - String scheme = queries.get(id).sparql11seprotocol.availableProtocols.get(queries.get(id).sparql11seprotocol.protocol).scheme; + String scheme = queries.get(id).sparql11seprotocol.availableProtocols + .get(queries.get(id).sparql11seprotocol.protocol).scheme; String port = ""; if (getSubscribePort(id) != -1) @@ -923,11 +978,78 @@ public String getSubscribeUrl(String id) throws IllegalArgumentException { */ public String addPrefixesAndReplaceBindings(String sparql, Bindings bindings) throws SEPABindingsException { - return prefixes + replaceBindings(sparql, bindings); + /* + * Direct Known Subclasses: + * + * UpdateBinaryOp, UpdateCreate, UpdateData, UpdateDeleteWhere, UpdateDropClear, + * UpdateLoad, UpdateWithUsing + * + */ + String ret = ""; + + try { + UpdateRequest request = UpdateFactory.create(); + request.setPrefixMapping(prefixes); + UpdateFactory.parse(request, replaceBindings(sparql, bindings)); + IndentedWriter writer = new IndentedLineBuffer(); + UpdateWriterVisitor visitor = new UpdateWriterVisitor(writer, new SerializationContext()); + + for (Update upd : request.getOperations()) { + String prologue = ""; + + if (upd instanceof UpdateDataDelete) + visitor.visit((UpdateDataDelete) upd); + else if (upd instanceof UpdateDataInsert) + visitor.visit((UpdateDataInsert) upd); + else if (upd instanceof UpdateDeleteWhere) + visitor.visit((UpdateDeleteWhere) upd); + + else if (upd instanceof UpdateDrop) + visitor.visit((UpdateDrop) upd); + else if (upd instanceof UpdateMove) + visitor.visit((UpdateMove) upd); + else if (upd instanceof UpdateClear) + visitor.visit((UpdateClear) upd); + else if (upd instanceof UpdateLoad) + visitor.visit((UpdateLoad) upd); + + else if (upd instanceof UpdateAdd) + visitor.visit((UpdateAdd) upd); + else if (upd instanceof UpdateCopy) + visitor.visit((UpdateCopy) upd); + else if (upd instanceof UpdateCreate) + visitor.visit((UpdateCreate) upd); + else if (upd instanceof UpdateModify) + visitor.visit((UpdateModify) upd); + + if (upd instanceof UpdateAdd || upd instanceof UpdateDataDelete || upd instanceof UpdateDataInsert + || upd instanceof UpdateDeleteWhere) { + prologue = extractPrologue(null); + } + + if (ret.equals("")) { + ret = prologue + writer.toString(); + } else { + ret += ";" + prologue + writer.toString(); + } + } + + } catch (QueryParseException ex) { + ret = extractPrologue(null) + replaceBindings(sparql, bindings); + } + + return ret; + } + + private String extractPrologue(Update upd) { + if (upd == null) + return prologue; + return null; } - public String addPrefixesAndReplaceMultipleBindings(String sparql, ArrayList bindings) throws SEPABindingsException { - return prefixes + replaceMultipleBindings(sparql, bindings); + public String addPrefixesAndReplaceMultipleBindings(String sparql, ArrayList bindings) + throws SEPABindingsException { + return extractPrologue(null) + replaceMultipleBindings(sparql, bindings); } // TODO: use Jena? @@ -1102,24 +1224,28 @@ public static final String replaceBindings(String sparql, Bindings bindings) thr return replacedSparql; } - public static final String replaceMultipleBindings(String sparql, ArrayList multipleBindings) throws SEPABindingsException { + public static final String replaceMultipleBindings(String sparql, ArrayList multipleBindings) + throws SEPABindingsException { + long start = Timings.getTime(); if (multipleBindings == null || sparql == null) return sparql; - if (multipleBindings.isEmpty()) return sparql; + if (multipleBindings.isEmpty()) + return sparql; ArrayList vars = new ArrayList<>(); vars.addAll(multipleBindings.get(0).getVariables()); ArrayList> allValues = new ArrayList<>(); - for(Bindings bindings : multipleBindings) { + for (Bindings bindings : multipleBindings) { ArrayList values = new ArrayList(); for (String var : vars) { String value = bindings.getValue(var); if (value == null) { // https://www.w3.org/TR/sparql11-query/#inline-data - // If a variable has no value for a particular solution in the VALUES clause, the keyword UNDEF is used instead of an RDF term. + // If a variable has no value for a particular solution in the VALUES clause, + // the keyword UNDEF is used instead of an RDF term. values.add("UNDEF"); continue; } @@ -1237,26 +1363,30 @@ public static final String replaceMultipleBindings(String sparql, ArrayList values: allValues) { + for (ArrayList values : allValues) { VALUES += "("; for (String value : values) { - VALUES += value+" "; + VALUES += value + " "; } VALUES += ")"; } VALUES += "}"; int end = replacedSparql.lastIndexOf("}"); - return replacedSparql.substring(0,end) + " VALUES "+VARS+VALUES+"}"; + + String ret = replacedSparql.substring(0, end) + " VALUES " + VARS + VALUES + "}"; + long stop = Timings.getTime(); + Timings.log("replaceMultipleBindings", start, stop); + return ret; } private static boolean isValidVarChar(int c) { diff --git a/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/MultipleForcedBindings.java b/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/MultipleForcedBindings.java index 0ff09fd5..e917c18a 100644 --- a/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/MultipleForcedBindings.java +++ b/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/MultipleForcedBindings.java @@ -6,6 +6,7 @@ import it.unibo.arces.wot.sepa.commons.sparql.RDFTerm; import java.util.ArrayList; +import java.util.List; public class MultipleForcedBindings extends ForcedBindings { ArrayList multipleForcedBindings; @@ -19,8 +20,13 @@ public MultipleForcedBindings() { super(); multipleForcedBindings = new ArrayList(); } + + public MultipleForcedBindings(ArrayList bindings) { + super(); + multipleForcedBindings = bindings; + } - public final void setUpdateBindings(ArrayList variables, ArrayList> values) throws SEPABindingsException { + public final void add(ArrayList variables, ArrayList> values) throws SEPABindingsException { for(ArrayList value:values) { Bindings b = new Bindings(); for(int i=0; i < variables.size(); i++) { @@ -29,6 +35,11 @@ public final void setUpdateBindings(ArrayList variables, ArrayList b) throws SEPABindingsException { + multipleForcedBindings.addAll(b); + + } public final ArrayList getBindings() { return multipleForcedBindings; diff --git a/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/Producer.java b/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/Producer.java index 7ad54e1f..c9c48451 100644 --- a/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/Producer.java +++ b/client-api/src/main/java/it/unibo/arces/wot/sepa/pattern/Producer.java @@ -19,8 +19,8 @@ package it.unibo.arces.wot.sepa.pattern; import java.io.IOException; -import java.lang.reflect.Array; import java.util.ArrayList; +import java.util.List; import it.unibo.arces.wot.sepa.commons.sparql.Bindings; import it.unibo.arces.wot.sepa.commons.sparql.RDFTerm; @@ -32,7 +32,6 @@ import it.unibo.arces.wot.sepa.commons.exceptions.SEPASecurityException; import it.unibo.arces.wot.sepa.commons.request.UpdateRequest; import it.unibo.arces.wot.sepa.commons.response.Response; -import org.apache.commons.rdf.api.RDF; public class Producer extends Client implements IProducer { protected String sparqlUpdate = null; @@ -118,7 +117,14 @@ public final void setUpdateBindingValue(String variable, RDFTerm value) throws S forcedBindings.setBindingValue(variable, value); } - public final void setUpdateMultipleBindings(ArrayList variables, ArrayList> values) throws SEPABindingsException { - multipleForcedBindings.setUpdateBindings(variables,values); + public final void setUpdateMultipleBindings(MultipleForcedBindings b) throws SEPABindingsException { + multipleForcedBindings = b; + } + public final void addUpdateMultipleBindings(ArrayList variables, ArrayList> values) throws SEPABindingsException { + multipleForcedBindings.add(variables,values); + } + + public final void addUpdateMultipleBindings(List b) throws SEPABindingsException { + multipleForcedBindings.add(b); } } diff --git a/client-api/src/test/java/it/unibo/arces/wot/sepa/ConfigurationProvider.java b/client-api/src/test/java/it/unibo/arces/wot/sepa/ConfigurationProvider.java index b3810c39..f6fe6c9d 100644 --- a/client-api/src/test/java/it/unibo/arces/wot/sepa/ConfigurationProvider.java +++ b/client-api/src/test/java/it/unibo/arces/wot/sepa/ConfigurationProvider.java @@ -15,7 +15,6 @@ import java.io.Closeable; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.UUID; @@ -58,7 +57,11 @@ public ConfigurationProvider() throws SEPAPropertiesException, SEPASecurityExcep throw new RuntimeException(e); } - prefixes = appProfile.getPrefixes(); + prefixes = ""; + for(String pre : appProfile.getPrefixes().getNsPrefixMap().keySet()) { + prefixes += "PREFIX "+pre+":<"+appProfile.getPrefixes().getNsPrefixURI(pre)+"> "; + } + try { TIMEOUT = appProfile.getExtendedData().get("timeout").getAsLong(); diff --git a/client-api/src/test/java/it/unibo/arces/wot/sepa/pattern/ITPattern.java b/client-api/src/test/java/it/unibo/arces/wot/sepa/pattern/ITPattern.java index 2cdf4354..0dc7706b 100644 --- a/client-api/src/test/java/it/unibo/arces/wot/sepa/pattern/ITPattern.java +++ b/client-api/src/test/java/it/unibo/arces/wot/sepa/pattern/ITPattern.java @@ -1,12 +1,11 @@ package it.unibo.arces.wot.sepa.pattern; -import it.unibo.arces.wot.sepa.AggregatorTestUnit; -import it.unibo.arces.wot.sepa.ConsumerTestUnit; -import it.unibo.arces.wot.sepa.Sync; - import org.junit.jupiter.api.*; +import it.unibo.arces.wot.sepa.AggregatorTestUnit; import it.unibo.arces.wot.sepa.ConfigurationProvider; +import it.unibo.arces.wot.sepa.ConsumerTestUnit; +import it.unibo.arces.wot.sepa.Sync; import it.unibo.arces.wot.sepa.commons.exceptions.SEPABindingsException; import it.unibo.arces.wot.sepa.commons.exceptions.SEPAPropertiesException; import it.unibo.arces.wot.sepa.commons.exceptions.SEPAProtocolException; diff --git a/engine/pom.xml b/engine/pom.xml index a1cc25a8..9dab3ea5 100644 --- a/engine/pom.xml +++ b/engine/pom.xml @@ -109,36 +109,6 @@ - - - org.apache.jena - apache-jena-libs - 4.9.0 - pom - - - org.slf4j - jcl-over-slf4j - - - org.slf4j - slf4j-api - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-databind - - - org.glassfish - jakarta.json - - - - org.apache.httpcomponents diff --git a/engine/src/main/java/it/unibo/arces/wot/sepa/engine/scheduling/ScheduledRequest.java b/engine/src/main/java/it/unibo/arces/wot/sepa/engine/scheduling/ScheduledRequest.java index db25c035..79a040d9 100644 --- a/engine/src/main/java/it/unibo/arces/wot/sepa/engine/scheduling/ScheduledRequest.java +++ b/engine/src/main/java/it/unibo/arces/wot/sepa/engine/scheduling/ScheduledRequest.java @@ -37,7 +37,7 @@ public ScheduledRequest(int token,InternalRequest request,ResponseHandler handle @Override public String toString() { - return "REQUEST #"+token; + return "REQUEST #"+token+ (request.isQueryRequest() ? " QUERY" : request.isUpdateRequest() ? " UPDATE" : request.isSubscribeRequest() ? " SUBSCRIBE" : " UNSUBSCRIBE"); } public int getToken() { diff --git a/engine/src/main/resources/log4j2-debug.xml b/engine/src/main/resources/log4j2-debug.xml index 504bca13..8cd18d18 100644 --- a/engine/src/main/resources/log4j2-debug.xml +++ b/engine/src/main/resources/log4j2-debug.xml @@ -9,10 +9,10 @@ Change the following to enable different loggging levels --> - - + + - + @@ -29,7 +29,7 @@ - + diff --git a/engine/src/main/resources/log4j2.xml b/engine/src/main/resources/log4j2.xml index 43360691..9120e0bb 100644 --- a/engine/src/main/resources/log4j2.xml +++ b/engine/src/main/resources/log4j2.xml @@ -30,7 +30,7 @@ - + diff --git a/pom.xml b/pom.xml index 1d5f6c33..601f0fa5 100644 --- a/pom.xml +++ b/pom.xml @@ -145,6 +145,35 @@ https://http://wot.arces.unibo.it/ + + + org.apache.jena + apache-jena-libs + 4.9.0 + pom + + + org.slf4j + jcl-over-slf4j + + + org.slf4j + slf4j-api + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + org.glassfish + jakarta.json + + + org.apache.logging.log4j log4j-api