From 02ffc2eaa3fd31384f3f9b567f72f56390a05745 Mon Sep 17 00:00:00 2001 From: Barry Nouwt Date: Tue, 10 Sep 2024 10:41:26 +0200 Subject: [PATCH] Add (timeout) exceptions to exchange info. Add fail() to exceptions being catched in unit tests. --- .../impl/ReasonerProcessor.java | 68 +++++++++++++------ .../smartconnector/api/TestAskAnswer5.java | 9 --- ...etadataFromNormalKnowledgeInteraction.java | 31 ++++++--- .../smartconnector/api/TestPostReact.java | 1 + .../smartconnector/api/TestPostReact2.java | 3 +- .../smartconnector/api/TestPostReact3.java | 1 + .../api/TestPostReactPerformance.java | 3 +- .../api/TestPostRecipientSelector.java | 2 +- .../smartconnector/api/TestReactMetadata.java | 36 +++++----- .../engine/smartconnector/api/Thermostat.java | 13 +--- .../api/VariableBindingNameTest.java | 1 + 11 files changed, 98 insertions(+), 70 deletions(-) diff --git a/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/ReasonerProcessor.java b/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/ReasonerProcessor.java index 529286dd0..4dc05bb6e 100644 --- a/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/ReasonerProcessor.java +++ b/smart-connector/src/main/java/eu/knowledge/engine/smartconnector/impl/ReasonerProcessor.java @@ -19,6 +19,7 @@ import org.apache.jena.sparql.util.FmtUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.helpers.MessageFormatter; import eu.knowledge.engine.reasoner.BaseRule; import eu.knowledge.engine.reasoner.BaseRule.MatchStrategy; @@ -47,6 +48,7 @@ import eu.knowledge.engine.smartconnector.impl.KnowledgeInteractionInfo.Type; import eu.knowledge.engine.smartconnector.messaging.AnswerMessage; import eu.knowledge.engine.smartconnector.messaging.AskMessage; +import eu.knowledge.engine.smartconnector.messaging.KnowledgeMessage; import eu.knowledge.engine.smartconnector.messaging.PostMessage; import eu.knowledge.engine.smartconnector.messaging.ReactMessage; @@ -420,19 +422,22 @@ public CompletableFuture handle( Instant aPreviousSend = Instant.now(); bsFuture = sendAskMessage.exceptionally((Throwable t) -> { - LOG.warn("Error '{}' occurred while waiting for response to: {}", - t.getMessage() != null ? t.getMessage() : t.getClass().getSimpleName(), - askMessage.getMessageId()); + + String failedMessage = MessageFormatter + .basicArrayFormat("Error '{}' occurred while waiting for response to message: {}", + new String[] { + t.getMessage() != null ? t.getMessage() : t.getClass().getSimpleName(), + askMessage.getMessageId().toString() }); + + LOG.warn(failedMessage); LOG.debug("", t); - return null; + return ReasonerProcessor.this + .createFailedResponseMessageFromRequestMessage(askMessage, + failedMessage); }).thenApply((answerMessage) -> { + assert answerMessage != null; LOG.debug("Received ANSWER message from KI '{}'", answerMessage.getFromKnowledgeInteraction()); - BindingSet resultBindingSet = null; - if (answerMessage != null) - resultBindingSet = answerMessage.getBindings(); - - if (resultBindingSet == null) - resultBindingSet = new BindingSet(); + BindingSet resultBindingSet = answerMessage.getBindings(); ReasonerProcessor.this.askExchangeInfos .add(convertMessageToExchangeInfo(resultBindingSet, answerMessage, aPreviousSend)); @@ -450,6 +455,28 @@ public CompletableFuture handle( } return bsFuture; } + + } + + @SuppressWarnings("unchecked") + private S createFailedResponseMessageFromRequestMessage( + T incomingMessage, String failedMessage) { + + S outgoingMessage = null; + if (incomingMessage instanceof AskMessage) { + + outgoingMessage = (S) new AnswerMessage(incomingMessage.getToKnowledgeBase(), + incomingMessage.getToKnowledgeInteraction(), incomingMessage.getFromKnowledgeBase(), + incomingMessage.getFromKnowledgeInteraction(), incomingMessage.getMessageId(), failedMessage); + + } else if (incomingMessage instanceof PostMessage) { + outgoingMessage = (S) new AnswerMessage(incomingMessage.getToKnowledgeBase(), + incomingMessage.getToKnowledgeInteraction(), incomingMessage.getFromKnowledgeBase(), + incomingMessage.getFromKnowledgeInteraction(), incomingMessage.getMessageId(), failedMessage); + } + + assert outgoingMessage != null; + return outgoingMessage; } /** @@ -488,18 +515,19 @@ public CompletableFuture handle( .sendPostMessage(postMessage); Instant aPreviousSend = Instant.now(); bsFuture = sendPostMessage.exceptionally((Throwable t) -> { - LOG.warn("Error '{}' occurred while waiting for response to: {}", - t.getMessage() != null ? t.getMessage() : t.getClass().getSimpleName(), - postMessage.getMessageId()); + String failedMessage = MessageFormatter + .basicArrayFormat("Error '{}' occurred while waiting for response to message: {}", + new String[] { + t.getMessage() != null ? t.getMessage() : t.getClass().getSimpleName(), + postMessage.getMessageId().toString() }); + LOG.warn(failedMessage); LOG.debug("", t); - return null; + return ReasonerProcessor.this + .createFailedResponseMessageFromRequestMessage(postMessage, + failedMessage); }).thenApply((reactMessage) -> { - BindingSet resultBindingSet = null; - if (reactMessage != null) - resultBindingSet = reactMessage.getResult(); - - if (resultBindingSet == null) - resultBindingSet = new BindingSet(); + assert reactMessage != null; + BindingSet resultBindingSet = reactMessage.getResult(); ReasonerProcessor.this.postExchangeInfos.add( convertMessageToExchangeInfo(newBS, reactMessage.getResult(), reactMessage, aPreviousSend)); diff --git a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestAskAnswer5.java b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestAskAnswer5.java index c7529c3e0..50fc0d9da 100644 --- a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestAskAnswer5.java +++ b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestAskAnswer5.java @@ -21,15 +21,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.knowledge.engine.smartconnector.api.AnswerHandler; -import eu.knowledge.engine.smartconnector.api.AnswerKnowledgeInteraction; -import eu.knowledge.engine.smartconnector.api.AskExchangeInfo; -import eu.knowledge.engine.smartconnector.api.AskKnowledgeInteraction; -import eu.knowledge.engine.smartconnector.api.AskResult; -import eu.knowledge.engine.smartconnector.api.Binding; -import eu.knowledge.engine.smartconnector.api.BindingSet; -import eu.knowledge.engine.smartconnector.api.CommunicativeAct; -import eu.knowledge.engine.smartconnector.api.GraphPattern; import eu.knowledge.engine.smartconnector.util.KnowledgeNetwork; import eu.knowledge.engine.smartconnector.util.MockedKnowledgeBase; diff --git a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestMetadataFromNormalKnowledgeInteraction.java b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestMetadataFromNormalKnowledgeInteraction.java index fedc5d76a..de8ef3253 100644 --- a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestMetadataFromNormalKnowledgeInteraction.java +++ b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestMetadataFromNormalKnowledgeInteraction.java @@ -45,12 +45,24 @@ public void testPostReact() throws InterruptedException { var prefixes = new PrefixMappingMem(); prefixes.setNsPrefixes(PrefixMapping.Standard); prefixes.setNsPrefix("ke", Vocab.ONTO_URI); - var metaGraphPattern = new GraphPattern(prefixes, "?kb rdf:type ke:KnowledgeBase .", "?kb ke:hasName ?name .", - "?kb ke:hasDescription ?description .", "?kb ke:hasKnowledgeInteraction ?ki .", - "?ki rdf:type ?kiType .", "?ki ke:isMeta ?isMeta .", "?ki ke:hasCommunicativeAct ?act .", - "?act rdf:type ke:CommunicativeAct .", "?act ke:hasRequirement ?req .", - "?act ke:hasSatisfaction ?sat .", "?req rdf:type ?reqType .", "?sat rdf:type ?satType .", - "?ki ke:hasGraphPattern ?gp .", "?gp rdf:type ?patternType .", "?gp ke:hasPattern ?pattern ."); + var metaGraphPattern = new GraphPattern(prefixes, + // @formatter:off + "?kb rdf:type ke:KnowledgeBase .", + "?kb ke:hasName ?name .", + "?kb ke:hasDescription ?description .", + "?kb ke:hasKnowledgeInteraction ?ki .", + "?ki rdf:type ?kiType .", + "?ki ke:isMeta ?isMeta .", + "?ki ke:hasCommunicativeAct ?act .", + "?act rdf:type ke:CommunicativeAct .", + "?act ke:hasRequirement ?req .", + "?act ke:hasSatisfaction ?sat .", + "?req rdf:type ?reqType .", + "?sat rdf:type ?satType .", + "?ki ke:hasGraphPattern ?gp .", + "?gp rdf:type ?patternType .", + "?gp ke:hasPattern ?pattern ."); + // @formatter:on PostKnowledgeInteraction ki1 = new PostKnowledgeInteraction( new CommunicativeAct(new HashSet<>(Arrays.asList(Vocab.INFORM_PURPOSE)), new HashSet<>(Arrays.asList(Vocab.NEW_KNOWLEDGE_PURPOSE))), @@ -101,9 +113,9 @@ public void testPostReact() throws InterruptedException { binding.put("reqType", ""); binding.put("satType", ""); binding.put("gp", ""); - binding.put("patternType", "https://w3id.org/knowledge-engine/ArgumentGraphPattern"); + binding.put("patternType", ""); binding.put("pattern", - "?kb rdf:type kb:KnowledgeBase . ?kb kb:hasName ?name . ?kb kb:hasDescription ?description . ?kb kb:hasKnowledgeInteraction ?ki . ?ki rdf:type ?kiType . ?ki kb:isMeta ?isMeta . ?ki kb:hasCommunicativeAct ?act . ?act rdf:type kb:CommunicativeAct . ?act kb:hasRequirement ?req . ?act kb:hasSatisfaction ?sat . ?req rdf:type ?reqType . ?sat rdf:type ?satType . ?ki kb:hasGraphPattern ?gp . ?gp rdf:type ?patternType . ?gp kb:hasPattern ?pattern ."); + "\"?kb rdf:type kb:KnowledgeBase . ?kb kb:hasName ?name . ?kb kb:hasDescription ?description . ?kb kb:hasKnowledgeInteraction ?ki . ?ki rdf:type ?kiType . ?ki kb:isMeta ?isMeta . ?ki kb:hasCommunicativeAct ?act . ?act rdf:type kb:CommunicativeAct . ?act kb:hasRequirement ?req . ?act kb:hasSatisfaction ?sat . ?req rdf:type ?reqType . ?sat rdf:type ?satType . ?ki kb:hasGraphPattern ?gp . ?gp rdf:type ?patternType . ?gp kb:hasPattern ?pattern .\""); bindingSet.add(binding); try { @@ -115,7 +127,8 @@ public void testPostReact() throws InterruptedException { LOG.info("After post!"); } catch (Exception e) { - LOG.error("Erorr", e); + LOG.error("Error", e); + fail(); } } diff --git a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact.java b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact.java index 81e98c7aa..502a940e7 100644 --- a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact.java +++ b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact.java @@ -81,6 +81,7 @@ public void testPostReact() throws InterruptedException { LOG.info("After post!"); } catch (ExecutionException e) { LOG.error("Error", e); + fail(); } } diff --git a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact2.java b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact2.java index 6d65ad6d5..3d6f881ec 100644 --- a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact2.java +++ b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact2.java @@ -113,7 +113,8 @@ public void testPostReact() throws InterruptedException { LOG.info("After post!"); } catch (Exception e) { - LOG.error("Erorr", e); + LOG.error("Error", e); + fail(); } } diff --git a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact3.java b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact3.java index 25b8c8787..17b6345f7 100644 --- a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact3.java +++ b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReact3.java @@ -138,6 +138,7 @@ public void testPostReact() throws InterruptedException { assertEquals(expected, bs); } catch (Exception e) { LOG.error("Error", e); + fail(); } } diff --git a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReactPerformance.java b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReactPerformance.java index f1b3c5035..decf36c79 100644 --- a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReactPerformance.java +++ b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostReactPerformance.java @@ -93,7 +93,8 @@ public void testPostReact() throws InterruptedException { // }); } catch (Exception e) { - LOG.error("Erorr", e); + LOG.error("Error", e); + fail(); } } diff --git a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostRecipientSelector.java b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostRecipientSelector.java index 9bf1742e0..f9ce7e0bb 100644 --- a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostRecipientSelector.java +++ b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestPostRecipientSelector.java @@ -103,7 +103,7 @@ public void testPostReact() throws InterruptedException { LOG.info("After post!"); } catch (Exception e) { - LOG.error("Erorr", e); + LOG.error("Error", e); } } diff --git a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestReactMetadata.java b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestReactMetadata.java index 5502b8887..b0a19ef32 100644 --- a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestReactMetadata.java +++ b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/TestReactMetadata.java @@ -38,25 +38,23 @@ public void testRequestMetadata() throws InterruptedException { kn.sync(); - GraphPattern gp2 = new GraphPattern(prefixes, - """ - ?kb rdf:type kb:KnowledgeBase . - ?kb kb:hasName ?name . - ?kb kb:hasDescription ?description . - ?kb kb:hasKnowledgeInteraction ?ki . - ?ki rdf:type ?kiType . - ?ki kb:isMeta ?isMeta . - ?ki kb:hasCommunicativeAct ?act . - ?act rdf:type kb:CommunicativeAct . - ?act kb:hasRequirement ?req . - ?act kb:hasSatisfaction ?sat . - ?req rdf:type ?reqType . - ?sat rdf:type ?satType . - ?ki kb:hasGraphPattern ?gp . - ?gp rdf:type ?patternType . - ?gp kb:hasPattern ?pattern . - """ - ); + GraphPattern gp2 = new GraphPattern(prefixes, """ + ?kb rdf:type kb:KnowledgeBase . + ?kb kb:hasName ?name . + ?kb kb:hasDescription ?description . + ?kb kb:hasKnowledgeInteraction ?ki . + ?ki rdf:type ?kiType . + ?ki kb:isMeta ?isMeta . + ?ki kb:hasCommunicativeAct ?act . + ?act rdf:type kb:CommunicativeAct . + ?act kb:hasRequirement ?req . + ?act kb:hasSatisfaction ?sat . + ?req rdf:type ?reqType . + ?sat rdf:type ?satType . + ?ki kb:hasGraphPattern ?gp . + ?gp rdf:type ?patternType . + ?gp kb:hasPattern ?pattern . + """); var ki2 = new ReactKnowledgeInteraction(new CommunicativeAct(), gp2, null); kb2.register(ki2, new ReactHandler() { diff --git a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/Thermostat.java b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/Thermostat.java index 11d551f29..adbeb8d2b 100644 --- a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/Thermostat.java +++ b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/Thermostat.java @@ -1,5 +1,7 @@ package eu.knowledge.engine.smartconnector.api; +import static org.junit.jupiter.api.Assertions.fail; + import java.util.Iterator; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -9,19 +11,9 @@ import org.apache.jena.shared.PrefixMapping; import org.apache.jena.sparql.graph.PrefixMappingMem; -import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.knowledge.engine.smartconnector.api.Binding; -import eu.knowledge.engine.smartconnector.api.BindingSet; -import eu.knowledge.engine.smartconnector.api.CommunicativeAct; -import eu.knowledge.engine.smartconnector.api.GraphPattern; -import eu.knowledge.engine.smartconnector.api.PostKnowledgeInteraction; -import eu.knowledge.engine.smartconnector.api.ReactExchangeInfo; -import eu.knowledge.engine.smartconnector.api.ReactHandler; -import eu.knowledge.engine.smartconnector.api.ReactKnowledgeInteraction; -import eu.knowledge.engine.smartconnector.runtime.KeRuntime; import eu.knowledge.engine.smartconnector.util.KnowledgeNetwork; import eu.knowledge.engine.smartconnector.util.MockedKnowledgeBase; @@ -172,6 +164,7 @@ public void run() { } } catch (InterruptedException e) { LOG.debug("", e); + fail(); } } diff --git a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/VariableBindingNameTest.java b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/VariableBindingNameTest.java index 203840a67..bce7d769b 100644 --- a/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/VariableBindingNameTest.java +++ b/smart-connector/src/test/java/eu/knowledge/engine/smartconnector/api/VariableBindingNameTest.java @@ -150,6 +150,7 @@ public BindingSet react(ReactKnowledgeInteraction anRKI, ReactExchangeInfo aReac assertEquals("", b2.get("o2")); } catch (InterruptedException | ExecutionException e) { LOG.error("{}", e); + fail(); } }