package com.dianping.cat.report.page.model.dependency;
import java.util.Date;
import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.consumer.dependency.DependencyAnalyzer;
import com.dianping.cat.consumer.dependency.model.entity.DependencyReport;
import com.dianping.cat.consumer.dependency.model.transform.DefaultSaxParser;
import com.dianping.cat.helper.TimeHelper;
import com.dianping.cat.report.page.model.spi.internal.BaseHistoricalModelService;
import com.dianping.cat.report.service.ReportServiceManager;
import com.dianping.cat.service.ModelRequest;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
public class HistoricalDependencyService extends BaseHistoricalModelService<DependencyReport> {
@Inject
private BucketManager m_bucketManager;
@Inject
private ReportServiceManager m_reportService;
public HistoricalDependencyService() {
super(DependencyAnalyzer.ID);
}
@Override
protected DependencyReport buildModel(ModelRequest request) throws Exception {
String domain = request.getDomain();
long date = request.getStartTime();
DependencyReport report;
if (isLocalMode()) {
report = getReportFromLocalDisk(date, domain);
} else {
report = getReportFromDatabase(date, domain);
}
return report;
}
private DependencyReport getReportFromDatabase(long timestamp, String domain) throws Exception {
return m_reportService
.queryDependencyReport(domain, new Date(timestamp), new Date(timestamp + TimeHelper.ONE_HOUR));
}
private DependencyReport getReportFromLocalDisk(long timestamp, String domain) throws Exception {
Bucket<String> bucket = null;
try {
bucket = m_bucketManager.getReportBucket(timestamp, DependencyAnalyzer.ID);
String xml = bucket.findById(domain);
return xml == null ? null : DefaultSaxParser.parse(xml);
} finally {
if (bucket != null) {
m_bucketManager.closeBucket(bucket);
}
}
}
}