blob: 59ce19d5716b91c199380b1020176b218a257c67 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.core.rest.admin;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.UUID;
import org.apache.commons.lang.time.DurationFormatUtils;
import org.eclipse.skalli.commons.FormatUtils;
import org.eclipse.skalli.commons.Statistics;
import org.eclipse.skalli.commons.Statistics.SearchInfo;
import org.eclipse.skalli.commons.Statistics.StatisticsInfo;
import org.eclipse.skalli.commons.Statistics.UsageInfo;
import org.eclipse.skalli.commons.Statistics.UserInfo;
import org.eclipse.skalli.model.Member;
import org.eclipse.skalli.model.Project;
import org.eclipse.skalli.services.entity.EntityServices;
import org.eclipse.skalli.services.extension.rest.RestConverterBase;
import org.eclipse.skalli.services.extension.rest.RestUtils;
import org.eclipse.skalli.services.project.ProjectService;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
class StatisticsConverter extends RestConverterBase<Statistics> {
public static final String API_VERSION = "1.0"; //$NON-NLS-1$
public static final String NAMESPACE = "http://www.eclipse.org/skalli/2010/API/Admin"; //$NON-NLS-1$
private final BackupQuery query;
public StatisticsConverter(BackupQuery query) {
super(Statistics.class);
this.query = query;
}
@SuppressWarnings("nls")
@Override
protected void marshal(Statistics statistics) throws IOException {
long from = Math.max(statistics.getStartDate(),
query.getFrom() > 0? query.getFrom() : statistics.getStartupTime());
long to = query.getTo() > 0 ? query.getTo() : System.currentTimeMillis();
writer.object("statistics");
namespaces();
apiVersion();
writer
.pair("instance-start", FormatUtils.formatUTCWithMillis(statistics.getStartupTime()))
.pair("instance-uptime", DurationFormatUtils.formatPeriodISO( //$NON-NLS-1$
statistics.getStartupTime(), System.currentTimeMillis()))
.pair("from", FormatUtils.formatUTCWithMillis(from))
.pair("to", FormatUtils.formatUTCWithMillis(to))
.pair("period", DurationFormatUtils.formatPeriodISO(from, to));
ProjectService projectService = ((ProjectService)EntityServices.getByEntityClass(Project.class));
List<UUID> uuids = new ArrayList<UUID>(projectService.keySet());
if (query.showSection("projects")) {
marshalProjectsSection(projectService, uuids, from, to);
}
if (query.showSection("members")) {
marshalMembersSection(projectService, uuids);
}
if (query.showSection("users")) {
marshalUsersSection(statistics, from, to);
}
if (query.showSection("departments")) {
marshalDepartmentsSection(statistics, from, to);
}
if (query.showSection("locations")) {
marshalLocationsSection(statistics, from, to);
}
if (query.showSection("searches")) {
marshalSearchesSection(statistics, from, to);
}
if (query.showSection("browsers")) {
marshalBrowsersSection(statistics, from, to);
}
if (query.showSection("referers")) {
marshalReferersSection(statistics, from, to);
}
if (query.showSection("requests")) {
marshalRequestsSection(statistics, from, to);
}
if (query.showSection("tracks")) {
marshalTracksSection(statistics, from, to);
}
writer.end();
}
@SuppressWarnings("nls")
private void marshalProjectsSection(ProjectService projectService,
List<UUID> uuids, long from, long to) throws IOException {
writer.object("projects");
List<Project> existing = new ArrayList<Project>();
List<Project> newProjects = new ArrayList<Project>();
List<Project> modifiedProjects = new ArrayList<Project>();
for (UUID uuid: uuids) {
Project project = projectService.getByUUID(uuid);
if (project != null) {
if (isBefore(project.getRegistered(), to)) {
existing.add(project);
}
if (isInRange(project.getRegistered(), from, to)) {
newProjects.add(project);
} else if (isInRange(project.getLastModifiedMillis(), from, to)) {
modifiedProjects.add(project);
}
}
}
writer.pair("totalCount", existing.size());
writer.object("created");
writer.pair("totalCount", newProjects.size());
if (query.showByFilter("byDate")) {
writer.array("byDate", "project");
for (Project newProject: newProjects) {
writeProjectInfo(newProject, newProject.getRegistered());
}
writer.end();
}
writer.end();
writer.object("modified");
writer.pair("totalCount", modifiedProjects.size());
if (query.showByFilter("byDate")) {
writer.array("byDate", "project");
for (Project modifiedProject: modifiedProjects) {
writeProjectInfo(modifiedProject, modifiedProject.getLastModifiedMillis());
}
writer.end();
}
writer.end();
writer.end();
}
@SuppressWarnings("nls")
private void marshalMembersSection(ProjectService projectService, List<UUID> uuids) throws IOException {
writer.object("members");
Map<String, SortedSet<Member>> uniqueMembers = collectUniqueMembers(projectService, uuids);
writer.pair("totalCount", countUniqueMembers(uniqueMembers));
if (query.showByFilter("byRole")) {
writer.object("byRole");
for (Entry<String, SortedSet<Member>> entry: uniqueMembers.entrySet()) {
writer.pair(entry.getKey(), entry.getValue().size());
}
writer.end();
}
writer.end();
}
@SuppressWarnings("nls")
private void marshalUsersSection(Statistics statistics, long from, long to) throws IOException {
writer.object("users");
Map<String,Long> users = statistics.getUserCount(from, to);
writeUniqueCount(users);
writeTotalCount(users);
if (query.showByFilter("byCount")) {
writer.array("byCount", "user");
writeCounts(users);
writer.end();
}
if (query.showByFilter("byDate")) {
writer.key("byDate").array();
SortedSet<Statistics.UserInfo> userInfos = statistics.getUserInfo();
for (Statistics.UserInfo userInfo: userInfos) {
if (userInfo.inRange(from, to)) {
writeInfoEntry(userInfo);
}
}
writer.end();
}
writer.end();
}
@SuppressWarnings("nls")
private void marshalDepartmentsSection(Statistics statistics, long from, long to) throws IOException {
writer.object("departments");
Map<String,Long> departments = statistics.getDepartmentCount(from, to);
writeUniqueCount(departments);
writeTotalCount(departments);
if (query.showByFilter("byCount")) {
writer.array("byCount", "department");
writeCounts(departments);
writer.end();
}
writer.end();
}
@SuppressWarnings("nls")
private void marshalLocationsSection(Statistics statistics, long from, long to) throws IOException {
writer.object("locations");
Map<String,Long> locations = statistics.getLocationCount(from, to);
writeUniqueCount(locations);
writeTotalCount(locations);
if (query.showByFilter("byCount")) {
writer.array("byCount", "location");
writeCounts(locations);
writer.end();
}
writer.end();
}
@SuppressWarnings("nls")
private void marshalSearchesSection(Statistics statistics, long from, long to) throws IOException {
writer.object("searches");
Map<String,Long> searches = statistics.getSearchCount(from, to);
writeUniqueCount( searches);
writeTotalCount(searches);
if (query.showByFilter("byCount")) {
writer.array("byCount", "search");
writeCounts(searches);
writer.end();
}
if (query.showByFilter("byDate")) {
writer.key("byDate").array();
SortedSet<Statistics.SearchInfo> searchInfos = statistics.getSearchInfo();
for (Statistics.SearchInfo searchInfo: searchInfos) {
if (searchInfo.inRange(from, to)) {
writeInfoEntry(searchInfo);
}
}
writer.end();
}
writer.end();
}
@SuppressWarnings("nls")
private void marshalBrowsersSection(Statistics statistics, long from, long to) throws IOException {
writer.object("browsers");
Map<String,Long> browsers = statistics.getBrowserCount(from, to);
writeUniqueCount(browsers);
writeTotalCount(browsers);
if (query.showByFilter("byCount")) {
writer.array("byCount", "browser");
writeCounts(browsers);
writer.end();
}
writer.end();
}
@SuppressWarnings("nls")
private void marshalReferersSection(Statistics statistics, long from, long to) throws IOException {
writer.object("referers");
Map<String,Long> referers = statistics.getRefererCount(from, to);
writeUniqueCount(referers);
writeTotalCount(referers);
if (query.showByFilter("byCount")) {
writer.array("byCount", "referer");
writeCounts(referers);
writer.end();
}
writer.end();
}
@SuppressWarnings("nls")
private void marshalRequestsSection(Statistics statistics, long from, long to) throws IOException {
Map<String,Long> avgResponseTimes = statistics.getAverageResponseTimes(from, to);
writer.object("requests");
Map<String,Long> usages = statistics.getUsageCount(from, to);
writeUniqueCount(usages);
writeTotalCount(usages);
if (query.showByFilter("byCount")) {
writer.array("byCount", "request");
writeRequestCounts(usages, avgResponseTimes);
writer.end();
}
if (query.showByFilter("byAvgResponseTime")) {
writer.array("byAvgResponseTime", "request");
writeAverageResponseTimes(avgResponseTimes);
writer.end();
}
if (query.showByFilter("byDate")) {
writer.key("byDate").array();
for (UsageInfo usageInfo: statistics.getUsageInfo()) {
if (usageInfo.inRange(from, to)) {
writeInfoEntry(usageInfo);
}
}
writer.end();
}
writer.end();
}
@SuppressWarnings("nls")
private void marshalTracksSection(Statistics statistics, long from, long to) throws IOException {
writer.array("tracks", "track");
Map<String, SortedSet<StatisticsInfo>> tracks = statistics.getUsageTracks(from, to);
for (Entry<String, SortedSet<StatisticsInfo>> entries: tracks.entrySet()) {
writer.object();
SortedSet<StatisticsInfo> track = entries.getValue();
writer.pair("user", entries.getKey());
writer.array();
for (StatisticsInfo info: track) {
if (info.inRange(from, to)) {
writeInfoEntry(info);
}
}
writer.end();
writer.end();
}
writer.end();
}
@SuppressWarnings("nls")
void writeCounts(Map<String,Long> entries) throws IOException {
for (Entry<String, Long> entry : entries.entrySet()) {
writer
.object()
.attribute("count", entry.getValue())
.value(entry.getKey())
.end();
}
}
@SuppressWarnings("nls")
void writeRequestCounts(Map<String,Long> requests, Map<String,Long> avgResponseTimes) throws IOException {
for (Entry<String, Long> request : requests.entrySet()) {
Long avgResponseTime = avgResponseTimes.get(request.getKey());
writer.object();
writer.attribute("count", request.getValue());
if (avgResponseTime != null) {
writer.attribute("avgResponseTime", avgResponseTime);
}
writer.value(request.getKey());
writer.end();
}
}
@SuppressWarnings("nls")
void writeAverageResponseTimes(Map<String,Long> avgResponseTimes) throws IOException {
for (Entry<String, Long> entry : avgResponseTimes.entrySet()) {
writer
.object()
.attribute("avgResponseTime", entry.getValue())
.value(entry.getKey())
.end();
}
}
@SuppressWarnings("nls")
void writeProjectInfo(Project project, long timestamp) throws IOException {
writer
.object()
.attribute("date", FormatUtils.formatUTCWithMillis(timestamp))
.attribute("timestamp", timestamp)
.pair("uuid", project.getUuid())
.pair("id", project.getProjectId())
.pair("name", project.getName())
.link(PROJECT_RELATION, RestUtils.URL_PROJECTS, project.getUuid())
.link(BROWSE_RELATION, RestUtils.URL_BROWSE, project.getProjectId())
.end();
}
@SuppressWarnings("nls")
void writeInfoEntry(StatisticsInfo info) throws IOException {
if (info instanceof UsageInfo) {
UsageInfo usageInfo = (UsageInfo)info;
writer
.item("request")
.object()
.attribute("type", "usage")
.attribute("date", FormatUtils.formatUTCWithMillis(usageInfo.getTimestamp()))
.attribute("timestamp", usageInfo.getTimestamp())
.attribute("user", usageInfo.getUserHash());
if (usageInfo.getReferer() != null) {
writer.attribute("referer", usageInfo.getReferer());
}
writer.value(usageInfo.getPath())
.end()
.end();
} else if (info instanceof SearchInfo) {
SearchInfo searchInfo = (SearchInfo)info;
writer
.item("search")
.object()
.attribute("type", "search")
.attribute("date", FormatUtils.formatUTCWithMillis(searchInfo.getTimestamp()))
.attribute("timestamp", searchInfo.getTimestamp())
.attribute("user", searchInfo.getUserHash())
.attribute("resultCount", searchInfo.getResultCount())
.attribute("duration", searchInfo.getDuration())
.value(searchInfo.getQueryString())
.end()
.end();
} else if (info instanceof UserInfo) {
UserInfo userInfo = (UserInfo)info;
writer
.item("user")
.object()
.attribute("type", "user")
.attribute("date", FormatUtils.formatUTCWithMillis(userInfo.getTimestamp()))
.attribute("timestamp", userInfo.getTimestamp());
if (userInfo.getDepartment() != null) {
writer.attribute("department", userInfo.getDepartment());
}
if (userInfo.getLocation() != null) {
writer.attribute("location", userInfo.getLocation());
}
writer.value(userInfo.getUserHash())
.end()
.end();
}
}
@SuppressWarnings("nls")
void writeUniqueCount(Map<String,Long> entries) throws IOException {
writer.attribute("uniqueCount", entries.size());
}
@SuppressWarnings("nls")
void writeTotalCount(Map<String,Long> entries) throws IOException {
Iterator<Long> it = entries.values().iterator();
int count = 0;
for (; it.hasNext(); count += it.next()) {
}
writer.attribute("totalCount", count);
}
@Deprecated
public StatisticsConverter(String host, BackupQuery query) {
super(Statistics.class, "statistics", host); //$NON-NLS-1$
this.query = query;
}
@Deprecated
@SuppressWarnings("nls")
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
Statistics statistics = (Statistics) source;
marshalNSAttributes(writer);
marshalApiVersion(writer);
writeNode(writer, "instance-start", FormatUtils.formatUTCWithMillis(statistics.getStartupTime()));
writeNode(writer, "instance-uptime", DurationFormatUtils.formatPeriodISO( //$NON-NLS-1$
statistics.getStartupTime(), System.currentTimeMillis()));
long from = Math.max(statistics.getStartDate(),
query.getFrom() > 0? query.getFrom() : statistics.getStartupTime());
long to = query.getTo() > 0 ? query.getTo() : System.currentTimeMillis();
writeNode(writer, "from", FormatUtils.formatUTCWithMillis(from));
writeNode(writer, "to", FormatUtils.formatUTCWithMillis(to));
writeNode(writer, "period", DurationFormatUtils.formatPeriodISO(from, to));
ProjectService projectService = ((ProjectService)EntityServices.getByEntityClass(Project.class));
List<UUID> uuids = new ArrayList<UUID>(projectService.keySet());
if (query.showSection("projects")) {
marshalProjectsSection(writer, projectService, uuids, from, to);
}
if (query.showSection("members")) {
marshalMembersSection(writer, projectService, uuids);
}
if (query.showSection("users")) {
marshalUsersSection(writer, statistics, from, to);
}
if (query.showSection("departments")) {
marshalDepartmentsSection(writer, statistics, from, to);
}
if (query.showSection("locations")) {
marshalLocationsSection(writer, statistics, from, to);
}
if (query.showSection("searches")) {
marshalSearchesSection(writer, statistics, from, to);
}
if (query.showSection("browsers")) {
marshalBrowsersSection(writer, statistics, from, to);
}
if (query.showSection("referers")) {
marshalReferersSection(writer, statistics, from, to);
}
if (query.showSection("requests")) {
marshalRequestsSection(writer, statistics, from, to);
}
if (query.showSection("tracks")) {
marshalTracksSection(writer, statistics, from, to);
}
}
@Deprecated
@SuppressWarnings("nls")
private void marshalProjectsSection(HierarchicalStreamWriter writer, ProjectService projectService,
List<UUID> uuids, long from, long to) {
writer.startNode("projects");
List<Project> existing = new ArrayList<Project>();
List<Project> newProjects = new ArrayList<Project>();
List<Project> modifiedProjects = new ArrayList<Project>();
for (UUID uuid: uuids) {
Project project = projectService.getByUUID(uuid);
if (project != null) {
if (isBefore(project.getRegistered(), to)) {
existing.add(project);
}
if (isInRange(project.getRegistered(), from, to)) {
newProjects.add(project);
} else if (isInRange(project.getLastModifiedMillis(), from, to)) {
modifiedProjects.add(project);
}
}
}
writeNode(writer, "totalCount", existing.size());
writer.startNode("created");
writeNode(writer, "totalCount", newProjects.size());
if (query.showByFilter("byDate")) {
writer.startNode("byDate");
for (Project newProject: newProjects) {
writeProjectInfo(writer, newProject, newProject.getRegistered());
}
writer.endNode();
}
writer.endNode();
writer.startNode("modified");
writeNode(writer, "totalCount", modifiedProjects.size());
if (query.showByFilter("byDate")) {
writer.startNode("byDate");
for (Project modifiedProject: modifiedProjects) {
writeProjectInfo(writer, modifiedProject, modifiedProject.getLastModifiedMillis());
}
writer.endNode();
}
writer.endNode();
writer.endNode();
}
@Deprecated
@SuppressWarnings("nls")
private void marshalMembersSection(HierarchicalStreamWriter writer, ProjectService projectService,
List<UUID> uuids) {
writer.startNode("members");
Map<String, SortedSet<Member>> uniqueMembers = collectUniqueMembers(projectService, uuids);
writeNode(writer, "totalCount", countUniqueMembers(uniqueMembers));
if (query.showByFilter("byRole")) {
writer.startNode("byRole");
for (Entry<String, SortedSet<Member>> entry: uniqueMembers.entrySet()) {
writeNode(writer, entry.getKey(), entry.getValue().size());
}
writer.endNode();
}
writer.endNode();
}
private Map<String, SortedSet<Member>> collectUniqueMembers(ProjectService projectService, List<UUID> uuids) {
Map<String, SortedSet<Member>> uniqueMembers = new HashMap<String, SortedSet<Member>>();
for (UUID uuid: uuids) {
Map<String, SortedSet<Member>> membersByRole = projectService.getMembersByRole(uuid);
for (Entry<String,SortedSet<Member>> entry: membersByRole.entrySet()) {
SortedSet<Member> members = uniqueMembers.get(entry.getKey());
if (members == null) {
members = new TreeSet<Member>();
uniqueMembers.put(entry.getKey(), members);
}
members.addAll(entry.getValue());
}
}
return uniqueMembers;
}
private int countUniqueMembers(Map<String, SortedSet<Member>> uniqueMembers) {
int count = 0;
for (SortedSet<Member> members: uniqueMembers.values()) {
count += members.size();
}
return count;
}
@Deprecated
@SuppressWarnings("nls")
private void marshalUsersSection(HierarchicalStreamWriter writer, Statistics statistics, long from, long to) {
writer.startNode("users");
Map<String,Long> users = statistics.getUserCount(from, to);
writeUniqueCount(writer, users);
writeTotalCount(writer, users);
if (query.showByFilter("byCount")) {
writer.startNode("byCount");
writeCounts(writer, "user", users);
writer.endNode();
}
if (query.showByFilter("byDate")) {
writer.startNode("byDate");
SortedSet<Statistics.UserInfo> userInfos = statistics.getUserInfo();
for (Statistics.UserInfo userInfo: userInfos) {
if (userInfo.inRange(from, to)) {
writeInfoEntry(writer, userInfo);
}
}
writer.endNode();
}
writer.endNode();
}
@Deprecated
@SuppressWarnings("nls")
private void marshalDepartmentsSection(HierarchicalStreamWriter writer, Statistics statistics, long from, long to) {
writer.startNode("departments");
Map<String,Long> departments = statistics.getDepartmentCount(from, to);
writeUniqueCount(writer, departments);
writeTotalCount(writer, departments);
if (query.showByFilter("byCount")) {
writer.startNode("byCount");
writeCounts(writer, "department", departments);
writer.endNode();
}
writer.endNode();
}
@Deprecated
@SuppressWarnings("nls")
private void marshalLocationsSection(HierarchicalStreamWriter writer, Statistics statistics, long from, long to) {
writer.startNode("locations");
Map<String,Long> locations = statistics.getLocationCount(from, to);
writeUniqueCount(writer, locations);
writeTotalCount(writer, locations);
if (query.showByFilter("byCount")) {
writer.startNode("byCount");
writeCounts(writer, "location", locations);
writer.endNode();
}
writer.endNode();
}
@Deprecated
@SuppressWarnings("nls")
private void marshalSearchesSection(HierarchicalStreamWriter writer, Statistics statistics, long from, long to) {
writer.startNode("searches");
Map<String,Long> searches = statistics.getSearchCount(from, to);
writeUniqueCount(writer, searches);
writeTotalCount(writer, searches);
if (query.showByFilter("byCount")) {
writer.startNode("byCount");
writeCounts(writer, "search", searches);
writer.endNode();
}
if (query.showByFilter("byDate")) {
writer.startNode("byDate");
SortedSet<Statistics.SearchInfo> searchInfos = statistics.getSearchInfo();
for (Statistics.SearchInfo searchInfo: searchInfos) {
if (searchInfo.inRange(from, to)) {
writeInfoEntry(writer, searchInfo);
}
}
writer.endNode();
}
writer.endNode();
}
@Deprecated
@SuppressWarnings("nls")
private void marshalBrowsersSection(HierarchicalStreamWriter writer, Statistics statistics, long from, long to) {
writer.startNode("browsers");
Map<String,Long> browsers = statistics.getBrowserCount(from, to);
writeUniqueCount(writer, browsers);
writeTotalCount(writer, browsers);
if (query.showByFilter("byCount")) {
writer.startNode("byCount");
writeCounts(writer, "browser", browsers);
writer.endNode();
}
writer.endNode();
}
@Deprecated
@SuppressWarnings("nls")
private void marshalReferersSection(HierarchicalStreamWriter writer, Statistics statistics, long from, long to) {
writer.startNode("referers");
Map<String,Long> referers = statistics.getRefererCount(from, to);
writeUniqueCount(writer, referers);
writeTotalCount(writer, referers);
if (query.showByFilter("byCount")) {
writer.startNode("byCount");
writeCounts(writer, "referer", referers);
writer.endNode();
}
writer.endNode();
}
@Deprecated
@SuppressWarnings("nls")
private void marshalRequestsSection(HierarchicalStreamWriter writer, Statistics statistics, long from, long to) {
Map<String,Long> avgResponseTimes = statistics.getAverageResponseTimes(from, to);
writer.startNode("requests");
Map<String,Long> usages = statistics.getUsageCount(from, to);
writeUniqueCount(writer, usages);
writeTotalCount(writer, usages);
if (query.showByFilter("byCount")) {
writer.startNode("byCount");
writeRequestCounts(writer, usages, avgResponseTimes);
writer.endNode();
}
if (query.showByFilter("byAvgResponseTime")) {
writer.startNode("byAvgResponseTime");
writeAverageResponseTimes(writer, avgResponseTimes);
writer.endNode();
}
if (query.showByFilter("byDate")) {
writer.startNode("byDate");
writeRequestInfos(writer, statistics.getUsageInfo(), from, to);
writer.endNode();
}
writer.endNode();
}
@Deprecated
@SuppressWarnings("nls")
private void marshalTracksSection(HierarchicalStreamWriter writer, Statistics statistics, long from, long to) {
writer.startNode("tracks");
Map<String, SortedSet<StatisticsInfo>> tracks = statistics.getUsageTracks(from, to);
for (Entry<String, SortedSet<StatisticsInfo>> entries: tracks.entrySet()) {
writer.startNode("track");
SortedSet<StatisticsInfo> track = entries.getValue();
writeNode(writer, "user", entries.getKey());
for (StatisticsInfo info: track) {
if (info.inRange(from, to)) {
writeInfoEntry(writer, info);
}
}
writer.endNode();
}
writer.endNode();
}
@Deprecated
@SuppressWarnings("nls")
void writeCounts(HierarchicalStreamWriter writer, String nodeName, Map<String,Long> entries) {
for (Entry<String, Long> entry : entries.entrySet()) {
writer.startNode(nodeName);
writer.addAttribute("count", entry.getValue().toString());
writeValue(writer, entry.getKey());
writer.endNode();
}
}
@Deprecated
@SuppressWarnings("nls")
void writeRequestCounts(HierarchicalStreamWriter writer,
Map<String,Long> requests, Map<String,Long> avgResponseTimes) {
for (Entry<String, Long> request : requests.entrySet()) {
writer.startNode("request");
writer.addAttribute("count", request.getValue().toString());
Long avgResponseTime = avgResponseTimes.get(request.getKey());
if (avgResponseTime != null) {
writer.addAttribute("avgResponseTime", Long.toString(avgResponseTime));
}
writeValue(writer, request.getKey());
writer.endNode();
}
}
@Deprecated
@SuppressWarnings("nls")
void writeAverageResponseTimes(HierarchicalStreamWriter writer, Map<String,Long> avgResponseTimes) {
for (Entry<String, Long> entry : avgResponseTimes.entrySet()) {
writer.startNode("request");
writer.addAttribute("avgResponseTime", Long.toString(entry.getValue()) );
writeValue(writer, entry.getKey());
writer.endNode();
}
}
@Deprecated
void writeRequestInfos(HierarchicalStreamWriter writer, SortedSet<UsageInfo> usageInfos, long from, long to) {
for (UsageInfo usageInfo: usageInfos) {
if (usageInfo.inRange(from, to)) {
writeInfoEntry(writer, usageInfo);
}
}
}
@Deprecated
@SuppressWarnings("nls")
void writeProjectInfo(HierarchicalStreamWriter writer, Project project, long timestamp) {
writer.startNode("project");
writer.addAttribute("date", FormatUtils.formatUTCWithMillis(timestamp));
writer.addAttribute("timestamp", Long.toString(timestamp));
UUID uuid = project.getUuid();
writeNode(writer, "uuid", uuid.toString()); //$NON-NLS-1$
writeNode(writer, "id", project.getProjectId()); //$NON-NLS-1$
writeNode(writer, "name", project.getName()); //$NON-NLS-1$
writeProjectLink(writer, PROJECT_RELATION, uuid);
writeLink(writer, BROWSE_RELATION, getHost() + RestUtils.URL_BROWSE + project.getProjectId());
writer.endNode();
}
@Deprecated
@SuppressWarnings("nls")
void writeInfoEntry(HierarchicalStreamWriter writer, StatisticsInfo info) {
if (info instanceof UsageInfo) {
UsageInfo usageInfo = (UsageInfo)info;
writer.startNode("request");
writer.addAttribute("date", FormatUtils.formatUTCWithMillis(usageInfo.getTimestamp()));
writer.addAttribute("timestamp", Long.toString(usageInfo.getTimestamp()));
writer.addAttribute("user", usageInfo.getUserHash());
if (usageInfo.getReferer() != null) {
writer.addAttribute("referer", usageInfo.getReferer());
}
writeValue(writer, usageInfo.getPath());
writer.endNode();
} else if (info instanceof SearchInfo) {
SearchInfo searchInfo = (SearchInfo)info;
writer.startNode("search");
writer.addAttribute("date", FormatUtils.formatUTCWithMillis(searchInfo.getTimestamp()));
writer.addAttribute("timestamp", Long.toString(searchInfo.getTimestamp()));
writer.addAttribute("user", searchInfo.getUserHash());
writer.addAttribute("resultCount", Integer.toString(searchInfo.getResultCount()));
writer.addAttribute("duration", Long.toString(searchInfo.getDuration()));
writeValue(writer, searchInfo.getQueryString());
writer.endNode();
} else if (info instanceof UserInfo) {
UserInfo userInfo = (UserInfo)info;
writer.startNode("user");
writer.addAttribute("date", FormatUtils.formatUTCWithMillis(userInfo.getTimestamp()));
writer.addAttribute("timestamp", Long.toString(userInfo.getTimestamp()));
if (userInfo.getDepartment() != null) {
writer.addAttribute("department", userInfo.getDepartment());
}
if (userInfo.getLocation() != null) {
writer.addAttribute("location", userInfo.getLocation());
}
writeValue(writer, userInfo.getUserHash());
writer.endNode();
}
}
@Deprecated
@SuppressWarnings("nls")
void writeUniqueCount(HierarchicalStreamWriter writer, Map<String,Long> entries) {
writer.addAttribute("uniqueCount", Integer.toString(entries.size()));
}
@Deprecated
@SuppressWarnings("nls")
void writeTotalCount(HierarchicalStreamWriter writer, Map<String,Long> entries) {
Iterator<Long> it = entries.values().iterator();
int count = 0;
for (; it.hasNext(); count += it.next()) {
}
writer.addAttribute("totalCount", Integer.toString(count));
}
@Deprecated
void writeValue(HierarchicalStreamWriter writer, String value) {
writer.setValue(value != null? value : ""); //$NON-NLS-1$
}
private boolean isInRange(long timestamp, long from, long to) {
return (from <= 0 || from <= timestamp) && (to <= 0 || timestamp <= to);
}
private boolean isBefore(long timestamp, long to) {
return to <= 0 || timestamp <= to;
}
@Override
public Object unmarshal(HierarchicalStreamReader arg0, UnmarshallingContext arg1) {
// not supported
return null;
}
@Override
public String getApiVersion() {
return API_VERSION;
}
@Override
public String getNamespace() {
return NAMESPACE;
}
@Override
public String getXsdFileName() {
return "admin-statistics.xsd"; //$NON-NLS-1$
}
}