/* * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except * in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.synapse.aspects.flow.statistics.publishing; import org.apache.synapse.aspects.flow.statistics.data.raw.StatisticsLog; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class PublishingEvent { private String flowId; private String componentType; private String componentName; private Integer componentIndex; private String componentId; private long startTime; private long endTime; private long duration; private String beforePayload; private String afterPayload; private Map contextPropertyMap; private Map transportPropertyMap; private Integer[] children; private String entryPoint; private Integer entryPointHashcode; private int faultCount; private Integer hashCode; public PublishingEvent(){} public PublishingEvent(String flowId, int componentIndex, StatisticsLog statisticsLog, String entryPoint, Integer entryPointHashcode) { this.flowId = flowId; this.componentType = statisticsLog.getComponentTypeToString(); this.componentName = statisticsLog.getComponentName(); this.componentIndex = componentIndex; this.componentId = statisticsLog.getComponentId(); this.startTime = statisticsLog.getStartTime(); this.endTime = statisticsLog.getEndTime(); this.duration = this.endTime - this.startTime; this.contextPropertyMap = extractProperties(statisticsLog.getContextPropertyMap()); this.transportPropertyMap = extractProperties(statisticsLog.getTransportPropertyMap()); if (statisticsLog.getChildren().size() > 0) { this.children = new Integer[statisticsLog.getChildren().size()]; this.children = statisticsLog.getChildren().toArray(this.children); } this.entryPoint = entryPoint; this.entryPointHashcode = entryPointHashcode; this.faultCount = statisticsLog.getNoOfFaults(); this.hashCode = statisticsLog.getHashCode(); } public String getFlowId() { return flowId; } public void setFlowId(String flowId) { this.flowId = flowId; } public String getComponentType() { return componentType; } public void setComponentType(String componentType) { this.componentType = componentType; } public String getComponentName() { return componentName; } public void setComponentName(String componentName) { this.componentName = componentName; } public long getStartTime() { return startTime; } public void setStartTime(long startTime) { this.startTime = startTime; } public long getEndTime() { return endTime; } public void setEndTime(long endTime) { this.endTime = endTime; } public long getDuration() { return duration; } public void setDuration(long duration) { this.duration = duration; } public String getBeforePayload() { return beforePayload; } public void setBeforePayload(String beforePayload) { this.beforePayload = beforePayload; } public String getAfterPayload() { return afterPayload; } public void setAfterPayload(String afterPayload) { this.afterPayload = afterPayload; } public Map getContextPropertyMap() { return contextPropertyMap; } public void setContextPropertyMap(Map contextPropertyMap) { this.contextPropertyMap = contextPropertyMap; } public Map getTransportPropertyMap() { return transportPropertyMap; } public void setTransportPropertyMap(Map transportPropertyMap) { this.transportPropertyMap = transportPropertyMap; } public Integer[] getChildren() { return children; } public void setChildren(Integer[] children) { this.children = children; } public String getEntryPoint() { return entryPoint; } public void setEntryPoint(String entryPoint) { this.entryPoint = entryPoint; } public int getFaultCount() { return faultCount; } public void setFaultCount(int faultCount) { this.faultCount = faultCount; } public String getComponentId() { return componentId; } public void setComponentId(String componentId) { this.componentId = componentId; } public Integer getHashCode() { return hashCode; } public void setHashCode(Integer hashCode) { this.hashCode = hashCode; } public Integer getEntryPointHashcode() { return entryPointHashcode; } public void setEntryPointHashcode(Integer entryPointHashcode) { this.entryPointHashcode = entryPointHashcode; } @Override public String toString() { return "Component Type " + componentType + " , Component Name " + componentName; } /** * Need to convert complex objects in properties to string, before converting to JSON */ private Map<String, Object> extractProperties(Map<String, Object> originalMap) { Map<String, Object> copy = new HashMap<String, Object>(); if (originalMap == null) { return null; } for (Map.Entry<String, Object> anEntry : originalMap.entrySet()){ Object entryValue = anEntry.getValue(); // Directly set if it's a known serializable type if (entryValue instanceof String || entryValue instanceof Boolean || entryValue instanceof Integer || entryValue instanceof Double || entryValue instanceof Character) { copy.put(anEntry.getKey(), entryValue); } else { // Else, try to serialize try { copy.put(anEntry.getKey(), anEntry.getValue().toString()); } catch (Exception ignore) { copy.put(anEntry.getKey(), "Value cannot be serialized"); } } } return copy; } public ArrayList<Object> getObjectAsList() { ArrayList<Object> objectList = new ArrayList<Object>(); /** * Important, order of adding to array-list should be preserved * @TracingDataCollectonHelper.createPublishingFlow() also needs to sync with changes here */ objectList.add(this.flowId); objectList.add(this.componentType); objectList.add(this.componentName); objectList.add(this.componentIndex); objectList.add(this.componentId); objectList.add(this.startTime); objectList.add(this.endTime); objectList.add(this.duration); objectList.add(this.beforePayload); objectList.add(this.afterPayload); if (this.contextPropertyMap == null) { objectList.add(null); } else { objectList.add(this.contextPropertyMap.toString()); } if (this.transportPropertyMap == null) { objectList.add(null); } else { objectList.add(this.transportPropertyMap.toString()); } objectList.add(Arrays.toString(this.children)); objectList.add(this.entryPoint); objectList.add(String.valueOf(this.entryPointHashcode)); objectList.add(this.faultCount); objectList.add(String.valueOf(this.hashCode)); return objectList; } }