/**
* (C) Copyright 2013 Jabylon (http://www.jabylon.org) 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
*/
/**
*
*/
package org.jabylon.log.viewer.pages;
import java.io.File;
import java.util.AbstractList;
import java.util.Deque;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.PriorityHeaderItem;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.link.DownloadLink;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.time.Duration;
import org.jabylon.log.viewer.pages.util.CircularDeque;
import org.jabylon.log.viewer.pages.util.LogAccess;
import org.jabylon.log.viewer.pages.util.LogAccess.LogLevel;
import org.jabylon.log.viewer.pages.util.LogTail;
import org.jabylon.rest.ui.security.RestrictedComponent;
import org.jabylon.rest.ui.wicket.JabylonApplication;
import org.jabylon.rest.ui.wicket.pages.GenericPage;
import org.jabylon.security.CommonPermissions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Johannes Utzig (jutzig.dev@googlemail.com)
*
*/
public class LogViewerPage extends GenericPage<String> implements RestrictedComponent{
private static final long serialVersionUID = 1L;
private static final Logger LOG = LoggerFactory.getLogger(LogViewerPage.class);
private LogTail logTail;
private IModel<String> logcontent;
public LogViewerPage(PageParameters parameters) {
super(parameters);
}
@Override
protected void construct() {
super.construct();
final TextArea<String> nextLog = new TextArea<String>("nextLog", logcontent);
add(nextLog);
nextLog.setOutputMarkupId(true);
nextLog.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(1)) {
private static final long serialVersionUID = 4831467550166004945L;
@Override
protected void onPostProcessTarget(AjaxRequestTarget target) {
super.onPostProcessTarget(target);
String chunk = readChunk(40);
if(chunk==null)
chunk = "";
logcontent.setObject(chunk);
target.appendJavaScript("updateLog();");
target.add(nextLog);
}
});
final DropDownChoice<LogLevel> logLevel = new DropDownChoice<LogLevel>("loglevel", new EnumSetList(), new LogLevelRenderer());
logLevel.setModel(Model.of(LogAccess.get().getLogLevel()));
logLevel.add(new AjaxFormComponentUpdatingBehavior("onchange") {
private static final long serialVersionUID = -4582780686636922915L;
protected void onUpdate(AjaxRequestTarget target) {
LogAccess.get().setLogLevel(logLevel.getModelObject());
}
});
add(logLevel);
File logFile = new File(LogAccess.get().getLogFiles().get(0).getLocation());
add(new DownloadLink("dowloadLog", logFile));
}
@Override
public void renderHead(IHeaderResponse response) {
response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(JabylonApplication.get().getJavaScriptLibrarySettings().getJQueryReference())));
response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forUrl("/bootstrap/js/bootstrap.min.js")));
super.renderHead(response);
}
private String readChunk(int lines) {
Deque<String> buffer = new CircularDeque<String>(lines);
logTail.nextChunk(lines, buffer);
StringBuilder result = new StringBuilder();
for (String string : buffer) {
result.append(string);
result.append("\r\n");
}
return result.toString();
}
@Override
protected IModel<String> createModel(PageParameters params) {
try {
logTail = new LogTail(LogAccess.get().getLogFiles().get(0).getLocation());
String content = readChunk(20);
logcontent = Model.of(content);
} catch (RuntimeException e) {
logcontent = Model.of(e.getMessage());
LOG.error("Failed to create LogTail",e);
}
return logcontent;
}
@Override
public String getRequiredPermission() {
return CommonPermissions.WORKSPACE_CONFIG;
}
}
class LogLevelRenderer implements IChoiceRenderer<LogLevel> {
private static final long serialVersionUID = 5412202409908394630L;
@Override
public Object getDisplayValue(LogLevel object) {
return object.toString();
}
@Override
public String getIdValue(LogLevel object, int index) {
return object.toString();
}
}
class EnumSetList extends AbstractList<LogLevel> {
@Override
public LogLevel get(int index) {
return LogLevel.values()[index];
}
@Override
public int size() {
return LogLevel.values().length;
}
}