/** * $URL: https://source.sakaiproject.org/svn/sitestats/trunk/sitestats-tool/src/java/org/sakaiproject/sitestats/tool/wicket/SiteStatsApplication.java $ * $Id: SiteStatsApplication.java 105078 2012-02-24 23:00:38Z ottenhoff@longsight.com $ * * Copyright (c) 2006-2009 The Sakai Foundation * * Licensed under the Educational Community 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.opensource.org/licenses/ECL-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 org.sakaiproject.sitestats.tool.wicket; import java.util.Locale; import org.apache.wicket.Component; import org.apache.wicket.IRequestTarget; import org.apache.wicket.Page; import org.apache.wicket.Request; import org.apache.wicket.RequestCycle; import org.apache.wicket.Response; import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.protocol.http.WebRequest; import org.apache.wicket.protocol.http.WebRequestCycle; import org.apache.wicket.protocol.http.WebResponse; import org.apache.wicket.request.RequestParameters; import org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy; import org.apache.wicket.resource.loader.IStringResourceLoader; import org.apache.wicket.settings.IExceptionSettings; import org.apache.wicket.spring.injection.annot.SpringComponentInjector; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.locator.ResourceStreamLocator; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.sitestats.tool.facade.SakaiFacade; import org.sakaiproject.sitestats.tool.wicket.pages.OverviewPage; import org.sakaiproject.util.ResourceLoader; public class SiteStatsApplication extends WebApplication { private boolean debug = false; private transient SakaiFacade facade; protected void init() { super.init(); // Configure general wicket application settings addComponentInstantiationListener(new SpringComponentInjector(this)); getResourceSettings().setThrowExceptionOnMissingResource(false); getMarkupSettings().setStripWicketTags(true); getResourceSettings().addStringResourceLoader(new SiteStatsStringResourceLoader()); getResourceSettings().addResourceFolder("html"); getResourceSettings().setResourceStreamLocator(new SiteStatsResourceStreamLocator()); getDebugSettings().setAjaxDebugModeEnabled(debug); // Home page mountBookmarkablePage("/home", OverviewPage.class); // Prevent bad requests from: url(#default#VML) mount(new PassThroughUrlCodingStrategy("/home/panel/Main/none")); // On wicket session timeout, redirect to main page getApplicationSettings().setPageExpiredErrorPage(OverviewPage.class); getApplicationSettings().setAccessDeniedPage(OverviewPage.class); // Debugging debug = ServerConfigurationService.getBoolean("sitestats.debug", false); if(debug) { getDebugSettings().setComponentUseCheck(true); getDebugSettings().setAjaxDebugModeEnabled(true); getDebugSettings().setLinePreciseReportingOnAddComponentEnabled(true); getDebugSettings().setLinePreciseReportingOnNewComponentEnabled(true); getDebugSettings().setOutputComponentPath(true); getDebugSettings().setOutputMarkupContainerClassName(true); getMarkupSettings().setStripWicketTags(false); getExceptionSettings().setUnexpectedExceptionDisplay(IExceptionSettings.SHOW_EXCEPTION_PAGE); } } @SuppressWarnings("unchecked") public Class getHomePage() { return OverviewPage.class; } public SakaiFacade getFacade() { return facade; } public void setFacade(final SakaiFacade facade) { this.facade = facade; } @Override public RequestCycle newRequestCycle(Request request, Response response) { if(!debug) { return new WebRequestCycle(this, (WebRequest)request, (WebResponse)response) { @Override public Page onRuntimeException(Page page, RuntimeException e) { // Let Sakai ErrorReportHandler (BugReport) handle errors throw e; } }; }else{ return super.newRequestCycle(request, response); } } /** * Custom bundle loader to pickup bundles from sitestats-bundles/ * @author Nuno Fernandes */ private static class SiteStatsStringResourceLoader implements IStringResourceLoader { private ResourceLoader messages = new ResourceLoader("Messages"); private ResourceLoader events = new ResourceLoader("Events"); private ResourceLoader nav = new ResourceLoader("Navigator"); public String loadStringResource(Component component, String key) { String value = null; if(messages.containsKey(key)) { value = messages.getString(key, null); } if(value == null && events.containsKey(key)){ value = events.getString(key, null); } if(value == null && nav.containsKey(key)){ value = nav.getString(key, null); } if(value == null){ value = key; } return value; } public String loadStringResource(Class clazz, String key, Locale locale, String style) { ResourceLoader msgs = new ResourceLoader("Messages"); msgs.setContextLocale(locale); String value = msgs.getString(key, null); if(value == null){ ResourceLoader evnts = new ResourceLoader("Events"); evnts.setContextLocale(locale); value = evnts.getString(key, null); } if(value == null){ ResourceLoader nav = new ResourceLoader("Navigator"); nav.setContextLocale(locale); value = nav.getString(key, null); } if(value == null){ value = key; } return value; } } /** * Custom loader for .html files * @author Nuno Fernandes */ private static class SiteStatsResourceStreamLocator extends ResourceStreamLocator { public SiteStatsResourceStreamLocator() { } public IResourceStream locate(final Class clazz, final String path) { IResourceStream located = super.locate(clazz, trimFolders(path)); if(located != null){ return located; } return super.locate(clazz, path); } private String trimFolders(String path) { String wicketPackage = "/wicket/"; return path.substring(path.lastIndexOf(wicketPackage) + wicketPackage.length()); } } /** Pass-through coding strategy to unmount paths from Wicket */ private class PassThroughUrlCodingStrategy extends AbstractRequestTargetUrlCodingStrategy { public PassThroughUrlCodingStrategy(final String mountPath) { super(mountPath); } public IRequestTarget decode(RequestParameters requestParameters) { return null; } public CharSequence encode(IRequestTarget requestTarget) { return null; } public boolean matches(IRequestTarget requestTarget) { return false; } } }