package jnpf.dmsIntegration.audit;
|
|
import jnpf.audit.model.AuditRelatedSignDTO;
|
import jnpf.audit.sdk.AuditRequestCorrelationResolver;
|
import jnpf.dmsEntity.permission.form.DmsAuditSignForm;
|
import org.springframework.web.context.request.RequestAttributes;
|
import org.springframework.web.context.request.RequestContextHolder;
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
import jakarta.servlet.http.HttpServletRequest;
|
import java.lang.reflect.Array;
|
import java.util.ArrayList;
|
import java.util.Collection;
|
import java.util.LinkedHashMap;
|
import java.util.List;
|
import java.util.Locale;
|
import java.util.Map;
|
|
/** Extracts optional signature ids from request fields whose names end with {@code _sign}. */
|
public final class DmsAuditRequestSignResolver {
|
private DmsAuditRequestSignResolver() {
|
}
|
|
public static List<AuditRelatedSignDTO> resolve(Map<String, ?> bodyParameters) {
|
Map<String, AuditRelatedSignDTO> signs = new LinkedHashMap<>();
|
collectRequestHeader(signs);
|
collect(signs, bodyParameters);
|
collect(signs, currentRequestParameters());
|
return new ArrayList<>(signs.values());
|
}
|
|
public static List<AuditRelatedSignDTO> resolve(DmsAuditSignForm form) {
|
if (form == null) {
|
return resolve(java.util.Collections.emptyMap());
|
}
|
Map<String, Object> parameters = new LinkedHashMap<>(form.getAuditSignParameters());
|
parameters.put("biz_sign", form.getBizSign());
|
return resolve(parameters);
|
}
|
|
private static Map<String, ?> currentRequestParameters() {
|
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
|
if (!(attributes instanceof ServletRequestAttributes)) {
|
return java.util.Collections.emptyMap();
|
}
|
HttpServletRequest request = ((ServletRequestAttributes) attributes).getRequest();
|
return request == null ? java.util.Collections.emptyMap() : request.getParameterMap();
|
}
|
|
private static void collectRequestHeader(Map<String, AuditRelatedSignDTO> signs) {
|
String signId = AuditRequestCorrelationResolver.currentBizSign();
|
if (signId == null || signId.trim().isEmpty()) {
|
return;
|
}
|
String normalized = signId.trim();
|
signs.put(normalized, new AuditRelatedSignDTO(normalized, "PRIMARY"));
|
}
|
|
private static void collect(Map<String, AuditRelatedSignDTO> signs, Map<String, ?> parameters) {
|
if (parameters == null) {
|
return;
|
}
|
for (Map.Entry<String, ?> entry : parameters.entrySet()) {
|
String name = entry.getKey();
|
if (name == null || !name.toLowerCase(Locale.ROOT).endsWith("_sign")) {
|
continue;
|
}
|
collectValues(signs, entry.getValue());
|
}
|
}
|
|
private static void collectValues(Map<String, AuditRelatedSignDTO> signs, Object value) {
|
if (value instanceof Collection) {
|
for (Object item : (Collection<?>) value) {
|
collectValues(signs, item);
|
}
|
return;
|
}
|
if (value != null && value.getClass().isArray()) {
|
for (int i = 0; i < Array.getLength(value); i++) {
|
collectValues(signs, Array.get(value, i));
|
}
|
return;
|
}
|
if (value == null) {
|
return;
|
}
|
String signId = String.valueOf(value).trim();
|
if (!signId.isEmpty()) {
|
signs.putIfAbsent(signId, new AuditRelatedSignDTO(signId, null));
|
}
|
}
|
}
|