in tablestore/src/main/java/com/alicloud/openservices/tablestore/timeline/model/TimelineMessageForV1.java [114:190]
public String getContent() {
if (stringMessage != null) {
return stringMessage;
}
/**
* Get Message Content Count
*/
String contentCountName = SYSTEM_COLUMN_NAME_PREFIX + messageContentCountSuffix;
long currentCount = 0;
long columnCount = message.getLong(contentCountName);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
/**
* Get CRC32 And Message Content..
*/
int index = CONTENT_COLUMN_START_ID;
long crc32 = 0;
Map<String, Column> columns = message.getFields();
List<Map.Entry<String,Column>> list = new ArrayList<Map.Entry<String,Column>>(columns.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String,Column>>(){
@Override
public int compare(Map.Entry<String, Column> o1, Map.Entry<String, Column> o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
for (Map.Entry<String,Column> entry: list) {
String key = entry.getKey();
Column column = columns.get(key);
String name = column.getName();
if (name.startsWith(SYSTEM_COLUMN_NAME_PREFIX + messageContentSuffix)) {
if (currentCount == columnCount) {
continue;
}
int columnSeqID = Integer.parseInt(name.substring(SYSTEM_COLUMN_NAME_PREFIX.length() + messageContentSuffix.length()));
if (columnSeqID != index) {
throw new TimelineException(String.format("Message Content column sequence id is wrong, expected:%d, but:%d", index, columnSeqID));
}
byte[] value = column.getValue().asBinary();
stream.write(value, 0, value.length);
index++;
currentCount++;
} else if (name.equals(SYSTEM_COLUMN_NAME_PREFIX + columnNameOfMessageCrc32Suffix)) {
crc32 = column.getValue().asLong();
}
}
if (columnCount != -1 && currentCount != columnCount) {
throw new TimelineException(String.format("Message content column is broken, expected %d, but %d", columnCount, currentCount));
}
byte[] content = stream.toByteArray();
try {
stream.close();
} catch (IOException ex) {
throw new TimelineException("Close ByteArrayOutputStream failed", ex);
}
/**
* Check CRC32
* */
if (columnNameOfMessageCrc32Suffix != null && !columnNameOfMessageCrc32Suffix.isEmpty()) {
long current = crc32(content);
if (current != crc32) {
throw new TimelineException(String.format("Message content is broken, expected crc32:%d, but:%d", crc32, current));
}
}
stringMessage = new String(content);
return stringMessage;
}