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 2008/12/20 18:48:32 UTC
svn commit: r728321 - in /wicket/trunk/wicket/src:
main/java/org/apache/wicket/util/resource/locator/
test/java/org/apache/wicket/markup/html/
Author: jdonnerstag
Date: Sat Dec 20 09:48:32 2008
New Revision: 728321
URL: http://svn.apache.org/viewvc?rev=728321&view=rev
Log:
wicket-1868: i18n package resource resolving depends too much on available locale
Added:
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/packaged1_en.txt
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/packaged1_foo_bar.txt
Modified:
wicket/trunk/wicket/src/main/java/org/apache/wicket/util/resource/locator/ResourceNameIterator.java
wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/PackageResourceTest.java
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/util/resource/locator/ResourceNameIterator.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/util/resource/locator/ResourceNameIterator.java?rev=728321&r1=728320&r2=728321&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/util/resource/locator/ResourceNameIterator.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/util/resource/locator/ResourceNameIterator.java Sat Dec 20 09:48:32 2008
@@ -16,13 +16,17 @@
*/
package org.apache.wicket.util.resource.locator;
+import java.util.Arrays;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.util.string.Strings;
-
/**
* Contains the logic to locate a resource based on a path, a style (see
* {@link org.apache.wicket.Session}), a locale and a extension strings. The full filename will be
@@ -50,6 +54,8 @@
*/
public class ResourceNameIterator implements Iterator<String>
{
+ private static final Pattern LOCALE_PATTERN = Pattern.compile("_[a-zA-Z]{2}($|(?=_))");
+
// The locale to search for the resource file
private final Locale locale;
@@ -64,6 +70,12 @@
// The latest exact Locale used
private Locale currentLocale;
+ private final Set<String> isoCountries = new HashSet<String>(
+ Arrays.asList(Locale.getISOCountries()));
+
+ private final Set<String> isoLanguages = new HashSet<String>(
+ Arrays.asList(Locale.getISOLanguages()));
+
/**
* Construct.
*
@@ -74,7 +86,7 @@
* @param locale
* The Locale to apply
* @param extensions
- * the filname's extensions (comma separated). Null permitted
+ * the filname's extensions (comma separated)
*/
public ResourceNameIterator(String path, final String style, final Locale locale,
final String extensions)
@@ -90,6 +102,62 @@
this.extensions = extensions;
}
+ Matcher matcher = LOCALE_PATTERN.matcher(path);
+ if (matcher.find())
+ {
+ String language = null;
+ String country = null;
+ String variant = null;
+ int firstValidLocalePatternFragment = -1;
+ do
+ {
+ String s = matcher.group().substring(1, 3);
+ if (Character.isLowerCase(s.charAt(0)))
+ {
+ if (isoLanguages.contains(s))
+ {
+ language = s;
+ firstValidLocalePatternFragment = matcher.start();
+ break;
+ }
+ }
+ }
+ while (matcher.find());
+
+ // did we find a language?
+ if (language != null)
+ {
+ // check for country
+ if (matcher.find())
+ {
+ do
+ {
+ String s = matcher.group().substring(1, 3);
+ if (Character.isUpperCase(s.charAt(0)))
+ {
+ if (isoCountries.contains(s))
+ {
+ country = s;
+ break;
+ }
+ }
+ }
+ while (matcher.find());
+ }
+ if (country != null)
+ {
+ // country found... just get the rest of the string for any variant
+ if (matcher.find())
+ {
+ variant = path.substring(matcher.start());
+ }
+ }
+ path = path.substring(0, firstValidLocalePatternFragment);
+ localeIterator = new LocaleResourceNameIterator(path, new Locale(language,
+ country != null ? country : "", variant != null ? variant : ""));
+ } // else skip the whole thing... probably user specific underscores used
+ }
+
styleIterator = new StyleAndVariationResourceNameIterator(path, style, null);
}
Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/PackageResourceTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/PackageResourceTest.java?rev=728321&r1=728320&r2=728321&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/PackageResourceTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/PackageResourceTest.java Sat Dec 20 09:48:32 2008
@@ -56,6 +56,15 @@
}
/**
+ * @see junit.framework.TestCase#setUp()
+ */
+ @Override
+ protected void setUp() throws Exception
+ {
+ application = new WicketTester().getApplication();
+ }
+
+ /**
* Tests binding a single absolute package resource.
*
* @throws Exception
@@ -65,9 +74,9 @@
final SharedResources sharedResources = Application.get().getSharedResources();
PackageResource.bind(application, PackageResourceTest.class, "packaged1.txt");
assertNotNull("resource packaged1.txt should be available as a packaged resource",
- sharedResources.get(PackageResourceTest.class, "packaged1.txt", null, null, true));
+ sharedResources.get(PackageResourceTest.class, "packaged1.txt", null, null, true));
assertNull("resource packaged2.txt should NOT be available as a packaged resource",
- sharedResources.get(PackageResourceTest.class, "packaged2.txt", null, null, true));
+ sharedResources.get(PackageResourceTest.class, "packaged2.txt", null, null, true));
}
/**
@@ -91,14 +100,43 @@
assertFalse(guard.accept(PackageResourceTest.class, "Bar.java"));
}
- public void testInvalidPackageResource() throws Exception
+ /**
+ * Test lenient matching
+ *
+ * @throws Exception
+ */
+ public void testLenientPackageResourceMatching() throws Exception
{
final SharedResources sharedResources = Application.get().getSharedResources();
Resource invalidResource = new PackageResource(PackageResourceTest.class, "packaged3.txt",
- Locale.ENGLISH, null);
+ Locale.ENGLISH, null);
assertNotNull(
- "resource packaged3.txt SHOULD be available as a packaged resource even if it doesn't exist",
- invalidResource);
+ "resource packaged3.txt SHOULD be available as a packaged resource even if it doesn't exist",
+ invalidResource);
+
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1.txt", null, null));
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1.txt", Locale.CHINA,
+ null));
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1.txt", Locale.CHINA,
+ "foo"));
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1.txt", null, "foo"));
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1_en.txt", null, null));
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1_en_US.txt", null,
+ null));
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1_en_US.txt", null,
+ "foo"));
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1_en_US.txt",
+ Locale.US, null));
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1_en_US.txt",
+ Locale.CANADA, null));
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1_en_US.txt",
+ Locale.CHINA, null));
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1_foo_bar_en.txt",
+ null, null));
+ assertTrue(PackageResource.exists(PackageResourceTest.class, "packaged1_foo_bar_en_US.txt",
+ null, null));
+ assertTrue(PackageResource.exists(PackageResourceTest.class,
+ "packaged1_foo_bar_en_US_MAC.txt", null, null));
try
{
@@ -109,12 +147,4 @@
{
}
}
-
- /**
- * @see junit.framework.TestCase#setUp()
- */
- protected void setUp() throws Exception
- {
- application = new WicketTester().getApplication();
- }
}
Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/packaged1_en.txt
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/packaged1_en.txt?rev=728321&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/packaged1_en.txt (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/packaged1_en.txt Sat Dec 20 09:48:32 2008
@@ -0,0 +1 @@
+TEST
Added: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/packaged1_foo_bar.txt
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/packaged1_foo_bar.txt?rev=728321&view=auto
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/packaged1_foo_bar.txt (added)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/packaged1_foo_bar.txt Sat Dec 20 09:48:32 2008
@@ -0,0 +1 @@
+TEST