Updated Branches: refs/heads/master 46e0e5799 -> 593a6b506
WICKET-4970 Move the logic for creating the proper PackageResource from PackageResourceReference to ResourceReferenceRegistry Introduce IResourceReferenceFactory that is used by ResourceReferenceRegistry to create new ResourceReference when there is no registered one for the given attributes (key) Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/593a6b50 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/593a6b50 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/593a6b50 Branch: refs/heads/master Commit: 593a6b506292172a513b225c2245de82b4042109 Parents: 46e0e57 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Wed Jan 16 12:49:44 2013 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Wed Jan 16 12:51:36 2013 +0200 ---------------------------------------------------------------------- .../request/resource/CssResourceReference.java | 10 +++ .../resource/IResourceReferenceFactory.java | 18 ++++ .../resource/JavaScriptResourceReference.java | 13 +++- .../wicket/request/resource/PackageResource.java | 22 ++++- .../resource/ResourceReferenceRegistry.java | 52 ++++++++++--- .../resource/LessResourceReferenceTest.java | 63 ++++++++++++++- 6 files changed, 161 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/593a6b50/wicket-core/src/main/java/org/apache/wicket/request/resource/CssResourceReference.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/CssResourceReference.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/CssResourceReference.java index c43ee3e..55955d7 100644 --- a/wicket-core/src/main/java/org/apache/wicket/request/resource/CssResourceReference.java +++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/CssResourceReference.java @@ -63,6 +63,16 @@ public class CssResourceReference extends PackageResourceReference super(scope, name); } + /** + * Constructor. + * + * @param key + */ + public CssResourceReference(Key key) + { + super(key); + } + @Override public CssPackageResource getResource() { http://git-wip-us.apache.org/repos/asf/wicket/blob/593a6b50/wicket-core/src/main/java/org/apache/wicket/request/resource/IResourceReferenceFactory.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/IResourceReferenceFactory.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/IResourceReferenceFactory.java new file mode 100644 index 0000000..230b03e --- /dev/null +++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/IResourceReferenceFactory.java @@ -0,0 +1,18 @@ +package org.apache.wicket.request.resource; + +/** + * Used to create a ResourceReference for a given request attributes + */ +public interface IResourceReferenceFactory +{ + /** + * Creates a new instance of ResourceReference with the given + * request attributes + * + * @param key + * The object that brings the request attributes + * @return a ResourceReference or {@code null} if the factory cannot create + * such with the given request attributes + */ + ResourceReference create(ResourceReference.Key key); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/593a6b50/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptResourceReference.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptResourceReference.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptResourceReference.java index eb2887d..43e4a0d 100644 --- a/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptResourceReference.java +++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptResourceReference.java @@ -53,7 +53,7 @@ public class JavaScriptResourceReference extends PackageResourceReference /** * Construct. - * + * * @param scope * mandatory parameter * @param name @@ -64,6 +64,17 @@ public class JavaScriptResourceReference extends PackageResourceReference super(scope, name); } + /** + * Construct. + * + * @param key + * mandatory parameter + */ + public JavaScriptResourceReference(Key key) + { + super(key); + } + @Override public JavaScriptPackageResource getResource() { http://git-wip-us.apache.org/repos/asf/wicket/blob/593a6b50/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java index 1d45eae..3e5824e 100644 --- a/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java +++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java @@ -25,17 +25,17 @@ import javax.servlet.http.HttpServletResponse; import org.apache.wicket.Application; import org.apache.wicket.Session; import org.apache.wicket.WicketRuntimeException; +import org.apache.wicket.core.util.lang.WicketObjects; +import org.apache.wicket.core.util.resource.locator.IResourceStreamLocator; import org.apache.wicket.markup.html.IPackageResourceGuard; import org.apache.wicket.request.resource.caching.IStaticCacheableResource; import org.apache.wicket.settings.IResourceSettings; import org.apache.wicket.util.io.IOUtils; import org.apache.wicket.util.lang.Classes; import org.apache.wicket.util.lang.Packages; -import org.apache.wicket.core.util.lang.WicketObjects; import org.apache.wicket.util.resource.IFixedLocationResourceStream; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.ResourceStreamNotFoundException; -import org.apache.wicket.core.util.resource.locator.IResourceStreamLocator; import org.apache.wicket.util.string.Strings; import org.apache.wicket.util.time.Time; import org.slf4j.Logger; @@ -479,10 +479,22 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl .getPackageResourceGuard(); return guard.accept(scope, path); -} + } + + /** + * Checks whether a resource for a given set of criteria exists. + * + * @param key + * The key that contains all attributes about the requested resource + * @return {@code true} if there is a package resource with the given attributes + */ + public static boolean exists(final ResourceReference.Key key) + { + return exists(key.getScopeClass(), key.getName(), key.getLocale(), key.getStyle(), key.getVariation()); + } /** - * Gets whether a resource for a given set of criteria exists. + * Checks whether a resource for a given set of criteria exists. * * @param scope * This argument will be used to get the class loader for loading the package @@ -496,7 +508,7 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl * The style of the resource (see {@link org.apache.wicket.Session}) * @param variation * The component's variation (of the style) - * @return true if a resource could be loaded, false otherwise + * @return {@code true} if a resource could be loaded, {@code false} otherwise */ public static boolean exists(final Class<?> scope, final String path, final Locale locale, final String style, final String variation) http://git-wip-us.apache.org/repos/asf/wicket/blob/593a6b50/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceReferenceRegistry.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceReferenceRegistry.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceReferenceRegistry.java index aeb4503..254f5af 100644 --- a/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceReferenceRegistry.java +++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceReferenceRegistry.java @@ -67,10 +67,50 @@ public class ResourceReferenceRegistry private int autoAddedCapacity = 1000; /** - * Construct. + * A simple implementation of {@link IResourceReferenceFactory} that creates + * {@link PackageResourceReference} + */ + public static class DefaultResourceReferenceFactory implements IResourceReferenceFactory + { + @Override + public ResourceReference create(Key key) + { + ResourceReference result = null; + if (PackageResource.exists(key)) + { + result = new PackageResourceReference(key); + } + return result; + } + } + + /** + * The factory to use when a ResourceReference is not previously + * registered and a new instance should be create + */ + private final IResourceReferenceFactory resourceReferenceFactory; + + /** + * Constructor. + * + * <p>Uses DefaultResourceReferenceFactory to create ResourceReference when there is + * no registered one for the requested attributes</p> */ public ResourceReferenceRegistry() { + this(new DefaultResourceReferenceFactory()); + } + + /** + * Constructor + * + * @param resourceReferenceFactory + * The factory that will create ResourceReference by Key when there is no registered one + */ + public ResourceReferenceRegistry(IResourceReferenceFactory resourceReferenceFactory) + { + this.resourceReferenceFactory = Args.notNull(resourceReferenceFactory, "resourceReferenceFactory"); + // Initial the auto-add list for a maximum of 1000 entries setAutoAddedCapacity(autoAddedCapacity); } @@ -355,15 +395,7 @@ public class ResourceReferenceRegistry */ protected ResourceReference createDefaultResourceReference(final Key key) { - if (PackageResource.exists(key.getScopeClass(), key.getName(), key.getLocale(), - key.getStyle(), key.getVariation())) - { - return new PackageResourceReference(key); - } - else - { - return null; - } + return resourceReferenceFactory.create(key); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/593a6b50/wicket-core/src/test/java/org/apache/wicket/request/resource/LessResourceReferenceTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/LessResourceReferenceTest.java b/wicket-core/src/test/java/org/apache/wicket/request/resource/LessResourceReferenceTest.java index 902ae34..fe05851 100644 --- a/wicket-core/src/test/java/org/apache/wicket/request/resource/LessResourceReferenceTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/request/resource/LessResourceReferenceTest.java @@ -27,8 +27,10 @@ import org.apache.wicket.markup.html.SecurePackageResourceGuard; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.mock.MockApplication; import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.util.file.Files; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.StringResourceStream; +import org.junit.Before; import org.junit.Test; /** @@ -40,6 +42,37 @@ public class LessResourceReferenceTest extends WicketTestCase { private static final AtomicBoolean PROCESS_RESPONSE_CALLED = new AtomicBoolean(false); + /** + * An {@link org.apache.wicket.request.resource.ResourceReferenceRegistry.IResourceReferenceFactory} that creates + * LessResourceReference for resources with extension '.less' + */ + private static class LessResourceReferenceFactory extends ResourceReferenceRegistry.DefaultResourceReferenceFactory + { + @Override + public ResourceReference create(ResourceReference.Key key) + { + ResourceReference result = null; + if (PackageResource.exists(key)) + { + if ("less".equals(Files.extension(key.getName()))) + { + result = new LessResourceReference(key); + } + else + { + result = super.create(key); + } + } + return result; + } + } + + @Before + public void before() + { + PROCESS_RESPONSE_CALLED.set(false); + } + @Override protected WebApplication newApplication() { @@ -53,6 +86,16 @@ public class LessResourceReferenceTest extends WicketTestCase SecurePackageResourceGuard guard = (SecurePackageResourceGuard) getResourceSettings().getPackageResourceGuard(); guard.addPattern("+*.less"); } + + /** + * Register custom ResourceReferenceRegistry that creates LessResourceReference + * for requests with .less extension + */ + @Override + protected ResourceReferenceRegistry newResourceReferenceRegistry() + { + return new ResourceReferenceRegistry(new LessResourceReferenceFactory()); + } }; } @@ -75,9 +118,22 @@ public class LessResourceReferenceTest extends WicketTestCase assertTrue(PROCESS_RESPONSE_CALLED.get()); } + /** + * Tests that a LessResourceReference is request-able without being registered in ResourceReferenceRegistry + */ + @Test + public void processLessResourcesWithoutStartingAPage() + { + // make a request to the resource that is not registered in the ResourceReferenceRegistry + CharSequence urlToReference = "./wicket/resource/org.apache.wicket.request.resource.LessResourceReferenceTest/LessResourceReference.less"; + tester.executeUrl(urlToReference.toString()); + assertTrue(PROCESS_RESPONSE_CALLED.get()); + } + private static class LessResourcePage extends WebPage implements IMarkupResourceStreamProvider { - private LessResourceReference resourceReference = new LessResourceReference(LessResourceReferenceTest.class, "LessResourceReference.less"); + private final LessResourceReference resourceReference = new LessResourceReference(LessResourceReferenceTest.class, "LessResourceReference.less"); + @Override public void renderHead(IHeaderResponse response) { @@ -98,6 +154,11 @@ public class LessResourceReferenceTest extends WicketTestCase super(scope, name); } + public LessResourceReference(Key key) + { + super(key); + } + @Override public LessPackageResource getResource() {
