Factor out JSON schemas parsing with per OCPP stack version
authorJérôme Benoit <jerome.benoit@sap.com>
Thu, 26 Jan 2023 15:34:07 +0000 (16:34 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Thu, 26 Jan 2023 15:34:07 +0000 (16:34 +0100)
specialisation

Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/AuthorizedTagsCache.ts
src/charging-station/ChargingStation.ts
src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts
src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts
src/charging-station/ocpp/OCPPServiceUtils.ts
src/performance/storage/JsonFileStorage.ts
src/utils/Configuration.ts
src/utils/FileUtils.ts

index 8c95660d07130155f495ec3d1fa7d017dbab1ca6..b5058291b71c1a336ce914786d94f6a90af2e80f 100644 (file)
@@ -30,10 +30,10 @@ export default class AuthorizedTagsCache {
         this.FSWatchers.set(
           file,
           FileUtils.watchJsonFile(
-            this.logPrefix(file),
-            FileType.Authorization,
             file,
-            null,
+            FileType.Authorization,
+            this.logPrefix(file),
+            undefined,
             (event, filename) => {
               if (!Utils.isEmptyString(filename) && event === 'change') {
                 try {
@@ -44,10 +44,10 @@ export default class AuthorizedTagsCache {
                   this.deleteFSWatcher(file);
                 } catch (error) {
                   FileUtils.handleFileException(
-                    this.logPrefix(file),
-                    FileType.Authorization,
                     file,
+                    FileType.Authorization,
                     error as NodeJS.ErrnoException,
+                    this.logPrefix(file),
                     {
                       throwError: false,
                     }
@@ -94,10 +94,10 @@ export default class AuthorizedTagsCache {
         authorizedTags = JSON.parse(fs.readFileSync(file, 'utf8')) as string[];
       } catch (error) {
         FileUtils.handleFileException(
-          this.logPrefix(file),
-          FileType.Authorization,
           file,
-          error as NodeJS.ErrnoException
+          FileType.Authorization,
+          error as NodeJS.ErrnoException,
+          this.logPrefix(file)
         );
       }
     } else {
index c9806f21e6b614574b457daeb3f24f02df359ea8..514d50cee292b8975e3d46a39b87bb59813db486 100644 (file)
@@ -506,10 +506,10 @@ export default class ChargingStation {
         this.openWSConnection();
         // Monitor charging station template file
         this.templateFileWatcher = FileUtils.watchJsonFile(
-          this.logPrefix(),
-          FileType.ChargingStationTemplate,
           this.templateFile,
-          null,
+          FileType.ChargingStationTemplate,
+          this.logPrefix(),
+          undefined,
           (event, filename): void => {
             if (!Utils.isEmptyString(filename) && event === 'change') {
               try {
@@ -819,10 +819,10 @@ export default class ChargingStation {
       }
     } catch (error) {
       FileUtils.handleFileException(
-        this.logPrefix(),
-        FileType.ChargingStationTemplate,
         this.templateFile,
-        error as NodeJS.ErrnoException
+        FileType.ChargingStationTemplate,
+        error as NodeJS.ErrnoException,
+        this.logPrefix()
       );
     }
     return template;
@@ -1335,10 +1335,10 @@ export default class ChargingStation {
         }
       } catch (error) {
         FileUtils.handleFileException(
-          this.logPrefix(),
-          FileType.ChargingStationConfiguration,
           this.configurationFile,
-          error as NodeJS.ErrnoException
+          FileType.ChargingStationConfiguration,
+          error as NodeJS.ErrnoException,
+          this.logPrefix()
         );
       }
     }
@@ -1381,10 +1381,10 @@ export default class ChargingStation {
         }
       } catch (error) {
         FileUtils.handleFileException(
-          this.logPrefix(),
-          FileType.ChargingStationConfiguration,
           this.configurationFile,
-          error as NodeJS.ErrnoException
+          FileType.ChargingStationConfiguration,
+          error as NodeJS.ErrnoException,
+          this.logPrefix()
         );
       }
     } else {
index d09a8548d28e0545e949fd7c9913637e7ee0dd69..de9c8548926477a3c73f8de0bd3c5c0bced4aa7c 100644 (file)
@@ -1,6 +1,5 @@
 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
 
-import fs from 'node:fs';
 import path from 'node:path';
 import { fileURLToPath } from 'node:url';
 
@@ -8,7 +7,6 @@ import type { JSONSchemaType } from 'ajv';
 
 import OCPPError from '../../../exception/OCPPError';
 import { CurrentType, Voltage } from '../../../types/ChargingStationTemplate';
-import { FileType } from '../../../types/FileType';
 import type { JsonType } from '../../../types/JsonType';
 import type {
   MeasurandPerPhaseSampledValueTemplates,
@@ -37,7 +35,6 @@ import { ErrorType } from '../../../types/ocpp/ErrorType';
 import { OCPPVersion } from '../../../types/ocpp/OCPPVersion';
 import Constants from '../../../utils/Constants';
 import { ACElectricUtils, DCElectricUtils } from '../../../utils/ElectricUtils';
-import FileUtils from '../../../utils/FileUtils';
 import logger from '../../../utils/Logger';
 import Utils from '../../../utils/Utils';
 import type ChargingStation from '../../ChargingStation';
@@ -790,18 +787,10 @@ export class OCPP16ServiceUtils extends OCPPServiceUtils {
   }
 
   public static parseJsonSchemaFile<T extends JsonType>(relativePath: string): JSONSchemaType<T> {
-    const filePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), relativePath);
-    try {
-      return JSON.parse(fs.readFileSync(filePath, 'utf8')) as JSONSchemaType<T>;
-    } catch (error) {
-      FileUtils.handleFileException(
-        OCPPServiceUtils.logPrefix(OCPPVersion.VERSION_16),
-        FileType.JsonSchema,
-        filePath,
-        error as NodeJS.ErrnoException,
-        { throwError: false }
-      );
-    }
+    return super.parseJsonSchemaFile<T>(
+      path.resolve(path.dirname(fileURLToPath(import.meta.url)), relativePath),
+      OCPPVersion.VERSION_16
+    );
   }
 
   private static buildSampledValue(
index 2c7d3df3191f2246eb3086e4bb02d003ef241663..e6f5c7adf7243e43f2ae52ddd8b6516831aae4e9 100644 (file)
@@ -1,30 +1,19 @@
 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
 
-import fs from 'node:fs';
 import path from 'node:path';
 import { fileURLToPath } from 'node:url';
 
 import type { JSONSchemaType } from 'ajv';
 
-import { FileType } from '../../../types/FileType';
 import type { JsonType } from '../../../types/JsonType';
 import { OCPPVersion } from '../../../types/ocpp/OCPPVersion';
-import FileUtils from '../../../utils/FileUtils';
 import { OCPPServiceUtils } from '../OCPPServiceUtils';
 
 export class OCPP20ServiceUtils extends OCPPServiceUtils {
   public static parseJsonSchemaFile<T extends JsonType>(relativePath: string): JSONSchemaType<T> {
-    const filePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), relativePath);
-    try {
-      return JSON.parse(fs.readFileSync(filePath, 'utf8')) as JSONSchemaType<T>;
-    } catch (error) {
-      FileUtils.handleFileException(
-        OCPPServiceUtils.logPrefix(OCPPVersion.VERSION_20),
-        FileType.JsonSchema,
-        filePath,
-        error as NodeJS.ErrnoException,
-        { throwError: false }
-      );
-    }
+    return super.parseJsonSchemaFile<T>(
+      path.resolve(path.dirname(fileURLToPath(import.meta.url)), relativePath),
+      OCPPVersion.VERSION_20
+    );
   }
 }
index 451870862ad1c5630a68fa34da323594e1e27fa7..c85ccf2fb753523fa01dcd5a4646616216f6d2b2 100644 (file)
@@ -1,6 +1,9 @@
-import type { DefinedError, ErrorObject } from 'ajv';
+import fs from 'node:fs';
+
+import type { DefinedError, ErrorObject, JSONSchemaType } from 'ajv';
 
 import BaseError from '../../exception/BaseError';
+import { FileType } from '../../types/FileType';
 import type { JsonObject, JsonType } from '../../types/JsonType';
 import type { SampledValueTemplate } from '../../types/MeasurandPerPhaseSampledValueTemplates';
 import type { OCPP16StatusNotificationRequest } from '../../types/ocpp/1.6/Requests';
@@ -19,6 +22,7 @@ import {
   type StatusNotificationRequest,
 } from '../../types/ocpp/Requests';
 import Constants from '../../utils/Constants';
+import FileUtils from '../../utils/FileUtils';
 import logger from '../../utils/Logger';
 import Utils from '../../utils/Utils';
 import type ChargingStation from '../ChargingStation';
@@ -164,8 +168,21 @@ export class OCPPServiceUtils {
     }
   }
 
-  protected static logPrefix(ocppVersion: OCPPVersion): string {
-    return Utils.logPrefix(` OCPP ${ocppVersion} |`);
+  protected static parseJsonSchemaFile<T extends JsonType>(
+    filePath: string,
+    ocppVersion: OCPPVersion
+  ): JSONSchemaType<T> {
+    try {
+      return JSON.parse(fs.readFileSync(filePath, 'utf8')) as JSONSchemaType<T>;
+    } catch (error) {
+      FileUtils.handleFileException(
+        filePath,
+        FileType.JsonSchema,
+        error as NodeJS.ErrnoException,
+        OCPPServiceUtils.logPrefix(ocppVersion),
+        { throwError: false }
+      );
+    }
   }
 
   protected static getSampledValueTemplate(
@@ -265,4 +282,8 @@ export class OCPPServiceUtils {
       ? Math.min(numberValue * options.unitMultiplier, limit)
       : numberValue * options.unitMultiplier;
   }
+
+  private static logPrefix(ocppVersion: OCPPVersion): string {
+    return Utils.logPrefix(` OCPP ${ocppVersion} |`);
+  }
 }
index 1a1ebeba19b625c0640ac95905f89e627c0cf388..bacc8d21486e02f2b1fd18e79c7db5d28fa71605 100644 (file)
@@ -36,10 +36,10 @@ export class JsonFileStorage extends Storage {
           );
         } catch (error) {
           FileUtils.handleFileException(
-            this.logPrefix,
-            FileType.PerformanceRecords,
             this.dbName,
-            error as NodeJS.ErrnoException
+            FileType.PerformanceRecords,
+            error as NodeJS.ErrnoException,
+            this.logPrefix
           );
         }
         await release();
@@ -56,10 +56,10 @@ export class JsonFileStorage extends Storage {
       }
     } catch (error) {
       FileUtils.handleFileException(
-        this.logPrefix,
-        FileType.PerformanceRecords,
         this.dbName,
-        error as NodeJS.ErrnoException
+        FileType.PerformanceRecords,
+        error as NodeJS.ErrnoException,
+        this.logPrefix
       );
     }
   }
@@ -72,10 +72,10 @@ export class JsonFileStorage extends Storage {
       }
     } catch (error) {
       FileUtils.handleFileException(
-        this.logPrefix,
-        FileType.PerformanceRecords,
         this.dbName,
-        error as NodeJS.ErrnoException
+        FileType.PerformanceRecords,
+        error as NodeJS.ErrnoException,
+        this.logPrefix
       );
     }
   }
index 263fa04876d92d90080aae3946f4a36864a9e7d6..8490be4eb79a0bde8358c50849c7e8b5a5fa4ace 100644 (file)
@@ -357,10 +357,10 @@ export default class Configuration {
         ) as ConfigurationData;
       } catch (error) {
         Configuration.handleFileException(
-          Configuration.logPrefix(),
-          FileType.Configuration,
           Configuration.configurationFile,
-          error as NodeJS.ErrnoException
+          FileType.Configuration,
+          error as NodeJS.ErrnoException,
+          Configuration.logPrefix()
         );
       }
       if (!Configuration.configurationFileWatcher) {
@@ -385,10 +385,10 @@ export default class Configuration {
       });
     } catch (error) {
       Configuration.handleFileException(
-        Configuration.logPrefix(),
-        FileType.Configuration,
         Configuration.configurationFile,
-        error as NodeJS.ErrnoException
+        FileType.Configuration,
+        error as NodeJS.ErrnoException,
+        Configuration.logPrefix()
       );
     }
   }
