From 51e700f28e0e4e2974ebc8563327db4b1b5e4ee7 Mon Sep 17 00:00:00 2001 From: Damien Goutte-Gattat Date: Tue, 16 Dec 2025 16:47:09 +0000 Subject: [PATCH] Accept missing "configuration" key for "chunkKeyEncoding". The DefaultChunkKeyEncoding constructor currently requires a `Configuration` argument, which means that the Jackson deserializer will fail upon attempting to parse array metadata containing a `chunk_key_encoding` like this one: ``` "chunk_key_encoding": { "name": "default" } ``` Instead, it expects, at a minimum: ``` "chunk_key_encoding": { "name": "default", "configuration": {} } ``` I believe Zarr-Java is being too strict here. It is true that that the spec for the "Default chunk key encoding" [1] says nothing about the `configuration` object being optional (it only says that the `separator` member is optional). But the spec for extension points [2] (and `chunk_key_encoding` _is_ an extension point) does say that the `configuration` member MAY be present (and therefore is optional), and in the absence of any overriding statement, I believe `configuration` should be considered optional _also_ in the context of the "Default chunk key encoding" extension. There are definitely OME-Zarr files out in the wild with a missing `configuration` member, for example [3]. This commit relaxes the requirement in the constructor of both the DefaultChunkKeyEncoding and V2ChunkKeyEncoding classes, so that they accept a missing (null) configuration argument and default to using a '/' and '.' separator, respectively. -- [1] https://zarr-specs.readthedocs.io/en/latest/v3/chunk-key-encodings/default/index.html [2] https://zarr-specs.readthedocs.io/en/latest/v3/core/index.html#extension-definition [3] https://uk1s3.embassy.ebi.ac.uk/idr/zarr/v0.5/idr0066/ExpD_chicken_embryo_MIP.ome.zarr --- .../v3/chunkkeyencoding/DefaultChunkKeyEncoding.java | 8 ++++++-- .../zarrjava/v3/chunkkeyencoding/V2ChunkKeyEncoding.java | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/zarr/zarrjava/v3/chunkkeyencoding/DefaultChunkKeyEncoding.java b/src/main/java/dev/zarr/zarrjava/v3/chunkkeyencoding/DefaultChunkKeyEncoding.java index 208280c..bf85706 100644 --- a/src/main/java/dev/zarr/zarrjava/v3/chunkkeyencoding/DefaultChunkKeyEncoding.java +++ b/src/main/java/dev/zarr/zarrjava/v3/chunkkeyencoding/DefaultChunkKeyEncoding.java @@ -19,9 +19,13 @@ public class DefaultChunkKeyEncoding extends ChunkKeyEncoding { @JsonCreator public DefaultChunkKeyEncoding( - @Nonnull @JsonProperty(value = "configuration", required = true) Configuration configuration + @JsonProperty(value = "configuration") Configuration configuration ) { - this.configuration = configuration; + if (configuration == null) { + this.configuration = new Configuration(Separator.SLASH); + } else { + this.configuration = configuration; + } } diff --git a/src/main/java/dev/zarr/zarrjava/v3/chunkkeyencoding/V2ChunkKeyEncoding.java b/src/main/java/dev/zarr/zarrjava/v3/chunkkeyencoding/V2ChunkKeyEncoding.java index d62994c..85bf19a 100644 --- a/src/main/java/dev/zarr/zarrjava/v3/chunkkeyencoding/V2ChunkKeyEncoding.java +++ b/src/main/java/dev/zarr/zarrjava/v3/chunkkeyencoding/V2ChunkKeyEncoding.java @@ -19,9 +19,13 @@ public class V2ChunkKeyEncoding extends ChunkKeyEncoding { @JsonCreator public V2ChunkKeyEncoding( - @Nonnull @JsonProperty(value = "configuration", required = true) Configuration configuration + @JsonProperty(value = "configuration") Configuration configuration ) { - this.configuration = configuration; + if (configuration == null) { + this.configuration = new Configuration(Separator.DOT); + } else { + this.configuration = configuration; + } } @Override