Skip to content

Commit ac3dd27

Browse files
committed
Updates for v2 arch
1 parent 28d1ed2 commit ac3dd27

6 files changed

Lines changed: 83 additions & 26 deletions

File tree

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@
55
import org.hdf5javalib.datatype.FixedPointDatatype;
66
import org.hdf5javalib.datatype.ReferenceDatatype;
77
import org.hdf5javalib.datatype.StringDatatype;
8-
import org.hdf5javalib.hdffile.infrastructure.HdfGlobalHeap;
98
import org.hdf5javalib.hdffile.metadata.HdfSuperblock;
109
import org.hdf5javalib.hdfjava.HdfTree;
1110
import org.hdf5javalib.hdfjava.HdfTreeNode;
1211
import org.hdf5javalib.hdfjava.HdfDataObject;
1312
import org.hdf5javalib.utils.HdfDataHolder;
14-
import org.hdf5javalib.utils.HdfDisplayUtils;
1513

1614
import java.io.IOException;
1715
import java.lang.reflect.InvocationTargetException;
@@ -108,12 +106,13 @@ public HdfObjectReference(byte[] bytes, ReferenceDatatype dt, boolean external)
108106
// }
109107
// Collections.reverse(parents);
110108
// String objectPathString = '/' + currentNode.getObjectName() + String.join("/", parents);
111-
String objectPathString;
112-
if ( hdfDataObject == null ) {
113-
objectPathString = "NULL:" + localHdfFixedPoint.toString();
114-
} else {
115-
objectPathString = hdfDataObject.getObjectPath();
116-
}
109+
// String objectPathString;
110+
// if ( hdfDataObject == null ) {
111+
// objectPathString = "NULL:" + localHdfFixedPoint.toString();
112+
// } else {
113+
// objectPathString = hdfDataObject.getObjectPath();
114+
// }
115+
String objectPathString = hdfDataObject.getObjectPath();
117116

118117
this.hdfDataHolder = HdfDataHolder.ofScalar(
119118
new HdfString(objectPathString, new StringDatatype(

src/main/java/org/hdf5javalib/hdffile/dataobjects/messages/LinkMessage.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,12 @@ public String toString() {
161161

162162
return sb.toString();
163163
}
164+
165+
public String getLinkName() {
166+
return linkName;
167+
}
168+
169+
public HdfFixedPoint getLinkInformation() {
170+
return (HdfFixedPoint)linkInformation;
171+
}
164172
}

src/main/java/org/hdf5javalib/hdffile/infrastructure/fractalheap/grok/ParsedHeapId.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public ParsedHeapId(byte[] rawId, FractalHeap fractalHeap) {
6161
// this.length = reader.read(spec.lengthBits);
6262
// this.row = (int) reader.read(spec.rowBits);
6363
// this.col = (int) reader.read(spec.colBits);
64-
System.out.println(this);
64+
// System.out.println(this);
6565

6666
}
6767

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

Lines changed: 59 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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("\nTraversal 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);

src/main/java/org/hdf5javalib/utils/HdfDisplayUtils.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,9 @@ private static void processFile(Path filePath, FileAction action) {
7676
try (SeekableByteChannel channel = Files.newByteChannel(filePath, StandardOpenOption.READ)) {
7777
HdfFileReader reader = new HdfFileReader(channel).readFile();
7878
for (HdfDataset dataSet : reader.getDatasets()) {
79-
log.info("{} ", dataSet);
80-
action.perform(channel, dataSet, reader);
79+
System.out.println("{} " + dataSet);
80+
// log.info("{} ", dataSet);
81+
// action.perform(channel, dataSet, reader);
8182
}
8283
} catch (Exception e) {
8384
log.error("Exception in processFile: {}", filePath, e);

src/main/java/org/hdf5javalib/utils/HdfReadUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import org.hdf5javalib.dataclass.HdfFixedPoint;
44
import org.hdf5javalib.datatype.FixedPointDatatype;
5+
import org.hdf5javalib.hdffile.dataobjects.messages.HdfMessage;
6+
import org.hdf5javalib.hdffile.dataobjects.messages.LinkMessage;
7+
import org.hdf5javalib.hdfjava.HdfFileReader;
8+
import org.hdf5javalib.hdfjava.HdfGroup;
59

610
import java.io.IOException;
711
import java.lang.reflect.InvocationTargetException;
@@ -169,4 +173,5 @@ public static void validateSize(int size) {
169173
throw new IllegalArgumentException("Size must be between 1 and 8 bytes");
170174
}
171175
}
176+
172177
}

0 commit comments

Comments
 (0)