From 3f688e21ce5e8d03ccd68fa821874440fa1049fe Mon Sep 17 00:00:00 2001
From: Martin Vogel <martin.vogel@sinc.de>
Date: Wed, 7 Sep 2022 12:00:23 +0200
Subject: [PATCH] refactor: use static initializers for fromValue due to better
 performance on lookup

---
 .../api/config/ApplicationConfig.java         |  1 +
 .../domain/model/destination/StatusEnum.java  | 20 ++++++++++----
 .../api/domain/model/jwk/AlgEnum.java         | 20 ++++++++++----
 .../api/domain/model/jwk/EEnum.java           | 20 ++++++++++----
 .../api/domain/model/jwk/KeyOpsEnum.java      | 20 ++++++++++----
 .../api/domain/model/jwk/KtyEnum.java         | 20 ++++++++++----
 .../model/metadata/EidasAdesProfile.java      | 27 ++++++++++++++-----
 .../model/metadata/SignatureFormat.java       | 20 ++++++++++----
 .../metadata/data/DataSignatureType.java      | 20 +++++++++++---
 .../domain/model/metadata/data/MimeType.java  | 20 ++++++++++----
 10 files changed, 143 insertions(+), 45 deletions(-)

diff --git a/api/src/main/java/de/fitko/fitconnect/api/config/ApplicationConfig.java b/api/src/main/java/de/fitko/fitconnect/api/config/ApplicationConfig.java
index b3b152fb9..7ab2bad82 100644
--- a/api/src/main/java/de/fitko/fitconnect/api/config/ApplicationConfig.java
+++ b/api/src/main/java/de/fitko/fitconnect/api/config/ApplicationConfig.java
@@ -18,6 +18,7 @@ public class ApplicationConfig {
     @Builder.Default
     private Integer httpProxyPort = 0;
     @Builder.Default
+
     private Integer requestTimeoutInSeconds = 30;
     private String metadataSchemaPath;
     private String privateSigningKeyPath;
diff --git a/api/src/main/java/de/fitko/fitconnect/api/domain/model/destination/StatusEnum.java b/api/src/main/java/de/fitko/fitconnect/api/domain/model/destination/StatusEnum.java
index b42836cb6..5f5638798 100644
--- a/api/src/main/java/de/fitko/fitconnect/api/domain/model/destination/StatusEnum.java
+++ b/api/src/main/java/de/fitko/fitconnect/api/domain/model/destination/StatusEnum.java
@@ -3,6 +3,9 @@ package de.fitko.fitconnect.api.domain.model.destination;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 
+import java.util.HashMap;
+import java.util.Map;
+
 public enum StatusEnum {
 
     CREATED("created"),
@@ -13,6 +16,14 @@ public enum StatusEnum {
 
     DECOMMISSIONED("decommissioned");
 
+    private static final Map<String, StatusEnum> CONSTANTS = new HashMap<>();
+
+    static {
+        for (final StatusEnum c : values()) {
+            CONSTANTS.put(c.value, c);
+        }
+    }
+
     private final String value;
 
     StatusEnum(final String value) {
@@ -31,11 +42,10 @@ public enum StatusEnum {
 
     @JsonCreator
     public static StatusEnum fromValue(final String value) {
-        for (final StatusEnum statusEnum : StatusEnum.values()) {
-            if (statusEnum.value.equals(value)) {
-                return statusEnum;
-            }
+        final StatusEnum constant = CONSTANTS.get(value);
+        if (constant == null) {
+            throw new IllegalArgumentException("Unexpected value '" + value + "'");
         }
-        throw new IllegalArgumentException("Unexpected value '" + value + "'");
+        return constant;
     }
 }
diff --git a/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/AlgEnum.java b/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/AlgEnum.java
index efa8b3181..630b85ec7 100644
--- a/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/AlgEnum.java
+++ b/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/AlgEnum.java
@@ -3,7 +3,8 @@ package de.fitko.fitconnect.api.domain.model.jwk;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 
 public enum AlgEnum {
 
@@ -11,6 +12,14 @@ public enum AlgEnum {
 
     RSA_OAEP_256("RSA-OAEP-256");
 
+    private static final Map<String, AlgEnum> CONSTANTS = new HashMap<>();
+
+    static {
+        for (final AlgEnum c : values()) {
+            CONSTANTS.put(c.value, c);
+        }
+    }
+
     private final String value;
 
     AlgEnum(final String value) {
@@ -29,9 +38,10 @@ public enum AlgEnum {
 
     @JsonCreator
     public static AlgEnum fromValue(final String value) {
-        return Arrays.stream(AlgEnum.values())
-                .filter(enumValue -> enumValue.value.equals(value))
-                .findFirst()
-                .orElseThrow(() -> new IllegalArgumentException("Unexpected value '" + value + "'"));
+        final AlgEnum constant = CONSTANTS.get(value);
+        if (constant == null) {
+            throw new IllegalArgumentException("Unexpected value '" + value + "'");
+        }
+        return constant;
     }
 }
diff --git a/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/EEnum.java b/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/EEnum.java
index dc447ae3f..4d6273e4b 100644
--- a/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/EEnum.java
+++ b/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/EEnum.java
@@ -3,12 +3,21 @@ package de.fitko.fitconnect.api.domain.model.jwk;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 
 public enum EEnum {
 
     AQAB("AQAB");
 
+    private static final Map<String, EEnum> CONSTANTS = new HashMap<>();
+
+    static {
+        for (final EEnum c : values()) {
+            CONSTANTS.put(c.value, c);
+        }
+    }
+
     private final String value;
 
     EEnum(final String value) {
@@ -27,9 +36,10 @@ public enum EEnum {
 
     @JsonCreator
     public static EEnum fromValue(final String value) {
-        return Arrays.stream(EEnum.values())
-                .filter(enumValue -> enumValue.value.equals(value))
-                .findFirst()
-                .orElseThrow(() -> new IllegalArgumentException("Unexpected value '" + value + "'"));
+        final EEnum constant = CONSTANTS.get(value);
+        if (constant == null) {
+            throw new IllegalArgumentException("Unexpected value '" + value + "'");
+        }
+        return constant;
     }
 }
diff --git a/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/KeyOpsEnum.java b/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/KeyOpsEnum.java
index 455ff64f2..e8e18709d 100644
--- a/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/KeyOpsEnum.java
+++ b/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/KeyOpsEnum.java
@@ -3,7 +3,8 @@ package de.fitko.fitconnect.api.domain.model.jwk;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 
 public enum KeyOpsEnum {
 
@@ -11,6 +12,14 @@ public enum KeyOpsEnum {
 
     WRAPKEY("wrapKey");
 
+    private static final Map<String, KeyOpsEnum> CONSTANTS = new HashMap<>();
+
+    static {
+        for (final KeyOpsEnum c : values()) {
+            CONSTANTS.put(c.value, c);
+        }
+    }
+
     private final String value;
 
     KeyOpsEnum(final String value) {
@@ -29,9 +38,10 @@ public enum KeyOpsEnum {
 
     @JsonCreator
     public static KeyOpsEnum fromValue(final String value) {
-        return Arrays.stream(KeyOpsEnum.values())
-                .filter(enumValue -> enumValue.value.equals(value))
-                .findFirst()
-                .orElseThrow(() -> new IllegalArgumentException("Unexpected value '" + value + "'"));
+        final KeyOpsEnum constant = CONSTANTS.get(value);
+        if (constant == null) {
+            throw new IllegalArgumentException("Unexpected value '" + value + "'");
+        }
+        return constant;
     }
 }
diff --git a/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/KtyEnum.java b/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/KtyEnum.java
index b422d165a..10c7b24c1 100644
--- a/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/KtyEnum.java
+++ b/api/src/main/java/de/fitko/fitconnect/api/domain/model/jwk/KtyEnum.java
@@ -3,12 +3,21 @@ package de.fitko.fitconnect.api.domain.model.jwk;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 
 public enum KtyEnum {
 
     RSA("RSA");
 
+    private static final Map<String, KtyEnum> CONSTANTS = new HashMap<>();
+
+    static {
+        for (final KtyEnum c : values()) {
+            CONSTANTS.put(c.value, c);
+        }
+    }
+
     private final String value;
 
     KtyEnum(final String value) {
@@ -27,9 +36,10 @@ public enum KtyEnum {
 
     @JsonCreator
     public static KtyEnum fromValue(final String value) {
-        return Arrays.stream(KtyEnum.values())
-                .filter(enumValue -> enumValue.value.equals(value))
-                .findFirst()
-                .orElseThrow(() -> new IllegalArgumentException("Unexpected value '" + value + "'"));
+        final KtyEnum constant = CONSTANTS.get(value);
+        if (constant == null) {
+            throw new IllegalArgumentException("Unexpected value '" + value + "'");
+        }
+        return constant;
     }
 }
diff --git a/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/EidasAdesProfile.java b/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/EidasAdesProfile.java
index ae1e93c20..c8e87c22c 100644
--- a/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/EidasAdesProfile.java
+++ b/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/EidasAdesProfile.java
@@ -3,8 +3,14 @@ package de.fitko.fitconnect.api.domain.model.metadata;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import java.util.Arrays;
-
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Referenziert ein eindeutiges Profil einer AdES (advanced electronic signature/seal) gemäß eIDAS-Verordnung über eine URI gemäß [ETSI TS 119 192](https://www.etsi.org/deliver/etsi_ts/119100_119199/119192/01.01.01_60/ts_119192v010101p.pdf).
+ * <p>
+ * Für die Details zur Verwendung und Validierung von Profilen siehe auch https://ec.europa.eu/cefdigital/DSS/webapp-demo/doc/dss-documentation.html#_signatures_profile_simplification
+ */
 public enum EidasAdesProfile {
 
     HTTP_URI_ETSI_ORG_ADES_191_X_2_LEVEL_BASELINE_B_B("http://uri.etsi.org/ades/191x2/level/baseline/B-B#"),
@@ -12,6 +18,14 @@ public enum EidasAdesProfile {
     HTTP_URI_ETSI_ORG_ADES_191_X_2_LEVEL_BASELINE_B_LT("http://uri.etsi.org/ades/191x2/level/baseline/B-LT#"),
     HTTP_URI_ETSI_ORG_ADES_191_X_2_LEVEL_BASELINE_B_LTA("http://uri.etsi.org/ades/191x2/level/baseline/B-LTA#");
 
+    private static final Map<String, EidasAdesProfile> CONSTANTS = new HashMap<>();
+
+    static {
+        for (final EidasAdesProfile c : values()) {
+            CONSTANTS.put(c.value, c);
+        }
+    }
+
     private final String value;
 
     EidasAdesProfile(final String value) {
@@ -30,10 +44,11 @@ public enum EidasAdesProfile {
 
     @JsonCreator
     public static EidasAdesProfile fromValue(final String value) {
-        return Arrays.stream(EidasAdesProfile.values())
-                .filter(enumValue -> enumValue.value.equals(value))
-                .findFirst()
-                .orElseThrow(() -> new IllegalArgumentException("Unexpected value '" + value + "'"));
+        final EidasAdesProfile constant = CONSTANTS.get(value);
+        if (constant == null) {
+            throw new IllegalArgumentException(value);
+        }
+        return constant;
     }
 
 }
diff --git a/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/SignatureFormat.java b/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/SignatureFormat.java
index a36975e97..11e2efdc8 100644
--- a/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/SignatureFormat.java
+++ b/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/SignatureFormat.java
@@ -3,7 +3,8 @@ package de.fitko.fitconnect.api.domain.model.metadata;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 
 public enum SignatureFormat {
 
@@ -13,6 +14,14 @@ public enum SignatureFormat {
     ASIC("asic"),
     JSON("json");
 
+    private static final Map<String, SignatureFormat> CONSTANTS = new HashMap<>();
+
+    static {
+        for (final SignatureFormat c : values()) {
+            CONSTANTS.put(c.value, c);
+        }
+    }
+
     private final String value;
 
     SignatureFormat(final String value) {
@@ -31,9 +40,10 @@ public enum SignatureFormat {
 
     @JsonCreator
     public static SignatureFormat fromValue(final String value) {
-        return Arrays.stream(SignatureFormat.values())
-                .filter(enumValue -> enumValue.value.equals(value))
-                .findFirst()
-                .orElseThrow(() -> new IllegalArgumentException("Unexpected value '" + value + "'"));
+        final SignatureFormat constant = CONSTANTS.get(value);
+        if (constant == null) {
+            throw new IllegalArgumentException("Unexpected value '" + value + "'");
+        }
+        return constant;
     }
 }
diff --git a/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/data/DataSignatureType.java b/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/data/DataSignatureType.java
index 06b7ffe84..56a5a9b32 100644
--- a/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/data/DataSignatureType.java
+++ b/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/data/DataSignatureType.java
@@ -4,10 +4,21 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 
 public enum DataSignatureType {
 
     SHA_512("sha512");
+
+    private static final Map<String, DataSignatureType> CONSTANTS = new HashMap<>();
+
+    static {
+        for (final DataSignatureType c : values()) {
+            CONSTANTS.put(c.value, c);
+        }
+    }
+
     private final String value;
 
     DataSignatureType(final String value) {
@@ -26,10 +37,11 @@ public enum DataSignatureType {
 
     @JsonCreator
     public static DataSignatureType fromValue(final String value) {
-        return Arrays.stream(DataSignatureType.values())
-                .filter(enumValue -> enumValue.value.equals(value))
-                .findFirst()
-                .orElseThrow(() -> new IllegalArgumentException("Unexpected value '" + value + "'"));
+        final DataSignatureType constant = CONSTANTS.get(value);
+        if (constant == null) {
+            throw new IllegalArgumentException("Unexpected value '" + value + "'");
+        }
+        return constant;
     }
 
 }
diff --git a/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/data/MimeType.java b/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/data/MimeType.java
index 88c3fe319..2011bc56e 100644
--- a/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/data/MimeType.java
+++ b/api/src/main/java/de/fitko/fitconnect/api/domain/model/metadata/data/MimeType.java
@@ -3,13 +3,22 @@ package de.fitko.fitconnect.api.domain.model.metadata.data;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
 
-import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 
 public enum MimeType {
 
     APPLICATION_JSON("application/json"),
     APPLICATION_XML("application/xml");
 
+    private static final Map<String, MimeType> CONSTANTS = new HashMap<>();
+
+    static {
+        for (final MimeType c : values()) {
+            CONSTANTS.put(c.value, c);
+        }
+    }
+
     private final String value;
 
     MimeType(final String value) {
@@ -28,9 +37,10 @@ public enum MimeType {
 
     @JsonCreator
     public static MimeType fromValue(final String value) {
-        return Arrays.stream(MimeType.values())
-                .filter(enumValue -> enumValue.value.equals(value))
-                .findFirst()
-                .orElseThrow(() -> new IllegalArgumentException("Unexpected value '" + value + "'"));
+        final MimeType constant = CONSTANTS.get(value);
+        if (constant == null) {
+            throw new IllegalArgumentException("Unexpected value '" + value + "'");
+        }
+        return constant;
     }
 }
-- 
GitLab