package de.flower.rmt.ui.app;
import de.flower.common.ui.serialize.ISerializerListener;
import de.flower.common.ui.serialize.SerializerWrapper;
import org.apache.wicket.RuntimeConfigurationType;
import org.apache.wicket.Session;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Response;
import org.apache.wicket.serialize.ISerializer;
import org.apache.wicket.settings.IExceptionSettings;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Locale;
@Component(value = "wicketApplication")
public class RMTApplication extends WebApplication {
private final static Logger log = LoggerFactory.getLogger(RMTApplication.class);
/** Arbitrary status code for page expired pages. Required to detect ajax-error in CalendarPanel. */
public static final int PAGE_EXPIRED_STATUS_CODE = 666;
@Autowired
private ISerializerListener pageSerializationValidatorListener;
@Autowired
private IPageResolver pageResolver;
@Autowired
private IBookmarkManager bookmarkManager;
public static RMTApplication get() {
return (RMTApplication) WebApplication.get();
}
public RMTApplication() {
}
protected RMTApplication(IPageResolver pageResolver, IBookmarkManager bookmarkManager) {
this.pageResolver = pageResolver;
this.bookmarkManager = bookmarkManager;
}
@Override
protected void init() {
log.info("***********************************************************************************");
log.info("*** Version " + Version.VERSION);
log.info("***********************************************************************************");
super.init();
Locale.setDefault(Locale.GERMANY);
// add support for @SpringBean
getComponentInstantiationListeners().add(getSpringComponentInjector());
// google maps have problems when wicket tags are rendered in development mode, so strip those tags
getMarkupSettings().setStripWicketTags(true);
// don't use <em>link</em> when disabling links.
getMarkupSettings().setDefaultBeforeDisabledLink(null);
getMarkupSettings().setDefaultAfterDisabledLink(null);
// wicket tries to survive session timeout by recreating the original page. but that leads to strange behavior
// when clicking links as nothing happens (only current page is refreshed).
getPageSettings().setRecreateMountedPagesAfterExpiry(false);
if (usesDevelopmentConfig()) {
// enable debug bar
getDebugSettings().setDevelopmentUtilitiesEnabled(true);
getDebugSettings().setOutputComponentPath(true);
getDebugSettings().setOutputMarkupContainerClassName(true);
getRequestLoggerSettings().setRequestLoggerEnabled(true);
// getComponentInstantiationListeners().add(new RenderPerformanceListener());
initSerializer();
}
bookmarkManager.initBookmarkablePages(this);
initErrorPages();
}
/**
* Adds a listener that analyses and logs the serialized pages to find out
* if unwanted objects (e.g. domain objects) are serialized.
*/
private void initSerializer() {
final ISerializer serializer = getFrameworkSettings().getSerializer();
SerializerWrapper wrapper = new SerializerWrapper(serializer);
wrapper.addListener(pageSerializationValidatorListener);
getFrameworkSettings().setSerializer(wrapper);
}
protected SpringComponentInjector getSpringComponentInjector() {
return new SpringComponentInjector(this);
}
private void initErrorPages() {
// same url as in web.xml
mountPage("error/404", pageResolver.getPageNotFoundPage());
mountPage("error/500", pageResolver.getInternalErrorPage());
getRequestCycleListeners().add(new ExceptionRequestCycleListener());
getApplicationSettings().setInternalErrorPage(pageResolver.getInternalErrorPage());
getExceptionSettings().setUnexpectedExceptionDisplay(IExceptionSettings.SHOW_INTERNAL_ERROR_PAGE);
// access denied is not handled by wicket. spring security will redirect request to this url
mountPage("error/403", pageResolver.getAccessDeniedPage());
// mountPage("error/" + PageExpiredPage.SC, pageResolver.getPageExpiredPage());
getApplicationSettings().setPageExpiredErrorPage(pageResolver.getPageExpiredPage());
}
@Override
public Class getHomePage() {
return pageResolver.getHomePage();
}
@Override
public Session newSession(final Request request, final Response response) {
return new RMTSession(request);
}
/**
* Output to log instead of System.err.
*/
@Override
protected void outputDevelopmentModeWarning() {
log.warn("\n********************************************************************\n"
+ "*** WARNING: Wicket is running in DEVELOPMENT mode. ***\n"
+ "*** ^^^^^^^^^^^ ***\n"
+ "*** Do NOT deploy to your live server(s) without changing this. ***\n"
+ "*** See Application#getConfigurationType() for more information. ***\n"
+ "********************************************************************\n");
}
@Value("${wicket.configurationtype}")
public void setRuntimeConfigurationType(final RuntimeConfigurationType runtimeConfigurationType) {
setConfigurationType(runtimeConfigurationType);
}
}