55import org .hdf5javalib .hdffile .dataobjects .HdfObjectHeaderPrefix ;
66import org .hdf5javalib .hdffile .dataobjects .HdfObjectHeaderPrefixV1 ;
77import org .hdf5javalib .hdffile .dataobjects .HdfObjectHeaderPrefixV2 ;
8- import org .hdf5javalib .hdffile .dataobjects .messages .AttributeInfoMessage ;
9- import org .hdf5javalib .hdffile .dataobjects .messages .HdfMessage ;
10- import org .hdf5javalib .hdffile .dataobjects .messages .ObjectHeaderContinuationMessage ;
8+ import org .hdf5javalib .hdffile .dataobjects .messages .*;
119import org .hdf5javalib .hdffile .infrastructure .*;
1210import org .hdf5javalib .hdffile .infrastructure .fractalheap .grok .ParsedHeapId ;
1311import org .hdf5javalib .hdffile .infrastructure .fractalheap .grok .FractalHeap ;
1412import org .hdf5javalib .hdffile .infrastructure .v2btree .gemini .*;
1513import org .hdf5javalib .hdffile .metadata .HdfSuperblock ;
14+ import org .hdf5javalib .utils .HdfDisplayUtils ;
1615import org .hdf5javalib .utils .HdfReadUtils ;
1716import org .hdf5javalib .utils .HdfWriteUtils ;
1817
@@ -141,67 +140,95 @@ private void readV1Arch(SeekableByteChannel fileChannel, HdfSymbolTableEntry roo
141140 }
142141
143142 private void readV2Arch (SeekableByteChannel fileChannel , HdfGroup rootGroup ) throws Exception {
144- //// HdfFixedPoint fractalHeapAddress = objectHeader.findMessageByType(LinkInfoMessage.class).orElseThrow().getFractalHeapAddress();
145- //// long fractalHeapOffset = fractalHeapAddress.getInstance(Long.class);
146- //// fileChannel.position(fractalHeapOffset);
147- //
148- // HdfFixedPoint v2BTreeNameIndexAddress = rootGroup.getObjectHeader().findMessageByType(LinkInfoMessage.class).orElseThrow().getV2BTreeNameIndexAddress();
149- // long v2BTreeNameIndexOffset = v2BTreeNameIndexAddress.getInstance(Long.class);
150- // fileChannel.position(v2BTreeNameIndexOffset);
151- //
152- // System.out.println("Starting B-tree v2 Read...");
153- // BTreeV2Reader bTreeV2Reader = new BTreeV2Reader(fileChannel, 8, 8);
154- // BTreeV2Header bTreeV2Header = bTreeV2Reader.getHeader();
155- //
156- // System.out.println("Header parsed successfully:");
157- // System.out.println(" Type: " + bTreeV2Header.type);
158- // System.out.println(" Depth: " + bTreeV2Header.depth);
159- // System.out.println(" Total Records: " + bTreeV2Header.totalNumberOfRecordsInBTree);
160- // System.out.println(" Root Node Address: " + bTreeV2Header.rootNodeAddress);
161- //
162- // List<BTreeV2Record> allRecords = bTreeV2Reader.getAllRecords();
163- //
164- // System.out.println("\nTraversal complete. Found " + allRecords.size() + " records:");
165- //
166- // HdfFixedPoint fractalHeapAddress = rootGroup.getObjectHeader().findMessageByType(LinkInfoMessage.class).orElseThrow().getFractalHeapAddress();
143+ // HdfFixedPoint fractalHeapAddress = objectHeader.findMessageByType(LinkInfoMessage.class).orElseThrow().getFractalHeapAddress();
167144// long fractalHeapOffset = fractalHeapAddress.getInstance(Long.class);
168145// fileChannel.position(fractalHeapOffset);
169- //
170- // // 6. --- EXECUTE THE READER ---
171- // FractalHeapReader reader = new FractalHeapReader(fileChannel, 8, 8);
172- // FractalHeap heap = reader.read();
173- //
174- // // 7. --- RETRIEVE THE OBJECT AND VERIFY ---
175- // for (BTreeV2Record bTreeV2Record: allRecords) {
176- //
177- // byte[] heapId = ((Type5Record)bTreeV2Record).heapId;
178- //
179- //// byte[] retrievedData = heap.getObject(heapId);
180- //// System.out.println("Row: " + Arrays.toString(Arrays.copyOfRange(retrievedData, 0, 10))
181- //// + " : " + retrievedData[10]
182- //// + " : " + new String(Arrays.copyOfRange(retrievedData, 11, 11+retrievedData[10]))
183- //// + " : " + Arrays.toString(Arrays.copyOfRange(retrievedData, 10+1+retrievedData[10], retrievedData.length))
184- //// );
185- // ByteBuffer retrievedData = ByteBuffer.wrap(heap.getObject(heapId)).order(ByteOrder.LITTLE_ENDIAN);
186- // byte[] rowHeader = new byte[10];
187- // retrievedData.get(rowHeader);
188- // int sLength = Byte.toUnsignedInt(retrievedData.get());
189- // byte[] stringBuffer = new byte[sLength];
190- // retrievedData.get(stringBuffer);
191- // String groupName = new String(stringBuffer);
192- // long objectHeaderOffset = retrievedData.getLong();
193- // System.out.println("Row: " + Arrays.toString(rowHeader)
194- // + " : " + sLength
195- // + " : " + groupName
196- // + " : " + objectHeaderOffset
146+
147+ HdfFixedPoint v2BTreeNameIndexAddress = rootGroup .getObjectHeader ().findMessageByType (LinkInfoMessage .class ).orElseThrow ().getV2BTreeNameIndexAddress ();
148+ long v2BTreeNameIndexOffset = v2BTreeNameIndexAddress .getInstance (Long .class );
149+ fileChannel .position (v2BTreeNameIndexOffset );
150+
151+ System .out .println ("Starting B-tree v2 Read..." );
152+ BTreeV2Reader bTreeV2Reader = new BTreeV2Reader (fileChannel , 8 , 8 );
153+ BTreeV2Header bTreeV2Header = bTreeV2Reader .getHeader ();
154+
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 );
160+
161+ List <BTreeV2Record > allRecords = bTreeV2Reader .getAllRecords ();
162+
163+ System .out .println ("\n Traversal complete. Found " + allRecords .size () + " records:" );
164+
165+ HdfFixedPoint fractalHeapAddress = rootGroup .getObjectHeader ().findMessageByType (LinkInfoMessage .class ).orElseThrow ().getFractalHeapAddress ();
166+ long fractalHeapOffset = fractalHeapAddress .getInstance (Long .class );
167+ fileChannel .position (fractalHeapOffset );
168+
169+ // 6. --- EXECUTE THE READER ---
170+ FractalHeap fractalHeap = FractalHeap .read (fileChannel , fractalHeapOffset , 8 , 8 );
171+
172+ // 7. --- RETRIEVE THE OBJECT AND VERIFY ---
173+ for (BTreeV2Record bTreeV2Record : allRecords ) {
174+
175+ byte [] heapId = ((Type5Record )bTreeV2Record ).heapId ;
176+ ParsedHeapId parsedHeapId = new ParsedHeapId (heapId , fractalHeap );
177+
178+ // byte[] retrievedData = heap.getObject(heapId);
179+ // System.out.println("Row: " + Arrays.toString(Arrays.copyOfRange(retrievedData, 0, 10))
180+ // + " : " + retrievedData[10]
181+ // + " : " + new String(Arrays.copyOfRange(retrievedData, 11, 11+retrievedData[10]))
182+ // + " : " + Arrays.toString(Arrays.copyOfRange(retrievedData, 10+1+retrievedData[10], retrievedData.length))
197183// );
198- //
199- // // System.out.println("Heap ID: " + Arrays.toString(heapId));
200- //// System.out.println("Retrieved Data: '" + new String(retrievedData, StandardCharsets.UTF_8) + "'");
184+ byte [] objectData = fractalHeap .getObject (parsedHeapId );
185+ ByteBuffer retrievedData = ByteBuffer .wrap (objectData ).order (ByteOrder .LITTLE_ENDIAN );
186+ byte [] rowHeader = new byte [10 ];
187+ retrievedData .get (rowHeader );
188+ int sLength = Byte .toUnsignedInt (retrievedData .get ());
189+ byte [] stringBuffer = new byte [sLength ];
190+ retrievedData .get (stringBuffer );
191+ String groupName = new String (stringBuffer );
192+ long objectHeaderOffset = retrievedData .getLong ();
193+ System .out .println ("Row: " + Arrays .toString (rowHeader )
194+ + " : " + sLength
195+ + " : " + groupName
196+ + " : " + objectHeaderOffset
197+ );
198+
199+ // System.out.println("Heap ID: " + Arrays.toString(heapId));
200+ // System.out.println("Retrieved Data: '" + new String(retrievedData, StandardCharsets.UTF_8) + "'");
201+ String hardLink = isHardLink (rootGroup , objectHeaderOffset );
202+ HdfObjectHeaderPrefix objectHeader = null ;
203+ if ( hardLink == null ) {
204+ // objectHeader = readObjectHeader(fileChannel, objectHeaderOffset, this);
205+ objectHeader = readObjectHeaderPrefixFromSeekableByteChannel (fileChannel , objectHeaderOffset , this , groupName );
206+ }
201207// HdfObjectHeaderPrefix objectHeaderG1 = readObjectHeaderPrefixFromSeekableByteChannel(fileChannel, objectHeaderOffset, this, groupName);
202- //// System.out.println(groupName + ":" + objectHeaderG1.getHeaderMessages());
203- // }
208+ // System.out.println(groupName + ":" + objectHeaderG1.getHeaderMessages());
209+
210+ if ( objectHeader != null && objectHeader .findMessageByType (DataLayoutMessage .class ).isEmpty () ) {
211+ HdfGroup groupObject = new HdfGroup (groupName , objectHeader , rootGroup , hardLink );
212+ rootGroup .addChild (groupObject );
213+ System .out .println ("ADDED GROUP: " + HdfDisplayUtils .getDataObjectFullName (groupObject ));
214+
215+ if ( hardLink == null ) {
216+ LinkInfoMessage linkInfoMessage = objectHeader .findMessageByType (LinkInfoMessage .class ).orElseThrow ();
217+ if ( !linkInfoMessage .getFractalHeapAddress ().isUndefined () && !linkInfoMessage .getV2BTreeNameIndexAddress ().isUndefined () ) {
218+ readV2Arch (fileChannel , groupObject );
219+ }
220+ }
221+
222+ } else {
223+ HdfDataset datasetObject = new HdfDataset (groupName , objectHeader , rootGroup , hardLink );
224+ rootGroup .addChild (datasetObject );
225+ System .out .println ("ADDED DATASET: " + HdfDisplayUtils .getDataObjectFullName (datasetObject ));
226+ }
227+
228+
229+ }
204230
231+ /*
205232 HdfFixedPoint attributeInfoV2BTreeNameIndexAddress = rootGroup.getObjectHeader().findMessageByType(AttributeInfoMessage.class).orElseThrow().getAttributeNameV2BtreeAddress();
206233 long attributeInfoV2BTreeNameIndexOffset = attributeInfoV2BTreeNameIndexAddress.getInstance(Long.class);
207234 fileChannel.position(attributeInfoV2BTreeNameIndexOffset);
@@ -226,43 +253,18 @@ private void readV2Arch(SeekableByteChannel fileChannel, HdfGroup rootGroup) thr
226253 fileChannel.position(attributeInfoFractalHeapOffset);
227254
228255 FractalHeap fractalHeap = FractalHeap.read(fileChannel, attributeInfoFractalHeapOffset, 8, 8);
229- //
230- // // 6. --- EXECUTE THE READER ---
231- // FractalHeapReader attributeInfoReader = new FractalHeapReader(fileChannel, 8, 8);
232- // FractalHeap attributeInfoRHeap = attributeInfoReader.read();
233- //
234256 // 7. --- RETRIEVE THE OBJECT AND VERIFY ---
235257 for (BTreeV2Record bTreeV2Record: attributeInfoAllRecords) {
236258
237259 byte[] heapId = ((Type8Record)bTreeV2Record).heapId;
238- // System.out.println("Row: " + Arrays.toString(heapId));
239260 ParsedHeapId parsedHeapId = new ParsedHeapId(heapId, fractalHeap);
240261
241262 byte[] retrievedData = fractalHeap.getObject(parsedHeapId);
242263 System.out.println("Row: " + Arrays.toString(retrievedData));
243264 printRows(retrievedData);
244265 System.out.println();
245- // System.out.println("Row: " + Arrays.toString(Arrays.copyOfRange(retrievedData, 0, 10))
246- // + " : " + retrievedData[10]
247- // + " : " + new String(Arrays.copyOfRange(retrievedData, 11, 11+retrievedData[10]))
248- // + " : " + Arrays.toString(Arrays.copyOfRange(retrievedData, 10+1+retrievedData[10], retrievedData.length))
249- // );
250- // ByteBuffer retrievedData = ByteBuffer.wrap(attributeInfoRHeap.getObject(heapId)).order(ByteOrder.LITTLE_ENDIAN);
251- // byte[] rowHeader = new byte[10];
252- // retrievedData.get(rowHeader);
253- // int sLength = Byte.toUnsignedInt(retrievedData.get());
254- // byte[] stringBuffer = new byte[sLength];
255- // retrievedData.get(stringBuffer);
256- // String groupName = new String(stringBuffer);
257- // long objectHeaderOffset = retrievedData.getLong();
258- // System.out.println("Row: " + Arrays.toString(retrievedData.array()));
259-
260- // System.out.println("Heap ID: " + Arrays.toString(heapId));
261- // System.out.println("Retrieved Data: '" + new String(retrievedData, StandardCharsets.UTF_8) + "'");
262- // HdfObjectHeaderPrefix objectHeaderG1 = readObjectHeaderPrefixFromSeekableByteChannel(fileChannel, objectHeaderOffset, this, groupName);
263- // System.out.println(groupName + ":" + objectHeaderG1.getHeaderMessages());
264266 }
265-
267+ */
266268
267269 }
268270 public static void printRows (byte [] input ) {
@@ -409,7 +411,8 @@ public Iterator<HdfDataset> datasetIterator() {
409411 public List <HdfDataset > getDatasets () {
410412 // Convert Iterator to List using a for loop
411413 List <HdfDataset > resultList = new ArrayList <>();
412- for (Iterator <HdfDataset > iterator = datasetIterator (); iterator .hasNext (); ) {
414+ Iterator <HdfDataset > iterator = datasetIterator ();
415+ for (; iterator .hasNext (); ) {
413416 resultList .add (iterator .next ());
414417 }
415418 return resultList ;
0 commit comments