refactor: Made `SimpleChatHome` an implementation of `ChatHome`
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / persistence / inmemory / InMemoryServicesConfiguration.java
1 package de.juplo.kafka.chat.backend.persistence.inmemory;
2
3 import de.juplo.kafka.chat.backend.ChatBackendProperties;
4 import de.juplo.kafka.chat.backend.api.KafkaLikeShardingStrategy;
5 import de.juplo.kafka.chat.backend.api.ShardingStrategy;
6 import de.juplo.kafka.chat.backend.domain.ChatHome;
7 import de.juplo.kafka.chat.backend.domain.SimpleChatHome;
8 import de.juplo.kafka.chat.backend.persistence.StorageStrategy;
9 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
10 import org.springframework.context.annotation.Bean;
11 import org.springframework.context.annotation.Configuration;
12
13 import java.time.Clock;
14
15
16 @ConditionalOnProperty(
17     prefix = "chat.backend",
18     name = "services",
19     havingValue = "inmemory",
20     matchIfMissing = true)
21 @Configuration
22 public class InMemoryServicesConfiguration
23 {
24   @Bean
25   ChatHome[] chatHomes(
26       ChatBackendProperties properties,
27       InMemoryChatHomeService chatHomeService,
28       StorageStrategy storageStrategy)
29   {
30     SimpleChatHome[] chatHomes = new SimpleChatHome[properties.getInmemory().getNumShards()];
31     storageStrategy
32         .read()
33         .subscribe(chatRoom ->
34         {
35           int shard = chatRoom.getShard();
36           if (chatHomes[shard] == null)
37             chatHomes[shard] = new SimpleChatHome(chatHomeService, shard);
38         });
39     return chatHomes;
40   }
41
42   @Bean
43   InMemoryChatHomeService chatHomeService(
44       ChatBackendProperties properties,
45       StorageStrategy storageStrategy)
46   {
47     return new InMemoryChatHomeService(
48         properties.getInmemory().getNumShards(),
49         properties.getInmemory().getOwnedShards(),
50         storageStrategy.read());
51   }
52
53   @Bean
54   InMemoryChatRoomFactory chatRoomFactory(
55       ShardingStrategy strategy,
56       Clock clock,
57       ChatBackendProperties properties)
58   {
59     return new InMemoryChatRoomFactory(
60         strategy,
61         clock,
62         properties.getChatroomBufferSize());
63   }
64
65   @ConditionalOnProperty(
66       prefix = "chat.backend.inmemory",
67       name = "sharding-strategy",
68       havingValue = "none",
69       matchIfMissing = true)
70   @Bean
71   ShardingStrategy defaultShardingStrategy()
72   {
73     return chatRoomId -> 0;
74   }
75
76   @ConditionalOnProperty(
77       prefix = "chat.backend.inmemory",
78       name = "sharding-strategy",
79       havingValue = "kafkalike")
80   @Bean
81   ShardingStrategy kafkalikeShardingStrategy(ChatBackendProperties properties)
82   {
83     return new KafkaLikeShardingStrategy(
84         properties.getInmemory().getNumShards());
85   }
86 }