📄 application.java
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.wicket;import java.io.IOException;import java.io.InputStream;import java.io.Serializable;import java.net.URL;import java.util.ArrayList;import java.util.Collections;import java.util.Enumeration;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Properties;import java.util.Set;import org.apache.wicket.application.IComponentInstantiationListener;import org.apache.wicket.application.IComponentOnAfterRenderListener;import org.apache.wicket.application.IComponentOnBeforeRenderListener;import org.apache.wicket.markup.IMarkupCache;import org.apache.wicket.markup.html.IHeaderContributor;import org.apache.wicket.markup.html.IHeaderResponse;import org.apache.wicket.markup.html.image.resource.DefaultButtonImageResourceFactory;import org.apache.wicket.markup.parser.filter.RelativePathPrefixHandler;import org.apache.wicket.markup.parser.filter.WicketMessageTagHandler;import org.apache.wicket.markup.resolver.AutoComponentResolver;import org.apache.wicket.markup.resolver.BorderBodyResolver;import org.apache.wicket.markup.resolver.EnclosureResolver;import org.apache.wicket.markup.resolver.FragmentResolver;import org.apache.wicket.markup.resolver.HtmlHeaderResolver;import org.apache.wicket.markup.resolver.MarkupInheritanceResolver;import org.apache.wicket.markup.resolver.ParentResolver;import org.apache.wicket.markup.resolver.WicketContainerResolver;import org.apache.wicket.markup.resolver.WicketLinkResolver;import org.apache.wicket.markup.resolver.WicketMessageResolver;import org.apache.wicket.protocol.http.IRequestLogger;import org.apache.wicket.protocol.http.RequestLogger;import org.apache.wicket.session.ISessionStore;import org.apache.wicket.settings.IApplicationSettings;import org.apache.wicket.settings.IDebugSettings;import org.apache.wicket.settings.IExceptionSettings;import org.apache.wicket.settings.IFrameworkSettings;import org.apache.wicket.settings.IMarkupSettings;import org.apache.wicket.settings.IPageSettings;import org.apache.wicket.settings.IRequestCycleSettings;import org.apache.wicket.settings.IRequestLoggerSettings;import org.apache.wicket.settings.IResourceSettings;import org.apache.wicket.settings.ISecuritySettings;import org.apache.wicket.settings.ISessionSettings;import org.apache.wicket.settings.Settings;import org.apache.wicket.util.convert.ConverterLocator;import org.apache.wicket.util.lang.Classes;import org.apache.wicket.util.lang.Objects;import org.apache.wicket.util.lang.PropertyResolver;import org.apache.wicket.util.time.Duration;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * Base class for all Wicket applications. To create a Wicket application, you generally should * <i>not </i> directly subclass this class. Instead, you will want to subclass some subclass of * Application, like WebApplication, which is appropriate for the protocol and markup type you are * working with. * <p> * Application has the following interesting features / attributes: * <ul> * <li><b>Name </b>- The Application's name, which is the same as its class name. * * <li><b>Home Page </b>- The Application's home Page class. Subclasses must override getHomePage() * to provide this property value. * * <li><b>Settings </b>- Application settings are partitioned into sets of related settings using * interfaces in the org.apache.wicket.settings package. These interfaces are returned by the * following methods, which should be used to configure framework settings for your application: * getApplicationSettings(), getDebugSettings(), getExceptionSettings(), getMarkupSettings(), * getPageSettings(), getRequestCycleSettings(), getSecuritySettings and getSessionSettings(). These * settings are configured by default through the constructor or internalInit methods. Default the * application is configured for DEVELOPMENT. You can configure this globally to DEPLOYMENT or * override specific settings by implementing the init() method. * * <li><b>Shared Resources </b>- Resources added to an Application's SharedResources have * application-wide scope and can be referenced using a logical scope and a name with the * ResourceReference class. ResourceReferences can then be used by multiple components in the same * application without additional overhead (beyond the ResourceReference instance held by each * referee) and will yield a stable URL, permitting efficient browser caching of the resource (even * if the resource is dynamically generated). Resources shared in this manner may also be localized. * See {@link org.apache.wicket.ResourceReference} for more details. * * <li><b>Session Factory </b>- The Application subclass WebApplication supplies an implementation * of getSessionFactory() which returns an implementation of ISessionFactory that creates WebSession * Session objects appropriate for web applications. You can (and probably will want to) override * getSessionFactory() to provide your own session factory that creates Session instances of your * own application-specific subclass of WebSession. * * </ul> * * @see org.apache.wicket.protocol.http.WebApplication * @author Jonathan Locke */public abstract class Application{ /** Configuration constant for the 2 types */ public static final String CONFIGURATION = "configuration"; /** * Configuration type constant for getting the context path out of the web.xml */ public static final String CONTEXTPATH = "contextpath"; /** Configuration type constant for deployment */ public static final String DEPLOYMENT = "deployment"; /** Configuration type constant for development */ public static final String DEVELOPMENT = "development"; /** * Applications keyed on the {@link #getApplicationKey()} so that they can be retrieved even * without being in a request/ being set in the thread local (we need that e.g. for when we are * in a destruction thread). */ private static final Map applicationKeyToApplication = new HashMap(1); /** Thread local holder of the application object. */ private static final ThreadLocal current = new ThreadLocal(); /** Log. */ private static final Logger log = LoggerFactory.getLogger(Application.class); /** * Checks if the <code>Application</code> threadlocal is set in this thread * * @return true if {@link Application#get()} can return the instance of application, false * otherwise */ public static boolean exists() { return current.get() != null; } /** * Get Application for current thread. * * @return The current thread's Application */ public static Application get() { final Application application = (Application)current.get(); if (application == null) { throw new WicketRuntimeException("There is no application attached to current thread " + Thread.currentThread().getName()); } return application; } /** * Gets the Application based on the application key of that application. You typically never * have to use this method unless you are working on an integration project. * * @param applicationKey * The unique key of the application within a certain context (e.g. a web * application) * @return The application * @throws IllegalArgumentException * When no application was found with the provided key */ public static Application get(String applicationKey) { Application application = (Application)applicationKeyToApplication.get(applicationKey); return application; } /** * Gets the keys of the currently registered Wicket applications for this web application. You * typically never have to use this method unless you are working on an integration project. * * @return unmodifiable set with keys that correspond with {@link #getApplicationKey()}. Never * null, but possibly empty */ public static Set/* <String> */getApplicationKeys() { return Collections.unmodifiableSet(applicationKeyToApplication.keySet()); } /** * THIS METHOD IS NOT PART OF THE WICKET PUBLIC API. DO NOT USE IT. * * @param application * The current application or null for this thread */ public static void set(final Application application) { if (application == null) { throw new IllegalArgumentException("Argument application can not be null"); } current.set(application); } /** * THIS METHOD IS NOT PART OF THE WICKET PUBLIC API. DO NOT USE IT. */ public static void unset() { current.set(null); } /** list of {@link IComponentInstantiationListener}s. */ private IComponentInstantiationListener[] componentInstantiationListeners = new IComponentInstantiationListener[0]; /** The converter locator instance. */ private IConverterLocator converterLocator; /** list of initializers. */ private final List initializers = new ArrayList(); /** Application level meta data. */ private MetaDataEntry[] metaData; /** Name of application subclass. */ private final String name; /** Request logger instance. */ private IRequestLogger requestLogger; /** The session facade. */ private ISessionStore sessionStore; /** Settings for this application. */ private Settings settings; /** can the settings object be set/used. */ private boolean settingsAccessible; /** Shared resources for this application */ private final SharedResources sharedResources; /** * Constructor. <strong>Use {@link #init()} for any configuration of your application instead of * overriding the constructor.</strong> */ public Application() { // Create name from subclass name = Classes.simpleName(getClass()); // Create shared resources repository sharedResources = new SharedResources(this); // Install default component instantiation listener that uses // authorization strategy to check component instantiations. addComponentInstantiationListener(new IComponentInstantiationListener() { /** * @see org.apache.wicket.application.IComponentInstantiationListener#onInstantiation(org.apache.wicket.Component) */ public void onInstantiation(final Component component) { // If component instantiation is not authorized if (!Session.get().getAuthorizationStrategy().isInstantiationAuthorized( component.getClass())) { // then call any unauthorized component instantiation // listener getSecuritySettings().getUnauthorizedComponentInstantiationListener() .onUnauthorizedInstantiation(component); } } }); } /** * Adds a component instantiation listener. This method should typically only be called during * application startup; it is not thread safe. * <p> * Note: wicket does not guarantee the execution order of added listeners * * @param listener * the listener to add */ public final void addComponentInstantiationListener( final IComponentInstantiationListener listener) { if (listener == null) { throw new IllegalArgumentException("argument listener may not be null"); } // if an instance of this listener is already present ignore this call for (int i = 0; i < componentInstantiationListeners.length; i++) { if (listener == componentInstantiationListeners[i]) { return; } } final IComponentInstantiationListener[] newListeners = new IComponentInstantiationListener[componentInstantiationListeners.length + 1]; System.arraycopy(componentInstantiationListeners, 0, newListeners, 0, componentInstantiationListeners.length); newListeners[componentInstantiationListeners.length] = listener; componentInstantiationListeners = newListeners; } /** * Configures application settings to good defaults. */ public final void configure() { final String configurationType = getConfigurationType(); // As long as this is public api the development and deployment mode // should counter act each other for all properties. if (DEVELOPMENT.equalsIgnoreCase(configurationType)) { getResourceSettings().setResourcePollFrequency(Duration.ONE_SECOND); getDebugSettings().setComponentUseCheck(true); getMarkupSettings().setStripWicketTags(false); getExceptionSettings().setUnexpectedExceptionDisplay( IExceptionSettings.SHOW_EXCEPTION_PAGE); getDebugSettings().setAjaxDebugModeEnabled(true); getResourceSettings().setStripJavascriptCommentsAndWhitespace(false); } else if (DEPLOYMENT.equalsIgnoreCase(configurationType)) { getResourceSettings().setResourcePollFrequency(null); getDebugSettings().setComponentUseCheck(false); getMarkupSettings().setStripWicketTags(true); getExceptionSettings().setUnexpectedExceptionDisplay( IExceptionSettings.SHOW_INTERNAL_ERROR_PAGE); getDebugSettings().setAjaxDebugModeEnabled(false); getResourceSettings().setStripJavascriptCommentsAndWhitespace(true); } else { throw new IllegalArgumentException("Invalid configuration type: '" + configurationType + "'. Must be \"development\" or \"deployment\"."); } } /** * Gets the unique key of this application within a given context (like a web application). NOT * INTENDED FOR FRAMEWORK CLIENTS. * * @return The unique key of this application */ public abstract String getApplicationKey(); /** * @return Application's application-wide settings * @see IApplicationSettings * @since 1.2 */ public IApplicationSettings getApplicationSettings() { return getSettings(); } /** * Gets the configuration mode to use for configuring the app, either {@link #DEVELOPMENT} or * {@link #DEPLOYMENT}. * <p> * The configuration type. Must currently be either DEVELOPMENT or DEPLOYMENT. Currently, if the
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -