Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/main/java/dev/zarr/zarrjava/core/ArrayMetadata.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.zarr.zarrjava.core;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import dev.zarr.zarrjava.ZarrException;
import dev.zarr.zarrjava.utils.MultiArrayUtils;
Expand All @@ -16,6 +17,7 @@ public abstract class ArrayMetadata {

public final long[] shape;

@JsonInclude(JsonInclude.Include.ALWAYS)
@JsonProperty("fill_value")
public final Object fillValue;
@JsonIgnore
Expand Down
48 changes: 29 additions & 19 deletions src/main/java/dev/zarr/zarrjava/core/codec/core/BytesCodec.java
Original file line number Diff line number Diff line change
@@ -1,38 +1,44 @@
package dev.zarr.zarrjava.core.codec.core;

import com.fasterxml.jackson.annotation.JsonValue;
import dev.zarr.zarrjava.ZarrException;
import dev.zarr.zarrjava.core.codec.ArrayBytesCodec;
import ucar.ma2.*;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public abstract class BytesCodec extends ArrayBytesCodec {
protected abstract ByteOrder getByteOrder();
protected abstract ByteOrder getByteOrder() throws ZarrException;

@Override
public Array decode(ByteBuffer chunkBytes) {
chunkBytes.order(getByteOrder());
DataType dtype = arrayMetadata.dataType.getMA2DataType();
int[] shape = arrayMetadata.chunkShape;

// Array.factory does not support boolean arrays directly from ByteBuffer
if (dtype == DataType.BOOLEAN) {
int size = chunkBytes.remaining();
boolean[] bools = new boolean[size];
for (int i = 0; i < size; i++) {
bools[i] = chunkBytes.get(i) != 0;
}
public Array decode(ByteBuffer chunkBytes) throws ZarrException {
ByteOrder order = ByteOrder.BIG_ENDIAN; // Default for 1-byte types
if (arrayMetadata.dataType.getByteCount() > 1)
order = getByteOrder();
chunkBytes.order(order);
DataType dtype = arrayMetadata.dataType.getMA2DataType();
int[] shape = arrayMetadata.chunkShape;

// Array.factory does not support boolean arrays directly from ByteBuffer
if (dtype == DataType.BOOLEAN) {
int size = chunkBytes.remaining();
boolean[] bools = new boolean[size];
for (int i = 0; i < size; i++) {
bools[i] = chunkBytes.get(i) != 0;
}

Index index = Index.factory(shape);
return Array.factory(DataType.BOOLEAN, index, bools);
Index index = Index.factory(shape);
return Array.factory(DataType.BOOLEAN, index, bools);
}
return Array.factory(dtype, shape, chunkBytes);
}

return Array.factory(dtype, shape, chunkBytes);
}
@Override
public ByteBuffer encode(Array chunkArray) {
ByteOrder order = getByteOrder();
public ByteBuffer encode(Array chunkArray) throws ZarrException {
ByteOrder order = ByteOrder.BIG_ENDIAN; // Default for 1-byte types
if (arrayMetadata.dataType.getByteCount() > 1)
order = getByteOrder();

// Boolean
if (chunkArray instanceof ArrayBoolean) {
Expand Down Expand Up @@ -94,6 +100,10 @@ public ByteOrder getByteOrder() {
throw new RuntimeException("Unreachable");
}
}

public static Endian nativeOrder() {
return ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN ? LITTLE : BIG;
}
}

}
7 changes: 4 additions & 3 deletions src/main/java/dev/zarr/zarrjava/v2/Array.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dev.zarr.zarrjava.v2;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import dev.zarr.zarrjava.ZarrException;
import dev.zarr.zarrjava.store.FilesystemStore;
import dev.zarr.zarrjava.store.StoreHandle;
Expand All @@ -18,6 +18,7 @@
import java.util.function.Function;
import java.util.stream.Collectors;
import static dev.zarr.zarrjava.v2.Node.makeObjectMapper;
import static dev.zarr.zarrjava.v2.Node.makeObjectWriter;

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

Expand Down Expand Up @@ -141,8 +142,8 @@ public static Array create(StoreHandle storeHandle, ArrayMetadata arrayMetadata,
"Trying to create a new array in " + storeHandle + ". But " + metadataHandle
+ " already exists.");
}
ObjectMapper objectMapper = makeObjectMapper();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectMapper.writeValueAsBytes(arrayMetadata));
ObjectWriter objectWriter = makeObjectWriter();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectWriter.writeValueAsBytes(arrayMetadata));
metadataHandle.set(metadataBytes);
return new Array(storeHandle, arrayMetadata);
}
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/dev/zarr/zarrjava/v2/Group.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dev.zarr.zarrjava.v2;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import dev.zarr.zarrjava.ZarrException;
import dev.zarr.zarrjava.store.FilesystemStore;
import dev.zarr.zarrjava.store.StoreHandle;
Expand All @@ -14,6 +14,7 @@
import java.nio.file.Paths;
import java.util.function.Function;
import static dev.zarr.zarrjava.v2.Node.makeObjectMapper;
import static dev.zarr.zarrjava.v2.Node.makeObjectWriter;

