in java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java [77:172]
public static TsFileMetadata deserializeFrom(
ByteBuffer buffer, DeserializeConfig context, boolean needTableSchemaMap) {
TsFileMetadata fileMetaData = new TsFileMetadata();
int startPos = buffer.position();
// metadataIndex
int tableIndexNodeNum = ReadWriteForEncodingUtils.readUnsignedVarInt(buffer);
Map<String, MetadataIndexNode> tableIndexNodeMap = new TreeMap<>();
for (int i = 0; i < tableIndexNodeNum; i++) {
String tableName = ReadWriteIOUtils.readVarIntString(buffer);
MetadataIndexNode metadataIndexNode =
context.deviceMetadataIndexNodeBufferDeserializer.deserialize(buffer, context);
tableIndexNodeMap.put(tableName, metadataIndexNode);
}
fileMetaData.setTableMetadataIndexNodeMap(tableIndexNodeMap);
// tableSchemas
int tableSchemaNum = ReadWriteForEncodingUtils.readUnsignedVarInt(buffer);
Map<String, TableSchema> tableSchemaMap = new HashMap<>();
for (int i = 0; i < tableSchemaNum; i++) {
String tableName = ReadWriteIOUtils.readVarIntString(buffer);
TableSchema tableSchema = context.tableSchemaBufferDeserializer.deserialize(buffer, context);
if (needTableSchemaMap) {
tableSchema.setTableName(tableName);
tableSchemaMap.put(tableName, tableSchema);
}
}
fileMetaData.setTableSchemaMap(tableSchemaMap);
fileMetaData.hasTableSchemaMapCache = needTableSchemaMap;
// metaOffset
long metaOffset = ReadWriteIOUtils.readLong(buffer);
fileMetaData.setMetaOffset(metaOffset);
// read bloom filter
if (buffer.hasRemaining()) {
fileMetaData.bloomFilter = BloomFilter.deserialize(buffer);
}
fileMetaData.propertiesOffset = buffer.position() - startPos;
if (buffer.hasRemaining()) {
int propertiesSize = ReadWriteForEncodingUtils.readVarInt(buffer);
Map<String, String> propertiesMap = new HashMap<>();
for (int i = 0; i < propertiesSize; i++) {
String key = ReadWriteIOUtils.readVarIntString(buffer);
String value = ReadWriteIOUtils.readVarIntString(buffer);
propertiesMap.put(key, value);
}
// if the file is not encrypted, set the default value(for compatible reason)
if (!propertiesMap.containsKey("encryptLevel") || propertiesMap.get("encryptLevel") == null) {
propertiesMap.put("encryptLevel", "0");
propertiesMap.put("encryptType", "org.apache.tsfile.encrypt.UNENCRYPTED");
propertiesMap.put("encryptKey", "");
} else if (propertiesMap.get("encryptLevel").equals("0")) {
propertiesMap.put("encryptType", "org.apache.tsfile.encrypt.UNENCRYPTED");
propertiesMap.put("encryptKey", "");
} else if (propertiesMap.get("encryptLevel").equals("1")) {
if (!propertiesMap.containsKey("encryptType")) {
throw new EncryptException("TsfileMetadata lack of encryptType while encryptLevel is 1");
}
if (!propertiesMap.containsKey("encryptKey")) {
throw new EncryptException("TsfileMetadata lack of encryptKey while encryptLevel is 1");
}
if (propertiesMap.get("encryptKey") == null || propertiesMap.get("encryptKey").isEmpty()) {
throw new EncryptException("TsfileMetadata null encryptKey while encryptLevel is 1");
}
String str = propertiesMap.get("encryptKey");
fileMetaData.dataEncryptKey = EncryptUtils.getSecondKeyFromStr(str);
fileMetaData.encryptType = propertiesMap.get("encryptType");
} else if (propertiesMap.get("encryptLevel").equals("2")) {
if (!propertiesMap.containsKey("encryptType")) {
throw new EncryptException("TsfileMetadata lack of encryptType while encryptLevel is 2");
}
if (!propertiesMap.containsKey("encryptKey")) {
throw new EncryptException("TsfileMetadata lack of encryptKey while encryptLevel is 2");
}
if (propertiesMap.get("encryptKey") == null || propertiesMap.get("encryptKey").isEmpty()) {
throw new EncryptException("TsfileMetadata null encryptKey while encryptLevel is 2");
}
IDecryptor decryptor =
IDecryptor.getDecryptor(
propertiesMap.get("encryptType"),
TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes());
String str = propertiesMap.get("encryptKey");
fileMetaData.dataEncryptKey = decryptor.decrypt(EncryptUtils.getSecondKeyFromStr(str));
fileMetaData.encryptType = propertiesMap.get("encryptType");
} else {
throw new EncryptException(
"Unsupported encryptLevel: " + propertiesMap.get("encryptLevel"));
}
fileMetaData.tsFileProperties = propertiesMap;
}
return fileMetaData;
}