This commit is contained in:
2021-12-16 11:42:27 +01:00
parent 27ccc54458
commit 6c17b20c55
60 changed files with 947 additions and 216 deletions

View File

@@ -2,23 +2,16 @@ package ch.unisg.tapas;
import ch.unisg.tapas.auctionhouse.adapter.common.clients.TapasMqttClient;
import ch.unisg.tapas.auctionhouse.adapter.in.messaging.mqtt.AuctionEventsMqttDispatcher;
import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscovery;
import ch.unisg.tapas.auctionhouse.domain.AuctionHouseDiscoveryInformation;
import ch.unisg.tapas.auctionhouse.adapter.common.clients.WebSubSubscriber;
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;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
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.
@@ -36,8 +29,8 @@ 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();
//bootstrapMarketplaceWithMqtt();
// bootstrapMarketplaceWithWebSub();
bootstrapMarketplaceWithMqtt();
}
/**
* Discovers auction houses and subscribes to WebSub notifications

View File

@@ -50,7 +50,6 @@ public class TapasMqttClient {
mqttClient = new org.eclipse.paho.client.mqttv3.MqttClient(brokerAddress, mqttClientId, new MemoryPersistence());
mqttClient.connect();
mqttClient.setCallback(messageReceivedCallback);
subscribeToAllTopics();
}

View File

@@ -13,26 +13,27 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Value;
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.sql.Timestamp;
public class ExternalAuctionStartedEventListenerMqttAdapter extends AuctionEventMqttListener{
private static final Logger LOGGER = LogManager.getLogger(ExternalAuctionStartedEventListenerMqttAdapter.class);
String auctionHouseURI = "https://tapas-auction-house.86-119-35-40.nip.io/";
// String auctionHouseURI = "https://tapas-auction-house.86-119-35-40.nip.io/";
String auctionHouseURI = "http://a888-77-59-152-182.eu.ngrok.io";
String taskListURI = "https://tapas-tasks.86-119-35-40.nip.io";
// String taskListURI = "https://tapas-tasks.86-119-35-40.nip.io";
String taskListURI = "http://e021-77-59-152-182.ngrok.io";
@Override
public boolean handleEvent(MqttMessage message){
String payload = new String(message.getPayload());
System.out.println("New auction");
try {
// Note: this message representation is provided only as an example. You should use a
// representation that makes sense in the context of your application.
@@ -46,6 +47,7 @@ public class ExternalAuctionStartedEventListenerMqttAdapter extends AuctionEvent
String deadline = data.get("deadline").asText();
var capable = ExecutorRegistry.getInstance().containsTaskType(new Auction.AuctionedTaskType(taskType));
System.out.println("Capable: " + capable);
// TODO check deadline
if(capable){
var bid = new Bid(

View File

@@ -1,11 +1,6 @@
package ch.unisg.tapas.auctionhouse.adapter.in.web;
import ch.unisg.tapas.auctionhouse.adapter.common.formats.AuctionJsonRepresentation;
import ch.unisg.tapas.auctionhouse.adapter.common.formats.BidJsonRepresentation;
import ch.unisg.tapas.auctionhouse.adapter.common.formats.TaskJsonRepresentation;
import ch.unisg.tapas.auctionhouse.adapter.in.messaging.mqtt.ExternalAuctionStartedEventListenerMqttAdapter;
import ch.unisg.tapas.auctionhouse.domain.Task;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
@@ -35,7 +30,7 @@ public class WinningBidWebController {
try {
var body = payload.serialize();
LOGGER.info(body);
var postURI = URI.create("https://tapas-tasks.86-119-35-40.nip.io/tasks/");
var postURI = URI.create(taskListURI + "/tasks/");
HttpRequest postRequest = HttpRequest.newBuilder()
.uri(postURI)
.header("Content-Type", TaskJsonRepresentation.MEDIA_TYPE)
@@ -49,7 +44,7 @@ public class WinningBidWebController {
HttpHeaders responseHeaders = new HttpHeaders();
return new ResponseEntity<>(responseHeaders, HttpStatus.NO_CONTENT);
return new ResponseEntity<>(responseHeaders, HttpStatus.ACCEPTED);
}
catch (
IOException | InterruptedException e) {

View File

@@ -6,31 +6,33 @@ import ch.unisg.tapas.auctionhouse.adapter.in.messaging.mqtt.AuctionEventsMqttDi
import ch.unisg.tapas.auctionhouse.application.port.out.AuctionStartedEventPort;
import ch.unisg.tapas.auctionhouse.domain.AuctionStartedEvent;
import ch.unisg.tapas.common.ConfigProperties;
import java.util.logging.Logger;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
@Component
// @Primary
@Primary
public class PublishAuctionStartedEventMqttAdapter implements AuctionStartedEventPort {
private static final Logger LOGGER = LogManager.getLogger(PublishAuctionStartedEventMqttAdapter.class);
Logger logger = Logger.getLogger(PublishAuctionStartedEventMqttAdapter.class.getName());
@Autowired
private ConfigProperties config;
@Override
public void publishAuctionStartedEvent(AuctionStartedEvent event) {
logger.info("AuctionHouse | Publish auction started over Mqtt!");
try{
var mqttClient = TapasMqttClient.getInstance(config.getMqttBrokerUri().toString(), new AuctionEventsMqttDispatcher());
mqttClient.publishMessage("ch/unisg/tapas/auctions", AuctionJsonRepresentation.serialize(event.getAuction()));
}
catch (MqttException | JsonProcessingException e){
LOGGER.error(e.getMessage(), e);
logger.severe(e.getMessage());
}
}
}

View File

@@ -19,7 +19,7 @@ import java.util.logging.Logger;
* This class is a template for publishing auction started events via WebSub.
*/
@Component
@Primary
// @Primary
public class PublishAuctionStartedEventWebSubAdapter implements AuctionStartedEventPort {
@Value("${auction.house.uri}")
private String auctionHouseUri;
@@ -31,12 +31,12 @@ public class PublishAuctionStartedEventWebSubAdapter implements AuctionStartedEv
@Override
public void publishAuctionStartedEvent(AuctionStartedEvent event) {
logger.info("AuctionHouse | Publish auction started over WebSub!");
HttpClient client = HttpClient.newHttpClient();
String body = "hub.url=" + auctionHouseUri + "/auctions/&hub.mode=publish";
logger.info("Auctions updated:" + body);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(webSubHubUri))
.header("Content-Type", "application/x-www-form-urlencoded")
@@ -46,7 +46,7 @@ public class PublishAuctionStartedEventWebSubAdapter implements AuctionStartedEv
try {
client.send(request, HttpResponse.BodyHandlers.ofString());
logger.info("WEBSUB send successfuly");
logger.info("AuctionHouse | Publish auction over WebSub successfuly!");
} catch (InterruptedException e) {
logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
Thread.currentThread().interrupt();

View File

@@ -1,7 +1,6 @@
package ch.unisg.tapas.auctionhouse.adapter.out.web;
import ch.unisg.tapas.auctionhouse.adapter.common.formats.TaskJsonRepresentation;
import ch.unisg.tapas.auctionhouse.application.handler.AuctionStartedHandler;
import ch.unisg.tapas.auctionhouse.application.port.out.AuctionWonEventPort;
import ch.unisg.tapas.auctionhouse.domain.AuctionRegistry;
import ch.unisg.tapas.auctionhouse.domain.AuctionWonEvent;
@@ -11,6 +10,7 @@ import org.apache.logging.log4j.Logger;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import java.io.IOException;
@@ -45,6 +45,10 @@ public class AuctionWonEventHttpAdapter implements AuctionWonEventPort {
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != HttpStatus.OK.value()) {
LOGGER.info("AuctionHouse | Could not get task from tasklist. Something went wrong...");
return;
}
LOGGER.info(response.body());
JSONObject responseBody = new JSONObject(response.body());

View File

@@ -2,7 +2,6 @@ package ch.unisg.tapas.auctionhouse.application.service;
import ch.unisg.tapas.auctionhouse.application.port.in.LaunchAuctionCommand;
import ch.unisg.tapas.auctionhouse.application.port.in.LaunchAuctionUseCase;
import ch.unisg.tapas.auctionhouse.application.port.in.LaunchAuctionUseCase;
import ch.unisg.tapas.auctionhouse.application.port.out.AuctionWonEventPort;
import ch.unisg.tapas.auctionhouse.application.port.out.AuctionStartedEventPort;
import ch.unisg.tapas.auctionhouse.domain.*;
@@ -13,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.sql.Timestamp;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -27,10 +27,10 @@ import java.util.concurrent.TimeUnit;
public class StartAuctionService implements LaunchAuctionUseCase {
private static final Logger LOGGER = LogManager.getLogger(StartAuctionService.class);
private final Timestamp DEFAULT_AUCTION_DEADLINE_MILLIS = Timestamp.valueOf("1970-01-01 00:00:01");
private final Timestamp DEFAULT_AUCTION_DEADLINE_MILLIS = new Timestamp(System.currentTimeMillis() + 20000);
// Event port used to publish an auction started event
private final AuctionStartedEventPort auctionStartedEventPort;
private final List<AuctionStartedEventPort> auctionStartedEventPorts;
// Event port used to publish an auction won event
private final AuctionWonEventPort auctionWonEventPort;
@@ -40,9 +40,9 @@ public class StartAuctionService implements LaunchAuctionUseCase {
@Autowired
private ConfigProperties config;
public StartAuctionService(AuctionStartedEventPort auctionStartedEventPort,
public StartAuctionService(List<AuctionStartedEventPort> auctionStartedEventPorts,
AuctionWonEventPort auctionWonEventPort) {
this.auctionStartedEventPort = auctionStartedEventPort;
this.auctionStartedEventPorts = auctionStartedEventPorts;
this.auctionWonEventPort = auctionWonEventPort;
this.auctions = AuctionRegistry.getInstance();
this.service = Executors.newScheduledThreadPool(1);
@@ -70,7 +70,9 @@ public class StartAuctionService implements LaunchAuctionUseCase {
// Publish an auction started event
AuctionStartedEvent auctionStartedEvent = new AuctionStartedEvent(auction);
auctionStartedEventPort.publishAuctionStartedEvent(auctionStartedEvent);
for (AuctionStartedEventPort auctionStartedEventPort : auctionStartedEventPorts) {
auctionStartedEventPort.publishAuctionStartedEvent(auctionStartedEvent);
}
return auction;
}

View File

@@ -5,8 +5,9 @@ broker.mqtt=tcp://broker.hivemq.com
websub.hub=https://websub.appspot.com/
websub.hub.publish=https://websub.appspot.com/
group=tapas-group-tutors
group=tapas-group-1
auction.house.uri=https://tapas-auction-house.86-119-35-40.nip.io
# auction.house.uri=http://a888-77-59-152-182.eu.ngrok.io
tasks.list.uri=http://localhost:8081
application.environment=development