package cz.cuni.mff.d3s.been.web.pages;
import static cz.cuni.mff.d3s.been.web.components.Layout.Section;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.text.*;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.PageRenderLinkSource;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
import org.slf4j.Logger;
import cz.cuni.mff.d3s.been.api.BeenApi;
import cz.cuni.mff.d3s.been.api.BeenApiException;
import cz.cuni.mff.d3s.been.api.ClusterConnectionUnavailableException;
import cz.cuni.mff.d3s.been.core.task.*;
import cz.cuni.mff.d3s.been.web.services.BeenApiService;
/**
* User: donarus Date: 4/27/13 Time: 1:05 PM
*/
@Import(library = { "context:js/bootstrap.js" })
public abstract class Page {
@Inject
@Property
protected BeenApiService api;
@Inject
protected Logger log;
@Inject
private PageRenderLinkSource pageRenderLinkSource;
@Environmental
private JavaScriptSupport javaScriptSupport;
public void setupRender() {
javaScriptSupport.addScript("$(document).on('hover', '.show_tooltip', \n" + " function(){\n " + " $(this).tooltip('show');\n" + " $(this).removeClass('show_tooltip');\n" + " });\n");
}
public Section getSection() {
Navigation sectionAnnotation = this.getClass().getAnnotation(Navigation.class);
if (sectionAnnotation != null) {
return sectionAnnotation.section();
}
return null;
}
Object onActivate() {
if (!api.isConnected()) {
log.info("Been Api is not connected. Redirecting to Connect page.");
return Connect.class;
}
return null;
}
/**
* User: donarus Date: 4/28/13 Time: 1:40 PM
*/
@Retention(RetentionPolicy.RUNTIME)
public static @interface Navigation {
public Section section();
}
public String getRuntimeLink(String runtimeId) {
return pageRenderLinkSource.createPageRenderLinkWithContext(
cz.cuni.mff.d3s.been.web.pages.runtime.Detail.class,
runtimeId).toString();
}
/*
Common formatters.
*/
public Format getLoadFormat() {
return new DecimalFormat("#.##");
}
public Format getCpuUsageFormat() {
return new Format() {
@Override
public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
double d = ((double) obj) * 100.0;
return new StringBuffer(String.format("%.1f", d));
}
@Override
public Object parseObject(String source, ParsePosition pos) {
return null;
}
};
}
public Format getIdFormat() {
return new Format() {
@Override
public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
return new StringBuffer(((String) obj).substring(0, 8));
}
@Override
public Object parseObject(String source, ParsePosition pos) {
return null;
}
};
}
public boolean taskRunning(TaskEntry taskEntry) {
return taskEntry.getState() == TaskState.RUNNING;
}
public boolean taskFinished(TaskEntry taskEntry) {
return taskEntry.getState() == TaskState.FINISHED;
}
public boolean taskWaiting(TaskEntry taskEntry) {
return taskEntry.getState() == TaskState.WAITING;
}
public boolean taskBenchmark(TaskEntry taskEntry) {
return taskEntry.getTaskDescriptor().getType() == TaskType.BENCHMARK;
}
public boolean taskDescriptorBenchmark(TaskDescriptor taskDescriptor) {
return taskDescriptor.getType() == TaskType.BENCHMARK;
}
public Date taskLastChanged(TaskEntry taskEntry) {
java.util.List<StateChangeEntry> logEntries = taskEntry.getStateChangeLog().getLogEntries();
if (logEntries.size() == 0)
return null;
StateChangeEntry entry = logEntries.get(0);
if (entry.getTimestamp() == 0)
return null;
return new Date(entry.getTimestamp());
}
public String timestampToString(long timestamp) {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(timestamp));
}
public String dateToString(Date date) {
return new SimpleDateFormat("yyyy-MM-dd").format(date);
}
public String nanotimeToString(long nanotime) {
return timestampToString(TimeUnit.NANOSECONDS.toMillis(nanotime));
}
public String logLevelToString(int logLevel) {
if (logLevel == 1)
return "TRACE";
if (logLevel == 2)
return "DEBUG";
if (logLevel == 3)
return "INFO";
if (logLevel == 4)
return "WARN";
if (logLevel == 5)
return "ERROR";
return Integer.toString(logLevel);
}
// stolen from http://stackoverflow.com/questions/3263892/format-file-size-as-mb-gb-etc
public String bytesReadable(long size) {
if (size <= 0)
return "0";
final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" };
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}
public boolean isSwRepositoryOnline() throws BeenApiException {
return this.api.getApi().isSwRepositoryOnline();
}
protected BeenApi getApi() throws ClusterConnectionUnavailableException {
return this.api.getApi();
}
}