@@ -211,6 +211,7 @@ private void readV2Arch(SeekableByteChannel fileChannel, HdfGroup rootGroup) thr
211211 HdfGroup groupObject = new HdfGroup (groupName , objectHeader , rootGroup , hardLink );
212212 rootGroup .addChild (groupObject );
213213 System .out .println ("ADDED GROUP: " + groupObject .getObjectPath ());
214+ HdfDisplayUtils .displayLinkMessages (objectHeader );
214215
215216 if ( hardLink == null ) {
216217 LinkInfoMessage linkInfoMessage = objectHeader .findMessageByType (LinkInfoMessage .class ).orElseThrow ();
@@ -1094,20 +1095,43 @@ static HdfObjectHeaderPrefixV2 readV2ObjectHeader(SeekableByteChannel fileChanne
10941095 }
10951096
10961097 private static void parseContinuationMessages (SeekableByteChannel fileChannel , int flags , List <HdfMessage > currentMessages , HdfDataFile hdfDataFile ) throws IOException , InvocationTargetException , InstantiationException , IllegalAccessException {
1097- // This logic is similar to V1, but you need to check the newly read messages.
1098- for (HdfMessage hdfMessage : currentMessages ) {
1098+ // Use a queue to process messages iteratively instead of recursively
1099+ Queue <HdfMessage > messageQueue = new LinkedList <>(currentMessages );
1100+
1101+ while (!messageQueue .isEmpty ()) {
1102+ HdfMessage hdfMessage = messageQueue .poll ();
10991103 if (hdfMessage instanceof ObjectHeaderContinuationMessage objectHeaderContinuationMessage ) {
1100- // The continuation message points to the next chunk. You need a method to parse these.
1101- // A continuation chunk is NOT a full V2 header, it's just more messages.
1102- List <HdfMessage > newContinuationMessages = HdfMessage .parseContinuationMessage (fileChannel , objectHeaderContinuationMessage , hdfDataFile ,
1103- (flags & 0b00000100) > 0 ? HdfMessage .V2OBJECT_HEADER_READ_PREFIX_WITHORDER : HdfMessage .V2_OBJECT_HEADER_READ_PREFIX );
1104- parseContinuationMessages (fileChannel , flags , newContinuationMessages , hdfDataFile );
1104+ // Parse the continuation chunk
1105+ List <HdfMessage > newContinuationMessages = HdfMessage .parseContinuationMessage (
1106+ fileChannel ,
1107+ objectHeaderContinuationMessage ,
1108+ hdfDataFile ,
1109+ (flags & 0b00000100) > 0 ? HdfMessage .V2OBJECT_HEADER_READ_PREFIX_WITHORDER : HdfMessage .V2_OBJECT_HEADER_READ_PREFIX
1110+ );
1111+ // Add new messages to the queue for further processing
1112+ messageQueue .addAll (newContinuationMessages );
1113+ // Also add them to currentMessages to retain all messages
11051114 currentMessages .addAll (newContinuationMessages );
1106- break ; // Typically only one continuation message per chunk
11071115 }
11081116 }
11091117 }
11101118
1119+ // private static void parseContinuationMessages(SeekableByteChannel fileChannel, int flags, List<HdfMessage> currentMessages, HdfDataFile hdfDataFile) throws IOException, InvocationTargetException, InstantiationException, IllegalAccessException {
1120+ // ArrayList<HdfMessage> messages = new ArrayList<>();
1121+ // // This logic is similar to V1, but you need to check the newly read messages.
1122+ // for (HdfMessage hdfMessage : currentMessages) {
1123+ // if (hdfMessage instanceof ObjectHeaderContinuationMessage objectHeaderContinuationMessage) {
1124+ // // The continuation message points to the next chunk. You need a method to parse these.
1125+ // // A continuation chunk is NOT a full V2 header, it's just more messages.
1126+ // List<HdfMessage> newContinuationMessages = HdfMessage.parseContinuationMessage(fileChannel, objectHeaderContinuationMessage, hdfDataFile,
1127+ // (flags & 0b00000100) > 0 ? HdfMessage.V2OBJECT_HEADER_READ_PREFIX_WITHORDER : HdfMessage.V2_OBJECT_HEADER_READ_PREFIX);
1128+ // messages.addAll(newContinuationMessages);
1129+ // parseContinuationMessages(fileChannel, flags, newContinuationMessages, hdfDataFile);
1130+ // }
1131+ // }
1132+ // currentMessages.addAll(messages);
1133+ // }
1134+
11111135 /**
11121136 * Initializes the global heap at the specified offset.
11131137 * <p>
0 commit comments