package cz.cuni.mff.d3s.been.web.pages;
import java.util.*;
import org.apache.tapestry5.Block;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
import org.apache.tapestry5.services.ajax.JavaScriptCallback;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
import org.got5.tapestry5.jquery.ImportJQueryUI;
import cz.cuni.mff.d3s.been.core.ri.FilesystemSample;
import cz.cuni.mff.d3s.been.core.ri.NetworkSample;
import cz.cuni.mff.d3s.been.core.ri.RuntimeInfo;
import cz.cuni.mff.d3s.been.core.task.TaskEntry;
import cz.cuni.mff.d3s.been.core.task.TaskExclusivity;
import cz.cuni.mff.d3s.been.core.task.TaskState;
import cz.cuni.mff.d3s.been.web.components.Layout;
import cz.cuni.mff.d3s.been.web.services.LiveFeedService;
/**
* User: donarus Date: 4/22/13 Time: 12:25 PM
*/
@Page.Navigation(section = Layout.Section.OVERVIEW)
@ImportJQueryUI
@Import(library = { "context:js/jquery.flot.min.js", "context:js/overview.js" })
public class Overview extends Page {
@Inject
private AjaxResponseRenderer ajaxResponseRenderer;
@Inject
private LiveFeedService logFeed;
@Inject
private Block runtimesBlock;
@Property
private Collection<RuntimeInfo> runtimes;
@Property
private RuntimeInfo runtime;
@Inject
private Block tasksBlock;
@Property
private ArrayList<ArrayList<TaskEntry>> contexts;
@Property
private ArrayList<TaskEntry> context;
@Property
private TaskEntry task;
@Property
private int taskIndex;
private static String contextPath;
@Inject
private Request request;
public Object onActivate() {
if (contextPath == null) {
contextPath = request.getContextPath();
if (contextPath.endsWith("/") || contextPath.endsWith("\\")) {
contextPath = contextPath.substring(0, contextPath.length() - 1);
}
}
return super.onActivate();
}
public Block onRuntimesUpdated(final Collection<RuntimeInfo> message) {
runtimes = message;
ajaxResponseRenderer.addCallback(new JavaScriptCallback() {
public void run(JavaScriptSupport jss) {
for (RuntimeInfo ri : runtimes) {
long netBytes = 0;
long fsBytes = 0;
for (NetworkSample iface : ri.getMonitorSample().getInterfaces()) {
netBytes += iface.getBytesOut() + iface.getBytesIn();
}
for (FilesystemSample fs : ri.getMonitorSample().getFilesystems()) {
fsBytes += fs.getWriteBytes() + fs.getReadBytes();
}
jss.addScript(
"addPlotPoint('%s', '%s', '%s', '%s', '%s', '%s', '%s')",
ri.getId(),
new Date().getTime(),
ri.getMonitorSample().getCpuUsage() * 100,
ri.getMonitorSample().getFreeMemory(),
ri.getMonitorSample().getLoadAverage().getLoad1(),
netBytes,
fsBytes);
}
}
});
return runtimesBlock;
}
public Block onTasksUpdated(final Collection<TaskEntry> message) {
ArrayList<TaskEntry> taskEntries = new ArrayList<>(message);
Collections.sort(taskEntries, new Comparator<TaskEntry>() {
@Override
public int compare(TaskEntry o1, TaskEntry o2) {
int order = o1.getTaskContextId().compareTo(o2.getTaskContextId());
if (order == 0)
order = o1.getId().compareTo(o2.getId());
return order;
}
});
Map<String, ArrayList<TaskEntry>> tasksByContexts = new LinkedHashMap<>();
for (TaskEntry taskEntry : taskEntries) {
if (taskEntry.getState() == TaskState.FINISHED) {
continue;
}
String contextId = taskEntry.getTaskContextId();
if (!tasksByContexts.containsKey(contextId))
tasksByContexts.put(contextId, new ArrayList<TaskEntry>());
tasksByContexts.get(contextId).add(taskEntry);
}
this.contexts = new ArrayList<>(tasksByContexts.values());
return tasksBlock;
}
public void onLogsUpdated(final String log) {
ajaxResponseRenderer.addCallback(new JavaScriptCallback() {
public void run(JavaScriptSupport jss) {
jss.addScript("addLog(%s)", log);
}
});
}
public boolean getAreThereAnyTasks() {
return contexts.size() > 0;
}
public boolean isFirstInContext() {
return taskIndex == 0;
}
public boolean isRuntimeFullExclusive() {
return TaskExclusivity.valueOf(runtime.getExclusivity()) == TaskExclusivity.EXCLUSIVE;
}
public boolean isRuntimeContextExclusive() {
return TaskExclusivity.valueOf(runtime.getExclusivity()) == TaskExclusivity.CONTEXT_EXCLUSIVE;
}
public String getContextDetailLink(String contextId) {
return contextPath + "/context/detail/" + contextId;
}
public String getTaskDetailLink(String taskId) {
return contextPath + "/task/detail/" + taskId;
}
public String getBenchmarkDetailLink(String benchmarkId) {
return contextPath + "/benchmark/detail/" + benchmarkId;
}
public String getRuntimeDetailLink(String runtimeId) {
return contextPath + "/runtime/detail/" + runtimeId;
}
}