Updated Branches: refs/heads/master 569e1cdf5 -> 04bb9046f
WICKET-4430: By using int as the scope, it is possible to read arbitrary resources from the classpath of a wicket application: - make resource (= extension) iteration more safe by using Iterable<String> instead of a comma-delimited list of extension Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/04bb9046 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/04bb9046 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/04bb9046 Branch: refs/heads/master Commit: 04bb9046fe21e91f2968998c1d0efd5a94602655 Parents: 569e1cd Author: Peter Ertl <p...@apache.org> Authored: Sat Feb 25 18:02:12 2012 +0100 Committer: Peter Ertl <p...@apache.org> Committed: Sat Feb 25 18:02:12 2012 +0100 ---------------------------------------------------------------------- .../locator/ExtensionResourceNameIterator.java | 58 +++++++-------- .../resource/locator/ResourceNameIterator.java | 22 +++--- .../resource/locator/ResourceStreamLocator.java | 8 ++- .../resource/locator/ResourceNameIteratorTest.java | 12 ++-- 4 files changed, 51 insertions(+), 49 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/04bb9046/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ExtensionResourceNameIterator.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ExtensionResourceNameIterator.java b/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ExtensionResourceNameIterator.java index 6a83510..9de883d 100644 --- a/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ExtensionResourceNameIterator.java +++ b/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ExtensionResourceNameIterator.java @@ -16,52 +16,46 @@ */ package org.apache.wicket.util.resource.locator; +import java.util.Arrays; import java.util.Iterator; -import org.apache.wicket.util.string.Strings; - - /** - * Iterate over a list of 'comma' separated strings. If an empty string is provided, hasNext() will + * Iterate over a set of extensions. If null is provided, hasNext() will * successfully return once with next() returning {@code null}. * * @author Juergen Donnerstag */ public class ExtensionResourceNameIterator implements Iterator<String> { - private final String[] extensions; + private static final Iterable<String> NULL_ITERABLE = Arrays.asList((String)null); - private int index; + private final Iterator<String> iterator; + + private String current; /** * Construct. * - * @param extension - * {@code null} or comma separated extensions - * @param separatorChar + * @param extensions + * {@code null} or iterable with extensions */ - public ExtensionResourceNameIterator(final String extension, final char separatorChar) + public ExtensionResourceNameIterator(final Iterable<String> extensions) { - // Extension can be a comma separated list - String[] extensions = Strings.split(extension, separatorChar); - if (extensions.length == 0) + // Fail safe: hasNext() needs to return at least once with true + if (extensions == null || !extensions.iterator().hasNext()) { - // Fail safe: hasNext() needs to return at least once with true. - extensions = new String[] { null }; + this.iterator = NULL_ITERABLE.iterator(); + } + else + { + this.iterator = extensions.iterator(); } - this.extensions = extensions; - - index = 0; } - /** - * - * @see java.util.Iterator#hasNext() - */ @Override public boolean hasNext() { - return (index < extensions.length); + return iterator.hasNext(); } /** @@ -70,8 +64,7 @@ public class ExtensionResourceNameIterator implements Iterator<String> @Override public String next() { - index++; - + current = iterator.next(); return getExtension(); } @@ -80,25 +73,26 @@ public class ExtensionResourceNameIterator implements Iterator<String> */ public final String getExtension() { - String extension = extensions[index - 1]; - if (extension != null) + String ext = current; + + if (ext != null) { - extension = extension.trim(); - if (extension.startsWith(".")) + ext = ext.trim(); + if (ext.startsWith(".")) { - extension = extension.substring(1); + ext = ext.substring(1); } } - return extension; + return ext; } /** * Noop. * - * @see java.util.Iterator#remove() */ @Override public void remove() { + iterator.remove(); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/04bb9046/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceNameIterator.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceNameIterator.java b/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceNameIterator.java index 161aabb..6b09f5b 100644 --- a/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceNameIterator.java +++ b/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceNameIterator.java @@ -16,6 +16,7 @@ */ package org.apache.wicket.util.resource.locator; +import java.util.Arrays; import java.util.Iterator; import java.util.Locale; @@ -43,8 +44,6 @@ import org.apache.wicket.util.string.Strings; * <li><language>_<country></li> * <li><language></li> * </ol> - * <p> - * Extensions may be a comma separated list of extensions, e.g. "properties,xml" * * @author Juergen Donnerstag */ @@ -53,8 +52,8 @@ public class ResourceNameIterator implements Iterator<String> // The base path without extension, style, locale etc. private final String path; - // The extensions (comma separated) to search for the resource file - private final String extensions; + // The extensions to search for the resource file + private final Iterable<String> extensions; // The locale to search for the resource file private final Locale locale; @@ -81,17 +80,20 @@ public class ResourceNameIterator implements Iterator<String> * @param locale * The Locale to apply * @param extensions - * the filname's extensions (comma separated) + * the filename's extensions * @param strict * If false, weaker combinations of style, locale, etc. are tested as well */ public ResourceNameIterator(final String path, final String style, final String variation, - final Locale locale, final String extensions, boolean strict) + final Locale locale, final Iterable<String> extensions, final boolean strict) { this.locale = locale; - if ((extensions == null) && (path != null) && (path.indexOf('.') != -1)) + + boolean noext = extensions == null || !extensions.iterator().hasNext(); + + if (noext && (path != null) && (path.indexOf('.') != -1)) { - this.extensions = Strings.afterLast(path, '.'); + this.extensions = Arrays.asList(Strings.afterLast(path, '.').split(",")); this.path = Strings.beforeLast(path, '.'); } else @@ -271,9 +273,9 @@ public class ResourceNameIterator implements Iterator<String> * @param extensions * @return New iterator */ - protected ExtensionResourceNameIterator newExtensionResourceNameIterator(final String extensions) + protected ExtensionResourceNameIterator newExtensionResourceNameIterator(final Iterable<String> extensions) { - return new ExtensionResourceNameIterator(extensions, ','); + return new ExtensionResourceNameIterator(extensions); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/04bb9046/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceStreamLocator.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceStreamLocator.java b/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceStreamLocator.java index a817f65..985da5a 100644 --- a/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceStreamLocator.java +++ b/wicket-core/src/main/java/org/apache/wicket/util/resource/locator/ResourceStreamLocator.java @@ -17,6 +17,8 @@ package org.apache.wicket.util.resource.locator; import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Locale; import org.apache.wicket.Application; @@ -60,6 +62,8 @@ public class ResourceStreamLocator implements IResourceStreamLocator /** Logging */ private static final Logger log = LoggerFactory.getLogger(ResourceStreamLocator.class); + private static final Iterable<String> NO_EXTENSIONS = new ArrayList<String>(0); + /** If null, the application registered finder will be used */ private IResourceFinder finder; @@ -250,6 +254,8 @@ public class ResourceStreamLocator implements IResourceStreamLocator public ResourceNameIterator newResourceNameIterator(final String path, final Locale locale, final String style, final String variation, final String extension, final boolean strict) { - return new ResourceNameIterator(path, style, variation, locale, extension, strict); + final Iterable<String> extensions = extension == null ? NO_EXTENSIONS : Arrays.asList(extension); + + return new ResourceNameIterator(path, style, variation, locale, extensions, strict); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/04bb9046/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/ResourceNameIteratorTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/ResourceNameIteratorTest.java b/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/ResourceNameIteratorTest.java index 965be43..ceed507 100644 --- a/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/ResourceNameIteratorTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/ResourceNameIteratorTest.java @@ -16,6 +16,7 @@ */ package org.apache.wicket.util.resource.locator; +import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.Locale; @@ -117,18 +118,17 @@ public class ResourceNameIteratorTest extends WicketTestCase @Test public void extensionResourceNameIterator() { - ExtensionResourceNameIterator iterator = new ExtensionResourceNameIterator(null, ','); + ExtensionResourceNameIterator iterator = new ExtensionResourceNameIterator(null); assertTrue(iterator.hasNext()); assertEquals(null, iterator.next()); assertFalse(iterator.hasNext()); - iterator = new ExtensionResourceNameIterator("txt", ','); + iterator = new ExtensionResourceNameIterator(Arrays.asList("txt")); assertTrue(iterator.hasNext()); assertEquals("txt", iterator.next()); assertFalse(iterator.hasNext()); - iterator = new ExtensionResourceNameIterator("properties,utf8.properties,properties.xml", - ','); + iterator = new ExtensionResourceNameIterator(Arrays.asList("properties", "utf8.properties", "properties.xml")); assertTrue(iterator.hasNext()); assertEquals("properties", iterator.next()); assertTrue(iterator.hasNext()); @@ -148,9 +148,9 @@ public class ResourceNameIteratorTest extends WicketTestCase String style = null; String var = "var"; Locale locale = Locale.getDefault(); - String ext = null; + Iterable<String> extensions = null; boolean strict = false; - Iterator<String> iterator = new ResourceNameIterator(path, style, var, locale, ext, strict); + Iterator<String> iterator = new ResourceNameIterator(path, style, var, locale, extensions, strict); HashSet<String> variations = new HashSet<String>(); while (iterator.hasNext()) {