Merge pull request #83 from SCS-ASSE-FS21-Group1/db_roster

added database to roster
This commit is contained in:
Marcel 2021-11-21 21:19:10 +01:00 committed by GitHub
commit df0e91fb23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 170 additions and 1 deletions

View File

@ -73,9 +73,13 @@
<artifactId>common</artifactId> <artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>

View File

@ -1,8 +1,13 @@
package ch.unisg.roster; package ch.unisg.roster;
import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import ch.unisg.roster.roster.adapter.out.persistence.mongodb.RosterRepository;
import ch.unisg.roster.roster.application.port.in.LoadRosterItemPort;
import ch.unisg.roster.roster.domain.Roster;
import ch.unisg.roster.roster.domain.RosterItem;
import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@ -11,19 +16,24 @@ import org.springframework.core.env.ConfigurableEnvironment;
import ch.unisg.roster.roster.adapter.common.clients.TapasMqttClient; import ch.unisg.roster.roster.adapter.common.clients.TapasMqttClient;
import ch.unisg.roster.roster.adapter.in.messaging.mqtt.ExecutorEventMqttListener; import ch.unisg.roster.roster.adapter.in.messaging.mqtt.ExecutorEventMqttListener;
import ch.unisg.roster.roster.adapter.in.messaging.mqtt.ExecutorEventsMqttDispatcher; import ch.unisg.roster.roster.adapter.in.messaging.mqtt.ExecutorEventsMqttDispatcher;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
@SpringBootApplication @SpringBootApplication
@EnableMongoRepositories(basePackageClasses = RosterRepository.class)
public class RosterApplication { public class RosterApplication {
static Logger logger = Logger.getLogger(RosterApplication.class.getName()); static Logger logger = Logger.getLogger(RosterApplication.class.getName());
private static ConfigurableEnvironment ENVIRONMENT; private static ConfigurableEnvironment ENVIRONMENT;
private static final LoadRosterItemPort loadRosterItemPort;
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication rosterApp = new SpringApplication(RosterApplication.class); SpringApplication rosterApp = new SpringApplication(RosterApplication.class);
ENVIRONMENT = rosterApp.run(args).getEnvironment(); ENVIRONMENT = rosterApp.run(args).getEnvironment();
bootstrapMarketplaceWithMqtt(); bootstrapMarketplaceWithMqtt();
initialiseRoster();
} }
/** /**
@ -42,4 +52,9 @@ public class RosterApplication {
} }
} }
private static void initialiseRoster(){
List<RosterItem> rosterItemList = loadRosterItemPort.loadAllRosterItems();
Roster.getInstance().initialiseRoster(rosterItemList);
}
} }

View File

@ -0,0 +1,21 @@
package ch.unisg.roster.roster.adapter.out.persistence.mongodb;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Document(collection="roster")
public class MongoRosterDocument {
@Id
public String taskId;
public String taskType;
public String executorURI;
public MongoRosterDocument(String taskId, String taskType, String executorURI){
this.taskId = taskId;
this.taskType = taskType;
this.executorURI = executorURI;
}
}

View File

@ -0,0 +1,23 @@
package ch.unisg.roster.roster.adapter.out.persistence.mongodb;
import ch.unisg.common.valueobject.ExecutorURI;
import ch.unisg.roster.roster.domain.RosterItem;
import org.springframework.stereotype.Component;
@Component
public class RosterMapper {
RosterItem maptoDomainEntity(MongoRosterDocument rosterItem) {
return new RosterItem(rosterItem.taskId, rosterItem.taskType,
new ExecutorURI(rosterItem.executorURI));
}
MongoRosterDocument mapToMongoDocument(RosterItem rosterItem){
return new MongoRosterDocument(
rosterItem.getTaskID(),
rosterItem.getTaskType(),
rosterItem.getExecutorURI().getValue().toString());
}
}

View File

@ -0,0 +1,50 @@
package ch.unisg.roster.roster.adapter.out.persistence.mongodb;
import ch.unisg.roster.roster.application.port.in.AddRosterItemPort;
import ch.unisg.roster.roster.application.port.in.DeleteRosterItem;
import ch.unisg.roster.roster.application.port.in.LoadRosterItemPort;
import ch.unisg.roster.roster.domain.RosterItem;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@RequiredArgsConstructor
public class RosterPersistenceAdapter implements AddRosterItemPort, LoadRosterItemPort, DeleteRosterItem {
@Autowired
private final RosterRepository rosterRepository;
private final RosterMapper rosterMapper;
@Override
public void addRosterItem(RosterItem rosterItem){
MongoRosterDocument mongoRosterDocument = rosterMapper.mapToMongoDocument(rosterItem);
rosterRepository.save(mongoRosterDocument);
}
@Override
public RosterItem loadRosterItem(String taskId){
MongoRosterDocument mongoRosterDocument = rosterRepository.findByTaskId(taskId);
RosterItem rosterItem = rosterMapper.maptoDomainEntity(mongoRosterDocument);
return rosterItem;
}
@Override
public List<RosterItem> loadAllRosterItems(){
List<MongoRosterDocument> rosterList = rosterRepository.findAll();
List<RosterItem> rosterItemList = new ArrayList<>();
for(MongoRosterDocument rosterDocument : rosterList){
rosterItemList.add(rosterMapper.maptoDomainEntity(rosterDocument));
}
return rosterItemList;
}
@Override
public void deleteRosterItem(String taskId){
rosterRepository.deleteById(taskId);
}
}

View File

@ -0,0 +1,9 @@
package ch.unisg.roster.roster.adapter.out.persistence.mongodb;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface RosterRepository extends MongoRepository<MongoRosterDocument,String>{
public MongoRosterDocument findByTaskId(String taskId);
}

View File

@ -0,0 +1,9 @@
package ch.unisg.roster.roster.application.port.in;
import ch.unisg.roster.roster.domain.RosterItem;
public interface AddRosterItemPort {
void addRosterItem(RosterItem rosterItem);
}

View File

@ -0,0 +1,8 @@
package ch.unisg.roster.roster.application.port.in;
import ch.unisg.roster.roster.domain.RosterItem;
public interface DeleteRosterItem {
void deleteRosterItem(String taskId);
}

View File

@ -0,0 +1,12 @@
package ch.unisg.roster.roster.application.port.in;
import ch.unisg.roster.roster.domain.RosterItem;
import java.util.List;
public interface LoadRosterItemPort {
RosterItem loadRosterItem(String taskId);
List<RosterItem> loadAllRosterItems();
}

View File

@ -2,6 +2,8 @@ package ch.unisg.roster.roster.application.service;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import ch.unisg.roster.roster.application.port.in.AddRosterItemPort;
import ch.unisg.roster.roster.domain.RosterItem;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ch.unisg.roster.roster.application.port.in.ApplyForTaskCommand; import ch.unisg.roster.roster.application.port.in.ApplyForTaskCommand;
@ -18,6 +20,7 @@ import lombok.RequiredArgsConstructor;
public class ApplyForTaskService implements ApplyForTaskUseCase { public class ApplyForTaskService implements ApplyForTaskUseCase {
private final TaskAssignedEventPort taskAssignedEventPort; private final TaskAssignedEventPort taskAssignedEventPort;
private final AddRosterItemPort addRosterItemPort;
/** /**
* Checks if a task is available and assignes it to the executor. If task got assigned a task * Checks if a task is available and assignes it to the executor. If task got assigned a task
@ -31,6 +34,7 @@ public class ApplyForTaskService implements ApplyForTaskUseCase {
if (task != null) { if (task != null) {
taskAssignedEventPort.publishTaskAssignedEvent(new TaskAssignedEvent(task.getTaskID())); taskAssignedEventPort.publishTaskAssignedEvent(new TaskAssignedEvent(task.getTaskID()));
addRosterItemPort.addRosterItem(new RosterItem(task.getTaskID(), task.getTaskType().getValue(), command.getExecutorURI()));
} }
return task; return task;

View File

@ -2,6 +2,7 @@ package ch.unisg.roster.roster.application.service;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import ch.unisg.roster.roster.application.port.in.DeleteRosterItem;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ch.unisg.roster.roster.application.port.in.TaskCompletedCommand; import ch.unisg.roster.roster.application.port.in.TaskCompletedCommand;
@ -17,6 +18,7 @@ import lombok.RequiredArgsConstructor;
public class TaskCompletedService implements TaskCompletedUseCase { public class TaskCompletedService implements TaskCompletedUseCase {
private final TaskCompletedEventPort taskCompletedEventPort; private final TaskCompletedEventPort taskCompletedEventPort;
private final DeleteRosterItem deleteRosterItem;
/** /**
* Completes the task in the roster and publishes a task completed event. * Completes the task in the roster and publishes a task completed event.
@ -26,6 +28,7 @@ public class TaskCompletedService implements TaskCompletedUseCase {
public void taskCompleted(TaskCompletedCommand command) { public void taskCompleted(TaskCompletedCommand command) {
Roster.getInstance().taskCompleted(command.getTaskID()); Roster.getInstance().taskCompleted(command.getTaskID());
deleteRosterItem.deleteRosterItem(command.getTaskID());
taskCompletedEventPort.publishTaskCompleted(new TaskCompletedEvent(command.getTaskID(), taskCompletedEventPort.publishTaskCompleted(new TaskCompletedEvent(command.getTaskID(),
command.getTaskStatus(), command.getTaskResult())); command.getTaskStatus(), command.getTaskResult()));

View File

@ -3,6 +3,7 @@ package ch.unisg.roster.roster.domain;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -83,4 +84,10 @@ public class Roster {
return queues.get(taskType.getValue()).removeIf(task -> task.getTaskID().equalsIgnoreCase(taskID)); return queues.get(taskType.getValue()).removeIf(task -> task.getTaskID().equalsIgnoreCase(taskID));
} }
public void initialiseRoster(List<RosterItem> rosterItemList){
for(RosterItem rosterItem : rosterItemList){
rosterMap.put(rosterItem.getTaskID(), rosterItem);
}
}
} }

View File

@ -20,4 +20,8 @@ public class RosterItem {
this.executorURI = executorURI; this.executorURI = executorURI;
} }
public static RosterItem withIDTypeExecutorURI(String taskId, String taskType,
ExecutorURI executorURI){
return new RosterItem(taskId, taskType, executorURI);
}
} }