Skip to content

Commit

Permalink
Merge pull request #32 from rwth-acis/release/1.2.3
Browse files Browse the repository at this point in the history
Release/1.2.3
  • Loading branch information
AlexanderNeumann authored Sep 15, 2022
2 parents 5596a08 + 9ce3005 commit c91f670
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package i5.las2peer.services.mobsos.dataProcessing;

import java.io.Serializable;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
Expand Down Expand Up @@ -129,6 +133,7 @@ private boolean processMessages(MonitoringMessage[] messages) {
boolean returnStatement = true;
int counter = 0;
botMessages = new ArrayList<BotMessage>();
HashMap<String, JSONObject> webhookCalls = new HashMap<>();
for (MonitoringMessage message : messages) {
// Happens when a node has sent its last messages
if (message == null) {
Expand Down Expand Up @@ -272,9 +277,19 @@ else if (Math.abs(message.getEvent().getCode()) >= 7000
//}
JSONParser p = new JSONParser(JSONParser.MODE_PERMISSIVE);
try {
Object jo = p.parse(message.getRemarks());
if (jo instanceof JSONObject) {
String function = ((JSONObject) jo).getAsString("functionName");
Object obj = p.parse(message.getRemarks());
if (obj instanceof JSONObject) {
JSONObject jsonObj = (JSONObject) obj;

// check if the monitoring message should trigger a webhook call
if(jsonObj.containsKey("webhook")) {
JSONObject webhook = (JSONObject) jsonObj.get("webhook");
String url = webhook.getAsString("url");
JSONObject payload = (JSONObject) webhook.get("payload");
webhookCalls.put(url, payload);
}

String function = jsonObj.getAsString("functionName");
if (function != null && hasBot() && triggerFunctions.contains(function.toLowerCase())) {
BotMessage m = new BotMessage(message.getTimestamp(), message.getEvent(),
message.getSourceNode(), message.getSourceAgentId(),
Expand Down Expand Up @@ -361,6 +376,28 @@ else if (Math.abs(message.getEvent().getCode()) >= 7000
e.printStackTrace();
}
}

// perform webhook calls
if(!webhookCalls.isEmpty()) {
HttpClient client = HttpClient.newHttpClient();
for (Map.Entry<String, JSONObject> entry : webhookCalls.entrySet()) {
String url = entry.getKey();
JSONObject payload = entry.getValue();

HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.POST(HttpRequest.BodyPublishers.ofString(payload.toJSONString()))
.build();

try {
client.send(request,
HttpResponse.BodyHandlers.ofString());
} catch (Exception e) {
System.out.println("Unable to call webhook");
}
}
}

System.out.println((messages.length - counter) + "/" + messageCount + " messages were handled.");
return returnStatement;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import java.sql.Statement;
import java.util.Properties;

import i5.las2peer.connectors.webConnector.WebConnector;
import net.minidev.json.JSONObject;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
Expand Down Expand Up @@ -55,6 +57,8 @@ public class MobSOSDataProcessingServiceTest {
private final static String dNode = "1234567891022";
private final static String sAgent = "c4ca4238a0b923820dcc509a6f75849b"; // md5 for 1

private static WebConnector connector;

@BeforeClass
public static void setUpDatabase() {
Properties prop = new Properties();
Expand Down Expand Up @@ -101,11 +105,22 @@ public void startServer() throws Exception {
testService.unlock("a pass");

node.registerReceiver(testService);

node.startService(new ServiceNameVersion(WebhookTestService.class.getName(), "1.0.0"), "a pass");

// start connector
connector = new WebConnector(true, 0, false, 0); // port 0 means use system defined port
connector.start(node);
}

@After
public void stopNetwork() {
try {
if (connector != null) {
connector.stop();
connector = null;
}

System.out.println("stopping test network...");
node.shutDown();
} catch (Exception e) {
Expand Down Expand Up @@ -238,4 +253,42 @@ public void testDefaultStartup() {
}
}

/**
* Test to verify that specific monitoring messages trigger a webhook call.
* Uses a helper las2peer service that receives the webhook call.
*/
@Test
public void testWebhookCallMessage() {
// create message content
JSONObject messageContent = new JSONObject();
JSONObject webhook = new JSONObject();
webhook.put("url", connector.getHttpEndpoint() + "/webhooktestservice/webhook");
webhook.put("payload", new JSONObject());
messageContent.put("webhook", webhook);

// create monitoring message
MonitoringMessage msg = new MonitoringMessage((long) 1376750476, MonitoringEvent.SERVICE_CUSTOM_MESSAGE_1,
sNode, "1", dNode, "2", messageContent.toJSONString());

// verify that no webhook has been delivered until now
assertEquals(false, WebhookTestService.webhookDelivered);

try {
// get monitoring agent
Object result = node.invoke(testService, testServiceClass, "getReceivingAgentId", new Serializable[] { "Test" });
MonitoringAgent mAgent = (MonitoringAgent) node.getAgent((String) result);
mAgent.unlock("ProcessingAgentPass");

// send monitoring message
MonitoringMessage[] messages = { msg };
node.invoke(mAgent, testServiceClass, "getMessages", new Serializable[] { messages });
} catch (Exception e) {
e.printStackTrace();
fail("Exception: " + e);
}

// verify that the webhook has been delivered
assertEquals(true, WebhookTestService.webhookDelivered);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package i5.las2peer.services.mobsos.dataProcessing;

import i5.las2peer.restMapper.RESTService;
import i5.las2peer.restMapper.annotations.ServicePath;

import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;

/**
* Helper service used to test whether webhook calls are executed.
*/
@ServicePath("/webhooktestservice")
public class WebhookTestService extends RESTService {

public static boolean webhookDelivered = false;

@POST
@Path("/webhook")
public Response webhook(String body) {
webhookDelivered = true;
return Response.status(200).build();
}
}
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
core.version=1.2.2
core.version=1.2.3
service.name=i5.las2peer.services.mobsos.dataProcessing
service.class=MobSOSDataProcessingService
service.version=1.2.0
service.version=1.2.3
java.version=17

las2peer_user1.name=alice
Expand Down

0 comments on commit c91f670

Please sign in to comment.