@@ -148,19 +148,19 @@ private void readV2Arch(SeekableByteChannel fileChannel, HdfGroup rootGroup) thr
148148 long v2BTreeNameIndexOffset = v2BTreeNameIndexAddress .getInstance (Long .class );
149149 fileChannel .position (v2BTreeNameIndexOffset );
150150
151- System .out .println ("Starting B-tree v2 Read..." );
151+ // System.out.println("Starting B-tree v2 Read...");
152152 BTreeV2Reader bTreeV2Reader = new BTreeV2Reader (fileChannel , 8 , 8 );
153153 BTreeV2Header bTreeV2Header = bTreeV2Reader .getHeader ();
154154
155- System .out .println ("Header parsed successfully:" );
156- System .out .println (" Type: " + bTreeV2Header .type );
157- System .out .println (" Depth: " + bTreeV2Header .depth );
158- System .out .println (" Total Records: " + bTreeV2Header .totalNumberOfRecordsInBTree );
159- System .out .println (" Root Node Address: " + bTreeV2Header .rootNodeAddress );
155+ // System.out.println("Header parsed successfully:");
156+ // System.out.println(" Type: " + bTreeV2Header.type);
157+ // System.out.println(" Depth: " + bTreeV2Header.depth);
158+ // System.out.println(" Total Records: " + bTreeV2Header.totalNumberOfRecordsInBTree);
159+ // System.out.println(" Root Node Address: " + bTreeV2Header.rootNodeAddress);
160160
161161 List <BTreeV2Record > allRecords = bTreeV2Reader .getAllRecords ();
162162
163- System .out .println ("\n Traversal complete. Found " + allRecords .size () + " records:" );
163+ // System.out.println("\nTraversal complete. Found " + allRecords.size() + " records:");
164164
165165 HdfFixedPoint fractalHeapAddress = rootGroup .getObjectHeader ().findMessageByType (LinkInfoMessage .class ).orElseThrow ().getFractalHeapAddress ();
166166 long fractalHeapOffset = fractalHeapAddress .getInstance (Long .class );
@@ -190,11 +190,11 @@ private void readV2Arch(SeekableByteChannel fileChannel, HdfGroup rootGroup) thr
190190 retrievedData .get (stringBuffer );
191191 String groupName = new String (stringBuffer );
192192 long objectHeaderOffset = retrievedData .getLong ();
193- System .out .println ("Row: " + Arrays .toString (rowHeader )
194- + " : " + sLength
195- + " : " + groupName
196- + " : " + objectHeaderOffset
197- );
193+ // System.out.println("Row: " + Arrays.toString(rowHeader)
194+ // + " : " + sLength
195+ // + " : " + groupName
196+ // + " : " + objectHeaderOffset
197+ // );
198198
199199 // System.out.println("Heap ID: " + Arrays.toString(heapId));
200200// System.out.println("Retrieved Data: '" + new String(retrievedData, StandardCharsets.UTF_8) + "'");
@@ -210,8 +210,9 @@ private void readV2Arch(SeekableByteChannel fileChannel, HdfGroup rootGroup) thr
210210 if ( objectHeader != null && objectHeader .findMessageByType (DataLayoutMessage .class ).isEmpty () ) {
211211 HdfGroup groupObject = new HdfGroup (groupName , objectHeader , rootGroup , hardLink );
212212 rootGroup .addChild (groupObject );
213- System .out .println ("ADDED GROUP: " + groupObject .getObjectPath ());
214- HdfDisplayUtils .displayLinkMessages (objectHeader );
213+ System .out .println ("ADDED GROUP: " + groupObject .getObjectPath () + " at " + objectHeaderOffset );
214+ // HdfDisplayUtils.displayLinkMessages(objectHeader);
215+ addLinkMessageDatasets (fileChannel , groupObject , this );
215216
216217 if ( hardLink == null ) {
217218 LinkInfoMessage linkInfoMessage = objectHeader .findMessageByType (LinkInfoMessage .class ).orElseThrow ();
@@ -223,7 +224,7 @@ private void readV2Arch(SeekableByteChannel fileChannel, HdfGroup rootGroup) thr
223224 } else {
224225 HdfDataset datasetObject = new HdfDataset (groupName , objectHeader , rootGroup , hardLink );
225226 rootGroup .addChild (datasetObject );
226- System .out .println ("ADDED DATASET: " + datasetObject .getObjectPath ());
227+ System .out .println ("ADDED DATASET: " + datasetObject .getObjectPath () + " at " + objectHeaderOffset );
227228 }
228229
229230
@@ -268,6 +269,49 @@ private void readV2Arch(SeekableByteChannel fileChannel, HdfGroup rootGroup) thr
268269*/
269270
270271 }
272+
273+ private void addLinkMessageDatasets (SeekableByteChannel fileChannel , HdfGroup rootGroup , HdfDataFile hdfDataFile ) throws Exception {
274+ for (HdfMessage hdfMessage : rootGroup .getObjectHeader ().getHeaderMessages ()) {
275+ if ( hdfMessage instanceof LinkMessage ) {
276+ LinkMessage linkMessage = (LinkMessage ) hdfMessage ;
277+ long objectHeaderOffset = linkMessage .getLinkInformation ().getInstance (Long .class );
278+ String groupName = linkMessage .getLinkName ();
279+ String hardLink = isHardLink (rootGroup , objectHeaderOffset );
280+ HdfObjectHeaderPrefix objectHeader = null ;
281+ if ( hardLink == null ) {
282+ // objectHeader = readObjectHeader(fileChannel, objectHeaderOffset, this);
283+ objectHeader = readObjectHeaderPrefixFromSeekableByteChannel (fileChannel , objectHeaderOffset , this , groupName );
284+ }
285+ // HdfObjectHeaderPrefix objectHeaderG1 = readObjectHeaderPrefixFromSeekableByteChannel(fileChannel, objectHeaderOffset, this, groupName);
286+ // System.out.println(groupName + ":" + objectHeaderG1.getHeaderMessages());
287+
288+ if ( objectHeader != null && objectHeader .findMessageByType (DataLayoutMessage .class ).isEmpty () ) {
289+ HdfGroup groupObject = new HdfGroup (groupName , objectHeader , rootGroup , hardLink );
290+ rootGroup .addChild (groupObject );
291+ System .out .println ("ADDED GROUP: " + groupObject .getObjectPath () + " at " + objectHeaderOffset );
292+ addLinkMessageDatasets (fileChannel , groupObject , this );
293+
294+ if ( hardLink == null ) {
295+ Optional <LinkInfoMessage > linkInfoMessageOpt = objectHeader .findMessageByType (LinkInfoMessage .class );
296+ if ( linkInfoMessageOpt .isPresent () ) {
297+ LinkInfoMessage linkInfoMessage = linkInfoMessageOpt .get ();
298+ if ( !linkInfoMessage .getFractalHeapAddress ().isUndefined () && !linkInfoMessage .getV2BTreeNameIndexAddress ().isUndefined () ) {
299+ readV2Arch (fileChannel , groupObject );
300+ }
301+ } else {
302+ System .out .println ("No LinkInfoMessage" );
303+ }
304+ }
305+
306+ } else {
307+ HdfDataset datasetObject = new HdfDataset (groupName , objectHeader , rootGroup , hardLink );
308+ rootGroup .addChild (datasetObject );
309+ System .out .println ("ADDED DATASET: " + datasetObject .getObjectPath () + " at " + objectHeaderOffset );
310+ }
311+ }
312+ }
313+ }
314+
271315 public static void printRows (byte [] input ) {
272316 // First row: 8 bytes, print as Arrays.toString
273317 byte [] firstRow = Arrays .copyOfRange (input , 0 , 8 );
0 commit comments