refactor: Moved classes in package `persistence` in sub-packages -- Move
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / persistence / inmemory / InMemoryChatHomeService.java
1 package de.juplo.kafka.chat.backend.persistence;
2
3 import de.juplo.kafka.chat.backend.domain.ChatRoom;
4 import de.juplo.kafka.chat.backend.domain.ChatHomeService;
5 import lombok.extern.slf4j.Slf4j;
6 import reactor.core.publisher.Flux;
7 import reactor.core.publisher.Mono;
8
9 import java.time.Clock;
10 import java.util.HashMap;
11 import java.util.LinkedHashMap;
12 import java.util.Map;
13 import java.util.UUID;
14
15
16 @Slf4j
17 public class InMemoryChatHomeService implements ChatHomeService<InMemoryChatRoomService>
18 {
19   private final Map<UUID, ChatRoom> chatrooms;
20   private final Clock clock;
21   private final int bufferSize;
22
23
24   public InMemoryChatHomeService(
25       Flux<ChatRoom> chatroomFlux,
26       Clock clock,
27       int bufferSize)
28   {
29     log.debug("Creating InMemoryChatHomeService with buffer-size {} (for created ChatRoom's)", bufferSize);
30     this.chatrooms = new HashMap<>();
31     chatroomFlux.subscribe(chatroom -> chatrooms.put(chatroom.getId(), chatroom));
32     this.clock = clock;
33     this.bufferSize = bufferSize;
34   }
35
36   @Override
37   public Mono<ChatRoom> createChatRoom(UUID id, String name)
38   {
39     InMemoryChatRoomService service =
40         new InMemoryChatRoomService(new LinkedHashMap<>());
41     ChatRoom chatRoom = new ChatRoom(id, name, clock, service, bufferSize);
42     chatrooms.put(chatRoom.getId(), chatRoom);
43     return Mono.just(chatRoom);
44   }
45
46   @Override
47   public Mono<ChatRoom> getChatRoom(UUID id)
48   {
49     return Mono.justOrEmpty(chatrooms.get(id));
50   }
51
52   @Override
53   public Flux<ChatRoom> getChatRooms()
54   {
55     return Flux.fromStream(chatrooms.values().stream());
56   }
57 }