From 23a46b4be35277e06ec89f48730eeb694e686be8 Mon Sep 17 00:00:00 2001
From: Kenmegne <stephanie.kenmegne@gmail.com>
Date: Thu, 18 Jun 2026 15:40:06 +0000
Subject: [PATCH] add fdx-commons and fdx-consultation

---
 fdx-commons/fdxcommons-core-impl/src/main/java/com/megatim/fdxcommons/core/impl/interceptor/InterceptorHandlerImpl.java |  158 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 158 insertions(+), 0 deletions(-)

diff --git a/fdx-commons/fdxcommons-core-impl/src/main/java/com/megatim/fdxcommons/core/impl/interceptor/InterceptorHandlerImpl.java b/fdx-commons/fdxcommons-core-impl/src/main/java/com/megatim/fdxcommons/core/impl/interceptor/InterceptorHandlerImpl.java
new file mode 100644
index 0000000..93902e7
--- /dev/null
+++ b/fdx-commons/fdxcommons-core-impl/src/main/java/com/megatim/fdxcommons/core/impl/interceptor/InterceptorHandlerImpl.java
@@ -0,0 +1,158 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
+ */
+package com.megatim.fdxcommons.core.impl.interceptor;
+
+import com.google.gson.Gson;
+import com.google.gson.internal.LinkedTreeMap;
+import com.megatim.fdxcommons.core.ifaces.interceptor.LoggingInterceptorBinding;
+import com.megatim.fdxcommons.core.ifaces.interceptor.InterceptorHandler;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import javax.enterprise.context.Dependent;
+import javax.ws.rs.core.MultivaluedMap;
+
+/**
+ * {} : Les paramètres de requête sont entre accolades () : La valeur de retour
+ * entre les parenthèses [] : L'entité de requête est entre les crochets
+ *
+ * @author ASUS
+ */
+@Dependent
+public class InterceptorHandlerImpl implements InterceptorHandler {
+
+    @Override
+    public String finalMessage(LoggingInterceptorBinding interceptorBinding, Parameter[] parameters, MultivaluedMap<String, String> queryParams, Object requestEntity, Object responseEntity) throws Exception {
+        //Recherche des références au paramètres de la requête
+        String message = infoFromPathParameters(interceptorBinding.message(), queryParams);
+
+        //Recherche des références aux éléments du tableau de paramètres
+        message = infoFromParameters(message, parameters, requestEntity);
+
+        //Recherche des références à la valeur de retour
+        return infoFromReturnValue(message, interceptorBinding.classe(), responseEntity);
+    }
+
+    private String infoFromPathParameters(String message, MultivaluedMap<String, String> queryParams) throws Exception {
+        if (!queryParams.isEmpty()) {
+            Pattern pattern = Pattern.compile("\\{\\S{1,}\\}");
+            Matcher matcher = pattern.matcher(message);
+
+            while (matcher.find()) {
+                String group = matcher.group();
+                String fieldName = group.substring(1, group.length() - 1);
+
+                if (queryParams.containsKey(fieldName)) {
+                    message = message.replace(group, queryParams.getFirst(fieldName));
+                }
+            }
+        }
+        return message;
+    }
+
+    private String infoFromReturnValue(String message, Class<?> classe, Object dataToProcess) throws Exception {
+        Pattern pattern = Pattern.compile("\\(\\S{1,}\\)");
+        Matcher matcher = pattern.matcher(message);
+
+        while (matcher.find()) {
+            String group = matcher.group();
+            String fieldName = group.substring(1, group.length() - 1);
+            String[] fieldPath = fieldName.split("\\.");
+            String fieldValue = value(fieldPath, classe, dataToProcess);
+            message = message.replace(group, fieldValue);
+        }
+
+        return message;
+    }
+
+    private String infoFromParameters(String message, Parameter[] parameters, Object requestEntity) throws Exception {
+        if (parameters.length > 0) {
+            Pattern pattern = Pattern.compile("\\[\\d{1,}\\S*\\]");
+            Matcher matcher = pattern.matcher(message);
+
+            while (matcher.find()) {
+                String group = matcher.group();
+                String fieldName = group.substring(1, group.length() - 1);
+                String[] fieldPath = fieldName.split("\\.");
+                int index = Integer.parseInt(fieldPath[0]);
+
+                if (requestEntity != null && index < parameters.length) {
+                    Object obj = new Gson().fromJson(requestEntity.toString(), parameters[index].getType());
+                    String value = "";
+
+                    if (fieldPath.length == 1) {
+                        value = value(fieldPath, parameters[index].getType(), obj);
+                    } else {
+                        value = value(Arrays.copyOfRange(fieldPath, 1, fieldPath.length),
+                                parameters[index].getType(), obj);
+                    }
+
+                    message = message.replace(group, value);
+                }
+            }
+        }
+        return message;
+    }
+
+    private String value(String[] fieldPath, Class<?> classe, Object dataToProcess) throws Exception {
+
+        if (dataToProcess instanceof Collection) {
+            return valueFromCollection(fieldPath, classe, (Collection) dataToProcess);
+
+        } else {
+            return valueFromField(fieldPath, classe, dataToProcess);
+        }
+    }
+
+    private String valueFromCollection(String[] fieldPath, Class<?> classe, Collection collection) throws Exception {
+        List<String> values = new ArrayList<>();
+        for (Object obj : collection) {
+            values.add(valueFromField(fieldPath, classe, obj));
+        }
+        return "[" + values.stream().collect(Collectors.joining(",")) + "]";
+    }
+
+    private String valueFromLinkedTreeMap(LinkedTreeMap dataToProcess, String field) {
+        return dataToProcess.get(field).toString();
+    }
+
+    private String valueFromField(String[] fieldPath, Class<?> classe, Object dataToProcess) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+        if (dataToProcess instanceof LinkedTreeMap) {
+            return valueFromLinkedTreeMap((LinkedTreeMap) dataToProcess, fieldPath[0]);
+        } else {
+            String methodName = "get" + (fieldPath[0].charAt(0) + "").toUpperCase() + fieldPath[0].substring(1);
+            Method method = classe.getMethod(methodName);
+            Object obj = method.invoke(classe.cast(dataToProcess));
+
+            if (fieldPath.length == 1) {
+                return obj.toString();
+
+            } else {
+                Class<?> classToParse = fieldType(fieldPath[0], classe);
+                return valueFromField(Arrays.copyOfRange(fieldPath, 1, fieldPath.length), classToParse, obj);
+            }
+        }
+    }
+
+    private Class<?> fieldType(String fieldName, Class<?> classe) {
+        Optional<Field> optionalField = Arrays.asList(classe.getDeclaredFields()).stream().filter(f -> f.getName().equals(fieldName)).findFirst();
+
+        if (optionalField.isPresent()) {
+            return optionalField.get().getType();
+        } else {
+            return null;
+        }
+    }
+
+}

--
Gitblit v1.10.0