private static void divideAndAddMessages(Collection<Message> messages, Message message, int maxBytes)
throws SparkplugException, JsonProcessingException {
Topic topic = message.getTopic();
SparkplugBPayload payload = message.getPayload();
List<Metric> metrics = payload.getMetrics();
final int metricCount = message.getPayload().getMetricCount();
final int size = toJsonString(message).getBytes().length;
if (metricCount <= 1) {
throw new SparkplugException("Cannot divide SparkplugBPayload with only " + metricCount + " metric(s)");
}
int newMessageCount = size / maxBytes + ((size % maxBytes > 0) ? 1 : 0);
int metricsPerMessageCount = metricCount / newMessageCount + ((metricCount % newMessageCount > 0) ? 1 : 0);
int index = 0;
while (index < metricCount) {
int toIndex = metricCount < (index + metricsPerMessageCount) ? metricCount : index + metricsPerMessageCount;
Message newMessage = new MessageBuilder(topic,
new SparkplugBPayloadBuilder().setTimestamp(payload.getTimestamp()).setUuid(payload.getUuid())
.setSeq(payload.getSeq()).addMetrics(new ArrayList<Metric>(metrics.subList(index, toIndex)))
.createPayload()).build();
String jsonMessage = toJsonString(newMessage);
if (jsonMessage.getBytes().length < maxBytes) {
messages.add(newMessage);
} else {
divideAndAddMessages(messages, newMessage, maxBytes);
}
index += metricsPerMessageCount;
}
}