/*
* Copyright 2012
* Ubiquitous Knowledge Processing (UKP) Lab and FG Language Technology
* Technische Universität Darmstadt
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.tudarmstadt.ukp.clarin.webanno.ui.core;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.Page;
import org.apache.wicket.RuntimeConfigurationType;
import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication;
import org.apache.wicket.authroles.authentication.AuthenticatedWebSession;
import org.apache.wicket.devutils.stateless.StatelessChecker;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.request.cycle.AbstractRequestCycleListener;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.apache.wicket.request.resource.SharedResourceReference;
import org.apache.wicket.resource.DynamicJQueryResourceReference;
import org.apache.wicket.resource.loader.IStringResourceLoader;
import org.apache.wicket.resource.loader.NestedStringResourceLoader;
import org.apache.wicket.settings.ExceptionSettings;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.slf4j.MDC;
import org.springframework.context.ApplicationContext;
import org.wicketstuff.annotation.scan.AnnotatedMountScanner;
import de.tudarmstadt.ukp.clarin.webanno.api.DocumentService;
import de.tudarmstadt.ukp.clarin.webanno.security.SpringAuthenticatedWebSession;
import de.tudarmstadt.ukp.clarin.webanno.support.ApplicationContextProvider;
import de.tudarmstadt.ukp.clarin.webanno.support.FileSystemResource;
import de.tudarmstadt.ukp.clarin.webanno.support.SettingsUtil;
import de.tudarmstadt.ukp.clarin.webanno.support.logging.Logging;
import de.tudarmstadt.ukp.clarin.webanno.ui.core.login.LoginPage;
import de.tudarmstadt.ukp.clarin.webanno.ui.core.menu.page.MainMenuPage;
/**
* The Wicket application class. Sets up pages, authentication, theme, and other application-wide
* configuration.
*/
public abstract class WicketApplicationBase
extends AuthenticatedWebApplication
{
protected boolean isInitialized = false;
@Override
protected void init()
{
super.init();
initSpring();
initStatelessChecker();
if (!isInitialized) {
initOnce();
isInitialized = true;
}
}
protected void initOnce()
{
// Allow nested string resource resolving using "#(key)"
initNestedStringResourceLoader();
// // This should avoid some application-reloading while working on I18N
// getResourceSettings().setThrowExceptionOnMissingResource(false);
// getResourceSettings().setCachingStrategy(new NoOpResourceCachingStrategy());
// Enable dynamic switching between JQuery 1 and JQuery 2 based on the browser
// identification.
initDynamicJQueryResourceReference();
initDefaultPageMounts();
initLogoReference();
// Display stack trace instead of internal error
initShowExceptionPage();
initMDCLifecycle();
}
protected void initMDCLifecycle()
{
getRequestCycleListeners().add(new AbstractRequestCycleListener()
{
@Override
public void onBeginRequest(RequestCycle cycle)
{
ApplicationContext ctx = ApplicationContextProvider.getApplicationContext();
DocumentService repo = ctx.getBean(DocumentService.class);
MDC.put(Logging.KEY_REPOSITORY_PATH, repo.getDir().getAbsolutePath());
};
@Override
public void onEndRequest(RequestCycle cycle)
{
MDC.remove(Logging.KEY_REPOSITORY_PATH);
};
});
}
protected void initShowExceptionPage()
{
Properties settings = SettingsUtil.getSettings();
if ("true".equalsIgnoreCase(settings.getProperty("debug.showExceptionPage"))) {
getExceptionSettings().setUnexpectedExceptionDisplay(
ExceptionSettings.SHOW_EXCEPTION_PAGE);
}
}
protected void initLogoReference()
{
Properties settings = SettingsUtil.getSettings();
String logoValue = settings.getProperty(SettingsUtil.CFG_STYLE_LOGO);
if (StringUtils.isNotBlank(logoValue) && new File(logoValue).canRead()) {
getSharedResources().add("logo", new FileSystemResource(new File(logoValue)));
mountResource("/assets/logo.png", new SharedResourceReference("logo"));
}
else {
mountResource("/assets/logo.png", new PackageResourceReference(getLogoLocation()));
}
}
protected String getLogoLocation()
{
return "/de/tudarmstadt/ukp/clarin/webanno/ui/core/logo/logo.png";
}
protected void initDefaultPageMounts()
{
mountPage("/login.html", getSignInPageClass());
mountPage("/welcome.html", getHomePage());
// Mount the other pages via @MountPath annotation on the page classes
new AnnotatedMountScanner().scanPackage("de.tudarmstadt.ukp").mount(this);
}
protected void initDynamicJQueryResourceReference()
{
getJavaScriptLibrarySettings().setJQueryReference(new DynamicJQueryResourceReference());
}
protected void initNestedStringResourceLoader()
{
List<IStringResourceLoader> loaders = new ArrayList<>(
getResourceSettings().getStringResourceLoaders());
NestedStringResourceLoader nestedLoader = new NestedStringResourceLoader(loaders,
Pattern.compile("#\\(([^ ]*?)\\)"));
getResourceSettings().getStringResourceLoaders().clear();
getResourceSettings().getStringResourceLoaders().add(nestedLoader);
}
protected void initStatelessChecker()
{
if (RuntimeConfigurationType.DEVELOPMENT.equals(getConfigurationType())) {
getComponentPostOnBeforeRenderListeners().add(new StatelessChecker());
}
}
protected void initSpring()
{
getComponentInstantiationListeners().add(new SpringComponentInjector(this));
}
/**
* @see org.apache.wicket.Application#getHomePage()
*/
@Override
public Class<? extends Page> getHomePage()
{
return MainMenuPage.class;
}
@Override
public Class<? extends WebPage> getSignInPageClass()
{
return LoginPage.class;
}
@Override
protected Class<? extends AuthenticatedWebSession> getWebSessionClass()
{
return SpringAuthenticatedWebSession.class;
}
}