@@ -423,10 +423,10 @@ export default class Configuration {
   }
 
   private static handleFileException(
-    logPrefix: string,
-    fileType: FileType,
     filePath: string,
+    fileType: FileType,
     error: NodeJS.ErrnoException,
+    logPrefix: string,
     params: HandleErrorParams<EmptyObject> = { throwError: true }
   ): void {
     const prefix = logPrefix.trim().length !== 0 ? `${logPrefix} ` : '';
index 19150af19fbc31d8a6d1a9a7d5554094f569efe4..8ef8168039b449e3bbd3d36c727852b07b413af8 100644 (file)
@@ -15,9 +15,9 @@ export default class FileUtils {
   }
 
   public static watchJsonFile<T extends JsonType>(
-    logPrefix: string,
-    fileType: FileType,
     file: string,
+    fileType: FileType,
+    logPrefix: string,
     refreshedVariable?: T,
     listener: fs.WatchListener<string> = (event, filename) => {
       if (!Utils.isEmptyString(filename) && event === 'change') {
@@ -25,7 +25,7 @@ export default class FileUtils {
           logger.debug(`${logPrefix} ${fileType} file ${file} have changed, reload`);
           refreshedVariable && (refreshedVariable = JSON.parse(fs.readFileSync(file, 'utf8')) as T);
         } catch (error) {
-          FileUtils.handleFileException(logPrefix, fileType, file, error as NodeJS.ErrnoException, {
+          FileUtils.handleFileException(file, fileType, error as NodeJS.ErrnoException, logPrefix, {
             throwError: false,
           });
         }
@@ -36,7 +36,7 @@ export default class FileUtils {
       try {
         return fs.watch(file, listener);
       } catch (error) {
-        FileUtils.handleFileException(logPrefix, fileType, file, error as NodeJS.ErrnoException, {
+        FileUtils.handleFileException(file, fileType, error as NodeJS.ErrnoException, logPrefix, {
           throwError: false,
         });
       }
@@ -46,10 +46,10 @@ export default class FileUtils {
   }
 
   public static handleFileException(
-    logPrefix: string,
-    fileType: FileType,
     file: string,
+    fileType: FileType,
     error: NodeJS.ErrnoException,
+    logPrefix: string,
     params: HandleErrorParams<EmptyObject> = { throwError: true, consoleOut: false }
   ): void {
     const prefix = !Utils.isEmptyString(logPrefix) ? `${logPrefix} ` : '';