Skip to content

Commit 43ebb38

Browse files
brokkoli71brokkoli71
andauthored
Fix codecs without config (#34)
* allow no config for BytesCodec * pretty print json * testZarrJsonFormat * add @JsonIgnore annotation to codec name fields for serialization * remove duplicate 'id' for v2 compressors in .zarray * JsonInclude.Include.NON_NULL for all json attributes * JsonInclude.Include.NON_NULL only for v3 --------- Co-authored-by: brokkoli71 <[email protected]>
1 parent 680c1b0 commit 43ebb38

26 files changed

+224
-56
lines changed

src/main/java/dev/zarr/zarrjava/core/ArrayMetadata.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.zarr.zarrjava.core;
22

33
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
import com.fasterxml.jackson.annotation.JsonInclude;
45
import com.fasterxml.jackson.annotation.JsonProperty;
56
import dev.zarr.zarrjava.ZarrException;
67
import dev.zarr.zarrjava.utils.MultiArrayUtils;
@@ -16,6 +17,7 @@ public abstract class ArrayMetadata {
1617

1718
public final long[] shape;
1819

20+
@JsonInclude(JsonInclude.Include.ALWAYS)
1921
@JsonProperty("fill_value")
2022
public final Object fillValue;
2123
@JsonIgnore

src/main/java/dev/zarr/zarrjava/core/codec/core/BytesCodec.java

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,44 @@
11
package dev.zarr.zarrjava.core.codec.core;
22

33
import com.fasterxml.jackson.annotation.JsonValue;
4+
import dev.zarr.zarrjava.ZarrException;
45
import dev.zarr.zarrjava.core.codec.ArrayBytesCodec;
56
import ucar.ma2.*;
67

78
import java.nio.ByteBuffer;
89
import java.nio.ByteOrder;
910

1011
public abstract class BytesCodec extends ArrayBytesCodec {
11-
protected abstract ByteOrder getByteOrder();
12+
protected abstract ByteOrder getByteOrder() throws ZarrException;
1213

1314
@Override
14-
public Array decode(ByteBuffer chunkBytes) {
15-
chunkBytes.order(getByteOrder());
16-
DataType dtype = arrayMetadata.dataType.getMA2DataType();
17-
int[] shape = arrayMetadata.chunkShape;
18-
19-
// Array.factory does not support boolean arrays directly from ByteBuffer
20-
if (dtype == DataType.BOOLEAN) {
21-
int size = chunkBytes.remaining();
22-
boolean[] bools = new boolean[size];
23-
for (int i = 0; i < size; i++) {
24-
bools[i] = chunkBytes.get(i) != 0;
25-
}
15+
public Array decode(ByteBuffer chunkBytes) throws ZarrException {
16+
ByteOrder order = ByteOrder.BIG_ENDIAN; // Default for 1-byte types
17+
if (arrayMetadata.dataType.getByteCount() > 1)
18+
order = getByteOrder();
19+
chunkBytes.order(order);
20+
DataType dtype = arrayMetadata.dataType.getMA2DataType();
21+
int[] shape = arrayMetadata.chunkShape;
22+
23+
// Array.factory does not support boolean arrays directly from ByteBuffer
24+
if (dtype == DataType.BOOLEAN) {
25+
int size = chunkBytes.remaining();
26+
boolean[] bools = new boolean[size];
27+
for (int i = 0; i < size; i++) {
28+
bools[i] = chunkBytes.get(i) != 0;
29+
}
2630

27-
Index index = Index.factory(shape);
28-
return Array.factory(DataType.BOOLEAN, index, bools);
31+
Index index = Index.factory(shape);
32+
return Array.factory(DataType.BOOLEAN, index, bools);
33+
}
34+
return Array.factory(dtype, shape, chunkBytes);
2935
}
3036

31-
return Array.factory(dtype, shape, chunkBytes);
32-
}
3337
@Override
34-
public ByteBuffer encode(Array chunkArray) {
35-
ByteOrder order = getByteOrder();
38+
public ByteBuffer encode(Array chunkArray) throws ZarrException {
39+
ByteOrder order = ByteOrder.BIG_ENDIAN; // Default for 1-byte types
40+
if (arrayMetadata.dataType.getByteCount() > 1)
41+
order = getByteOrder();
3642

3743
// Boolean
3844
if (chunkArray instanceof ArrayBoolean) {
@@ -94,6 +100,10 @@ public ByteOrder getByteOrder() {
94100
throw new RuntimeException("Unreachable");
95101
}
96102
}
103+
104+
public static Endian nativeOrder() {
105+
return ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN ? LITTLE : BIG;
106+
}
97107
}
98108

99109
}

src/main/java/dev/zarr/zarrjava/v2/Array.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.zarr.zarrjava.v2;
22

3-
import com.fasterxml.jackson.databind.ObjectMapper;
3+
import com.fasterxml.jackson.databind.ObjectWriter;
44
import dev.zarr.zarrjava.ZarrException;
55
import dev.zarr.zarrjava.store.FilesystemStore;
66
import dev.zarr.zarrjava.store.StoreHandle;
@@ -18,6 +18,7 @@
1818
import java.util.function.Function;
1919
import java.util.stream.Collectors;
2020
import static dev.zarr.zarrjava.v2.Node.makeObjectMapper;
21+
import static dev.zarr.zarrjava.v2.Node.makeObjectWriter;
2122

2223
public class Array extends dev.zarr.zarrjava.core.Array implements Node {
2324

@@ -141,8 +142,8 @@ public static Array create(StoreHandle storeHandle, ArrayMetadata arrayMetadata,
141142
"Trying to create a new array in " + storeHandle + ". But " + metadataHandle
142143
+ " already exists.");
143144
}
144-
ObjectMapper objectMapper = makeObjectMapper();
145-
ByteBuffer metadataBytes = ByteBuffer.wrap(objectMapper.writeValueAsBytes(arrayMetadata));
145+
ObjectWriter objectWriter = makeObjectWriter();
146+
ByteBuffer metadataBytes = ByteBuffer.wrap(objectWriter.writeValueAsBytes(arrayMetadata));
146147
metadataHandle.set(metadataBytes);
147148
return new Array(storeHandle, arrayMetadata);
148149
}

src/main/java/dev/zarr/zarrjava/v2/Group.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.zarr.zarrjava.v2;
22

3-
import com.fasterxml.jackson.databind.ObjectMapper;
3+
import com.fasterxml.jackson.databind.ObjectWriter;
44
import dev.zarr.zarrjava.ZarrException;
55
import dev.zarr.zarrjava.store.FilesystemStore;
66
import dev.zarr.zarrjava.store.StoreHandle;
@@ -14,6 +14,7 @@
1414
import java.nio.file.Paths;
1515
import java.util.function.Function;
1616
import static dev.zarr.zarrjava.v2.Node.makeObjectMapper;
17+
import static dev.zarr.zarrjava.v2.Node.makeObjectWriter;
1718

1819
public class Group extends dev.zarr.zarrjava.core.Group implements Node{
1920
public GroupMetadata metadata;
@@ -41,8 +42,8 @@ public static Group open(String path) throws IOException {
4142
public static Group create(
4243
@Nonnull StoreHandle storeHandle, @Nonnull GroupMetadata groupMetadata
4344
) throws IOException {
44-
ObjectMapper objectMapper = makeObjectMapper();
45-
ByteBuffer metadataBytes = ByteBuffer.wrap(objectMapper.writeValueAsBytes(groupMetadata));
45+
ObjectWriter objectWriter = makeObjectWriter();
46+
ByteBuffer metadataBytes = ByteBuffer.wrap(objectWriter.writeValueAsBytes(groupMetadata));
4647
storeHandle.resolve(ZGROUP).set(metadataBytes);
4748
return new Group(storeHandle, groupMetadata);
4849
}

src/main/java/dev/zarr/zarrjava/v2/Node.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package dev.zarr.zarrjava.v2;
22

3+
import com.fasterxml.jackson.annotation.JsonInclude;
34
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.databind.ObjectWriter;
46
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
57
import dev.zarr.zarrjava.ZarrException;
68
import dev.zarr.zarrjava.store.FilesystemStore;
@@ -21,7 +23,11 @@ static ObjectMapper makeObjectMapper() {
2123
return objectMapper;
2224
}
2325

24-
/**
26+
static ObjectWriter makeObjectWriter() {
27+
return makeObjectMapper().writerWithDefaultPrettyPrinter();
28+
}
29+
30+
/**
2531
* Opens an existing Zarr array or group at a specified storage location.
2632
*
2733
* @param storeHandle the storage location of the Zarr array

src/main/java/dev/zarr/zarrjava/v2/codec/core/BloscCodec.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.zarr.zarrjava.v2.codec.core;
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
4+
import com.fasterxml.jackson.annotation.JsonIgnore;
45
import com.fasterxml.jackson.annotation.JsonProperty;
56
import com.fasterxml.jackson.core.JsonGenerator;
67
import com.fasterxml.jackson.core.JsonParser;
@@ -22,6 +23,7 @@
2223

2324
public class BloscCodec extends dev.zarr.zarrjava.core.codec.core.BloscCodec implements Codec {
2425

26+
@JsonIgnore
2527
public final String id = "blosc";
2628

2729
@Nonnull

src/main/java/dev/zarr/zarrjava/v2/codec/core/BytesCodec.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package dev.zarr.zarrjava.v2.codec.core;
22

3-
import com.fasterxml.jackson.annotation.JsonCreator;
4-
import com.fasterxml.jackson.annotation.JsonProperty;
5-
import dev.zarr.zarrjava.ZarrException;
63
import dev.zarr.zarrjava.core.ArrayMetadata;
74
import dev.zarr.zarrjava.v2.codec.Codec;
85

@@ -14,9 +11,7 @@ public class BytesCodec extends dev.zarr.zarrjava.core.codec.core.BytesCodec imp
1411
@Nonnull
1512
public final Endian endian;
1613

17-
@JsonCreator
18-
public BytesCodec(
19-
@JsonProperty(value = "endian", defaultValue = "little") Endian endian) {
14+
public BytesCodec(Endian endian) {
2015
this.endian = endian;
2116
}
2217

src/main/java/dev/zarr/zarrjava/v2/codec/core/ZlibCodec.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.zarr.zarrjava.v2.codec.core;
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
4+
import com.fasterxml.jackson.annotation.JsonIgnore;
45
import com.fasterxml.jackson.annotation.JsonProperty;
56
import dev.zarr.zarrjava.ZarrException;
67
import dev.zarr.zarrjava.core.ArrayMetadata;
@@ -16,6 +17,7 @@
1617

1718
public class ZlibCodec extends BytesBytesCodec implements Codec {
1819

20+
@JsonIgnore
1921
public final String id = "zlib";
2022
public final int level;
2123

src/main/java/dev/zarr/zarrjava/v3/Array.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.zarr.zarrjava.v3;
22

3-
import com.fasterxml.jackson.databind.ObjectMapper;
3+
import com.fasterxml.jackson.databind.ObjectWriter;
44
import dev.zarr.zarrjava.ZarrException;
55
import dev.zarr.zarrjava.store.FilesystemStore;
66
import dev.zarr.zarrjava.store.StoreHandle;
@@ -17,6 +17,7 @@
1717
import java.util.stream.Collectors;
1818
import javax.annotation.Nonnull;
1919
import static dev.zarr.zarrjava.v3.Node.makeObjectMapper;
20+
import static dev.zarr.zarrjava.v3.Node.makeObjectWriter;
2021

2122
public class Array extends dev.zarr.zarrjava.core.Array implements Node {
2223

@@ -136,8 +137,8 @@ public static Array create(StoreHandle storeHandle, ArrayMetadata arrayMetadata,
136137
"Trying to create a new array in " + storeHandle + ". But " + metadataHandle
137138
+ " already exists.");
138139
}
139-
ObjectMapper objectMapper = makeObjectMapper();
140-
ByteBuffer metadataBytes = ByteBuffer.wrap(objectMapper.writeValueAsBytes(arrayMetadata));
140+
ObjectWriter objectWriter = makeObjectWriter();
141+
ByteBuffer metadataBytes = ByteBuffer.wrap(objectWriter.writeValueAsBytes(arrayMetadata));
141142
metadataHandle.set(metadataBytes);
142143
return new Array(storeHandle, arrayMetadata);
143144
}
@@ -182,8 +183,8 @@ public static ArrayMetadataBuilder metadataBuilder(ArrayMetadata existingMetadat
182183
}
183184

184185
private Array writeMetadata(ArrayMetadata newArrayMetadata) throws ZarrException, IOException {
185-
ObjectMapper objectMapper = makeObjectMapper();
186-
ByteBuffer metadataBytes = ByteBuffer.wrap(objectMapper.writeValueAsBytes(newArrayMetadata));
186+
ObjectWriter objectWriter = makeObjectWriter();
187+
ByteBuffer metadataBytes = ByteBuffer.wrap(objectWriter.writeValueAsBytes(newArrayMetadata));
187188
storeHandle.resolve(ZARR_JSON)
188189
.set(metadataBytes);
189190
return new Array(storeHandle, newArrayMetadata);

src/main/java/dev/zarr/zarrjava/v3/ArrayMetadataBuilder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ public ArrayMetadataBuilder withDefaultChunkKeyEncoding(Separator separator) {
7373
return this;
7474
}
7575

76+
public ArrayMetadataBuilder withDefaultChunkKeyEncoding() {
77+
this.chunkKeyEncoding = new DefaultChunkKeyEncoding(
78+
new DefaultChunkKeyEncoding.Configuration(Separator.SLASH));
79+
return this;
80+
}
81+
7682
public ArrayMetadataBuilder withDefaultChunkKeyEncoding(String separator) {
7783
this.chunkKeyEncoding =
7884
new DefaultChunkKeyEncoding(
@@ -85,6 +91,12 @@ public ArrayMetadataBuilder withV2ChunkKeyEncoding(Separator separator) {
8591
return this;
8692
}
8793

94+
public ArrayMetadataBuilder withV2ChunkKeyEncoding() {
95+
this.chunkKeyEncoding = new V2ChunkKeyEncoding(
96+
new V2ChunkKeyEncoding.Configuration(Separator.DOT));
97+
return this;
98+
}
99+
88100
public ArrayMetadataBuilder withV2ChunkKeyEncoding(String separator) {
89101
this.chunkKeyEncoding =
90102
new V2ChunkKeyEncoding(new V2ChunkKeyEncoding.Configuration(Separator.valueOf(separator)));

0 commit comments

Comments
 (0)