Make statistics class a singleton.
authorJérôme Benoit <jerome.benoit@sap.com>
Fri, 23 Oct 2020 10:42:33 +0000 (12:42 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Fri, 23 Oct 2020 10:42:33 +0000 (12:42 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/ChargingStation.js
src/utils/Statistics.js
src/utils/Utils.js

index f5a67fe9fb6f56215c90db46cbd7e0b39dcde5b5..424305936a16cdc04d7fd5ef900fb1166c6af404 100644 (file)
@@ -105,8 +105,8 @@ class ChargingStation {
       }
     }
     this._stationInfo.powerDivider = this._getPowerDivider();
-    // FIXME: Conditionally initialize or use singleton design pattern per charging station
-    this._statistics = new Statistics(this._stationInfo.name);
+    this._statistics = Statistics.getInstance();
+    this._statistics.objName = this._stationInfo.name;
     this._performanceObserver = new PerformanceObserver((list) => {
       const entry = list.getEntries()[0];
       this._statistics.logPerformance(entry, 'ChargingStation');
index 743cb0b7a03f70b37e794d8fca2d30e3f6be4cd2..d53cbe45f415b447d118bd470cc4aab2b7526f95 100644 (file)
@@ -3,11 +3,23 @@ const logger = require('./Logger');
 const Utils = require('./Utils');
 
 class Statistics {
-  constructor(objName) {
-    this._objName = objName;
+  static instance;
+
+  constructor() {
     this._statistics = {};
   }
 
+  set objName(objName) {
+    this._objName = objName;
+  }
+
+  static getInstance() {
+    if (!Statistics.instance) {
+      Statistics.instance = new Statistics();
+    }
+    return Statistics.instance;
+  }
+
   _logPrefix() {
     return Utils.logPrefix(` ${this._objName} Statistics:`);
   }
index 7864057299142813d0f51a19372ffc6dedb00efd..bd8c80368d82169aabc69a1dfca01781fb5007ce 100644 (file)
@@ -15,18 +15,6 @@ class Utils {
     return date.toISOString().substr(11, 8);
   }
 
-  static convertToDate(date) {
-    // Check
-    if (!date) {
-      return date;
-    }
-    // Check Type
-    if (!(date instanceof Date)) {
-      return new Date(date);
-    }
-    return date;
-  }
-
   static isIterable(obj) {
     if (obj) {
       return typeof obj[Symbol.iterator] === 'function';
@@ -63,6 +51,18 @@ class Utils {
     }
   }
 
+  static convertToDate(date) {
+    // Check
+    if (!date) {
+      return date;
+    }
+    // Check Type
+    if (!(date instanceof Date)) {
+      return new Date(date);
+    }
+    return date;
+  }
+
   static convertToObjectID(id) {
     let changedID = id;
     // Check
@@ -119,11 +119,29 @@ class Utils {
     return result;
   }
 
-  static getRandomInt(max, min) {
+  static getRandomFloat(max, min = 0) {
+    if (min) {
+      return Math.random() * (max - min + 1) + min;
+    }
+    return Math.random() * max + 1;
+  }
+
+  static getRandomInt(max, min = 0) {
     if (min) {
-      return Math.floor((Math.random() * (max - min + 1)) + min);
+      return Math.floor(Utils.getRandomFloat(max, min));
     }
-    return Math.floor((Math.random() * max + 1));
+    return Math.floor(Utils.getRandomFloat(max));
+  }
+
+  static roundTo(number, scale) {
+    return Utils.convertToFloat(number.toFixed(scale));
+  }
+
+  static getRandomFloatRounded(max, min = 0, scale = 2) {
+    if (min) {
+      return Utils.roundTo(Utils.getRandomFloat(max, min), scale);
+    }
+    return Utils.roundTo(Utils.getRandomFloat(max), scale);
   }
 
   static logPrefix(prefixString = '') {
@@ -139,6 +157,10 @@ class Utils {
     return JSON.parse(JSON.stringify(jsonDocument));
   }
 
+  static isString(value) {
+    return typeof value === 'string';
+  }
+
   static isUndefined(value) {
     return typeof value === 'undefined';
   }