Skip to content

Commit 7e0e90e

Browse files
committed
add store.getSize
1 parent 5c74445 commit 7e0e90e

File tree

8 files changed

+73
-1
lines changed

8 files changed

+73
-1
lines changed

src/main/java/dev/zarr/zarrjava/store/BufferedZipStore.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,10 @@ public InputStream getInputStream(String[] keys, long start, long end) {
296296
return bufferStore.getInputStream(keys, start, end);
297297
}
298298

299+
public long getSize(String[] keys) {
300+
return bufferStore.getSize(keys);
301+
}
302+
299303
@Override
300304
public String toString() {
301305
return "BufferedZipStore(" + underlyingStore.toString() + ")";

src/main/java/dev/zarr/zarrjava/store/FilesystemStore.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,4 +170,11 @@ public InputStream getInputStream(String[] keys, long start, long end) {
170170
throw new RuntimeException(e);
171171
}
172172
}
173+
public long getSize(String[] keys) {
174+
try {
175+
return Files.size(resolveKeys(keys));
176+
} catch (IOException e) {
177+
throw new RuntimeException(e);
178+
}
179+
}
173180
}

src/main/java/dev/zarr/zarrjava/store/HttpStore.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,30 @@ public void close() throws IOException {
134134
return null;
135135
}
136136
}
137+
@Override
138+
public long getSize(String[] keys) {
139+
// Explicitly request "identity" encoding to prevent OkHttp from adding "gzip"
140+
// and subsequently stripping the Content-Length header.
141+
Request request = new Request.Builder()
142+
.head()
143+
.url(resolveKeys(keys))
144+
.header("Accept-Encoding", "identity")
145+
.build();
146+
147+
Call call = httpClient.newCall(request);
148+
try {
149+
Response response = call.execute();
150+
if (!response.isSuccessful()) {
151+
throw new IOException("Failed to get size: " + response.code());
152+
}
153+
154+
String contentLength = response.header("Content-Length");
155+
if (contentLength != null) {
156+
return Long.parseLong(contentLength);
157+
}
158+
return -1;
159+
} catch (IOException e) {
160+
throw new RuntimeException(e);
161+
}
162+
}
137163
}

src/main/java/dev/zarr/zarrjava/store/MemoryStore.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,5 +93,13 @@ public InputStream getInputStream(String[] keys, long start, long end) {
9393
if (end > Integer.MAX_VALUE) throw new IllegalArgumentException("End index too large");
9494
return new java.io.ByteArrayInputStream(bytes, (int) start, (int)(end - start));
9595
}
96-
}
9796

97+
@Override
98+
public long getSize(String[] keys) {
99+
byte[] bytes = map.get(resolveKeys(keys));
100+
if (bytes == null) {
101+
throw new RuntimeException(new java.io.FileNotFoundException("Key not found: " + String.join("/", keys)));
102+
}
103+
return bytes.length;
104+
}
105+
}

src/main/java/dev/zarr/zarrjava/store/S3Store.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,19 @@ public InputStream getInputStream(String[] keys, long start, long end) {
132132
return responseInputStream;
133133
}
134134

135+
@Override
136+
public long getSize(String[] keys) {
137+
HeadObjectRequest req = HeadObjectRequest.builder()
138+
.bucket(bucketName)
139+
.key(resolveKeys(keys))
140+
.build();
141+
try {
142+
return s3client.headObject(req).contentLength();
143+
} catch (NoSuchKeyException e) {
144+
throw new RuntimeException(e);
145+
}
146+
}
147+
135148
@Override
136149
public String toString() {
137150
return "s3://" + bucketName + "/" + prefix;

src/main/java/dev/zarr/zarrjava/store/Store.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,6 @@ default Stream<String[]> list() {
4949
default InputStream getInputStream(String[] keys) {
5050
return getInputStream(keys, 0, -1);
5151
}
52+
53+
long getSize(String[] keys);
5254
}

src/main/java/dev/zarr/zarrjava/store/StoreHandle.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ public Stream<String[]> list() {
7373
return ((Store.ListableStore) store).list(keys);
7474
}
7575

76+
public long getSize() {
77+
return store.getSize(keys);
78+
}
79+
7680
@Override
7781
public String toString() {
7882
return store + "/" + String.join("/", keys);

src/test/java/dev/zarr/zarrjava/ZarrStoreTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,14 @@ public void testStoreInputStream(StoreHandle storeHandle) throws IOException, Za
155155
Assertions.assertArrayEquals(expectedBuffer, buffer);
156156
}
157157

158+
@ParameterizedTest
159+
@MethodSource("inputStreamStores")
160+
public void testStoreGetSize(StoreHandle storeHandle) throws IOException, ZarrException {
161+
long size = storeHandle.getSize();
162+
long actual_size = storeHandle.read().remaining();
163+
Assertions.assertEquals(actual_size, size);
164+
}
165+
158166
@Test
159167
public void testHttpStore() throws IOException, ZarrException {
160168
HttpStore httpStore = new dev.zarr.zarrjava.store.HttpStore("https://static.webknossos.org/data/zarr_v3/l4_sample");

0 commit comments

Comments
 (0)