From d39f2b7b7b4e2fea2a5402c63c10d3ce83097129 Mon Sep 17 00:00:00 2001
From: Thomas <>
Date: Thu, 23 Mar 2023 17:24:53 +0100
Subject: chore(core): update statistic logger as requested by the BM.I
---
.../specific/core/logger/StatisticLogger.java | 20 +-
ms_specific_connector/pom.xml | 4 +
.../core/logger/AdvancedStatisicLogger.java | 217 --------------------
.../core/logger/AdvancedStatisticLogger.java | 223 +++++++++++++++++++++
.../core/logger/MultipleStatisticLogger.java | 4 +-
ms_specific_proxyservice/pom.xml | 4 +
.../proxy/logger/AdvancedStatisicLogger.java | 176 ----------------
.../proxy/logger/AdvancedStatisticLogger.java | 182 +++++++++++++++++
.../proxy/logger/MultipleStatisticLogger.java | 4 +-
pom.xml | 5 +
10 files changed, 441 insertions(+), 398 deletions(-)
delete mode 100644 ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/AdvancedStatisicLogger.java
create mode 100644 ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/AdvancedStatisticLogger.java
delete mode 100644 ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/AdvancedStatisicLogger.java
create mode 100644 ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/AdvancedStatisticLogger.java
diff --git a/modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/logger/StatisticLogger.java b/modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/logger/StatisticLogger.java
index 22cace10..fd2be89b 100644
--- a/modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/logger/StatisticLogger.java
+++ b/modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/logger/StatisticLogger.java
@@ -31,6 +31,7 @@ import org.slf4j.LoggerFactory;
import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
import at.gv.egiz.eaaf.core.api.IRequest;
import at.gv.egiz.eaaf.core.api.IStatusMessenger;
+import at.gv.egiz.eaaf.core.api.data.EaafConstants;
import at.gv.egiz.eaaf.core.api.idp.IAuthData;
import at.gv.egiz.eaaf.core.api.logging.IStatisticLogger;
import at.gv.egiz.eaaf.core.exceptions.EaafException;
@@ -50,6 +51,8 @@ public class StatisticLogger implements IStatisticLogger {
protocolRequest.getSpEntityId(),
protocolRequest.getRawData(MsEidasNodeConstants.DATA_REQUESTERID),
protocolRequest.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier(),
+ extractSpCountryCode(protocolRequest.getServiceProviderConfiguration()
+ .getAreaSpecificTargetIdentifier()),
authData.getCiticenCountryCode(),
extractMatchingState(protocolRequest.getRawData(MsEidasNodeConstants.DATA_MATCHING_STATE)),
STATUS_SUCCESS,
@@ -72,6 +75,7 @@ public class StatisticLogger implements IStatisticLogger {
StringUtils.EMPTY,
StringUtils.EMPTY,
StringUtils.EMPTY,
+ StringUtils.EMPTY,
STATUS_ERROR,
errorId,
throwable.getMessage()));
@@ -91,6 +95,8 @@ public class StatisticLogger implements IStatisticLogger {
errorRequest.getSpEntityId(),
errorRequest.getRawData(MsEidasNodeConstants.DATA_REQUESTERID),
errorRequest.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier(),
+ extractSpCountryCode(errorRequest.getServiceProviderConfiguration()
+ .getAreaSpecificTargetIdentifier()),
StringUtils.EMPTY,
extractMatchingState(errorRequest.getRawData(MsEidasNodeConstants.DATA_MATCHING_STATE)),
STATUS_ERROR,
@@ -104,6 +110,7 @@ public class StatisticLogger implements IStatisticLogger {
StringUtils.EMPTY,
StringUtils.EMPTY,
StringUtils.EMPTY,
+ StringUtils.EMPTY,
STATUS_ERROR,
errorId,
throwable.getMessage()));
@@ -117,13 +124,23 @@ public class StatisticLogger implements IStatisticLogger {
}
+ private String extractSpCountryCode(String target) {
+ if (target.startsWith(EaafConstants.URN_PREFIX_EIDAS)) {
+ return target.split("\\+")[2];
+
+ } else {
+ return "AT";
+
+ }
+ }
+
private String extractMatchingState(Object state) {
return state != null ? state.toString() : MsEidasNodeConstants.MatchingStates.NO_REQUIRED.toString();
}
private String buildLogMessage(String transId, String entityId, Object requesterId, String target,
- String cc, String matchingState,
+ String spCountry, String cc, String matchingState,
String status, String errorCode, String errorMsg) {
String logMsg = StringUtils.EMPTY;
@@ -140,6 +157,7 @@ public class StatisticLogger implements IStatisticLogger {
}
logMsg += target + ",";
+ logMsg += spCountry + ",";
logMsg += cc + ",";
logMsg += matchingState + ",";
diff --git a/ms_specific_connector/pom.xml b/ms_specific_connector/pom.xml
index 253768ca..b618e3d9 100644
--- a/ms_specific_connector/pom.xml
+++ b/ms_specific_connector/pom.xml
@@ -127,6 +127,10 @@
cxf-rt-transports-http
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-properties
+
diff --git a/ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/AdvancedStatisicLogger.java b/ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/AdvancedStatisicLogger.java
deleted file mode 100644
index cfa93286..00000000
--- a/ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/AdvancedStatisicLogger.java
+++ /dev/null
@@ -1,217 +0,0 @@
-package at.asitplus.eidas.specific.core.logger;
-
-import java.time.LocalDateTime;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
-import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.log.statistic.DetailedMatchtingStatistic;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
-import at.gv.egiz.eaaf.core.api.IRequest;
-import at.gv.egiz.eaaf.core.api.IStatusMessenger;
-import at.gv.egiz.eaaf.core.api.idp.IAuthData;
-import at.gv.egiz.eaaf.core.api.logging.IStatisticLogger;
-import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * Extended statistic logger that use a JSON based data model.
- *
- * @author tlenz
- *
- */
-@Slf4j
-public class AdvancedStatisicLogger implements IStatisticLogger {
-
- private static final String DATEFORMATER = "yyyy.MM.dd-HH:mm:ss";
- private static final String DEFAULT_NO_IDP_ID = "no idpId available";
- private static final String DEFAULT_NO_SP_ID = "no appId available";
-
- private static final ObjectMapper mapper = new ObjectMapper();
-
- private final IStatusMessenger messageService;
-
- /**
- * Build a JSON based statistic logger that uses error messages from a specific source.
- *
- * @param source i18n message source
- */
- public AdvancedStatisicLogger(IStatusMessenger source) {
- this.messageService = source;
-
- }
-
- @Override
- public void logSuccessOperation(IRequest protocolRequest, IAuthData authData, boolean isSsoSession) {
- final StatisticLogEntry entry = buildCoreEntry(protocolRequest);
- entry.setSuccess(SuccessEntry.builder()
- .spSector(protocolRequest.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier())
- .citizenCountryCode(authData.getCiticenCountryCode())
- .build());
- entry.setMatching(MatchingDetails.builder()
- .matchingMethod(extractMatchingState(protocolRequest))
- .matchingDetails(extractMatchingDetails(protocolRequest))
- .build());
- writeEntryToLog(entry);
-
- }
-
- @Override
- public void logErrorOperation(Throwable throwable) {
- log.trace("Advanced statistic logger only logs on SP level");
-
- }
-
- @Override
- public void logErrorOperation(Throwable throwable, IRequest errorRequest) {
- final StatisticLogEntry entry = buildCoreEntry(errorRequest);
- entry.setError(new ErrorEntry(messageService.getResponseErrorCode(throwable), throwable.getMessage()));
- entry.setMatching(MatchingDetails.builder()
- .matchingMethod(extractMatchingState(errorRequest))
- .matchingDetails(extractMatchingDetails(errorRequest))
- .build());
- writeEntryToLog(entry);
-
- }
-
- @Override
- public void internalTesting() throws Exception {
- log.trace("Not implemented for a File-based logger");
-
- }
-
- private StatisticLogEntry buildCoreEntry(IRequest errorRequest) {
- Object appId = errorRequest.getRawData(MsEidasNodeConstants.DATA_REQUESTERID);
- return new StatisticLogEntry(
- LocalDateTime.now(),
- errorRequest.getUniqueTransactionIdentifier(),
- errorRequest.getServiceProviderConfiguration() != null
- && errorRequest.getServiceProviderConfiguration().getUniqueIdentifier() != null
- ? errorRequest.getServiceProviderConfiguration().getUniqueIdentifier() : DEFAULT_NO_IDP_ID,
- appId instanceof String && StringUtils.isNotEmpty((String)appId)
- ? (String)appId : DEFAULT_NO_SP_ID);
-
- }
-
- private String extractMatchingState(IRequest protocolRequest) {
- Object state = protocolRequest.getRawData(MsEidasNodeConstants.DATA_MATCHING_STATE);
- return state != null ? state.toString() : MsEidasNodeConstants.MatchingStates.NO_REQUIRED.toString();
-
- }
-
- private DetailedMatchtingStatistic extractMatchingDetails(IRequest protocolRequest) {
- try {
- if (!MsEidasNodeConstants.MatchingStates.NO_REQUIRED.toString().equals(
- extractMatchingState(protocolRequest))) {
- return MatchingTaskUtils.getDetailedMatchingStatistic(protocolRequest);
-
- }
-
- } catch (EaafStorageException e) {
- log.warn("Can not generate detailed matching statistic", e);
-
- }
-
- return null;
- }
-
- private void writeEntryToLog(StatisticLogEntry entry) {
- try {
- log.info(mapper.writeValueAsString(entry));
-
- } catch (final JsonProcessingException e) {
- log.error("Can NOT generate statistic entry for logging", e);
-
- }
- }
-
-
- @Getter
- @Setter
- @RequiredArgsConstructor
- @JsonInclude(Include.NON_NULL)
- private static class StatisticLogEntry {
-
- @JsonSerialize(using = LocalDateTimeSerializer.class)
- @JsonDeserialize(using = LocalDateTimeDeserializer.class)
- @JsonFormat(pattern = DATEFORMATER)
- @JsonProperty("timestamp")
- private final LocalDateTime timestamp;
-
- @JsonProperty("txId")
- private final String transactionId;
-
- @JsonProperty("entityid")
- private final String idpEntityId;
-
- @JsonProperty("unique-sp-id")
- private final String uniqueId;
-
- @JsonProperty("success")
- private SuccessEntry success;
-
- @JsonProperty("error")
- private ErrorEntry error;
-
- @JsonProperty("idenityMatching")
- private MatchingDetails matching;
-
- }
-
- @Getter
- @Setter
- @Builder
- @JsonInclude(Include.NON_NULL)
- private static class SuccessEntry {
-
- @JsonProperty("spSector")
- private final String spSector;
-
- @JsonProperty("ccc")
- private final String citizenCountryCode;
-
- }
-
- @Getter
- @Setter
- @Builder
- @JsonInclude(Include.NON_NULL)
- private static class MatchingDetails {
-
- @JsonProperty("finalMatchingMethod")
- private final String matchingMethod;
-
- @JsonProperty("matchingProcessDetails")
- private final DetailedMatchtingStatistic matchingDetails;
-
- }
-
- @Getter
- @Setter
- @RequiredArgsConstructor
- private static class ErrorEntry {
-
- @JsonProperty("code")
- private final String errorCode;
-
- @JsonProperty("msg")
- private final String errorMessage;
-
- }
-
-}
diff --git a/ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/AdvancedStatisticLogger.java b/ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/AdvancedStatisticLogger.java
new file mode 100644
index 00000000..06fb1aba
--- /dev/null
+++ b/ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/AdvancedStatisticLogger.java
@@ -0,0 +1,223 @@
+package at.asitplus.eidas.specific.core.logger;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.dataformat.javaprop.JavaPropsMapper;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+
+import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.log.statistic.DetailedMatchtingStatistic;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.egiz.eaaf.core.api.IRequest;
+import at.gv.egiz.eaaf.core.api.IStatusMessenger;
+import at.gv.egiz.eaaf.core.api.idp.IAuthData;
+import at.gv.egiz.eaaf.core.api.logging.IStatisticLogger;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Extended statistic logger that use a JSON based data model.
+ *
+ * @author tlenz
+ *
+ */
+@Slf4j
+public class AdvancedStatisticLogger implements IStatisticLogger {
+
+ private static final String DATEFORMATER = "yyyy.MM.dd-HH:mm:ss,SSS";
+ private static final String DEFAULT_NO_IDP_ID = "no idpId available";
+ private static final String DEFAULT_NO_SP_ID = "no appId available";
+
+ private static final ObjectMapper mapper = new ObjectMapper();
+ private static final JavaPropsMapper propsMapper = new JavaPropsMapper();
+
+ private final IStatusMessenger messageService;
+
+ /**
+ * Build a JSON based statistic logger that uses error messages from a specific source.
+ *
+ * @param source i18n message source
+ */
+ public AdvancedStatisticLogger(IStatusMessenger source) {
+ this.messageService = source;
+
+ }
+
+ @Override
+ public void logSuccessOperation(IRequest protocolRequest, IAuthData authData, boolean isSsoSession) {
+ final StatisticLogEntry entry = buildCoreEntry(protocolRequest);
+ entry.setSuccess(SuccessEntry.builder()
+ .spSector(protocolRequest.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier())
+ .spCountry("AT")
+ .citizenCountryCode(authData.getCiticenCountryCode())
+ .build());
+ entry.setMatching(MatchingDetails.builder()
+ .matchingMethod(extractMatchingState(protocolRequest))
+ .matchingDetails(extractMatchingDetails(protocolRequest))
+ .build());
+ writeEntryToLog(entry);
+
+ }
+
+ @Override
+ public void logErrorOperation(Throwable throwable) {
+ log.trace("Advanced statistic logger only logs on SP level");
+
+ }
+
+ @Override
+ public void logErrorOperation(Throwable throwable, IRequest errorRequest) {
+ final StatisticLogEntry entry = buildCoreEntry(errorRequest);
+ entry.setError(new ErrorEntry(messageService.getResponseErrorCode(throwable), throwable.getMessage()));
+ entry.setMatching(MatchingDetails.builder()
+ .matchingMethod(extractMatchingState(errorRequest))
+ .matchingDetails(extractMatchingDetails(errorRequest))
+ .build());
+ writeEntryToLog(entry);
+
+ }
+
+ @Override
+ public void internalTesting() throws Exception {
+ log.trace("Not implemented for a File-based logger");
+
+ }
+
+ private StatisticLogEntry buildCoreEntry(IRequest errorRequest) {
+ Object appId = errorRequest.getRawData(MsEidasNodeConstants.DATA_REQUESTERID);
+ return new StatisticLogEntry(
+ LocalDateTime.now(),
+ errorRequest.getUniqueTransactionIdentifier(),
+ errorRequest.getServiceProviderConfiguration() != null
+ && errorRequest.getServiceProviderConfiguration().getUniqueIdentifier() != null
+ ? errorRequest.getServiceProviderConfiguration().getUniqueIdentifier() : DEFAULT_NO_IDP_ID,
+ appId instanceof String && StringUtils.isNotEmpty((String)appId)
+ ? (String)appId : DEFAULT_NO_SP_ID);
+
+ }
+
+ private String extractMatchingState(IRequest protocolRequest) {
+ Object state = protocolRequest.getRawData(MsEidasNodeConstants.DATA_MATCHING_STATE);
+ return state != null ? state.toString() : MsEidasNodeConstants.MatchingStates.NO_REQUIRED.toString();
+
+ }
+
+ private DetailedMatchtingStatistic extractMatchingDetails(IRequest protocolRequest) {
+ try {
+ if (!MsEidasNodeConstants.MatchingStates.NO_REQUIRED.toString().equals(
+ extractMatchingState(protocolRequest))) {
+ return MatchingTaskUtils.getDetailedMatchingStatistic(protocolRequest);
+
+ }
+
+ } catch (EaafStorageException e) {
+ log.warn("Can not generate detailed matching statistic", e);
+
+ }
+
+ return null;
+ }
+
+ private void writeEntryToLog(StatisticLogEntry entry) {
+ try {
+ log.info(mapper.writeValueAsString(propsMapper.writeValueAsProperties(entry)));
+
+ } catch (final IOException e) {
+ log.error("Can NOT generate statistic entry for logging", e);
+
+ }
+ }
+
+
+ @Getter
+ @Setter
+ @RequiredArgsConstructor
+ @JsonInclude(Include.NON_NULL)
+ private static class StatisticLogEntry {
+
+ @JsonSerialize(using = LocalDateTimeSerializer.class)
+ @JsonDeserialize(using = LocalDateTimeDeserializer.class)
+ @JsonFormat(pattern = DATEFORMATER)
+ @JsonProperty("timestamp")
+ private final LocalDateTime timestamp;
+
+ @JsonProperty("txId")
+ private final String transactionId;
+
+ @JsonProperty("entityid")
+ private final String idpEntityId;
+
+ @JsonProperty("unique-sp-id")
+ private final String uniqueId;
+
+ @JsonProperty("result")
+ private SuccessEntry success;
+
+ @JsonProperty("error")
+ private ErrorEntry error;
+
+ @JsonProperty("identityMatching")
+ private MatchingDetails matching;
+
+ }
+
+ @Getter
+ @Setter
+ @Builder
+ @JsonInclude(Include.NON_NULL)
+ private static class SuccessEntry {
+
+ @JsonProperty("spSector")
+ private final String spSector;
+
+ @JsonProperty("spCountry")
+ private final String spCountry;
+
+ @JsonProperty("citizenCountryCode")
+ private final String citizenCountryCode;
+
+ }
+
+ @Getter
+ @Setter
+ @Builder
+ @JsonInclude(Include.NON_NULL)
+ private static class MatchingDetails {
+
+ @JsonProperty("finalMatchingMethod")
+ private final String matchingMethod;
+
+ @JsonProperty("matchingProcessDetails")
+ private final DetailedMatchtingStatistic matchingDetails;
+
+ }
+
+ @Getter
+ @Setter
+ @RequiredArgsConstructor
+ private static class ErrorEntry {
+
+ @JsonProperty("code")
+ private final String errorCode;
+
+ @JsonProperty("msg")
+ private final String errorMessage;
+
+ }
+
+}
diff --git a/ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/MultipleStatisticLogger.java b/ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/MultipleStatisticLogger.java
index 008a5691..723da3ba 100644
--- a/ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/MultipleStatisticLogger.java
+++ b/ms_specific_connector/src/main/java/at/asitplus/eidas/specific/core/logger/MultipleStatisticLogger.java
@@ -23,7 +23,7 @@ public class MultipleStatisticLogger implements IStatisticLogger {
private final Set internalLoggers;
/**
- * Build a statistic logger that logs into {@link StatisticLogger} and {@link AdvancedStatisicLogger}.
+ * Build a statistic logger that logs into {@link StatisticLogger} and {@link AdvancedStatisticLogger}.
*
* @param messageService i18n message-source implementation.
*/
@@ -31,7 +31,7 @@ public class MultipleStatisticLogger implements IStatisticLogger {
internalLoggers = Collections.unmodifiableSet(
Sets.newHashSet(
new StatisticLogger(),
- new AdvancedStatisicLogger(messageService)));
+ new AdvancedStatisticLogger(messageService)));
}
diff --git a/ms_specific_proxyservice/pom.xml b/ms_specific_proxyservice/pom.xml
index 78b425fe..4d388b2d 100644
--- a/ms_specific_proxyservice/pom.xml
+++ b/ms_specific_proxyservice/pom.xml
@@ -68,6 +68,10 @@
org.springframework
spring-context
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-properties
+
org.slf4j
slf4j-api
diff --git a/ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/AdvancedStatisicLogger.java b/ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/AdvancedStatisicLogger.java
deleted file mode 100644
index cf55281d..00000000
--- a/ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/AdvancedStatisicLogger.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package at.asitplus.eidas.specific.proxy.logger;
-
-import java.time.LocalDateTime;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
-import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
-
-import at.asitplus.eidas.specific.modules.msproxyservice.MsProxyServiceConstants;
-import at.gv.egiz.eaaf.core.api.IRequest;
-import at.gv.egiz.eaaf.core.api.IStatusMessenger;
-import at.gv.egiz.eaaf.core.api.data.PvpAttributeDefinitions;
-import at.gv.egiz.eaaf.core.api.idp.IAuthData;
-import at.gv.egiz.eaaf.core.api.idp.IEidAuthData;
-import at.gv.egiz.eaaf.core.api.logging.IStatisticLogger;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * Extended statistic logger that use a JSON based data model.
- *
- * @author tlenz
- *
- */
-@Slf4j
-public class AdvancedStatisicLogger implements IStatisticLogger {
-
- private static final String DATEFORMATER = "yyyy.MM.dd-HH:mm:ss";
- private static final String DEFAULT_NO_IDP_ID = "no idpId available";
-
- private static final ObjectMapper mapper = new ObjectMapper();
-
- private final IStatusMessenger messageService;
-
- /**
- * Build a JSON based statistic logger that uses error messages from a specific source.
- *
- * @param source i18n message source
- */
- public AdvancedStatisicLogger(IStatusMessenger source) {
- this.messageService = source;
-
- }
-
- @Override
- public void logSuccessOperation(IRequest protocolRequest, IAuthData authData, boolean isSsoSession) {
- final StatisticLogEntry entry = buildCoreEntry(protocolRequest);
- entry.setSuccess(SuccessEntry.builder()
- .spSector(protocolRequest.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier())
- .spCountry(protocolRequest.getServiceProviderConfiguration().getConfigurationValue(
- MsProxyServiceConstants.CONIG_PROPS_CONNECTOR_COUNTRYCODE))
- .withMandates(selectMandateProcessType(authData))
- .build());
- writeEntryToLog(entry);
-
- }
-
- @Override
- public void logErrorOperation(Throwable throwable) {
- log.trace("Advanced statistic logger only logs on SP level");
-
- }
-
- @Override
- public void logErrorOperation(Throwable throwable, IRequest errorRequest) {
- final StatisticLogEntry entry = buildCoreEntry(errorRequest);
- entry.setError(new ErrorEntry(messageService.getResponseErrorCode(throwable), throwable.getMessage()));
- writeEntryToLog(entry);
-
- }
-
- @Override
- public void internalTesting() throws Exception {
- log.trace("Not implemented for a File-based logger");
-
- }
-
- private StatisticLogEntry buildCoreEntry(IRequest pendingRequest) {
- return new StatisticLogEntry(
- LocalDateTime.now(),
- pendingRequest.getUniqueTransactionIdentifier(),
- pendingRequest.getServiceProviderConfiguration() != null
- && pendingRequest.getServiceProviderConfiguration().getUniqueIdentifier() != null
- ? pendingRequest.getServiceProviderConfiguration().getUniqueIdentifier() : DEFAULT_NO_IDP_ID);
-
- }
-
- private MandateProcess selectMandateProcessType(IAuthData authData) {
- if (authData instanceof IEidAuthData && ((IEidAuthData)authData).isUseMandate()) {
- return authData.getGenericData(PvpAttributeDefinitions.MANDATE_LEG_PER_SOURCE_PIN_NAME, String.class) != null
- ? MandateProcess.FOR_LEGAL_PERSON : MandateProcess.FOR_NATURAL_PERSON;
-
- } else {
- return MandateProcess.NONE;
-
- }
- }
-
- private void writeEntryToLog(StatisticLogEntry entry) {
- try {
- log.info(mapper.writeValueAsString(entry));
-
- } catch (final JsonProcessingException e) {
- log.error("Can NOT generate statistic entry for logging", e);
-
- }
- }
-
- public enum MandateProcess { NONE, FOR_NATURAL_PERSON, FOR_LEGAL_PERSON }
-
- @Getter
- @Setter
- @RequiredArgsConstructor
- @JsonInclude(Include.NON_NULL)
- private static class StatisticLogEntry {
-
- @JsonSerialize(using = LocalDateTimeSerializer.class)
- @JsonDeserialize(using = LocalDateTimeDeserializer.class)
- @JsonFormat(pattern = DATEFORMATER)
- @JsonProperty("timestamp")
- private final LocalDateTime timestamp;
-
- @JsonProperty("txId")
- private final String transactionId;
-
- @JsonProperty("entityId")
- private final String idpEntityId;
-
- @JsonProperty("success")
- private SuccessEntry success;
-
- @JsonProperty("error")
- private ErrorEntry error;
-
- }
-
- @Getter
- @Setter
- @Builder
- @JsonInclude(Include.NON_NULL)
- private static class SuccessEntry {
-
- @JsonProperty("spSector")
- private final String spSector;
-
- @JsonProperty("spCountry")
- private final String spCountry;
-
- @JsonProperty("withMandates")
- private final MandateProcess withMandates;
-
- }
-
- @Getter
- @Setter
- @RequiredArgsConstructor
- private static class ErrorEntry {
-
- @JsonProperty("code")
- private final String errorCode;
-
- @JsonProperty("msg")
- private final String errorMessage;
-
- }
-}
diff --git a/ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/AdvancedStatisticLogger.java b/ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/AdvancedStatisticLogger.java
new file mode 100644
index 00000000..55833b8b
--- /dev/null
+++ b/ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/AdvancedStatisticLogger.java
@@ -0,0 +1,182 @@
+package at.asitplus.eidas.specific.proxy.logger;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.dataformat.javaprop.JavaPropsMapper;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+
+import at.asitplus.eidas.specific.modules.msproxyservice.MsProxyServiceConstants;
+import at.gv.egiz.eaaf.core.api.IRequest;
+import at.gv.egiz.eaaf.core.api.IStatusMessenger;
+import at.gv.egiz.eaaf.core.api.data.PvpAttributeDefinitions;
+import at.gv.egiz.eaaf.core.api.idp.IAuthData;
+import at.gv.egiz.eaaf.core.api.idp.IEidAuthData;
+import at.gv.egiz.eaaf.core.api.logging.IStatisticLogger;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Extended statistic logger that use a JSON based data model.
+ *
+ * @author tlenz
+ *
+ */
+@Slf4j
+public class AdvancedStatisticLogger implements IStatisticLogger {
+
+ private static final String DATEFORMATER = "yyyy.MM.dd-HH:mm:ss,SSS";
+ private static final String DEFAULT_NO_IDP_ID = "no idpId available";
+
+ private static final ObjectMapper mapper = new ObjectMapper();
+ private static final JavaPropsMapper propsMapper = new JavaPropsMapper();
+
+ private final IStatusMessenger messageService;
+
+ /**
+ * Build a JSON based statistic logger that uses error messages from a specific source.
+ *
+ * @param source i18n message source
+ */
+ public AdvancedStatisticLogger(IStatusMessenger source) {
+ this.messageService = source;
+
+ }
+
+ @Override
+ public void logSuccessOperation(IRequest protocolRequest, IAuthData authData, boolean isSsoSession) {
+ final StatisticLogEntry entry = buildCoreEntry(protocolRequest);
+ entry.setSuccess(SuccessEntry.builder()
+ .spSector(protocolRequest.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier())
+ .spCountry(protocolRequest.getServiceProviderConfiguration().getConfigurationValue(
+ MsProxyServiceConstants.CONIG_PROPS_CONNECTOR_COUNTRYCODE))
+ .citizenCountryCode("AT")
+ .withMandates(selectMandateProcessType(authData))
+ .build());
+ writeEntryToLog(entry);
+
+ }
+
+ @Override
+ public void logErrorOperation(Throwable throwable) {
+ log.trace("Advanced statistic logger only logs on SP level");
+
+ }
+
+ @Override
+ public void logErrorOperation(Throwable throwable, IRequest errorRequest) {
+ final StatisticLogEntry entry = buildCoreEntry(errorRequest);
+ entry.setError(new ErrorEntry(messageService.getResponseErrorCode(throwable), throwable.getMessage()));
+ writeEntryToLog(entry);
+
+ }
+
+ @Override
+ public void internalTesting() throws Exception {
+ log.trace("Not implemented for a File-based logger");
+
+ }
+
+ private StatisticLogEntry buildCoreEntry(IRequest pendingRequest) {
+ return new StatisticLogEntry(
+ LocalDateTime.now(),
+ pendingRequest.getUniqueTransactionIdentifier(),
+ pendingRequest.getServiceProviderConfiguration() != null
+ && pendingRequest.getServiceProviderConfiguration().getUniqueIdentifier() != null
+ ? pendingRequest.getServiceProviderConfiguration().getUniqueIdentifier() : DEFAULT_NO_IDP_ID);
+
+ }
+
+ private MandateProcess selectMandateProcessType(IAuthData authData) {
+ if (authData instanceof IEidAuthData && ((IEidAuthData)authData).isUseMandate()) {
+ return authData.getGenericData(PvpAttributeDefinitions.MANDATE_LEG_PER_SOURCE_PIN_NAME, String.class) != null
+ ? MandateProcess.FOR_LEGAL_PERSON : MandateProcess.FOR_NATURAL_PERSON;
+
+ } else {
+ return MandateProcess.NONE;
+
+ }
+ }
+
+ private void writeEntryToLog(StatisticLogEntry entry) {
+ try {
+ log.info(mapper.writeValueAsString(propsMapper.writeValueAsProperties(entry)));
+
+ } catch (final IOException e) {
+ log.error("Can NOT generate statistic entry for logging", e);
+
+ }
+ }
+
+ public enum MandateProcess { NONE, FOR_NATURAL_PERSON, FOR_LEGAL_PERSON }
+
+ @Getter
+ @Setter
+ @RequiredArgsConstructor
+ @JsonInclude(Include.NON_NULL)
+ private static class StatisticLogEntry {
+
+ @JsonSerialize(using = LocalDateTimeSerializer.class)
+ @JsonDeserialize(using = LocalDateTimeDeserializer.class)
+ @JsonFormat(pattern = DATEFORMATER)
+ @JsonProperty("timestamp")
+ private final LocalDateTime timestamp;
+
+ @JsonProperty("txId")
+ private final String transactionId;
+
+ @JsonProperty("entityId")
+ private final String idpEntityId;
+
+ @JsonProperty("result")
+ private SuccessEntry success;
+
+ @JsonProperty("error")
+ private ErrorEntry error;
+
+ }
+
+ @Getter
+ @Setter
+ @Builder
+ @JsonInclude(Include.NON_NULL)
+ private static class SuccessEntry {
+
+ @JsonProperty("spSector")
+ private final String spSector;
+
+ @JsonProperty("spCountry")
+ private final String spCountry;
+
+ @JsonProperty("citizenCountryCode")
+ private final String citizenCountryCode;
+
+ @JsonProperty("withMandates")
+ private final MandateProcess withMandates;
+
+ }
+
+ @Getter
+ @Setter
+ @RequiredArgsConstructor
+ private static class ErrorEntry {
+
+ @JsonProperty("code")
+ private final String errorCode;
+
+ @JsonProperty("msg")
+ private final String errorMessage;
+
+ }
+}
diff --git a/ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/MultipleStatisticLogger.java b/ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/MultipleStatisticLogger.java
index bd771fb2..ccd81a27 100644
--- a/ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/MultipleStatisticLogger.java
+++ b/ms_specific_proxyservice/src/main/java/at/asitplus/eidas/specific/proxy/logger/MultipleStatisticLogger.java
@@ -24,7 +24,7 @@ public class MultipleStatisticLogger implements IStatisticLogger {
private final Set internalLoggers;
/**
- * Build a statistic logger that logs into {@link StatisticLogger} and {@link AdvancedStatisicLogger}.
+ * Build a statistic logger that logs into {@link StatisticLogger} and {@link AdvancedStatisticLogger}.
*
* @param messageService i18n message-source implementation.
*/
@@ -32,7 +32,7 @@ public class MultipleStatisticLogger implements IStatisticLogger {
internalLoggers = Collections.unmodifiableSet(
Sets.newHashSet(
new StatisticLogger(),
- new AdvancedStatisicLogger(messageService)));
+ new AdvancedStatisticLogger(messageService)));
}
diff --git a/pom.xml b/pom.xml
index d65934b1..7b39b86b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -431,6 +431,11 @@
jackson-dataformat-yaml
${jackson.version}
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-properties
+ ${jackson.version}
+
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
--
cgit v1.2.3