Downgrade to Java 11.

Downgrades to Java 11 in order to support consumers that are not on
Java 16 yet.

Change-Id: Ia5930d1c40d0090ca145fd14c0b63a139e4ac970
diff --git a/pom.xml b/pom.xml
index f96e9d5..b2085ed 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,6 +12,7 @@
 
   <name>Quarkus Google Cloud JSON Logging Extension - Parent</name>
   <url>https://gerrit.benkard.de/plugins/gitiles/quarkus-googlecloud-jsonlogging</url>
+
   <description>
     A Quarkus extension that logs to standard output in a JSON format
     compatible with Google Cloud Logging.
@@ -46,7 +47,7 @@
 
   <properties>
     <maven.compiler.parameters>true</maven.compiler.parameters>
-    <maven.compiler.release>16</maven.compiler.release>
+    <maven.compiler.release>11</maven.compiler.release>
 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
diff --git a/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java b/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
index 0c691b7..d2e5562 100644
--- a/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
+++ b/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
@@ -36,9 +36,10 @@
     Map<String, String> labels = new HashMap<>();
     if (logRecord.getParameters() != null) {
       for (var parameter : logRecord.getParameters()) {
-        if (parameter instanceof StructuredParameter sparam) {
-          parameters.add(sparam);
-        } else if (parameter instanceof Label label) {
+        if (parameter instanceof StructuredParameter) {
+          parameters.add((StructuredParameter) parameter);
+        } else if (parameter instanceof Label) {
+          var label = (Label) parameter;
           labels.put(label.key(), label.value());
         }
       }
diff --git a/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/KeyValueParameter.java b/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/KeyValueParameter.java
index 5f582c9..ae2e7e0 100644
--- a/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/KeyValueParameter.java
+++ b/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/KeyValueParameter.java
@@ -2,11 +2,20 @@
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.util.Objects;
 import javax.json.Json;
 import javax.json.JsonObjectBuilder;
 import javax.json.JsonValue;
 
-public record KeyValueParameter(String key, JsonValue value) implements StructuredParameter {
+public final class KeyValueParameter implements StructuredParameter {
+
+  private final String key;
+  private final JsonValue value;
+
+  private KeyValueParameter(String key, JsonValue value) {
+    this.key = key;
+    this.value = value;
+  }
 
   public static KeyValueParameter of(String key, String value) {
     return new KeyValueParameter(key, Json.createValue(value));
@@ -40,4 +49,30 @@
   public JsonObjectBuilder json() {
     return Json.createObjectBuilder().add(key, value);
   }
+
+  public String key() {
+    return key;
+  }
+
+  public JsonValue value() {
+    return value;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj == this) return true;
+    if (obj == null || obj.getClass() != this.getClass()) return false;
+    var that = (KeyValueParameter) obj;
+    return Objects.equals(this.key, that.key) && Objects.equals(this.value, that.value);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(key, value);
+  }
+
+  @Override
+  public String toString() {
+    return "KeyValueParameter[" + "key=" + key + ", " + "value=" + value + ']';
+  }
 }
diff --git a/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Label.java b/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Label.java
index 02f7034..7c5d14d 100644
--- a/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Label.java
+++ b/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Label.java
@@ -1,8 +1,44 @@
 package eu.mulk.quarkus.googlecloud.jsonlogging;
 
-public record Label(String key, String value) {
+import java.util.Objects;
+
+public final class Label {
+
+  private final String key;
+  private final String value;
+
+  private Label(String key, String value) {
+    this.key = key;
+    this.value = value;
+  }
 
   public static Label of(String key, String value) {
     return new Label(key, value);
   }
+
+  public String key() {
+    return key;
+  }
+
+  public String value() {
+    return value;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj == this) return true;
+    if (obj == null || obj.getClass() != this.getClass()) return false;
+    var that = (Label) obj;
+    return Objects.equals(this.key, that.key) && Objects.equals(this.value, that.value);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(key, value);
+  }
+
+  @Override
+  public String toString() {
+    return "Label[" + "key=" + key + ", " + "value=" + value + ']';
+  }
 }
diff --git a/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java b/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
index 4394033..4c70e6f 100644
--- a/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
+++ b/runtime/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/LogEntry.java
@@ -18,21 +18,56 @@
  * <p>A few of the fields are treated specially by the fluentd instance running in Google Kubernetes
  * Engine. All other fields end up in the jsonPayload field on the Google Cloud Logging side.
  */
-record LogEntry(
-    String message,
-    String severity,
-    Timestamp timestamp,
-    @Nullable String trace,
-    @Nullable String spanId,
-    SourceLocation sourceLocation,
-    Map<String, String> labels,
-    List<StructuredParameter> parameters,
-    Map<String, String> mappedDiagnosticContext,
-    @Nullable String nestedDiagnosticContext,
-    @Nullable String type) {
+final class LogEntry {
 
-  static record SourceLocation(
-      @Nullable String file, @Nullable String line, @Nullable String function) {
+  private final String message;
+  private final String severity;
+  private final Timestamp timestamp;
+  @Nullable private final String trace;
+  @Nullable private final String spanId;
+  private final SourceLocation sourceLocation;
+  private final Map<String, String> labels;
+  private final List<StructuredParameter> parameters;
+  private final Map<String, String> mappedDiagnosticContext;
+  @Nullable private final String nestedDiagnosticContext;
+  @Nullable private final String type;
+
+  LogEntry(
+      String message,
+      String severity,
+      Timestamp timestamp,
+      @Nullable String trace,
+      @Nullable String spanId,
+      SourceLocation sourceLocation,
+      Map<String, String> labels,
+      List<StructuredParameter> parameters,
+      Map<String, String> mappedDiagnosticContext,
+      @Nullable String nestedDiagnosticContext,
+      @Nullable String type) {
+    this.message = message;
+    this.severity = severity;
+    this.timestamp = timestamp;
+    this.trace = trace;
+    this.spanId = spanId;
+    this.sourceLocation = sourceLocation;
+    this.labels = labels;
+    this.parameters = parameters;
+    this.mappedDiagnosticContext = mappedDiagnosticContext;
+    this.nestedDiagnosticContext = nestedDiagnosticContext;
+    this.type = type;
+  }
+
+  static final class SourceLocation {
+
+    @Nullable private final String file;
+    @Nullable private final String line;
+    @Nullable private final String function;
+
+    SourceLocation(@Nullable String file, @Nullable String line, @Nullable String function) {
+      this.file = file;
+      this.line = line;
+      this.function = function;
+    }
 
     JsonObject json() {
       return Json.createObjectBuilder()
@@ -43,7 +78,15 @@
     }
   }
 
-  static record Timestamp(long seconds, int nanos) {
+  static final class Timestamp {
+
+    private final long seconds;
+    private final int nanos;
+
+    Timestamp(long seconds, int nanos) {
+      this.seconds = seconds;
+      this.nanos = nanos;
+    }
 
     Timestamp(Instant t) {
       this(t.getEpochSecond(), t.getNano());