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