package org.dcache.webadmin.view.pages.basepage;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxSelfUpdatingTimerBehavior;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.StringHeaderItem;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.time.Duration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.MissingResourceException;
import java.util.concurrent.TimeUnit;
import org.dcache.util.Version;
import org.dcache.webadmin.view.WebAdminInterface;
import org.dcache.webadmin.view.beans.WebAdminInterfaceSession;
import org.dcache.webadmin.view.panels.header.HeaderPanel;
import org.dcache.webadmin.view.panels.navigation.BasicNavigationPanel;
import org.dcache.webadmin.view.panels.userpanel.UserPanel;
/**
* Main Page for all WebAdminInterface Pages
* @author jans
*/
public abstract class BasePage extends WebPage {
private static final long serialVersionUID = 7817347486820155316L;
private static final String META_GENERATOR_TAG =
"<meta name=\"generator\" content=\"dCache v" +
Version.of(Version.class).getVersion() + "\" />";
private static final String META_VERSION_TAG =
"<meta name=\"version\" content=\"" +
Version.of(Version.class).getVersion() + "\" />";
protected final Logger _log = LoggerFactory.getLogger(this.getClass());
private boolean autorefreshEnabled = false;
public BasePage() {
initialize();
}
public BasePage(PageParameters parameters) {
super(parameters);
initialize();
}
/*
* convenience method to access Property-File Stringresources
* since (nearly) every Page will need access to them. When a Resource is
* not found it catches the Exception and returns a String that tells to
* report/fix the missing ressource.
*/
protected String getStringResource(String resourceKey) {
try {
return new StringResourceModel(resourceKey, this, null).getString();
} catch (MissingResourceException e) {
}
return getString(WebAdminInterface.MISSING_RESOURCE_KEY);
}
/*
* convenience method since (nearly) every Page will need the
* session-object to retrive the user
*/
public WebAdminInterfaceSession getWebadminSession() {
return (WebAdminInterfaceSession) getSession();
}
/*
* convenience method since every Page will need the
* application-object to retrive the user
*/
public WebAdminInterface getWebadminApplication() {
return (WebAdminInterface) getApplication();
}
/*
* sets session's timeout for logged users to 30 minutes
* and for unauthenticated users to one day.
*/
private void setTimeout() {
ServletWebRequest webRequest = (ServletWebRequest) getRequest();
if (getWebadminSession().isSignedIn()) {
webRequest.getContainerRequest().getSession().setMaxInactiveInterval(30 * 60);
} else {
webRequest.getContainerRequest().getSession().setMaxInactiveInterval(24 * 60 * 60);
}
}
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(new StringHeaderItem("<!-- wicket " + this.getClass().getSimpleName() + " header BEGIN -->\n"));
renderHeadInternal(response);
response.render(new StringHeaderItem("<!-- wicket " + this.getClass().getSimpleName() + " header END -->\n"));
}
public boolean isAutorefreshEnabled() {
return autorefreshEnabled;
}
public void setAutorefreshEnabled(boolean autorefreshEnabled) {
this.autorefreshEnabled = autorefreshEnabled;
}
/**
* Adapter; additional scripting for this page header
* Each successive subclass should call the super of this method before
* add its own specific rendering.
*/
protected void renderHeadInternal(IHeaderResponse response) {
response.render(JavaScriptHeaderItem.forReference(getApplication()
.getJavaScriptLibrarySettings()
.getJQueryReference()));
response.render(JavaScriptHeaderItem.forUrl("js/infobox.js"));
response.render(JavaScriptHeaderItem.forScript("CLOSURE_NO_DEPS = true;",
"nodeps"));
response.render(StringHeaderItem.forString(META_GENERATOR_TAG));
response.render(StringHeaderItem.forString(META_VERSION_TAG));
}
protected Form<?> getAutoRefreshingForm(String name) {
return getAutoRefreshingForm(name, true);
}
protected Form<?> getAutoRefreshingForm(String name, boolean immediately) {
return getAutoRefreshingForm(name, 1, TimeUnit.MINUTES, immediately);
}
protected Form<?> getAutoRefreshingForm(String name,
long refresh,
TimeUnit unit) {
return getAutoRefreshingForm(name, refresh, unit, true);
}
protected Form<?> getAutoRefreshingForm(String name,
long refresh,
TimeUnit unit,
boolean immediately) {
Form<?> form = new Form<Void>(name);
addAutoRefreshToForm(form, refresh, unit);
autorefreshEnabled = immediately;
return form;
}
protected void addAutoRefreshToForm(Form<?> form,
long refresh,
TimeUnit unit) {
_log.trace("addAutoRefreshToForm to {}", form);
form.add(new AjaxSelfUpdatingTimerBehavior
(Duration.valueOf(unit.toMillis(refresh))) {
private static final long serialVersionUID = 541235165961670681L;
@Override
public void beforeRender(Component component) {
refresh();
}
@Override
protected boolean shouldTrigger() {
_log.trace("checking to see if {} should be triggered", this);
if (!autorefreshEnabled) {
return false;
}
return super.shouldTrigger();
}
});
}
protected void initialize() {
setTimeout();
add(new Label("pageTitle", new ResourceModel("title")));
add(new HeaderPanel("headerPanel"));
add(new UserPanel("userPanel"));
add(new BasicNavigationPanel("navigationPanel", this.getClass()));
}
/**
* Adapter; called by AjaxSelfUpdatedingTimerBehavior instance
*/
protected void refresh() {
}
}