refactor(simulator): switch to internal modules export/import design
[e-mobility-charging-stations-simulator.git] / src / charging-station / SharedLRUCache.ts
CommitLineData
8114d10e
JB
1import LRUCache from 'mnemonist/lru-map-with-delete';
2
17bc43d7 3import { Bootstrap } from './internal';
268a74bb
JB
4import type { ChargingStationConfiguration, ChargingStationTemplate } from '../types';
5import { Utils } from '../utils/Utils';
7c72977b
JB
6
7enum CacheType {
8 CHARGING_STATION_TEMPLATE = 'chargingStationTemplate',
9 CHARGING_STATION_CONFIGURATION = 'chargingStationConfiguration',
10}
11
0e89dd9a
JB
12type CacheableType = ChargingStationTemplate | ChargingStationConfiguration;
13
268a74bb 14export class SharedLRUCache {
57adbebc 15 private static instance: SharedLRUCache | null = null;
0e89dd9a 16 private readonly lruCache: LRUCache<string, CacheableType>;
7c72977b
JB
17
18 private constructor() {
d1c99c59 19 this.lruCache = new LRUCache<string, CacheableType>(
c3d8778e
JB
20 Bootstrap.getInstance().numberOfChargingStationTemplates +
21 Bootstrap.getInstance().numberOfChargingStations
d1c99c59 22 );
7c72977b
JB
23 }
24
57adbebc 25 public static getInstance(): SharedLRUCache {
1ca780f9 26 if (SharedLRUCache.instance === null) {
57adbebc 27 SharedLRUCache.instance = new SharedLRUCache();
7c72977b 28 }
57adbebc 29 return SharedLRUCache.instance;
7c72977b
JB
30 }
31
32 public hasChargingStationConfiguration(chargingStationConfigurationHash: string): boolean {
ec690502 33 return this.has(this.getChargingStationConfigurationKey(chargingStationConfigurationHash));
7c72977b
JB
34 }
35
36 public setChargingStationConfiguration(
37 chargingStationConfiguration: ChargingStationConfiguration
38 ): void {
c14729f4 39 if (this.isChargingStationConfigurationCacheable(chargingStationConfiguration)) {
7c72977b 40 this.set(
ec690502 41 this.getChargingStationConfigurationKey(chargingStationConfiguration.configurationHash),
7c72977b
JB
42 chargingStationConfiguration
43 );
44 }
45 }
46
47 public getChargingStationConfiguration(
48 chargingStationConfigurationHash: string
49 ): ChargingStationConfiguration {
50 return this.get(
ec690502 51 this.getChargingStationConfigurationKey(chargingStationConfigurationHash)
7c72977b
JB
52 ) as ChargingStationConfiguration;
53 }
54
55 public deleteChargingStationConfiguration(chargingStationConfigurationHash: string): void {
ec690502 56 this.delete(this.getChargingStationConfigurationKey(chargingStationConfigurationHash));
7c72977b
JB
57 }
58
59 public hasChargingStationTemplate(chargingStationTemplateHash: string): boolean {
ec690502 60 return this.has(this.getChargingStationTemplateKey(chargingStationTemplateHash));
7c72977b
JB
61 }
62
63 public setChargingStationTemplate(chargingStationTemplate: ChargingStationTemplate): void {
64 this.set(
ec690502 65 this.getChargingStationTemplateKey(chargingStationTemplate.templateHash),
7c72977b
JB
66 chargingStationTemplate
67 );
68 }
69
70 public getChargingStationTemplate(chargingStationTemplateHash: string): ChargingStationTemplate {
71 return this.get(
ec690502 72 this.getChargingStationTemplateKey(chargingStationTemplateHash)
7c72977b
JB
73 ) as ChargingStationTemplate;
74 }
75
76 public deleteChargingStationTemplate(chargingStationTemplateHash: string): void {
ec690502 77 this.delete(this.getChargingStationTemplateKey(chargingStationTemplateHash));
7c72977b
JB
78 }
79
80 public clear(): void {
81 this.lruCache.clear();
82 }
83
ec690502 84 private getChargingStationConfigurationKey(hash: string): string {
14ecae6a 85 return `${CacheType.CHARGING_STATION_CONFIGURATION}${hash}`;
ec690502
JB
86 }
87
88 private getChargingStationTemplateKey(hash: string): string {
14ecae6a 89 return `${CacheType.CHARGING_STATION_TEMPLATE}${hash}`;
ec690502
JB
90 }
91
7c72977b
JB
92 private has(key: string): boolean {
93 return this.lruCache.has(key);
94 }
95
1895299d 96 private get(key: string): CacheableType | undefined {
7c72977b
JB
97 return this.lruCache.get(key);
98 }
99
0e89dd9a 100 private set(key: string, value: CacheableType): void {
7c72977b
JB
101 this.lruCache.set(key, value);
102 }
103
104 private delete(key: string): void {
105 this.lruCache.delete(key);
106 }
c14729f4
JB
107
108 private isChargingStationConfigurationCacheable(
109 chargingStationConfiguration: ChargingStationConfiguration
110 ): boolean {
111 return (
a56d48e7
JB
112 Utils.isNullOrUndefined(chargingStationConfiguration?.configurationKey) === false &&
113 Utils.isNullOrUndefined(chargingStationConfiguration?.stationInfo) === false &&
114 Utils.isNullOrUndefined(chargingStationConfiguration?.configurationHash) === false &&
53ac516c 115 Utils.isNotEmptyArray(chargingStationConfiguration?.configurationKey) === true &&
a56d48e7 116 Utils.isEmptyObject(chargingStationConfiguration?.stationInfo) === false &&
5a2a53cf 117 Utils.isNotEmptyString(chargingStationConfiguration?.configurationHash) === true
c14729f4
JB
118 );
119 }
7c72977b 120}