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()
                {

Reply via email to