diff --git a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorType.java b/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorType.java index 30460e6..5ad22a7 100644 --- a/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorType.java +++ b/executor-base/src/main/java/ch/unisg/executorBase/executor/domain/ExecutorType.java @@ -1,7 +1,7 @@ package ch.unisg.executorbase.executor.domain; public enum ExecutorType { - COMPUTATION, ROBOT, HUMIDITY; + COMPUTATION, SMALLROBOT, HUMIDITY; /** * Checks if the give executor type exists. diff --git a/executor-computation/src/main/java/ch/unisg/executorcomputation/ExecutorcomputationApplication.java b/executor-computation/src/main/java/ch/unisg/executorcomputation/ExecutorcomputationApplication.java index ea9910a..1ee615d 100644 --- a/executor-computation/src/main/java/ch/unisg/executorcomputation/ExecutorcomputationApplication.java +++ b/executor-computation/src/main/java/ch/unisg/executorcomputation/ExecutorcomputationApplication.java @@ -15,14 +15,6 @@ public class ExecutorcomputationApplication { static Logger logger = Logger.getLogger(ExecutorcomputationApplication.class.getName()); public static void main(String[] args) { - - try { - TimeUnit.SECONDS.sleep(1); - } catch (InterruptedException e) { - logger.log(Level.SEVERE, e.getLocalizedMessage(), e); - Thread.currentThread().interrupt(); - } - SpringApplication.run(ExecutorcomputationApplication.class, args); Executor.getExecutor(); } diff --git a/executor-robot/pom.xml b/executor-robot/pom.xml index 570bd18..2fa8a0f 100644 --- a/executor-robot/pom.xml +++ b/executor-robot/pom.xml @@ -82,11 +82,10 @@ compile - com.github.Interactions-HSG - wot-td-java - 0.1.1 - compile - + com.github.Interactions-HSG + wot-td-java + master-SNAPSHOT + diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/ExecutorrobotApplication.java b/executor-robot/src/main/java/ch/unisg/executorrobot/ExecutorrobotApplication.java index 79a204f..15e2491 100644 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/ExecutorrobotApplication.java +++ b/executor-robot/src/main/java/ch/unisg/executorrobot/ExecutorrobotApplication.java @@ -11,14 +11,6 @@ import ch.unisg.executorrobot.executor.domain.Executor; public class ExecutorrobotApplication { public static void main(String[] args) { - - try { - TimeUnit.SECONDS.sleep(40); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - SpringApplication.run(ExecutorrobotApplication.class, args); Executor.getExecutor(); } diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/DeleteUserFromRobotAdapter.java b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/DeleteUserFromRobotAdapter.java deleted file mode 100644 index 37b605a..0000000 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/DeleteUserFromRobotAdapter.java +++ /dev/null @@ -1,42 +0,0 @@ -package ch.unisg.executorrobot.executor.adapter.out; -import java.io.IOException; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; - -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; - -import ch.unisg.executorrobot.executor.application.port.out.DeleteUserFromRobotPort; - -@Component -@Primary -public class DeleteUserFromRobotAdapter implements DeleteUserFromRobotPort { - - @Override - public boolean deleteUserFromRobot(String key) { - - String url = "https://api.interactions.ics.unisg.ch/leubot1/v1.3.4/user/" + key; - - var request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("Content-Type", "application/json") - .DELETE() - .build(); - - var client = HttpClient.newHttpClient(); - - try { - var response = client.send(request, HttpResponse.BodyHandlers.ofString()); - System.out.println(response.statusCode()); - return true; - } catch (IOException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return false; - } - -} diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/InstructionToRobotAdapter.java b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/InstructionToRobotAdapter.java deleted file mode 100644 index 763e530..0000000 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/InstructionToRobotAdapter.java +++ /dev/null @@ -1,121 +0,0 @@ -package ch.unisg.executorrobot.executor.adapter.out; -import java.io.IOException; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -import ch.unisg.ics.interactions.wot.td.ThingDescription; -import ch.unisg.ics.interactions.wot.td.affordances.ActionAffordance; -import ch.unisg.ics.interactions.wot.td.affordances.Form; -import ch.unisg.ics.interactions.wot.td.clients.TDHttpRequest; -import ch.unisg.ics.interactions.wot.td.clients.TDHttpResponse; -import ch.unisg.ics.interactions.wot.td.io.TDGraphReader; -import ch.unisg.ics.interactions.wot.td.schemas.DataSchema; -import ch.unisg.ics.interactions.wot.td.schemas.ObjectSchema; -import ch.unisg.ics.interactions.wot.td.schemas.StringSchema; -import ch.unisg.ics.interactions.wot.td.security.APIKeySecurityScheme; -import ch.unisg.ics.interactions.wot.td.vocabularies.TD; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; - -import ch.unisg.executorrobot.executor.application.port.out.InstructionToRobotPort; - -@Component -@Primary -public class InstructionToRobotAdapter implements InstructionToRobotPort { - - @Override - public boolean instructionToRobot(String key) { - - String endpoint = "https://api.interactions.ics.unisg.ch/search/searchEngine"; - - String input = "@prefix dct: . select ?title where { ?title dct:title 'leubot1' }"; - - var httpRequest = HttpRequest.newBuilder() - .uri(URI.create(endpoint)) - .header("Content-Type", "application/json") - .POST(HttpRequest.BodyPublishers.ofString(input)) - .build(); - - var client = HttpClient.newHttpClient(); - - try { - var description = client.send(httpRequest, HttpResponse.BodyHandlers.ofString()).body(); - - // Parse a TD from a string - ThingDescription td = TDGraphReader.readFromString(ThingDescription.TDFormat.RDF_TURTLE, description); - - // Create the payload to be sent with the Http request - Map elbowPayload = new HashMap<>(); - elbowPayload.put("http://www.w3.org/2001/XMLSchema#int", 400); - - // Get the affordance "setElbow" from the TD - Optional action = td.getActionByName("setElbow"); - - // Get the first form - if (action.isPresent()) { - Optional
form = action.get().getFirstForm(); - - // Retrieve the input data schema from the action affordance - Optional inputSchema = action.get().getInputSchema(); - - // If a form is found, use it to create and execute the Http request - if (form.isPresent()) { - TDHttpRequest request = new TDHttpRequest(form.get(), TD.invokeAction); - - if (inputSchema.isPresent()) { - request.setObjectPayload((ObjectSchema) inputSchema.get(), elbowPayload); - - try { - TDHttpResponse response = request.execute(); - System.out.println("Received response with status code: " + response.getStatusCode()); - return true; - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - } catch (IOException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return false; - - - - - /* - String putEndpoint = "https://api.interactions.ics.unisg.ch/leubot1/v1.3.0/elbow"; - - String inputJson = "{ \"value\": 400}"; - var request = HttpRequest.newBuilder() - .uri(URI.create(putEndpoint)) - .header("Content-Type", "application/json") - .header("X-API-KEY", key) - .PUT(HttpRequest.BodyPublishers.ofString(inputJson)) - .build(); - - var client = HttpClient.newHttpClient(); - - try { - var response = client.send(request, HttpResponse.BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.headers()); - return true; - } catch (IOException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return false; - */ - } - -} diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/UserToRobotAdapter.java b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/UserToRobotAdapter.java index b2db44f..deb4a8b 100644 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/UserToRobotAdapter.java +++ b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/adapter/out/UserToRobotAdapter.java @@ -1,5 +1,6 @@ package ch.unisg.executorrobot.executor.adapter.out; import java.io.IOException; +import java.io.StringReader; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; @@ -7,6 +8,11 @@ import java.net.http.HttpResponse; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.concurrent.TimeUnit; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import ch.unisg.ics.interactions.wot.td.ThingDescription; import ch.unisg.ics.interactions.wot.td.affordances.ActionAffordance; @@ -16,10 +22,19 @@ import ch.unisg.ics.interactions.wot.td.clients.TDHttpResponse; import ch.unisg.ics.interactions.wot.td.io.TDGraphReader; import ch.unisg.ics.interactions.wot.td.schemas.DataSchema; import ch.unisg.ics.interactions.wot.td.schemas.ObjectSchema; +import ch.unisg.ics.interactions.wot.td.security.APIKeySecurityScheme; +import ch.unisg.ics.interactions.wot.td.security.SecurityScheme; import ch.unisg.ics.interactions.wot.td.vocabularies.TD; +import ch.unisg.ics.interactions.wot.td.vocabularies.WoTSec; + import org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; import ch.unisg.executorrobot.executor.application.port.out.UserToRobotPort; @@ -32,7 +47,7 @@ public class UserToRobotAdapter implements UserToRobotPort { String endpoint = "https://api.interactions.ics.unisg.ch/search/searchEngine"; - String input = "@prefix dct: . select ?title where { ?title dct:title 'Mirogate' }"; + String input = "@prefix dct: . select ?title where { ?title dct:title 'leubot1' }"; var httpRequest = HttpRequest.newBuilder() .uri(URI.create(endpoint)) @@ -43,82 +58,184 @@ public class UserToRobotAdapter implements UserToRobotPort { var client = HttpClient.newHttpClient(); try { - var description = client.send(httpRequest, HttpResponse.BodyHandlers.ofString()).body(); + String description = client.send(httpRequest, HttpResponse.BodyHandlers.ofString()).body(); + String leubot1Uri = null; - String uri = "http://yggdrasil.interactions.ics.unisg.ch/environments/61/workspaces/102/artifacts/leubot1"; + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(new InputSource(new StringReader(description))); - // Parse a TD from a string - ThingDescription td = TDGraphReader.readFromURL(ThingDescription.TDFormat.RDF_TURTLE, uri); + doc.getDocumentElement().normalize(); - // Create the payload to be sent with the HTTP request - Map logInPayload = new HashMap<>(); - logInPayload.put("http://xmlns.com/foaf/0.1/Name", "keanu rahimian"); - logInPayload.put("http://xmlns.com/foaf/0.1/Mbox", "keanu.rahimian@student.unisg.ch"); - - // Get the affordance "Log-In" from the TD - Optional action = td.getActionByName("logIn"); - - // Get the first form - if (action.isPresent()) { - Optional form = action.get().getFirstForm(); - - // Retrieve the input data schema from the action affordance - Optional inputSchema = action.get().getInputSchema(); - - // If a form is found, use it to create and execute the HTTP request - if (form.isPresent()) { - TDHttpRequest request = new TDHttpRequest(form.get(), TD.invokeAction); - - if (inputSchema.isPresent()) { - request.setObjectPayload((ObjectSchema) inputSchema.get(), logInPayload); - - try { - TDHttpResponse response = request.execute(); - System.out.println("Received response with status code: " + response.getStatusCode()); - - // TODO: Get the key from the response and return it - // Not exactly sure how to get the headers from the payload, as we need them - // to get the key - - return null; - - } catch (IOException e) { - e.printStackTrace(); - } - } + NodeList results = doc.getElementsByTagName("uri"); + for (int temp = 0; temp < results.getLength(); temp += 1) { + Node nNode = results.item(temp); + if (nNode.getTextContent().contains("leubot1")) { + leubot1Uri = nNode.getTextContent(); } } + if (leubot1Uri == null) { + // TODO implement logic if execution failed + return "ERROR"; + } + + // Parse a TD from a string + ThingDescription td = TDGraphReader.readFromURL(ThingDescription.TDFormat.RDF_TURTLE, leubot1Uri); + + String apiUrl = getAPIKey(td); + System.out.println("FOUND API URL " + apiUrl); + + String apiKey = apiUrl.split("/")[apiUrl.split("/").length-1].split("]")[0]; + System.out.println("FOUND KEY " + apiKey); + + if(apiKey == null) { + // TODO implement logic if execution failed + return "ERROR"; + } + + try { + TimeUnit.MILLISECONDS.sleep(1500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + if (!moveRobot(td, apiKey)) { + return "ERROR"; + } + + try { + TimeUnit.MILLISECONDS.sleep(1500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + delteUserFromRobot(apiUrl); + } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); + } catch (SAXException e1) { + e1.printStackTrace(); + } catch (ParserConfigurationException e1) { + e1.printStackTrace(); + } + return "OK"; + } + + + private String getAPIKey(ThingDescription td) { + // Create the payload to be sent with the HTTP request + Map logInPayload = new HashMap<>(); + logInPayload.put("http://xmlns.com/foaf/0.1/Name", "keanu rahimian"); + logInPayload.put("http://xmlns.com/foaf/0.1/Mbox", "keanu.rahimian@student.unisg.ch"); + + // Get the affordance "Log-In" from the TD + Optional action = td.getActionByName("logIn"); + + // Get the first form + if (action.isEmpty()) { + // TODO implement logic if execution failed + return null; } - /* - String inputJson = "{ \"name\":\"keanu rahimian\", \"email\":\"keanu.rahimian@student.unisg.ch\"}"; - var request = HttpRequest.newBuilder() - .uri(URI.create(postEndpoint)) - .header("Content-Type", "application/json") - .POST(HttpRequest.BodyPublishers.ofString(inputJson)) - .build(); + Optional form = action.get().getFirstFormForOperationType(TD.invokeAction); + + if (form.isEmpty()) { + // TODO implement logic if execution failed + return null; + } + + // If a form is found, use it to create and execute the HTTP request + TDHttpRequest request = new TDHttpRequest(form.get(), TD.invokeAction); + + // Retrieve the input data schema from the action affordance + Optional inputSchema = action.get().getInputSchema(); + + if(inputSchema.isPresent()) { + request.setObjectPayload((ObjectSchema) inputSchema.get(), logInPayload); + } + + try { + TDHttpResponse response = request.execute(); + System.out.println("Received response with status code: " + response.getStatusCode()); + + String url = response.getHeaders().get("Location"); + return url; + + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + + } + + private boolean moveRobot(ThingDescription td, String key) { + + // Create the payload to be sent with the Http request + Map elbowPayload = new HashMap<>(); + elbowPayload.put("value", 400); + + // Get the affordance "setElbow" from the TD + Optional action = td.getActionByName("setElbow"); + + // Get the first form + if (action.isEmpty()) { + return false; + } + + Optional form = action.get().getFirstFormForOperationType(TD.invokeAction); + + if (form.isEmpty()) { + // TODO implement logic if execution failed + return false; + } + + // Retrieve the input data schema from the action affordance + Optional inputSchema = action.get().getInputSchema(); + + TDHttpRequest request = new TDHttpRequest(form.get(), TD.invokeAction); + + if(inputSchema.isPresent()) { + request.setObjectPayload((ObjectSchema) inputSchema.get(), elbowPayload); + } + + Optional securityScheme = td.getFirstSecuritySchemeByType(WoTSec.APIKeySecurityScheme); + if (securityScheme.isPresent()) { + request.setAPIKey((APIKeySecurityScheme) securityScheme.get(), key); + } + + try { + TDHttpResponse response = request.execute(); + System.out.println("Received response with status code: " + response.getStatusCode()); + return true; + } catch (IOException e) { + e.printStackTrace(); + } + + return false; + } + + private void delteUserFromRobot(String apiUrl) { + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(apiUrl)) + .header("Content-Type", "application/json") + .DELETE() + .build(); + + HttpClient client = HttpClient.newHttpClient(); try { var response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode()); - System.out.println(response.headers()); - String url = response.headers().map().get("location").toString(); - String key = url.split("/")[url.split("/").length-1].split("]")[0]; - return key; } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } - return null; - */ - - - return null; } } diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/port/out/DeleteUserFromRobotPort.java b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/port/out/DeleteUserFromRobotPort.java deleted file mode 100644 index 2411353..0000000 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/port/out/DeleteUserFromRobotPort.java +++ /dev/null @@ -1,5 +0,0 @@ -package ch.unisg.executorrobot.executor.application.port.out; - -public interface DeleteUserFromRobotPort { - boolean deleteUserFromRobot(String key); -} diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/port/out/InstructionToRobotPort.java b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/port/out/InstructionToRobotPort.java deleted file mode 100644 index 97985b0..0000000 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/application/port/out/InstructionToRobotPort.java +++ /dev/null @@ -1,5 +0,0 @@ -package ch.unisg.executorrobot.executor.application.port.out; - -public interface InstructionToRobotPort { - boolean instructionToRobot(String key); -} diff --git a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/domain/Executor.java b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/domain/Executor.java index e83579c..cc08bc1 100644 --- a/executor-robot/src/main/java/ch/unisg/executorrobot/executor/domain/Executor.java +++ b/executor-robot/src/main/java/ch/unisg/executorrobot/executor/domain/Executor.java @@ -1,22 +1,14 @@ package ch.unisg.executorrobot.executor.domain; -import java.util.concurrent.TimeUnit; - -import ch.unisg.executorrobot.executor.adapter.out.DeleteUserFromRobotAdapter; -import ch.unisg.executorrobot.executor.adapter.out.InstructionToRobotAdapter; import ch.unisg.executorrobot.executor.adapter.out.UserToRobotAdapter; -import ch.unisg.executorrobot.executor.application.port.out.DeleteUserFromRobotPort; -import ch.unisg.executorrobot.executor.application.port.out.InstructionToRobotPort; import ch.unisg.executorrobot.executor.application.port.out.UserToRobotPort; import ch.unisg.executorbase.executor.domain.ExecutorBase; import ch.unisg.executorbase.executor.domain.ExecutorType; public class Executor extends ExecutorBase { - private static final Executor executor = new Executor(ExecutorType.ROBOT); + private static final Executor executor = new Executor(ExecutorType.SMALLROBOT); private final UserToRobotPort userToRobotPort = new UserToRobotAdapter(); - private final InstructionToRobotPort instructionToRobotPort = new InstructionToRobotAdapter(); - private final DeleteUserFromRobotPort deleteUserFromRobotPort = new DeleteUserFromRobotAdapter(); public static Executor getExecutor() { return executor; @@ -29,24 +21,7 @@ public class Executor extends ExecutorBase { @Override protected String execution(String input) { - - String key = userToRobotPort.userToRobot(); - try { - TimeUnit.MILLISECONDS.sleep(1500); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - boolean result1 = instructionToRobotPort.instructionToRobot(key); - try { - TimeUnit.MILLISECONDS.sleep(10000); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - deleteUserFromRobotPort.deleteUserFromRobot(key); - - return Boolean.toString(result1); + return userToRobotPort.userToRobot(); } } diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java index ff6b95c..c57c8c5 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/TapasAuctionHouseApplication.java @@ -4,6 +4,10 @@ import ch.unisg.tapas.auctionhouse.adapter.common.clients.TapasMqttClient; import ch.unisg.tapas.auctionhouse.adapter.in.messaging.mqtt.AuctionEventsMqttDispatcher; import ch.unisg.tapas.auctionhouse.adapter.common.clients.WebSubSubscriber; import ch.unisg.tapas.auctionhouse.application.service.GetExecutorsService; +import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscovery; +import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscoveryInformation; +import ch.unisg.tapas.common.AuctionHouseResourceDirectory; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.eclipse.paho.client.mqttv3.MqttException; @@ -13,6 +17,9 @@ import org.springframework.core.env.ConfigurableEnvironment; import java.net.URI; import java.net.URISyntaxException; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * Main TAPAS Auction House application. @@ -30,7 +37,7 @@ public class TapasAuctionHouseApplication { ENVIRONMENT = tapasAuctioneerApp.run(args).getEnvironment(); // TODO Set start up of message services with config // We will use these bootstrap methods in Week 6: - // bootstrapMarketplaceWithWebSub(); + bootstrapMarketplaceWithWebSub(); bootstrapMarketplaceWithMqtt(); var getExecutorsService = new GetExecutorsService(); getExecutorsService.getExecutorsFromExecutorPool(); @@ -39,19 +46,20 @@ public class TapasAuctionHouseApplication { * Discovers auction houses and subscribes to WebSub notifications */ private static void bootstrapMarketplaceWithWebSub() { - // discoverAuctionHouseEndpoints(); + discoverAuctionHouseEndpoints(); WebSubSubscriber subscriber = new WebSubSubscriber(ENVIRONMENT.getProperty("auction.house.uri")); - // for (AuctionHouseDiscoveryInformation endpoint : AuctionHouseDiscovery.getInstance().getAuctionHouseDiscoveryList()) { - // subscriber.subscribeToAuctionHouseEndpoint(endpoint.getWebSubUri().getValue()); - // } - try { - subscriber.subscribeToAuctionHouseEndpoint(new URI("http://6b4e-130-82-250-227.ngrok.io/websub-discovery")); - } catch (URISyntaxException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + for (AuctionHouseDiscoveryInformation endpoint : AuctionHouseDiscovery.getInstance().getAuctionHouseDiscoveryList()) { + System.out.println(endpoint.getWebSubUri().getValue()); + subscriber.subscribeToAuctionHouseEndpoint(endpoint.getWebSubUri().getValue()); } + // try { + // subscriber.subscribeToAuctionHouseEndpoint(new URI("http://6b4e-130-82-250-227.ngrok.io/websub-discovery")); + // } catch (URISyntaxException e) { + // // TODO Auto-generated catch block + // e.printStackTrace(); + // } } /** @@ -76,17 +84,17 @@ public class TapasAuctionHouseApplication { } } - // private static void discoverAuctionHouseEndpoints() { + private static void discoverAuctionHouseEndpoints() { - // AuctionHouseResourceDirectory rd = new AuctionHouseResourceDirectory( - // URI.create(ENVIRONMENT.getProperty("discovery.endpoint.uri")) - // ); + AuctionHouseResourceDirectory rd = new AuctionHouseResourceDirectory( + URI.create(ENVIRONMENT.getProperty("discovery.endpoint.uri")) + ); - // AuctionHouseDiscovery.getInstance().addAuctionHouseDiscoveryInformation(rd.retrieveAuctionHouseEndpoints()); + AuctionHouseDiscovery.getInstance().addAuctionHouseDiscoveryInformation(rd.retrieveAuctionHouseEndpoints()); - // ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); - // executor.scheduleAtFixedRate(crawlerRunnable, 300, 300, TimeUnit.SECONDS); - // } + // ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + // executor.scheduleAtFixedRate(crawlerRunnable, 300, 300, TimeUnit.SECONDS); + } // private static Runnable crawlerRunnable = new Runnable() { diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java index e37c989..e9f5a04 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/adapter/out/web/AuctionHouseDiscoveryHttpAdapter.java @@ -41,8 +41,8 @@ public class AuctionHouseDiscoveryHttpAdapter implements AuctionHouseDiscoveryPo { var informationJSON = arrayOfInformation.getJSONObject(i); var information = new AuctionHouseDiscoveryInformation( - new AuctionHouseDiscoveryInformation.AuctionHouseUri(URI.create(informationJSON.getString("auctionHouseURI"))), - new AuctionHouseDiscoveryInformation.WebSubUri(URI.create(informationJSON.getString("webSubURI"))), + new AuctionHouseDiscoveryInformation.AuctionHouseUri(URI.create(informationJSON.getString("auctionHouseUri"))), + new AuctionHouseDiscoveryInformation.WebSubUri(URI.create(informationJSON.getString("webSubUri"))), new AuctionHouseDiscoveryInformation.TaskTypes(getTaskTypes(informationJSON.getJSONArray("taskTypes"))), new AuctionHouseDiscoveryInformation.TimeStamp(Timestamp.valueOf(informationJSON.getString("timeStamp"))), new AuctionHouseDiscoveryInformation.GroupName(informationJSON.getString("groupName")) diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/service/StartAuctionService.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/service/StartAuctionService.java index 7839b5b..f0f1546 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/service/StartAuctionService.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/application/service/StartAuctionService.java @@ -65,8 +65,17 @@ public class StartAuctionService implements LaunchAuctionUseCase { auctions.addAuction(auction); // Schedule the closing of the auction at the deadline - service.schedule(new CloseAuctionTask(auction.getAuctionId()), deadline.getValue().getTime() - System.currentTimeMillis(), + System.out.println(deadline.getValue().getTime()); + System.out.println(System.currentTimeMillis()); + System.out.println(deadline.getValue().getTime() - System.currentTimeMillis()); + if (deadline.getValue().getTime() == DEFAULT_AUCTION_DEADLINE_MILLIS.getTime()) { + System.out.println("DEFAULT TIMESTAMP USED"); + service.schedule(new CloseAuctionTask(auction.getAuctionId()), 10000, TimeUnit.MILLISECONDS); + } else { + service.schedule(new CloseAuctionTask(auction.getAuctionId()), deadline.getValue().getTime() - System.currentTimeMillis(), + TimeUnit.MILLISECONDS); + } // Publish an auction started event AuctionStartedEvent auctionStartedEvent = new AuctionStartedEvent(auction); diff --git a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java index c234b64..c51ec98 100644 --- a/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java +++ b/tapas-auction-house/src/main/java/ch/unisg/tapas/auctionhouse/domain/AuctionHouseDiscovery.java @@ -15,8 +15,9 @@ public class AuctionHouseDiscovery { private final List tasktypes = new ArrayList() { { - add("computation"); - add("smallrobot"); + add("COMPUTATION"); + add("SMALLROBOT"); + add("HUMIDITY"); } }; @@ -31,8 +32,8 @@ public class AuctionHouseDiscovery { try { // Add our information to list auctionHouseDiscoveryList.add(new AuctionHouseDiscoveryInformation( - new AuctionHouseDiscoveryInformation.AuctionHouseUri(new URI("http://localhost:8086")), - new AuctionHouseDiscoveryInformation.WebSubUri(new URI("http://localhost:8086/websub/auctions")), + new AuctionHouseDiscoveryInformation.AuctionHouseUri(new URI("https://tapas-auction-house.86-119-35-40.nip.io")), + new AuctionHouseDiscoveryInformation.WebSubUri(new URI("https://tapas-auction-house.86-119-35-40.nip.io/websub/auctions")), new AuctionHouseDiscoveryInformation.TaskTypes(tasktypes), new AuctionHouseDiscoveryInformation.TimeStamp(new Timestamp(new Date().getTime())), new AuctionHouseDiscoveryInformation.GroupName("Group 1") diff --git a/tapas-auction-house/src/main/resources/application.properties b/tapas-auction-house/src/main/resources/application.properties index 03a5542..dade5ce 100644 --- a/tapas-auction-house/src/main/resources/application.properties +++ b/tapas-auction-house/src/main/resources/application.properties @@ -15,4 +15,4 @@ websub.hub.uri=https://pubsubhubbub.appspot.com mqtt.broker.uri=tcp://broker.hivemq.com # mqtt.broker.uri=tcp://localhost:1883 -discovery.endpoint.uri=http://localhost:3500 +discovery.endpoint.uri=https://tapas-auction-house.86-119-34-242.nip.io