public class Group extends dev.zarr.zarrjava.core.Group implements Node{
public GroupMetadata metadata;
Expand Down Expand Up @@ -41,8 +42,8 @@ public static Group open(String path) throws IOException {
public static Group create(
@Nonnull StoreHandle storeHandle, @Nonnull GroupMetadata groupMetadata
) throws IOException {
ObjectMapper objectMapper = makeObjectMapper();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectMapper.writeValueAsBytes(groupMetadata));
ObjectWriter objectWriter = makeObjectWriter();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectWriter.writeValueAsBytes(groupMetadata));
storeHandle.resolve(ZGROUP).set(metadataBytes);
return new Group(storeHandle, groupMetadata);
}
Expand Down
8 changes: 7 additions & 1 deletion src/main/java/dev/zarr/zarrjava/v2/Node.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package dev.zarr.zarrjava.v2;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import dev.zarr.zarrjava.ZarrException;
import dev.zarr.zarrjava.store.FilesystemStore;
Expand All @@ -21,7 +23,11 @@ static ObjectMapper makeObjectMapper() {
return objectMapper;
}

/**
static ObjectWriter makeObjectWriter() {
return makeObjectMapper().writerWithDefaultPrettyPrinter();
}

/**
* Opens an existing Zarr array or group at a specified storage location.
*
* @param storeHandle the storage location of the Zarr array
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/dev/zarr/zarrjava/v2/codec/core/BloscCodec.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.zarr.zarrjava.v2.codec.core;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
Expand All @@ -22,6 +23,7 @@

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

@JsonIgnore
public final String id = "blosc";

@Nonnull
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package dev.zarr.zarrjava.v2.codec.core;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import dev.zarr.zarrjava.ZarrException;
import dev.zarr.zarrjava.core.ArrayMetadata;
import dev.zarr.zarrjava.v2.codec.Codec;

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

@JsonCreator
public BytesCodec(
@JsonProperty(value = "endian", defaultValue = "little") Endian endian) {
public BytesCodec(Endian endian) {
this.endian = endian;
}

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/dev/zarr/zarrjava/v2/codec/core/ZlibCodec.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.zarr.zarrjava.v2.codec.core;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import dev.zarr.zarrjava.ZarrException;
import dev.zarr.zarrjava.core.ArrayMetadata;
Expand All @@ -16,6 +17,7 @@

public class ZlibCodec extends BytesBytesCodec implements Codec {

@JsonIgnore
public final String id = "zlib";
public final int level;

Expand Down
11 changes: 6 additions & 5 deletions src/main/java/dev/zarr/zarrjava/v3/Array.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dev.zarr.zarrjava.v3;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import dev.zarr.zarrjava.ZarrException;
import dev.zarr.zarrjava.store.FilesystemStore;
import dev.zarr.zarrjava.store.StoreHandle;
Expand All @@ -17,6 +17,7 @@
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import static dev.zarr.zarrjava.v3.Node.makeObjectMapper;
import static dev.zarr.zarrjava.v3.Node.makeObjectWriter;

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

Expand Down Expand Up @@ -136,8 +137,8 @@ public static Array create(StoreHandle storeHandle, ArrayMetadata arrayMetadata,
"Trying to create a new array in " + storeHandle + ". But " + metadataHandle
+ " already exists.");
}
ObjectMapper objectMapper = makeObjectMapper();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectMapper.writeValueAsBytes(arrayMetadata));
ObjectWriter objectWriter = makeObjectWriter();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectWriter.writeValueAsBytes(arrayMetadata));
metadataHandle.set(metadataBytes);
return new Array(storeHandle, arrayMetadata);
}
Expand Down Expand Up @@ -182,8 +183,8 @@ public static ArrayMetadataBuilder metadataBuilder(ArrayMetadata existingMetadat
}

private Array writeMetadata(ArrayMetadata newArrayMetadata) throws ZarrException, IOException {
ObjectMapper objectMapper = makeObjectMapper();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectMapper.writeValueAsBytes(newArrayMetadata));
ObjectWriter objectWriter = makeObjectWriter();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectWriter.writeValueAsBytes(newArrayMetadata));
storeHandle.resolve(ZARR_JSON)
.set(metadataBytes);
return new Array(storeHandle, newArrayMetadata);
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/dev/zarr/zarrjava/v3/ArrayMetadataBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ public ArrayMetadataBuilder withDefaultChunkKeyEncoding(Separator separator) {
return this;
}

public ArrayMetadataBuilder withDefaultChunkKeyEncoding() {
this.chunkKeyEncoding = new DefaultChunkKeyEncoding(
new DefaultChunkKeyEncoding.Configuration(Separator.SLASH));
return this;
}

public ArrayMetadataBuilder withDefaultChunkKeyEncoding(String separator) {
this.chunkKeyEncoding =
new DefaultChunkKeyEncoding(
Expand All @@ -85,6 +91,12 @@ public ArrayMetadataBuilder withV2ChunkKeyEncoding(Separator separator) {
return this;
}

public ArrayMetadataBuilder withV2ChunkKeyEncoding() {
this.chunkKeyEncoding = new V2ChunkKeyEncoding(
new V2ChunkKeyEncoding.Configuration(Separator.DOT));
return this;
}

public ArrayMetadataBuilder withV2ChunkKeyEncoding(String separator) {
this.chunkKeyEncoding =
new V2ChunkKeyEncoding(new V2ChunkKeyEncoding.Configuration(Separator.valueOf(separator)));
Expand Down
11 changes: 6 additions & 5 deletions src/main/java/dev/zarr/zarrjava/v3/Group.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dev.zarr.zarrjava.v3;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import dev.zarr.zarrjava.ZarrException;
import dev.zarr.zarrjava.store.FilesystemStore;
import dev.zarr.zarrjava.store.StoreHandle;
Expand All @@ -14,6 +14,7 @@
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import static dev.zarr.zarrjava.v3.Node.makeObjectMapper;
import static dev.zarr.zarrjava.v3.Node.makeObjectWriter;


public class Group extends dev.zarr.zarrjava.core.Group implements Node {
Expand Down Expand Up @@ -44,8 +45,8 @@ public static Group open(String path) throws IOException {
public static Group create(
@Nonnull StoreHandle storeHandle, @Nonnull GroupMetadata groupMetadata
) throws IOException {
ObjectMapper objectMapper = makeObjectMapper();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectMapper.writeValueAsBytes(groupMetadata));
ObjectWriter objectWriter = makeObjectWriter();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectWriter.writeValueAsBytes(groupMetadata));
storeHandle.resolve(ZARR_JSON)
.set(metadataBytes);
return new Group(storeHandle, groupMetadata);
Expand Down Expand Up @@ -114,8 +115,8 @@ public Array createArray(String key,
}

private Group writeMetadata(GroupMetadata newGroupMetadata) throws IOException {
ObjectMapper objectMapper = makeObjectMapper();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectMapper.writeValueAsBytes(newGroupMetadata));
ObjectWriter objectWriter = makeObjectWriter();
ByteBuffer metadataBytes = ByteBuffer.wrap(objectWriter.writeValueAsBytes(newGroupMetadata));
storeHandle.resolve(ZARR_JSON)
.set(metadataBytes);
return new Group(storeHandle, newGroupMetadata);
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/dev/zarr/zarrjava/v3/Node.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package dev.zarr.zarrjava.v3;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import dev.zarr.zarrjava.ZarrException;
import dev.zarr.zarrjava.store.FilesystemStore;
Expand All @@ -20,9 +22,14 @@ static ObjectMapper makeObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new Jdk8Module());
objectMapper.registerSubtypes(CodecRegistry.getNamedTypes());
objectMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL);
return objectMapper;
}

static ObjectWriter makeObjectWriter() {
return makeObjectMapper().writerWithDefaultPrettyPrinter();
}

/**
* Opens an existing Zarr array or group at a specified storage location.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package dev.zarr.zarrjava.v3.chunkgrid;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.annotation.Nonnull;


public class RegularChunkGrid extends ChunkGrid {

@JsonIgnore
public final String name = "regular";
@Nonnull
public final Configuration configuration;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.zarr.zarrjava.v3.chunkkeyencoding;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import dev.zarr.zarrjava.core.chunkkeyencoding.Separator;

Expand All @@ -11,6 +12,7 @@

public class DefaultChunkKeyEncoding extends ChunkKeyEncoding {

@JsonIgnore
public final String name = "default";
@Nonnull
public final Configuration configuration;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.zarr.zarrjava.v3.chunkkeyencoding;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import dev.zarr.zarrjava.core.chunkkeyencoding.Separator;

Expand All @@ -11,6 +12,7 @@

public class V2ChunkKeyEncoding extends ChunkKeyEncoding {

@JsonIgnore
public final String name = "v2";
@Nonnull
public final Configuration configuration;
Expand Down
Loading
Loading