From ec58209519705a31c36695012bc5774c13ca753a Mon Sep 17 00:00:00 2001 From: atravieso Date: Tue, 1 Apr 2025 10:14:12 -0400 Subject: [PATCH] ADD - MessageRepository --- .../banesco/domain/model/BackResponse.java | 7 ++ .../infraestructure/helpers/JsonHelper.java | 2 +- .../repository/MessageRepository.java | 111 ++++++++++++++++++ 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/banesco/infraestructure/repository/MessageRepository.java diff --git a/src/main/java/com/banesco/domain/model/BackResponse.java b/src/main/java/com/banesco/domain/model/BackResponse.java index 882bf56..955c848 100644 --- a/src/main/java/com/banesco/domain/model/BackResponse.java +++ b/src/main/java/com/banesco/domain/model/BackResponse.java @@ -6,6 +6,13 @@ public class BackResponse { private final String statusCode; private final String description; + public BackResponse(String value) { + this.backendCode = value; + this.httpCode = value; + this.statusCode = value; + this.description = value; + } + private BackResponse(Builder builder) { this.backendCode = builder.backendCode; this.httpCode = builder.httpCode; diff --git a/src/main/java/com/banesco/infraestructure/helpers/JsonHelper.java b/src/main/java/com/banesco/infraestructure/helpers/JsonHelper.java index a41120b..121c388 100644 --- a/src/main/java/com/banesco/infraestructure/helpers/JsonHelper.java +++ b/src/main/java/com/banesco/infraestructure/helpers/JsonHelper.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class JsonHelper { private static final Logger logger = Logger.getLogger(JsonHelper.class.getName()); - private static final ObjectMapper MAPPER = new ObjectMapper(); + public static final ObjectMapper MAPPER = new ObjectMapper(); static { MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); diff --git a/src/main/java/com/banesco/infraestructure/repository/MessageRepository.java b/src/main/java/com/banesco/infraestructure/repository/MessageRepository.java new file mode 100644 index 0000000..443220d --- /dev/null +++ b/src/main/java/com/banesco/infraestructure/repository/MessageRepository.java @@ -0,0 +1,111 @@ +package com.banesco.infraestructure.repository; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.banesco.domain.model.BackResponse; +import com.banesco.infraestructure.helpers.JsonHelper; +import com.banesco.infraestructure.helpers.StringHelper; + +public class MessageRepository { + + private static final Logger logger = Logger.getLogger(MessageRepository.class.getName()); + + /** + * Respuesta de error por defecto que se utiliza cuando no se encuentra un + * error específico. + */ + public final BackResponse DEFAULT_ERROR = new BackResponse("CONFLICT"); + + /** + * Mapa que almacena múltiples mapas de códigos de error, donde la clave + * principal es el nombre del archivo de mensajes. + */ + public final Map> mapErrorsMultiple = new HashMap<>(); + + /** + * Carga los mensajes de error desde un InputStream y los almacena en un + * mapa. + * + * @param inputStream El InputStream que contiene los datos JSON de los + * mensajes de error. + * @param messageFileKey La clave del archivo de mensajes, utilizada para + * almacenar el mapa en mapErrorsMultiple. + * @return Un mapa que contiene los códigos de error como claves y los + * objetos BackResponse como valores. + * @throws IOException Si ocurre un error de entrada/salida al leer el + * InputStream. + */ + private Map loadFile(InputStream inputStream, String messageFileKey) throws IOException { + Map mapStatusCodes = new HashMap<>(); + Arrays.stream(JsonHelper.MAPPER.readValue(inputStream, BackResponse[].class)).forEach(o -> { + mapStatusCodes.put(o.getBackendCode(), o); + }); + mapErrorsMultiple.put(messageFileKey, mapStatusCodes); + return mapStatusCodes; + } + + /** + * Carga los mensajes de error desde una cadena JSON y los almacena en un + * mapa. + * + * @param messageFileKey La clave del archivo de mensajes, utilizada para + * almacenar el mapa en mapErrorsMultiple. + * @param jsonString La cadena JSON que contiene los datos de los mensajes + * de error. + * @throws IOException Si ocurre un error al procesar la cadena JSON. + */ + public void loadMessagesFromString(String messageFileKey, String jsonString) throws IOException { + Map mapStatusCodes = new HashMap<>(); + Arrays.stream(JsonHelper.MAPPER.readValue(jsonString, BackResponse[].class)).forEach(o -> { + mapStatusCodes.put(o.getBackendCode(), o); + }); + mapErrorsMultiple.put(messageFileKey, mapStatusCodes); + } + + /** + * Obtiene el mapa de códigos de error para un archivo de respuesta + * específico. + * + * @param responseFile El nombre del archivo de respuesta para el cual se + * desea obtener el mapa de errores. + * @return Un mapa que contiene los códigos de error como claves y los + * objetos BackResponse como valores, o null si no se encuentra el mapa. + */ + public Map getErrorMap(String responseFile) { + Map errorMap = mapErrorsMultiple.get(responseFile); + if (errorMap != null && !errorMap.isEmpty()) { + return errorMap; + } + + String fileName = (StringHelper.isNumeric(responseFile) ? "vb".concat(responseFile) : responseFile).concat(".json"); + + try { + try { + // Intenta cargar el archivo desde el directorio /config/. + return loadFile(new FileInputStream("/config/".concat(fileName)), responseFile); + } catch (IOException e) { + // Si no se encuentra el archivo en /config/, intenta cargarlo desde el classpath. + logger.log(Level.WARNING, String.format("Path /config/%s not found. Loading local from errors-mapping/%s", fileName, fileName)); + ClassLoader classLoader = getClass().getClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream("errors-mapping/" + fileName); + if (inputStream == null) { + // Si no se encuentra el archivo en el classpath, registra un error y devuelve null. + logger.log(Level.SEVERE, String.format("Resource errors-mapping/%s not found.", fileName)); + return null; + } + return loadFile(inputStream, responseFile); + } + } catch (IOException e) { + // Si ocurre un error al cargar el archivo desde cualquier ubicación, registra un error y devuelve null. + logger.log(Level.SEVERE, String.format("Error loading Service Messages from /config/%s and errors-mapping/%s: %s", fileName, fileName, e.getMessage())); + return null; + } + } +}