/*
* Copyright 2014 NAVER Corp.
*
* 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.
*/
package com.navercorp.pinpoint.web.applicationmap.rawdata;
import com.navercorp.pinpoint.common.trace.ServiceType;
import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogram;
import com.navercorp.pinpoint.web.util.TimeWindow;
import com.navercorp.pinpoint.web.vo.LinkKey;
import java.util.*;
/**
* representation of caller/callee relationship
* @author emeroad
*/
public class LinkCallData {
private final String source;
private final ServiceType sourceServiceType;
private final String target;
private final ServiceType targetServiceType;
private final Map<Long, TimeHistogram> targetHistogramTimeMap;
private final TimeWindow timeWindow;
public LinkCallData(LinkKey linkKey) {
this(linkKey, null);
}
public LinkCallData(LinkKey linkKey, TimeWindow timeWindow) {
if (linkKey == null) {
throw new NullPointerException("linkKey must not be null");
}
this.source = linkKey.getFromApplication();
this.sourceServiceType = linkKey.getFromServiceType();
this.target = linkKey.getToApplication();
this.targetServiceType = linkKey.getToServiceType();
this.targetHistogramTimeMap = new HashMap<>();
this.timeWindow = timeWindow;
}
public TimeWindow getTimeWindow() {
return timeWindow;
}
public String getSource() {
return source;
}
public ServiceType getSourceServiceType() {
return sourceServiceType;
}
public String getTarget() {
return target;
}
public ServiceType getTargetServiceType() {
return targetServiceType;
}
public Collection<TimeHistogram> getTimeHistogram() {
return targetHistogramTimeMap.values();
}
public void addCallData(long timestamp, short slot, long count) {
TimeHistogram histogram = getTimeHistogram(timestamp);
histogram.addCallCount(slot, count);
}
public void addCallData(Collection<TimeHistogram> timeHistogramList) {
for (TimeHistogram timeHistogram : timeHistogramList) {
TimeHistogram histogram = getTimeHistogram(timeHistogram.getTimeStamp());
histogram.add(timeHistogram);
}
}
public void addRawCallData(LinkCallData copyLinkCallData) {
if (copyLinkCallData == null) {
throw new NullPointerException("copyLinkCallData must not be null");
}
if (!this.source.equals(copyLinkCallData.source)) {
throw new IllegalArgumentException("source not equals");
}
if (this.sourceServiceType != copyLinkCallData.sourceServiceType) {
throw new IllegalArgumentException("sourceServiceType not equals");
}
if (!this.target.equals(copyLinkCallData.target)) {
throw new IllegalArgumentException("target not equals");
}
if (this.targetServiceType != copyLinkCallData.targetServiceType) {
throw new IllegalArgumentException("targetServiceType not equals");
}
for (Map.Entry<Long, TimeHistogram> copyEntry : copyLinkCallData.targetHistogramTimeMap.entrySet()) {
final Long timeStamp = copyEntry.getKey();
TimeHistogram histogram = getTimeHistogram(timeStamp);
histogram.add(copyEntry.getValue());
}
}
private TimeHistogram getTimeHistogram(Long timeStamp) {
long key = timeWindow != null ? timeWindow.refineTimestamp(timeStamp) : timeStamp;
TimeHistogram histogram = targetHistogramTimeMap.get(key);
if (histogram == null) {
histogram = new TimeHistogram(targetServiceType, key);
targetHistogramTimeMap.put(key, histogram);
}
return histogram;
}
public long getTotalCount() {
long totalCount = 0;
for (TimeHistogram timeHistogram : targetHistogramTimeMap.values()) {
totalCount += timeHistogram.getTotalCount();
}
return totalCount;
}
@Override
public String toString() {
return "LinkCallData{" +
"source='" + source + '\'' +
", sourceServiceType=" + sourceServiceType +
", target='" + target + '\'' +
", targetServiceType=" + targetServiceType +
'}';
}
}