Skip to content

Commit 1a3a5df

Browse files
committed
Updates for v2 arch
1 parent 30545f8 commit 1a3a5df

6 files changed

Lines changed: 93 additions & 15 deletions

File tree

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
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;
89
import org.hdf5javalib.hdffile.metadata.HdfSuperblock;
910
import org.hdf5javalib.hdfjava.HdfTree;
1011
import org.hdf5javalib.hdfjava.HdfTreeNode;
@@ -107,7 +108,12 @@ public HdfObjectReference(byte[] bytes, ReferenceDatatype dt, boolean external)
107108
// }
108109
// Collections.reverse(parents);
109110
// String objectPathString = '/' + currentNode.getObjectName() + String.join("/", parents);
110-
String objectPathString = hdfDataObject.getObjectPath();
111+
String objectPathString;
112+
if ( hdfDataObject == null ) {
113+
objectPathString = "NULL:" + localHdfFixedPoint.toString();
114+
} else {
115+
objectPathString = hdfDataObject.getObjectPath();
116+
}
111117

112118
this.hdfDataHolder = HdfDataHolder.ofScalar(
113119
new HdfString(objectPathString, new StringDatatype(

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,10 @@ public MessageType getMessageType() {
281281
return messageType;
282282
}
283283

284+
public int getMessageFlags() {
285+
return messageFlags;
286+
}
287+
284288
/**
285289
* Enum representing various HDF5 message types.
286290
*/

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

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public static HdfMessage parseHeaderMessage(int messageFlags, byte[] data, HdfDa
7676

7777
int version = Byte.toUnsignedInt(buffer.get());
7878
int flags = Byte.toUnsignedInt(buffer.get());
79-
int linkType = -1;
79+
int linkType = 0;
8080
if ( (flags & 1<<3) != 0 ) {
8181
linkType = Byte.toUnsignedInt(buffer.get());
8282
}
@@ -126,8 +126,39 @@ public static HdfMessage parseHeaderMessage(int messageFlags, byte[] data, HdfDa
126126
messageFlags, data.length);
127127
}
128128

129-
@Override
129+
@Override
130130
public void writeMessageToByteBuffer(ByteBuffer buffer) {
131131
writeMessageData(buffer);
132132
}
133+
134+
@Override
135+
public String toString() {
136+
StringBuilder sb = new StringBuilder();
137+
sb.append("LinkMessage{")
138+
.append("version=").append(version)
139+
.append(", flags=0x").append(Integer.toHexString(flags))
140+
.append(", linkType=").append(linkType)
141+
.append(", creationOrder=").append(creationOrder != null ? creationOrder : "undefined")
142+
.append(", linkNameCharacterSet=").append(linkNameCharacterSet == 0 ? "ASCII" : "UTF-8")
143+
.append(", lengthOfLinkName=").append(lengthOfLinkName)
144+
.append(", linkName='").append(linkName != null ? linkName : "null").append("'")
145+
.append(", linkInformation=");
146+
147+
if (linkInformation == null) {
148+
sb.append("null");
149+
} else if (linkInformation instanceof HdfFixedPoint) {
150+
sb.append("HdfFixedPoint=").append(linkInformation);
151+
} else if (linkInformation instanceof String) {
152+
sb.append("SoftLink='").append(linkInformation).append("'");
153+
} else {
154+
sb.append("UnknownType=").append(linkInformation.getClass().getSimpleName());
155+
}
156+
157+
sb.append(", messageType=").append(getMessageType())
158+
.append(", messageSize=").append(getSizeMessageData())
159+
.append(", messageFlags=0x").append(Integer.toHexString(getMessageFlags()))
160+
.append("}");
161+
162+
return sb.toString();
163+
}
133164
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ public HdfDataObject(String objectName, HdfObjectHeaderPrefix objectHeader, HdfT
3636
public void setParent(HdfTreeNode parent) { this.parent = parent; }
3737
@Override
3838
public String getObjectPath() {
39+
HdfTreeNode tParnent = parent;
3940
StringBuilder path = new StringBuilder(Objects.requireNonNull(objectName, "Node name cannot be null."));
40-
while(parent!=null) {
41+
while(tParnent!=null) {
4142
path.insert(0, '/');
42-
path.insert(0, parent.getObjectName());
43-
parent=parent.getParent();
43+
path.insert(0, tParnent.getObjectName());
44+
tParnent=tParnent.getParent();
4445
}
45-
path.insert(0, '/');
4646
return path.toString();
4747
}
4848

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

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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>

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
import org.hdf5javalib.dataclass.HdfData;
44
import org.hdf5javalib.dataclass.HdfFixedPoint;
55
import org.hdf5javalib.datasource.TypedDataSource;
6+
import org.hdf5javalib.hdffile.dataobjects.HdfObjectHeaderPrefix;
67
import org.hdf5javalib.hdffile.dataobjects.messages.AttributeMessage;
8+
import org.hdf5javalib.hdffile.dataobjects.messages.HdfMessage;
9+
import org.hdf5javalib.hdffile.dataobjects.messages.LinkMessage;
710
import org.hdf5javalib.hdfjava.HdfDataFile;
811
import org.hdf5javalib.hdfjava.HdfDataObject;
912
import org.hdf5javalib.hdfjava.HdfDataset;
@@ -37,6 +40,16 @@ public class HdfDisplayUtils {
3740
public static final String UNDEFINED = "<Undefined>";
3841
private static final String STREAM_EQUALS = " stream = ";
3942

43+
public static void displayLinkMessages(HdfObjectHeaderPrefix objectHeader) {
44+
for( HdfMessage hdfMessage: objectHeader.getHeaderMessages()) {
45+
if ( hdfMessage instanceof LinkMessage ) {
46+
LinkMessage linkMessage = (LinkMessage) hdfMessage;
47+
System.out.println("\tLinkMessage: " + linkMessage.toString());
48+
}
49+
50+
}
51+
}
52+
4053
// Define a functional interface for actions that may need channel, dataset, and reader
4154
@FunctionalInterface
4255
interface FileAction {

0 commit comments

Comments
 (0)