/*
* #%L
* Service Activity Monitoring :: Server
* %%
* Copyright (C) 2011 - 2012 Talend Inc.
* %%
* Licensed 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.
* #L%
*/
package org.talend.esb.sam.server.ui;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import org.talend.esb.sam.common.event.EventTypeEnum;
/**
* A utility class to extract complex methods
* to simplify testing.
*
* @author zubairov
*/
public class UIProviderUtils {
private JsonParser parser = new JsonParser();
private Gson gson = new Gson();
/**
* Aggregate flow details.
*
* @param objects the objects
* @param baseURL the base url
* @return the json array
*/
public JsonArray aggregateFlowDetails(List<JsonObject> objects, String baseURL) {
Map<Long, Map<String, String>> customInfo = new HashMap<Long, Map<String, String>>();
Set<Long> allEvents = new HashSet<Long>();
for (JsonObject obj : objects) {
long eventID = obj.get("id").getAsLong();
allEvents.add(eventID);
String custKey = obj.get("custKey").isJsonNull() ? null : obj.get("custKey").getAsString();
String custValue = obj.get("custValue").isJsonNull() ? null : obj.get("custValue").getAsString();
if (custKey != null) {
if (!customInfo.containsKey(eventID)) {
customInfo.put(eventID, new HashMap<String, String>());
}
customInfo.get(eventID).put(custKey, custValue);
}
}
JsonArray result = new JsonArray();
for (JsonObject obj : objects) {
long eventID = obj.get("id").getAsLong();
if (allEvents.contains(eventID)) {
allEvents.remove(eventID);
JsonObject newObj = copy(obj);
if (customInfo.containsKey(eventID)) {
newObj.add("customInfo", gson.toJsonTree(customInfo.get(eventID)));
}
newObj.remove("custKey");
newObj.remove("custValue");
newObj.add("details", new JsonPrimitive(baseURL + "event/" + newObj.get("id")));
result.add(newObj);
}
}
return result;
}
/**
* Aggregate raw data.
*
* @param objects the objects
* @param baseURL the base url
* @return the json array
*/
public JsonArray aggregateRawData(List<JsonObject> objects, String baseURL) {
// Render RAW data
Map<String, Long> flowLastTimestamp = new HashMap<String, Long>();
Map<String, String> flowProviderIP = new HashMap<String, String>();
Map<String, String> flowProviderHost = new HashMap<String, String>();
Map<String, String> flowConsumerIP = new HashMap<String, String>();
Map<String, String> flowConsumerHost = new HashMap<String, String>();
Map<String, Set<String>> flowTypes = new HashMap<String, Set<String>>();
for (JsonObject obj : objects) {
if (null == obj.get("flowID") || obj.get("flowID").isJsonNull()) {
continue;
}
String flowID = obj.get("flowID").getAsString();
long timestamp = obj.get("timestamp").getAsLong();
flowLastTimestamp.put(flowID, timestamp);
if (!flowTypes.containsKey(flowID)) {
flowTypes.put(flowID, new HashSet<String>());
}
String eventType = obj.get("type").getAsString();
flowTypes.get(flowID).add(eventType);
EventTypeEnum typeEnum = EventTypeEnum.valueOf(eventType);
boolean isConsumer = typeEnum == EventTypeEnum.REQ_OUT || typeEnum == EventTypeEnum.RESP_IN;
boolean isProvider = typeEnum == EventTypeEnum.REQ_IN || typeEnum == EventTypeEnum.RESP_OUT;
String host = obj.get("host").getAsString();
String ip = obj.get("ip").getAsString();
if (isConsumer) {
flowConsumerIP.put(flowID, ip);
flowConsumerHost.put(flowID, host);
}
if (isProvider) {
flowProviderIP.put(flowID, ip);
flowProviderHost.put(flowID, host);
}
}
JsonArray result = new JsonArray();
for (JsonObject obj : objects) {
if (null == obj.get("flowID") || obj.get("flowID").isJsonNull()) {
continue;
}
String flowID = obj.get("flowID").getAsString();
long timestamp = obj.get("timestamp").getAsLong();
Long endTime = flowLastTimestamp.get(flowID);
if (endTime != null) {
flowLastTimestamp.remove(flowID);
JsonObject newObj = copy(obj);
newObj.add("elapsed",
new JsonPrimitive(timestamp - endTime));
newObj.remove("type");
newObj.add("types", gson.toJsonTree(flowTypes.get(flowID)));
newObj.add("details", new JsonPrimitive(baseURL + "flow/"
+ flowID));
newObj.remove("host");
newObj.remove("ip");
if (flowConsumerHost.containsKey(flowID)) {
newObj.add("consumer_host", new JsonPrimitive(flowConsumerHost.get(flowID)));
newObj.add("consumer_ip", new JsonPrimitive(flowConsumerIP.get(flowID)));
}
if (flowProviderHost.containsKey(flowID)) {
newObj.add("provider_host", new JsonPrimitive(flowProviderHost.get(flowID)));
newObj.add("provider_ip", new JsonPrimitive(flowProviderIP.get(flowID)));
}
result.add(newObj);
}
}
return result;
}
/**
* Creates a copy of {@link JsonObject}.
*
* @param obj the JsonObject
* @return the json object
*/
private JsonObject copy(JsonObject obj) {
return (JsonObject) parser.parse(obj.toString());
}
}