Skip to content

Commit ec3764c

Browse files
committed
Updates for v2 arch
1 parent 798857e commit ec3764c

File tree

7 files changed

+34
-18
lines changed

7 files changed

+34
-18
lines changed

src/main/java/org/hdf5javalib/dataclass/reference/HdfObjectReference.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ public HdfObjectReference(byte[] bytes, ReferenceDatatype dt, boolean external)
113113
// } else {
114114
// objectPathString = hdfDataObject.getObjectPath();
115115
// }
116+
if ( hdfDataObject == null ) {
117+
throw new IllegalStateException("DataObject for reference not found for: " + localHdfFixedPoint);
118+
}
116119
String objectPathString = hdfDataObject.getObjectPath();
117120

118121
this.hdfDataHolder = HdfDataHolder.ofScalar(

src/main/java/org/hdf5javalib/examples/hdf5examples/HDF5Debug.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ private void run() {
4747
// List all .h5 files in HDF5Examples resources directory
4848
// ATL03_20250302235544_11742607_006_01
4949
// Path dirPath = Paths.get(Objects.requireNonNull(HDF5Debug.class.getClassLoader().getResource("HDF5Examples/h5ex_g_compact2.h5")).toURI());
50-
Path dirPath = Paths.get("c:/users/karln/Downloads/ATL03_20250302235544_11742607_007_01.h5");
51-
// Path dirPath = Paths.get("c:/users/karln/Downloads/ATL03_20250302235544_11742607_006_01.h5");
50+
// Path dirPath = Paths.get("c:/users/karln/Downloads/ATL03_20250302235544_11742607_007_01.h5");
51+
Path dirPath = Paths.get("c:/users/karln/Downloads/ATL03_20250302235544_11742607_006_01.h5");
5252
processFile(dirPath);
5353
} catch (Exception e) {
5454
throw new IllegalStateException(e);

src/main/java/org/hdf5javalib/hdffile/dataobjects/HdfObjectHeaderPrefix.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ public abstract class HdfObjectHeaderPrefix {
2626
protected HdfObjectHeaderPrefix(
2727
List<HdfMessage> headerMessages,
2828
HdfFixedPoint offset,
29-
long objectHeaderSize,
30-
HdfDataFile hdfDataFile,
31-
int OBJECT_HREADER_PREFIX_HEADER_SIZE
29+
long objectHeaderSize
30+
// ,
31+
// HdfDataFile hdfDataFile,
32+
// int OBJECT_HREADER_PREFIX_HEADER_SIZE
3233
) {
3334
this.headerMessages = headerMessages;
3435
this.objectHeaderSize = objectHeaderSize;

src/main/java/org/hdf5javalib/hdffile/dataobjects/HdfObjectHeaderPrefixV1.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ public class HdfObjectHeaderPrefixV1 extends HdfObjectHeaderPrefix {
4747
public HdfObjectHeaderPrefixV1(int version, long objectReferenceCount, long objectHeaderSize, List<HdfMessage> headerMessages,
4848
HdfDataFile hdfDataFile, HdfFixedPoint offset
4949
) {
50-
super(headerMessages, offset, objectHeaderSize, hdfDataFile, OBJECT_HEADER_PREFIX_HEADER_SIZE);
50+
super(headerMessages, offset, objectHeaderSize
51+
// , hdfDataFile, OBJECT_HEADER_PREFIX_HEADER_SIZE
52+
);
5153
this.version = version;
5254
this.objectReferenceCount = objectReferenceCount;
5355
}

src/main/java/org/hdf5javalib/hdffile/dataobjects/HdfObjectHeaderPrefixV2.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ public HdfObjectHeaderPrefixV2(
3737
) {
3838
super(headerMessages,
3939
HdfWriteUtils.hdfFixedPointFromValue(offset, hdfDataFile.getSuperblock().getFixedPointDatatypeForLength()),
40-
objectHeaderSize, hdfDataFile, (int) prefixSize);
40+
objectHeaderSize
41+
// , hdfDataFile, (int) prefixSize
42+
);
4143
this.flags = flags;
4244
this.checksum = checksum;
4345
this.accessTime = accessTime;

src/main/java/org/hdf5javalib/hdfjava/HdfFileReader.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.time.Instant;
2828
import java.util.*;
2929
import java.util.concurrent.atomic.AtomicReference;
30+
import java.util.function.Function;
3031

3132
import static org.hdf5javalib.datatype.FixedPointDatatype.BIT_MULTIPLIER;
3233
import static org.hdf5javalib.hdffile.dataobjects.HdfObjectHeaderPrefixV1.*;
@@ -624,7 +625,9 @@ private static HdfBTreeV1ForGroup readFromSeekableByteChannelRecursiveForGroups(
624625
for (int i = 0; i < entriesUsed; i++) {
625626
HdfFixedPoint childPointer = HdfReadUtils.readHdfFixedPointFromBuffer(hdfOffset, entriesBuffer);
626627
HdfFixedPoint key = HdfReadUtils.readHdfFixedPointFromBuffer(hdfLength, entriesBuffer);
628+
long filePosAfterEntriesBlock = fileChannel.position();
627629
long childAddress = childPointer.getInstance(Long.class);
630+
fileChannel.position(childAddress);
628631

629632
HdfGroupForGroupBTreeEntry entry;
630633
if (nodeLevel == 1) {
@@ -636,6 +639,7 @@ private static HdfBTreeV1ForGroup readFromSeekableByteChannelRecursiveForGroups(
636639
HdfGroupSymbolTableNode child = readSnodFromSeekableByteChannel(fileChannel, hdfDataFile);
637640
entry = new HdfGroupForGroupBTreeEntry(key, childPointer, null, child); // Assuming entry constructor accepts Object for last param
638641
}
642+
fileChannel.position(filePosAfterEntriesBlock);
639643
entries.add(entry);
640644
}
641645
return currentNode;
@@ -989,13 +993,15 @@ protected static HdfObjectHeaderPrefixV1 readObjectHeader(
989993
HdfMessage.readMessagesFromByteBuffer(fileChannel, objectHeaderSize, hdfDataFile, HdfMessage.V1_OBJECT_HEADER_READ_PREFIX)
990994
);
991995

992-
for (HdfMessage hdfMessage : dataObjectHeaderMessages) {
993-
if (hdfMessage instanceof ObjectHeaderContinuationMessage objectHeaderContinuationMessage) {
994-
dataObjectHeaderMessages.addAll(HdfMessage.parseContinuationMessage(fileChannel, objectHeaderContinuationMessage, hdfDataFile, HdfMessage.V1_OBJECT_HEADER_READ_PREFIX));
995-
996-
break;
997-
}
998-
}
996+
// for (HdfMessage hdfMessage : dataObjectHeaderMessages) {
997+
// if (hdfMessage instanceof ObjectHeaderContinuationMessage objectHeaderContinuationMessage) {
998+
// dataObjectHeaderMessages.addAll(HdfMessage.parseContinuationMessage(fileChannel, objectHeaderContinuationMessage, hdfDataFile, HdfMessage.V1_OBJECT_HEADER_READ_PREFIX));
999+
//
1000+
// break;
1001+
// }
1002+
// }
1003+
// --- 6. Handle Continuation Messages ---
1004+
parseContinuationMessages(fileChannel, HdfMessage.V1_OBJECT_HEADER_READ_PREFIX, dataObjectHeaderMessages, hdfDataFile);
9991005

10001006
// Create the instance
10011007
return new HdfObjectHeaderPrefixV1(
@@ -1096,15 +1102,17 @@ static HdfObjectHeaderPrefixV2 readV2ObjectHeader(SeekableByteChannel fileChanne
10961102
// Here you would typically verify the checksum against the header chunk data.
10971103

10981104
// --- 6. Handle Continuation Messages ---
1099-
parseContinuationMessages(fileChannel, flags, dataObjectHeaderMessages, hdfDataFile);
1105+
Function<ByteBuffer, HdfMessage.OBJECT_HEADER_PREFIX> prefixReader = (flags & 0b00000100) > 0 ? HdfMessage.V2OBJECT_HEADER_READ_PREFIX_WITHORDER : HdfMessage.V2_OBJECT_HEADER_READ_PREFIX;
1106+
;
1107+
parseContinuationMessages(fileChannel, prefixReader, dataObjectHeaderMessages, hdfDataFile);
11001108
// --- 7. Create the V2 Header Prefix Instance ---
11011109
return new HdfObjectHeaderPrefixV2(flags, sizeOfChunk0, checksum,
11021110
accessTime, modificationTime, changeTime, birthTime,
11031111
maxCompactAttributes, minDenseAttributes,
11041112
dataObjectHeaderMessages, hdfDataFile, objectHeaderAddress, prefixSize);
11051113
}
11061114

1107-
private static void parseContinuationMessages(SeekableByteChannel fileChannel, int flags, List<HdfMessage> currentMessages, HdfDataFile hdfDataFile) throws IOException, InvocationTargetException, InstantiationException, IllegalAccessException {
1115+
private static void parseContinuationMessages(SeekableByteChannel fileChannel, Function<ByteBuffer, HdfMessage.OBJECT_HEADER_PREFIX> prefixReader, List<HdfMessage> currentMessages, HdfDataFile hdfDataFile) throws IOException, InvocationTargetException, InstantiationException, IllegalAccessException {
11081116
// Use a queue to process messages iteratively instead of recursively
11091117
Queue<HdfMessage> messageQueue = new LinkedList<>(currentMessages);
11101118

@@ -1116,7 +1124,7 @@ private static void parseContinuationMessages(SeekableByteChannel fileChannel, i
11161124
fileChannel,
11171125
objectHeaderContinuationMessage,
11181126
hdfDataFile,
1119-
(flags & 0b00000100) > 0 ? HdfMessage.V2OBJECT_HEADER_READ_PREFIX_WITHORDER : HdfMessage.V2_OBJECT_HEADER_READ_PREFIX
1127+
prefixReader
11201128
);
11211129
// Add new messages to the queue for further processing
11221130
messageQueue.addAll(newContinuationMessages);

src/test/java/org/hdf5javalib/examples/read/CompoundReadTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ static void registerCustomConverter() {
9292
CompoundDatatype.addConverter(MonitoringData.class, (bytes, datatype) -> {
9393
MonitoringData monitoringData = new MonitoringData();
9494
for (CompoundMemberDatatype member : datatype.getMembers()) {
95-
byte[] memberBytes = Arrays.copyOfRange(bytes, member.getOffset(), member.getOffset() + member.getSize());
95+
byte[] memberBytes = Arrays.copyOfRange(bytes, Math.toIntExact(member.getOffset()), Math.toIntExact(member.getOffset() + member.getSize()));
9696
switch (member.getName()) {
9797
case "recordId" -> {
9898
long recordId = member.getInstance(Long.class, memberBytes);

0 commit comments

Comments
 (0)