use of org.apache.synapse.aspects.flow.statistics.publishing.PublishingPayload in project wso2-synapse by wso2.
the class TracingDataCollectionHelper method createPublishingFlow.
public static PublishingFlow createPublishingFlow(List<StatisticsLog> messageFlowLogs) {
// Data structure using to serialize thr statistic data while publishing.
PublishingFlow publishingFlow = new PublishingFlow();
// Payload map which contains all the payloads of the message flow.
Map<String, PublishingPayload> payloadMap = new HashMap<>();
// Constants
final String REFER = "#REFER:";
final String BEFORE = "before-";
final String AFTER = "after-";
// 8th attribute setting @PublishingEvent
final Integer BEFORE_PAYLOAD = 8;
// 9th attribute setting @PublishingEvent
final Integer AFTER_PAYLOAD = 9;
String entryPoint = messageFlowLogs.get(0).getComponentName();
String flowId = messageFlowLogs.get(0).getMessageFlowId();
Integer entrypointHashcode = messageFlowLogs.get(0).getHashCode();
boolean isTracingEnabledForFlow = messageFlowLogs.get(0).isTracingEnabled();
for (int index = 0; index < messageFlowLogs.size(); index++) {
StatisticsLog currentStatLog = messageFlowLogs.get(index);
if (currentStatLog == null) {
continue;
}
// Add each event to Publishing Flow
publishingFlow.addEvent(new PublishingEvent(flowId, index, currentStatLog, entryPoint, entrypointHashcode));
// Skip the rest of things, if message tracing is disabled
if (!RuntimeStatisticCollector.isCollectingPayloads()) {
continue;
}
// Skip flow is tracing is not enabled for the flow (from UI)
if (!isTracingEnabledForFlow) {
continue;
}
// Update children's immediateParent index
List<Integer> childrenOfCurrent = currentStatLog.getChildren();
for (Integer child : childrenOfCurrent) {
messageFlowLogs.get(child).setImmediateParent(currentStatLog.getCurrentIndex());
}
if (currentStatLog.getBeforePayload() != null && currentStatLog.getAfterPayload() == null) {
currentStatLog.setAfterPayload(currentStatLog.getBeforePayload());
}
if (currentStatLog.getBeforePayload() == null) {
int parentIndex = currentStatLog.getImmediateParent();
StatisticsLog parentStatLog = messageFlowLogs.get(parentIndex);
if (parentStatLog.getAfterPayload().startsWith(REFER)) {
// Parent also referring to after-payload
currentStatLog.setBeforePayload(parentStatLog.getAfterPayload());
currentStatLog.setAfterPayload(parentStatLog.getAfterPayload());
String referringIndex = parentStatLog.getAfterPayload().split(":")[1];
payloadMap.get(AFTER + referringIndex).addEvent(new PublishingPayloadEvent(index, BEFORE_PAYLOAD));
payloadMap.get(AFTER + referringIndex).addEvent(new PublishingPayloadEvent(index, AFTER_PAYLOAD));
} else {
// Create a new after-payload reference
currentStatLog.setBeforePayload(REFER + parentIndex);
currentStatLog.setAfterPayload(REFER + parentIndex);
payloadMap.get(AFTER + parentIndex).addEvent(new PublishingPayloadEvent(index, BEFORE_PAYLOAD));
payloadMap.get(AFTER + parentIndex).addEvent(new PublishingPayloadEvent(index, AFTER_PAYLOAD));
}
} else {
// For content altering components
PublishingPayload publishingPayloadBefore = new PublishingPayload();
publishingPayloadBefore.setPayload(currentStatLog.getBeforePayload());
publishingPayloadBefore.addEvent(new PublishingPayloadEvent(index, BEFORE_PAYLOAD));
payloadMap.put(BEFORE + index, publishingPayloadBefore);
PublishingPayload publishingPayloadAfter = new PublishingPayload();
publishingPayloadAfter.setPayload(currentStatLog.getAfterPayload());
publishingPayloadAfter.addEvent(new PublishingPayloadEvent(index, AFTER_PAYLOAD));
payloadMap.put(AFTER + index, publishingPayloadAfter);
}
}
publishingFlow.setMessageFlowId(flowId);
// Move all payloads to publishingFlow object
publishingFlow.setPayloads(payloadMap.values());
return publishingFlow;
}
Aggregations