2727import java .time .Instant ;
2828import java .util .*;
2929import java .util .concurrent .atomic .AtomicReference ;
30+ import java .util .function .Function ;
3031
3132import static org .hdf5javalib .datatype .FixedPointDatatype .BIT_MULTIPLIER ;
3233import 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 );
0 commit comments