Skip to content

Commit f1e82a7

Browse files
committed
Merge remote-tracking branch 'origin/master' into feat/attributesKey
# Conflicts: # src/main/java/org/janelia/saalfeldlab/n5/DatasetAttributes.java # src/main/java/org/janelia/saalfeldlab/n5/GsonUtils.java
2 parents 7b9dee4 + 4364b82 commit f1e82a7

19 files changed

Lines changed: 339 additions & 317 deletions

src/main/java/org/janelia/saalfeldlab/n5/Compression.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,24 +60,25 @@
6060
import java.lang.annotation.RetentionPolicy;
6161
import java.lang.annotation.Target;
6262

63-
import org.janelia.saalfeldlab.n5.codec.BytesCodec;
64-
import org.janelia.saalfeldlab.n5.codec.Codec;
63+
import org.janelia.saalfeldlab.n5.codec.DataCodec;
64+
import org.janelia.saalfeldlab.n5.codec.DataCodecInfo;
65+
import org.janelia.saalfeldlab.n5.codec.CodecInfo;
6566
import org.scijava.annotations.Indexable;
6667

6768
/**
68-
* This interface is used to indicate that a {@link BytesCodec} can be
69+
* This interface is used to indicate that a {@link DataCodec} can be
6970
* serialized as a "compression" for the N5 format (using the N5 API).
7071
* <p>
71-
* N5Readers and N5Writers for the N5 format can declare BytesCodecs that
72+
* N5Readers and N5Writers for the N5 format can declare DataCodecs that
7273
* implement this interface so that the {@link CompressionAdapter} is used for
7374
* serialization.
7475
* <p>
75-
* See also: an alternative method for serializing general {@link Codec}s is
76+
* See also: an alternative method for serializing general {@link CodecInfo}s is
7677
* with the {@link NameConfigAdapter}.
7778
*
7879
* @author Stephan Saalfeld
7980
*/
80-
public interface Compression extends Serializable, BytesCodec {
81+
public interface Compression extends Serializable, DataCodecInfo, DataCodec {
8182

8283
/**
8384
* Annotation for runtime discovery of compression schemes.
@@ -110,4 +111,9 @@ default String getType() {
110111
else
111112
return compressionType.value();
112113
}
114+
115+
@Override
116+
default DataCodec create() {
117+
return this;
118+
}
113119
}

src/main/java/org/janelia/saalfeldlab/n5/DatasetAttributes.java

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@
3232
import java.util.Arrays;
3333
import java.util.HashMap;
3434

35-
import org.janelia.saalfeldlab.n5.codec.ArrayCodec;
36-
import org.janelia.saalfeldlab.n5.codec.BytesCodec;
37-
import org.janelia.saalfeldlab.n5.codec.DataBlockSerializer;
38-
import org.janelia.saalfeldlab.n5.codec.N5ArrayCodec;
35+
import org.janelia.saalfeldlab.n5.codec.BlockCodecInfo;
36+
import org.janelia.saalfeldlab.n5.codec.BlockCodec;
37+
import org.janelia.saalfeldlab.n5.codec.DataCodecInfo;
38+
import org.janelia.saalfeldlab.n5.codec.N5BlockCodecInfo;
3939

4040
/**
4141
* Mandatory dataset attributes:
@@ -66,38 +66,39 @@ public class DatasetAttributes implements Serializable {
6666
private final int[] blockSize;
6767
private final DataType dataType;
6868

69-
private final ArrayCodec arrayCodec;
70-
private final BytesCodec[] byteCodecs;
69+
private final BlockCodecInfo blockCodecInfo;
70+
private final DataCodecInfo[] dataCodecInfos;
7171

72-
private final DataBlockSerializer<?> dataBlockSerializer;
72+
private final BlockCodec<?> blockCodec;
7373

7474
public DatasetAttributes(
7575
final long[] dimensions,
7676
final int[] blockSize,
7777
final DataType dataType,
78-
final ArrayCodec arrayCodec,
79-
final BytesCodec... codecs) {
78+
final BlockCodecInfo blockCodecInfo,
79+
final DataCodecInfo... dataCodecInfos) {
8080

8181
this.dimensions = dimensions;
8282
this.blockSize = blockSize;
8383
this.dataType = dataType;
8484

85-
this.arrayCodec = arrayCodec == null ? defaultArrayCodec() : arrayCodec;
86-
byteCodecs = Arrays.stream(codecs).filter(it -> !(it instanceof RawCompression)).toArray(BytesCodec[]::new);
87-
dataBlockSerializer = this.arrayCodec.initialize(this, byteCodecs);
85+
this.blockCodecInfo = blockCodecInfo == null ? defaultBlockCodecInfo() : blockCodecInfo;
86+
this.dataCodecInfos = Arrays.stream(dataCodecInfos).filter(it -> !(it instanceof RawCompression)).toArray(DataCodecInfo[]::new);
87+
blockCodec = this.blockCodecInfo.create(this, this.dataCodecInfos);
8888
}
8989

9090
public DatasetAttributes(
9191
final long[] dimensions,
9292
final int[] blockSize,
9393
final DataType dataType,
94-
final BytesCodec compression) {
94+
final DataCodecInfo compression) {
9595

9696
this(dimensions, blockSize, dataType, null, compression);
9797
}
9898

99-
protected ArrayCodec defaultArrayCodec() {
100-
return new N5ArrayCodec();
99+
protected BlockCodecInfo defaultBlockCodecInfo() {
100+
101+
return new N5BlockCodecInfo();
101102
}
102103

103104
public long[] getDimensions() {
@@ -117,7 +118,7 @@ public int[] getBlockSize() {
117118

118119
public Compression getCompression() {
119120

120-
return Arrays.stream(byteCodecs)
121+
return Arrays.stream(dataCodecInfos)
121122
.filter(it -> it instanceof Compression)
122123
.map(it -> (Compression)it)
123124
.findFirst()
@@ -130,23 +131,24 @@ public DataType getDataType() {
130131
}
131132

132133
/**
133-
* Get the {@link ArrayCodec} for this dataset.
134+
* Get the {@link BlockCodecInfo} for this dataset.
134135
*
135-
* @return the {@code ArrayCodec} for this dataset
136+
* @return the {@code BlockCodecInfo} for this dataset
136137
*/
137-
public ArrayCodec getArrayCodec() {
138+
public BlockCodecInfo getBlockCodecInfo() {
138139

139-
return arrayCodec;
140+
return blockCodecInfo;
140141
}
141142

142-
public BytesCodec[] getCodecs() {
143+
public DataCodecInfo[] getDataCodecInfos() {
143144

144-
return byteCodecs;
145+
return dataCodecInfos;
145146
}
146147

147148
@SuppressWarnings("unchecked")
148-
<T> DataBlockSerializer<T> getDataBlockSerializer() {
149-
return (DataBlockSerializer<T>) dataBlockSerializer;
149+
<T> BlockCodec<T> getBlockCodec() {
150+
151+
return (BlockCodec<T>) blockCodec;
150152
}
151153

152154
public HashMap<String, Object> asMap() {

src/main/java/org/janelia/saalfeldlab/n5/GsonKeyValueN5Reader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ default DataBlock<?> readBlock(
100100

101101
try {
102102
final ReadData blockData = getKeyValueAccess().createReadData(path);
103-
return datasetAttributes.getDataBlockSerializer().decode(blockData, gridPosition);
103+
return datasetAttributes.getBlockCodec().decode(blockData, gridPosition);
104104
} catch (N5Exception.N5NoSuchKeyException e) {
105105
return null;
106106
}

src/main/java/org/janelia/saalfeldlab/n5/GsonKeyValueN5Writer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ default <T> void writeBlock(
246246
final LockedChannel lock = getKeyValueAccess().lockForWriting(blockPath);
247247
final OutputStream out = lock.newOutputStream()
248248
) {
249-
datasetAttributes.<T>getDataBlockSerializer().encode(dataBlock).writeTo(out);
249+
datasetAttributes.<T>getBlockCodec().encode(dataBlock).writeTo(out);
250250
} catch (final IOException | UncheckedIOException e) {
251251
throw new N5IOException(
252252
"Failed to write block " + Arrays.toString(dataBlock.getGridPosition()) + " into dataset " + path,

src/main/java/org/janelia/saalfeldlab/n5/GsonUtils.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,13 @@
6363
import java.util.regex.Matcher;
6464

6565
import com.google.gson.Gson;
66-
import com.google.gson.GsonBuilder;
6766
import com.google.gson.JsonArray;
6867
import com.google.gson.JsonElement;
6968
import com.google.gson.JsonObject;
7069
import com.google.gson.JsonPrimitive;
7170
import com.google.gson.JsonSyntaxException;
7271
import com.google.gson.reflect.TypeToken;
7372
import org.janelia.saalfeldlab.n5.N5Exception.N5JsonParseException;
74-
import org.janelia.saalfeldlab.n5.codec.Codec;
7573

7674
/**
7775
* Utility class for working with JSON.

src/main/java/org/janelia/saalfeldlab/n5/N5KeyValueReader.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
import com.google.gson.JsonElement;
3535
import org.janelia.saalfeldlab.n5.cache.N5JsonCache;
36-
import org.janelia.saalfeldlab.n5.codec.Codec;
36+
import org.janelia.saalfeldlab.n5.codec.CodecInfo;
3737

3838
import com.google.gson.Gson;
3939
import com.google.gson.GsonBuilder;
@@ -163,7 +163,7 @@ private boolean inferExistence(String path) {
163163
protected GsonBuilder registerGson(final GsonBuilder gsonBuilder) {
164164

165165
gsonBuilder.registerTypeAdapter(DataType.class, new DataType.JsonAdapter());
166-
gsonBuilder.registerTypeHierarchyAdapter(Codec.class, NameConfigAdapter.getJsonAdapter(Codec.class));
166+
gsonBuilder.registerTypeHierarchyAdapter(CodecInfo.class, NameConfigAdapter.getJsonAdapter(CodecInfo.class));
167167
gsonBuilder.registerTypeHierarchyAdapter(Compression.class, CompressionAdapter.getJsonAdapter());
168168
gsonBuilder.disableHtmlEscaping();
169169
return gsonBuilder;

src/main/java/org/janelia/saalfeldlab/n5/codec/ArrayCodec.java

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/main/java/org/janelia/saalfeldlab/n5/codec/DataBlockSerializer.java renamed to src/main/java/org/janelia/saalfeldlab/n5/codec/BlockCodec.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
* @param <T>
3939
* type of the data contained in the DataBlock
4040
*/
41-
public interface DataBlockSerializer<T> {
41+
public interface BlockCodec<T> {
4242

4343
ReadData encode(DataBlock<T> dataBlock) throws N5IOException;
4444

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.janelia.saalfeldlab.n5.codec;
2+
3+
import java.util.Arrays;
4+
import org.janelia.saalfeldlab.n5.DataBlock;
5+
import org.janelia.saalfeldlab.n5.DatasetAttributes;
6+
import org.janelia.saalfeldlab.n5.readdata.ReadData;
7+
8+
/**
9+
* Metadata and factory for a particular family of {@code BlockCodec}.
10+
* <p>
11+
* {@code BlockCodec}s encode {@link DataBlock}s into {@link ReadData} and
12+
* decode {@link ReadData} into {@link DataBlock}s.
13+
*/
14+
public interface BlockCodecInfo extends CodecInfo {
15+
16+
<T> BlockCodec<T> create(final DatasetAttributes attributes, final DataCodec... codecs);
17+
18+
default <T> BlockCodec<T> create(final DatasetAttributes attributes, final DataCodecInfo... codecInfos) {
19+
final DataCodec[] codecs = new DataCodec[codecInfos.length];
20+
Arrays.setAll(codecs, i -> codecInfos[i].create());
21+
return create(attributes, codecs);
22+
}
23+
24+
// TODO: Should we have both create() signatures?
25+
}

src/main/java/org/janelia/saalfeldlab/n5/codec/Codec.java renamed to src/main/java/org/janelia/saalfeldlab/n5/codec/CodecInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* Zarr.
1212
*/
1313
@NameConfig.Prefix("codec")
14-
public interface Codec extends Serializable {
14+
public interface CodecInfo extends Serializable {
1515

1616
String getType();
1717
}

0 commit comments

Comments
 (0)