Skip to content

Commit 4364b82

Browse files
authored
Merge pull request #170 from saalfeldlab/rename
Codec renaming
2 parents e2fc4c1 + faae2aa commit 4364b82

18 files changed

Lines changed: 337 additions & 314 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: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@
3232
import java.util.Arrays;
3333
import java.util.HashMap;
3434

35-
import org.janelia.saalfeldlab.n5.codec.Codec;
36-
import org.janelia.saalfeldlab.n5.codec.ArrayCodec;
37-
import org.janelia.saalfeldlab.n5.codec.BytesCodec;
38-
import org.janelia.saalfeldlab.n5.codec.DataBlockSerializer;
39-
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;
4039

4140
/**
4241
* Mandatory dataset attributes:
@@ -67,38 +66,39 @@ public class DatasetAttributes implements Serializable {
6766
private final int[] blockSize;
6867
private final DataType dataType;
6968

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

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

7574
public DatasetAttributes(
7675
final long[] dimensions,
7776
final int[] blockSize,
7877
final DataType dataType,
79-
final ArrayCodec arrayCodec,
80-
final BytesCodec... codecs) {
78+
final BlockCodecInfo blockCodecInfo,
79+
final DataCodecInfo... dataCodecInfos) {
8180

8281
this.dimensions = dimensions;
8382
this.blockSize = blockSize;
8483
this.dataType = dataType;
8584

86-
this.arrayCodec = arrayCodec == null ? defaultArrayCodec() : arrayCodec;
87-
byteCodecs = Arrays.stream(codecs).filter(it -> !(it instanceof RawCompression)).toArray(BytesCodec[]::new);
88-
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);
8988
}
9089

9190
public DatasetAttributes(
9291
final long[] dimensions,
9392
final int[] blockSize,
9493
final DataType dataType,
95-
final BytesCodec compression) {
94+
final DataCodecInfo compression) {
9695

9796
this(dimensions, blockSize, dataType, null, compression);
9897
}
9998

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

104104
public long[] getDimensions() {
@@ -118,7 +118,7 @@ public int[] getBlockSize() {
118118

119119
public Compression getCompression() {
120120

121-
return Arrays.stream(byteCodecs)
121+
return Arrays.stream(dataCodecInfos)
122122
.filter(it -> it instanceof Compression)
123123
.map(it -> (Compression)it)
124124
.findFirst()
@@ -131,18 +131,19 @@ public DataType getDataType() {
131131
}
132132

133133
/**
134-
* Get the {@link ArrayCodec} for this dataset.
134+
* Get the {@link BlockCodecInfo} for this dataset.
135135
*
136-
* @return the {@code ArrayCodec} for this dataset
136+
* @return the {@code BlockCodecInfo} for this dataset
137137
*/
138-
public ArrayCodec getArrayCodec() {
138+
public BlockCodecInfo getBlockCodecInfo() {
139139

140-
return arrayCodec;
140+
return blockCodecInfo;
141141
}
142142

143143
@SuppressWarnings("unchecked")
144-
<T> DataBlockSerializer<T> getDataBlockSerializer() {
145-
return (DataBlockSerializer<T>) dataBlockSerializer;
144+
<T> BlockCodec<T> getBlockCodec() {
145+
146+
return (BlockCodec<T>) blockCodec;
146147
}
147148

148149
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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
import com.google.gson.JsonSyntaxException;
7272
import com.google.gson.reflect.TypeToken;
7373
import org.janelia.saalfeldlab.n5.N5Exception.N5JsonParseException;
74-
import org.janelia.saalfeldlab.n5.codec.Codec;
74+
import org.janelia.saalfeldlab.n5.codec.CodecInfo;
7575

7676
/**
7777
* Utility class for working with JSON.
@@ -83,7 +83,7 @@ public interface GsonUtils {
8383
static Gson registerGson(final GsonBuilder gsonBuilder) {
8484

8585
gsonBuilder.registerTypeAdapter(DataType.class, new DataType.JsonAdapter());
86-
gsonBuilder.registerTypeHierarchyAdapter(Codec.class, NameConfigAdapter.getJsonAdapter(Codec.class));
86+
gsonBuilder.registerTypeHierarchyAdapter(CodecInfo.class, NameConfigAdapter.getJsonAdapter(CodecInfo.class));
8787
gsonBuilder.registerTypeHierarchyAdapter(Compression.class, CompressionAdapter.getJsonAdapter());
8888
gsonBuilder.disableHtmlEscaping();
8989
return gsonBuilder.create();

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
}

src/main/java/org/janelia/saalfeldlab/n5/codec/ConcatenatedBytesCodec.java renamed to src/main/java/org/janelia/saalfeldlab/n5/codec/ConcatenatedDataCodec.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
import org.janelia.saalfeldlab.n5.readdata.ReadData;
44

5-
class ConcatenatedBytesCodec implements BytesCodec {
5+
class ConcatenatedDataCodec implements DataCodec {
66

7-
private final BytesCodec[] codecs;
7+
private final DataCodec[] codecs;
88

9-
ConcatenatedBytesCodec(final BytesCodec[] codecs) {
9+
ConcatenatedDataCodec(final DataCodec[] codecs) {
1010

1111
if (codecs == null) {
1212
throw new NullPointerException();
@@ -17,7 +17,7 @@ class ConcatenatedBytesCodec implements BytesCodec {
1717
@Override
1818
public ReadData encode(ReadData readData) {
1919

20-
for (BytesCodec codec : codecs) {
20+
for (DataCodec codec : codecs) {
2121
readData = codec.encode(readData);
2222
}
2323
return readData;
@@ -27,15 +27,9 @@ public ReadData encode(ReadData readData) {
2727
public ReadData decode(ReadData readData) {
2828

2929
for (int i = codecs.length - 1; i >= 0; i--) {
30-
final BytesCodec codec = codecs[i];
30+
final DataCodec codec = codecs[i];
3131
readData = codec.decode(readData);
3232
}
3333
return readData;
3434
}
35-
36-
@Override
37-
public String getType() {
38-
39-
return "internal-concatenated-codecs";
40-
}
4135
}

0 commit comments

Comments
 (0)