You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2007/08/12 12:24:52 UTC
svn commit: r565035 - in
/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket:
Localizer.java resource/PropertiesFactory.java
settings/IResourceSettings.java settings/Settings.java
Author: jdonnerstag
Date: Sun Aug 12 03:24:50 2007
New Revision: 565035
URL: http://svn.apache.org/viewvc?view=rev&rev=565035
Log:
Cache localized property values early to avoid traversing the serch stack.
Modified:
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Localizer.java
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/resource/PropertiesFactory.java
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/settings/IResourceSettings.java
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/settings/Settings.java
Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Localizer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Localizer.java?view=diff&rev=565035&r1=565034&r2=565035
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Localizer.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Localizer.java Sun Aug 12 03:24:50 2007
@@ -16,8 +16,10 @@
*/
package org.apache.wicket;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
+import java.util.Map;
import java.util.MissingResourceException;
import org.apache.wicket.model.IModel;
@@ -44,10 +46,12 @@
*
* @author Chris Turner
* @author Juergen Donnerstag
- * @todo implement properties caching
*/
public class Localizer
{
+ /** Cache properties */
+ private Map cache = new HashMap();
+
/**
* Create the utils instance class backed by the configuration information
* contained within the supplied application object.
@@ -57,6 +61,14 @@
}
/**
+ * Clear all cache entries
+ */
+ public final void clearCache()
+ {
+ cache = new HashMap();
+ }
+
+ /**
* @see #getString(String, Component, IModel, Locale, String, String)
*
* @param key
@@ -160,20 +172,35 @@
public String getString(final String key, final Component component, final IModel model,
final String defaultValue) throws MissingResourceException
{
- // Iterate over all registered string resource loaders until the
- // property has been found
+ final IResourceSettings resourceSettings = Application.get().getResourceSettings();
+
+ // Check the cache first
+ String cacheKey = getCacheKey(key, component);
String string = null;
- final IResourceSettings resourceSettings = Application.get().getResourceSettings();
- Iterator iter = resourceSettings.getStringResourceLoaders().iterator();
- while (iter.hasNext())
+ // Value not found are cached as well (value = null)
+ if (cache.containsKey(cacheKey))
+ {
+ string = getFromCache(cacheKey);
+ }
+ else
{
- IStringResourceLoader loader = (IStringResourceLoader)iter.next();
- string = loader.loadStringResource(component, key);
- if (string != null)
+ // Iterate over all registered string resource loaders until the
+ // property has been found
+
+ Iterator iter = resourceSettings.getStringResourceLoaders().iterator();
+ while (iter.hasNext())
{
- break;
+ IStringResourceLoader loader = (IStringResourceLoader)iter.next();
+ string = loader.loadStringResource(component, key);
+ if (string != null)
+ {
+ break;
+ }
}
+
+ // Cache the result incl null if not found
+ putIntoCache(cacheKey, string);
}
if ((string == null) && (defaultValue != null))
@@ -208,6 +235,54 @@
}
return "[Warning: String resource for '" + key + "' not found]";
+ }
+
+ /**
+ * Put the value into the cache and associate it with the cache key
+ *
+ * @param cacheKey
+ * @param string
+ */
+ protected void putIntoCache(final String cacheKey, final String string)
+ {
+ if (cacheKey != null)
+ {
+ cache.put(cacheKey, string);
+ }
+ }
+
+ /**
+ * Get the value associated with the key from the cache.
+ *
+ * @param cacheKey
+ * @return
+ */
+ protected String getFromCache(final String cacheKey)
+ {
+ return (String)cache.get(cacheKey);
+ }
+
+ /**
+ * Gets the cache key
+ *
+ * @param key
+ * @param component
+ * @return
+ */
+ protected String getCacheKey(final String key, final Component component)
+ {
+ String cacheKey = key;
+ if (component != null)
+ {
+ cacheKey += '-' + component.getPageRelativePath();
+
+ Page page = component.findPage();
+ if (page != null)
+ {
+ cacheKey += '-' + page.getClass().getName();
+ }
+ }
+ return cacheKey;
}
/**
Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/resource/PropertiesFactory.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/resource/PropertiesFactory.java?view=diff&rev=565035&r1=565034&r2=565035
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/resource/PropertiesFactory.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/resource/PropertiesFactory.java Sun Aug 12 03:24:50 2007
@@ -73,7 +73,7 @@
*/
public PropertiesFactory()
{
- this.resourceSettings = Application.get().getResourceSettings();
+ resourceSettings = Application.get().getResourceSettings();
}
/**
@@ -124,13 +124,13 @@
properties = loadPropertiesFileAndWatchForChanges(path, stream);
if (properties != null)
{
- this.propertiesCache.put(path, properties);
+ propertiesCache.put(path, properties);
return properties;
}
}
// Add a placeholder to the cache. Null is not a valid value to add.
- this.propertiesCache.put(path, Properties.EMPTY_PROPERTIES);
+ propertiesCache.put(path, Properties.EMPTY_PROPERTIES);
return null;
}
@@ -250,13 +250,16 @@
{
public void onChange()
{
- log.info("A properties files has changed. Remove all entries "
- + "from the cache. Resource: " + resourceStream);
+ log.info("A properties files has changed. Remove all entries " +
+ "from the cache. Resource: " + resourceStream);
// Clear the whole cache as associated localized files may
// be affected and may need reloading as well.
clearCache();
+ // clear the localizer cache as well
+ Application.get().getResourceSettings().getLocalizer().clearCache();
+
// Inform all listeners
Iterator iter = afterReloadListeners.iterator();
while (iter.hasNext())
@@ -268,8 +271,8 @@
}
catch (Throwable ex)
{
- log.error("PropertiesReloadListener has thrown an exception: "
- + ex.getMessage());
+ log.error("PropertiesReloadListener has thrown an exception: " +
+ ex.getMessage());
}
}
}
@@ -287,6 +290,6 @@
*/
protected final Map getCache()
{
- return this.propertiesCache;
+ return propertiesCache;
}
}
Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/settings/IResourceSettings.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/settings/IResourceSettings.java?view=diff&rev=565035&r1=565034&r2=565035
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/settings/IResourceSettings.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/settings/IResourceSettings.java Sun Aug 12 03:24:50 2007
@@ -112,13 +112,14 @@
void addStringResourceLoader(final IStringResourceLoader loader);
/**
- * Whether to disable gzip compression for resources. You need this on SAP, which gzips things twice.
+ * Whether to disable gzip compression for resources. You need this on SAP,
+ * which gzips things twice.
*
* @return True if we should disable gzip compression
* @since 1.3.0
*/
boolean getDisableGZipCompression();
-
+
/**
* Get the application's localizer.
*
@@ -199,14 +200,22 @@
boolean getUseDefaultOnMissingResource();
/**
- * Sets whether to disable gzip compression for resources.
- * You need to set this on some SAP versions, which gzip things twice.
+ * Sets whether to disable gzip compression for resources. You need to set
+ * this on some SAP versions, which gzip things twice.
*
* @param disableGZipCompression
* @since 1.3.0
*/
void setDisableGZipCompression(final boolean disableGZipCompression);
-
+
+ /**
+ * Sets the localizer which will be used to find property values.
+ *
+ * @param localizer
+ * @since 1.3.0
+ */
+ void setLocalizer(Localizer localizer);
+
/**
* Sets the {@link PackageResourceGuard package resource guard}.
*
@@ -267,15 +276,16 @@
void setUseDefaultOnMissingResource(final boolean useDefaultOnMissingResource);
/**
- * Sets whether the whitespace characters and comments should be stripped for
- * resources served through {@link JavascriptPackageResource}
+ * Sets whether the whitespace characters and comments should be stripped
+ * for resources served through {@link JavascriptPackageResource}
+ *
* @param value
*/
void setStripJavascriptCommentsAndWhitespace(boolean value);
-
+
/**
* @return whether the comments and whitespace characters will be stripped
- * from resources served through {@link JavascriptPackageResource}
+ * from resources served through {@link JavascriptPackageResource}
*/
boolean getStripJavascriptCommentsAndWhitespace();
}
Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/settings/Settings.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/settings/Settings.java?view=diff&rev=565035&r1=565034&r2=565035
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/settings/Settings.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/settings/Settings.java Sun Aug 12 03:24:50 2007
@@ -92,7 +92,7 @@
IRequestLoggerSettings
{
/** Class of access denied page. */
- private WeakReference/*<Class<? extends Page>*/ accessDeniedPage;
+ private WeakReference/* <Class<? extends Page> */accessDeniedPage;
/** ajax debug mode status */
private boolean ajaxDebugModeEnabled = false;
@@ -146,7 +146,7 @@
* Whether we should disable gzip compression for resources.
*/
private boolean disableGZipCompression = false;
-
+
/**
* Whether mounts should be enforced. If true, requests for mounted targets
* have to done through the mounted paths. If, for instance, a bookmarkable
@@ -165,7 +165,7 @@
private boolean gatherExtendedBrowserInfo = false;
/** Class of internal error page. */
- private WeakReference/*<Class<? extends Page>*/ internalErrorPage;
+ private WeakReference/* <Class<? extends Page> */internalErrorPage;
/** I18N support */
private Localizer localizer;
@@ -175,7 +175,7 @@
/** A markup cache which will load the markup if required. */
private IMarkupCache markupCache;
-
+
/** To help prevent denial of service attacks */
private int maxPageMaps = 5;
@@ -189,7 +189,7 @@
private IPackageResourceGuard packageResourceGuard = new PackageResourceGuard();
/** The error page displayed when an expired page is accessed. */
- private WeakReference/*<Class<? extends Page>*/ pageExpiredErrorPage;
+ private WeakReference/* <Class<? extends Page> */pageExpiredErrorPage;
/** factory to create new Page objects */
private IPageFactory pageFactory = new DefaultPageFactory();
@@ -295,10 +295,11 @@
private boolean stripJavascriptCommentsAndWhitespace;
/**
- * Whether the container's class name should be printed to response (in a html comment).
+ * Whether the container's class name should be printed to response (in a
+ * html comment).
*/
private boolean outputMarkupContainerClassName = false;
-
+
/**
* Create the application settings, carrying out any necessary
* initialisations.
@@ -439,7 +440,7 @@
*/
public boolean getComponentUseCheck()
{
- return this.componentUseCheck;
+ return componentUseCheck;
}
/**
@@ -501,7 +502,7 @@
{
return disableGZipCompression;
}
-
+
/**
* @see wicket.settings.ISecuritySettings#getEnforceMounts()
*/
@@ -533,19 +534,27 @@
{
if (localizer == null)
{
- this.localizer = new Localizer();
+ localizer = new Localizer();
}
return localizer;
}
/**
+ * @see org.apache.wicket.settings.IResourceSettings#setLocalizer(org.apache.wicket.Localizer)
+ */
+ public void setLocalizer(final Localizer localizer)
+ {
+ this.localizer = localizer;
+ }
+
+ /**
* @see org.apache.wicket.settings.IMarkupSettings#getMarkupParserFactory()
*/
public IMarkupParserFactory getMarkupParserFactory()
{
- if (this.markupParserFactory == null)
+ if (markupParserFactory == null)
{
- this.markupParserFactory = new MarkupParserFactory();
+ markupParserFactory = new MarkupParserFactory();
}
return markupParserFactory;
}
@@ -708,7 +717,7 @@
*/
public boolean getStripWicketTags()
{
- return this.stripWicketTags;
+ return stripWicketTags;
}
/**
@@ -716,7 +725,7 @@
*/
public boolean getStripXmlDeclarationFromOutput()
{
- return this.stripXmlDeclarationFromOutput;
+ return stripXmlDeclarationFromOutput;
}
/**
@@ -766,7 +775,7 @@
public String getVersion()
{
String implVersion = null;
- Package pkg = this.getClass().getPackage();
+ Package pkg = getClass().getPackage();
if (pkg != null)
{
implVersion = pkg.getImplementationVersion();
@@ -821,7 +830,7 @@
{
throw new IllegalArgumentException("authorization strategy cannot be set to null");
}
- this.authorizationStrategy = strategy;
+ authorizationStrategy = strategy;
}
/**
@@ -853,7 +862,7 @@
*/
public void setClassResolver(final IClassResolver defaultClassResolver)
{
- this.classResolver = defaultClassResolver;
+ classResolver = defaultClassResolver;
}
/**
@@ -914,7 +923,7 @@
*/
public void setDefaultMarkupEncoding(final String encoding)
{
- this.defaultMarkupEncoding = encoding;
+ defaultMarkupEncoding = encoding;
}
/**
@@ -924,13 +933,13 @@
{
this.disableGZipCompression = disableGZipCompression;
}
-
+
/**
* @see wicket.settings.ISecuritySettings#setEnforceMounts(boolean)
*/
public void setEnforceMounts(boolean enforce)
{
- this.enforceMounts = enforce;
+ enforceMounts = enforce;
}
/**
@@ -965,7 +974,7 @@
throw new IllegalArgumentException("markup parser factory cannot be null");
}
- this.markupParserFactory = factory;
+ markupParserFactory = factory;
}
/**
@@ -1007,7 +1016,7 @@
*/
public void setPageFactory(final IPageFactory defaultPageFactory)
{
- this.pageFactory = defaultPageFactory;
+ pageFactory = defaultPageFactory;
}
/**
@@ -1023,7 +1032,7 @@
*/
public void setPropertiesFactory(org.apache.wicket.resource.IPropertiesFactory factory)
{
- this.propertiesFactory = factory;
+ propertiesFactory = factory;
}
/**
@@ -1042,7 +1051,7 @@
this.resourceFinder = resourceFinder;
// Cause resource locator to get recreated
- this.resourceStreamLocator = null;
+ resourceStreamLocator = null;
}
/**
@@ -1090,7 +1099,7 @@
*/
public void setStripXmlDeclarationFromOutput(final boolean strip)
{
- this.stripXmlDeclarationFromOutput = strip;
+ stripXmlDeclarationFromOutput = strip;
}
/**
@@ -1144,7 +1153,7 @@
*/
public void setVersionPagesByDefault(boolean pagesVersionedByDefault)
{
- this.versionPagesByDefault = pagesVersionedByDefault;
+ versionPagesByDefault = pagesVersionedByDefault;
}
/**
@@ -1163,8 +1172,8 @@
// IPageFactory implementation
if (!Page.class.isAssignableFrom(pageClass))
{
- throw new IllegalArgumentException("argument " + pageClass
- + " must be a subclass of Page");
+ throw new IllegalArgumentException("argument " + pageClass +
+ " must be a subclass of Page");
}
}
@@ -1231,7 +1240,7 @@
{
stripJavascriptCommentsAndWhitespace = value;
}
-
+
/**
* @see org.apache.wicket.settings.IDebugSettings#setOutputMarkupContainerClassName(boolean)
*/
@@ -1253,13 +1262,13 @@
*/
public IMarkupCache getMarkupCache()
{
- if (this.markupCache == null)
+ if (markupCache == null)
{
// Construct markup cache for this application
- this.markupCache = new MarkupCache(application);
+ markupCache = new MarkupCache(application);
}
- return this.markupCache;
+ return markupCache;
}
/**
@@ -1274,7 +1283,7 @@
public Bytes getDefaultMaximumUploadSize()
{
- return this.defaultMaximumUploadSize;
+ return defaultMaximumUploadSize;
}
public void setDefaultMaximumUploadSize(Bytes defaultMaximumUploadSize)