You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2012/02/25 18:02:30 UTC

git commit: WICKET-4430: By using int as the scope, it is possible to read arbitrary resources from the classpath of a wicket application:

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 <pe...@apache.org>
Authored: Sat Feb 25 18:02:12 2012 +0100
Committer: Peter Ertl <pe...@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>&lt;language&gt;_&lt;country&gt;</li>
  * <li>&lt;language&gt;</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())
 		{