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/05/06 15:13:59 UTC

git commit: WICKET-4532 Disable caching for particular resources

Updated Branches:
  refs/heads/master d30af7d18 -> 91c604d55


WICKET-4532 Disable caching for particular resources


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/91c604d5
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/91c604d5
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/91c604d5

Branch: refs/heads/master
Commit: 91c604d55c2a5692f8b6321c1980c4ba4b5574bf
Parents: d30af7d
Author: Peter Ertl <pe...@apache.org>
Authored: Sun May 6 14:40:22 2012 +0200
Committer: Peter Ertl <pe...@apache.org>
Committed: Sun May 6 14:40:22 2012 +0200

----------------------------------------------------------------------
 .../mapper/BasicResourceReferenceMapper.java       |   18 ++--
 .../wicket/core/request/mapper/ResourceMapper.java |   21 +++--
 .../wicket/request/resource/AbstractResource.java  |    9 ++-
 .../request/resource/CssPackageResource.java       |    4 +-
 .../request/resource/CssResourceReference.java     |    2 +-
 .../request/resource/ICssPackageResource.java      |   28 +++++
 .../resource/IJavaScriptPackageResource.java       |   25 +++++
 .../wicket/request/resource/IPackageResource.java  |   59 ++++++++++
 .../resource/JavaScriptPackageResource.java        |    4 +-
 .../resource/JavaScriptResourceReference.java      |    2 +-
 .../wicket/request/resource/PackageResource.java   |   59 +++++-----
 .../request/resource/PackageResourceDecorator.java |   85 +++++++++++++++
 .../request/resource/PackageResourceReference.java |    2 +-
 .../resource/caching/IStaticCacheableResource.java |    5 +-
 .../NonCachingPackageResourceDecorator.java        |   45 ++++++++
 .../version/RequestCycleCachedResourceVersion.java |    2 +-
 16 files changed, 314 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java
index 6f4d417..63b06d0 100755
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/BasicResourceReferenceMapper.java
@@ -229,16 +229,20 @@ class BasicResourceReferenceMapper extends AbstractResourceReferenceMapper
 					// apply caching if required
 					if (resource instanceof IStaticCacheableResource)
 					{
-						// add caching related information to filename + query parameters
 						final IStaticCacheableResource cacheable = (IStaticCacheableResource)resource;
-						final ResourceUrl resourceUrl = new ResourceUrl(token, parameters);
-						getCachingStrategy().decorateUrl(resourceUrl, cacheable);
-						token = resourceUrl.getFileName();
 
-						if (Strings.isEmpty(token))
+						// is caching enabled?
+						if (cacheable.getCacheKey() != null)
 						{
-							throw new IllegalStateException(
-								"caching strategy returned empty name for " + resource);
+							final ResourceUrl resourceUrl = new ResourceUrl(token, parameters);
+							getCachingStrategy().decorateUrl(resourceUrl, cacheable);
+							token = resourceUrl.getFileName();
+
+							if (Strings.isEmpty(token))
+							{
+								throw new IllegalStateException(
+									"caching strategy returned empty name for " + resource);
+							}
 						}
 					}
 				}

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java
index 984f0ad..2e26caa 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/ResourceMapper.java
@@ -215,22 +215,27 @@ public class ResourceMapper extends AbstractMapper implements IRequestMapper
 
 		if (Strings.isEmpty(filename) == false)
 		{
-			// TODO is calling getResource() a potential performance bottleneck?
 			final IResource resource = resourceReference.getResource();
 
+			// is resource supposed to be cached?
 			if (resource instanceof IStaticCacheableResource)
 			{
 				final IStaticCacheableResource cacheable = (IStaticCacheableResource)resource;
-				final ResourceUrl cacheUrl = new ResourceUrl(filename, parameters);
 
-				getCachingStrategy().decorateUrl(cacheUrl, cacheable);
-
-				if (Strings.isEmpty(cacheUrl.getFileName()))
+				// is caching enabled?
+				if (cacheable.getCacheKey() != null)
 				{
-					throw new IllegalStateException("caching strategy returned empty name for " +
-						resource);
+					final ResourceUrl cacheUrl = new ResourceUrl(filename, parameters);
+
+					getCachingStrategy().decorateUrl(cacheUrl, cacheable);
+
+					if (Strings.isEmpty(cacheUrl.getFileName()))
+					{
+						throw new IllegalStateException("caching strategy returned empty name for " +
+						                                resource);
+					}
+					segments.set(lastSegmentAt, cacheUrl.getFileName());
 				}
-				segments.set(lastSegmentAt, cacheUrl.getFileName());
 			}
 		}
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
index 2033a72..6d39189 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
@@ -480,7 +480,14 @@ public abstract class AbstractResource implements IResource
 		// let caching strategy decorate response if resource is intended to be cached
 		if (this instanceof IStaticCacheableResource)
 		{
-			getCachingStrategy().decorateResponse(data, (IStaticCacheableResource)this);
+			final IStaticCacheableResource cacheable = (IStaticCacheableResource)this;
+
+			// is caching enabled?
+			if (cacheable.getCacheKey() != null)
+			{
+				// decorate web response
+				getCachingStrategy().decorateResponse(data, cacheable);
+			}
 		}
 		// set response header
 		setResponseHeaders(data, attributes);

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java
index f6cf010..f7a77d9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/CssPackageResource.java
@@ -26,7 +26,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Package resource for css files. It strips comments and whitespace from css.
  */
-public class CssPackageResource extends PackageResource
+public class CssPackageResource extends PackageResource implements ICssPackageResource
 {
 	private static final long serialVersionUID = 1L;
 
@@ -57,7 +57,7 @@ public class CssPackageResource extends PackageResource
 
 		ICssCompressor compressor = getCompressor();
 
-		if (compressor != null && getCompress())
+		if (compressor != null && isCompress())
 		{
 			try
 			{

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/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..a3cf582 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
@@ -64,7 +64,7 @@ public class CssResourceReference extends PackageResourceReference
 	}
 
 	@Override
-	public CssPackageResource getResource()
+	public ICssPackageResource getResource()
 	{
 		return new CssPackageResource(getScope(), getName(), getLocale(), getStyle(),
 			getVariation());

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/request/resource/ICssPackageResource.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/ICssPackageResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/ICssPackageResource.java
new file mode 100644
index 0000000..cbb98a7
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/ICssPackageResource.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.resource;
+
+import org.apache.wicket.request.resource.caching.IStaticCacheableResource;
+import org.apache.wicket.util.resource.IResourceStream;
+
+/**
+ * Represents a css stylesheet package resource
+ */
+public interface ICssPackageResource extends IPackageResource
+{
+	// to be extended in the future
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/request/resource/IJavaScriptPackageResource.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/IJavaScriptPackageResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/IJavaScriptPackageResource.java
new file mode 100644
index 0000000..75f2316
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/IJavaScriptPackageResource.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.resource;
+
+/**
+ * Represents a javascript package resource
+ */
+public interface IJavaScriptPackageResource extends IPackageResource
+{
+	// to be extended in the future
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/request/resource/IPackageResource.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/IPackageResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/IPackageResource.java
new file mode 100644
index 0000000..8f6ad99
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/IPackageResource.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.resource;
+
+import org.apache.wicket.request.resource.caching.IStaticCacheableResource;
+import org.apache.wicket.util.resource.IResourceStream;
+
+/**
+ * Represents a localizable static resource.
+ */
+public interface IPackageResource extends IStaticCacheableResource
+{
+	/**
+	 * Gets the scoping class, used for class loading and to determine the package.
+	 *
+	 * @return the scoping class
+	 */
+	Class<?> getScope();
+
+	/**
+	 * Gets the style.
+	 *
+	 * @return the style
+	 */
+	String getStyle();
+
+	/**
+	 * locate resource stream for current resource
+	 *
+	 * @return resource stream or <code>null</code> if not found
+	 */
+	IResourceStream getResourceStream();
+
+	/**
+	 * @return whether {@link org.apache.wicket.resource.ITextResourceCompressor} 
+	 *         can be used to compress the resource.
+	 */
+	boolean isCompress();
+
+	/**
+	 * @param compress
+	 *            A flag indicating whether the resource should be compressed.
+	 */
+	void setCompress(boolean compress);
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java
index 210fee1..b317b8a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/JavaScriptPackageResource.java
@@ -26,7 +26,7 @@ import org.slf4j.LoggerFactory;
 /**
  * Package resource for javascript files. It strips comments and whitespace from javascript.
  */
-public class JavaScriptPackageResource extends PackageResource
+public class JavaScriptPackageResource extends PackageResource implements IJavaScriptPackageResource
 {
 	private static final long serialVersionUID = 1L;
 
@@ -57,7 +57,7 @@ public class JavaScriptPackageResource extends PackageResource
 
 		IJavaScriptCompressor compressor = getCompressor();
 
-		if (compressor != null && getCompress())
+		if (compressor != null && isCompress())
 		{
 			try
 			{

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/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..e1a7250 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
@@ -65,7 +65,7 @@ public class JavaScriptResourceReference extends PackageResourceReference
 	}
 
 	@Override
-	public JavaScriptPackageResource getResource()
+	public IJavaScriptPackageResource getResource()
 	{
 		return new JavaScriptPackageResource(getScope(), getName(), getLocale(), getStyle(),
 			getVariation());

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/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 640639b..9975f2e 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
@@ -61,7 +61,7 @@ import org.slf4j.LoggerFactory;
  * @author Juergen Donnerstag
  * @author Matej Knopp
  */
-public class PackageResource extends AbstractResource implements IStaticCacheableResource
+public class PackageResource extends AbstractResource implements IPackageResource
 {
 	private static final Logger log = LoggerFactory.getLogger(PackageResource.class);
 
@@ -171,9 +171,10 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl
 		return style != null ? style : Session.get().getStyle();
 	}
 
+	@Override
 	public Serializable getCacheKey()
 	{
-		IResourceStream stream = getCacheableResourceStream();
+		final IResourceStream stream = locateResourceStream(getCurrentStyle(), getCurrentLocale());
 
 		// if resource stream can not be found do not cache
 		if (stream == null)
@@ -185,21 +186,13 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl
 			stream.getVariation());
 	}
 
-	/**
-	 * Gets the scoping class, used for class loading and to determine the package.
-	 * 
-	 * @return the scoping class
-	 */
+	@Override
 	public final Class<?> getScope()
 	{
 		return WicketObjects.resolveClass(scopeName);
 	}
 
-	/**
-	 * Gets the style.
-	 * 
-	 * @return the style
-	 */
+	@Override
 	public final String getStyle()
 	{
 		return style;
@@ -339,34 +332,25 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl
 	 * @see org.apache.wicket.request.resource.caching.IStaticCacheableResource#getCacheableResourceStream()
 	 * @see #getResourceStream()
 	 */
+	@Override
 	public IResourceStream getCacheableResourceStream()
 	{
 		return internalGetResourceStream(getCurrentStyle(), getCurrentLocale());
 	}
 	
-	/**
-	 * locate resource stream for current resource
-	 * 
-	 * @return resource stream or <code>null</code> if not found
-	 */
+	@Override
 	public IResourceStream getResourceStream()
 	{
 		return internalGetResourceStream(style, locale);
 	}
 
-	/**
-	 * @return whether {@link org.apache.wicket.resource.ITextResourceCompressor} can be used to compress the
-	 *         resource.
-	 */
-	public boolean getCompress()
+	@Override
+	public boolean isCompress()
 	{
 		return compress;
 	}
 
-	/**
-	 * @param compress
-	 *            A flag indicating whether the resource should be compressed.
-	 */
+	@Override
 	public void setCompress(boolean compress)
 	{
 		this.compress = compress;
@@ -374,10 +358,7 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl
 
 	private IResourceStream internalGetResourceStream(final String style, final Locale locale)
 	{
-		IResourceStreamLocator resourceStreamLocator = Application.get()
-				.getResourceSettings()
-				.getResourceStreamLocator();
-		IResourceStream resourceStream = resourceStreamLocator.locate(getScope(), absolutePath, style, variation, locale, null, false);
+		IResourceStream resourceStream = locateResourceStream(style, locale);
 
 		Class<?> realScope = getScope();
 		String realPath = absolutePath;
@@ -415,6 +396,24 @@ public class PackageResource extends AbstractResource implements IStaticCacheabl
 	}
 
 	/**
+	 * locate resource stream taking style and locale into account
+	 * 
+	 * @param style
+	 *          client style
+	 * @param locale
+	 *           client locale
+	 * @return client-specific resource stream
+	 */
+	private IResourceStream locateResourceStream(final String style, final Locale locale)
+	{
+		IResourceStreamLocator resourceStreamLocator = Application.get()
+				.getResourceSettings()
+				.getResourceStreamLocator();
+		
+		return resourceStreamLocator.locate(getScope(), absolutePath, style, variation, locale, null, false);
+	}
+
+	/**
 	 * @param scope
 	 *            resource scope
 	 * @param path

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceDecorator.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceDecorator.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceDecorator.java
new file mode 100644
index 0000000..372dc8e
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceDecorator.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.resource;
+
+import java.io.Serializable;
+
+import org.apache.wicket.util.resource.IResourceStream;
+
+/**
+ * wraps an existing {@link org.apache.wicket.request.resource.IPackageResource} and 
+ * enables overriding of its public methods.
+ * 
+ * @autor Peter Ertl
+ */
+public class PackageResourceDecorator implements IPackageResource
+{
+	private final IPackageResource resource;
+
+	public PackageResourceDecorator(final IPackageResource resource)
+	{
+		this.resource = resource;
+	}
+
+	@Override
+	public Class<?> getScope()
+	{
+		return resource.getScope();
+	}
+
+	@Override
+	public String getStyle()
+	{
+		return resource.getStyle();
+	}
+
+	@Override
+	public IResourceStream getResourceStream()
+	{
+		return resource.getResourceStream();
+	}
+
+	@Override
+	public boolean isCompress()
+	{
+		return resource.isCompress();
+	}
+
+	@Override
+	public void setCompress(final boolean compress)
+	{
+		resource.setCompress(compress);
+	}
+
+	@Override
+	public Serializable getCacheKey()
+	{
+		return resource.getCacheKey();
+	}
+
+	@Override
+	public IResourceStream getCacheableResourceStream()
+	{
+		return resource.getCacheableResourceStream();
+	}
+
+	@Override
+	public void respond(final Attributes attributes)
+	{
+		resource.respond(attributes);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceReference.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceReference.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceReference.java
index 6becc8e..924555b 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceReference.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResourceReference.java
@@ -107,7 +107,7 @@ public class PackageResourceReference extends ResourceReference
 	 * @see org.apache.wicket.request.resource.ResourceReference#getResource()
 	 */
 	@Override
-	public PackageResource getResource()
+	public IPackageResource getResource()
 	{
 		final String extension = getExtension();
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/IStaticCacheableResource.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/IStaticCacheableResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/IStaticCacheableResource.java
index a861e27..09f74eb 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/IStaticCacheableResource.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/IStaticCacheableResource.java
@@ -34,8 +34,9 @@ public interface IStaticCacheableResource extends IResource
 	 * get unique caching key for the resource stream produced by
 	 * {@link #getCacheableResourceStream()}
 	 * 
-	 * @return serializable key with properly supports {@link #equals(Object)} and
-	 *         {@link #hashCode()}
+	 * @return serializable key with properly implements {@link #equals(Object)} and
+	 *         {@link #hashCode()} or {@code null} which indicates the resource
+	 *         must not be processed by {@link IResourceCachingStrategy}
 	 */
 	Serializable getCacheKey();
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/resource/NonCachingPackageResourceDecorator.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/resource/NonCachingPackageResourceDecorator.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/resource/NonCachingPackageResourceDecorator.java
new file mode 100644
index 0000000..ac4a8d7
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/resource/NonCachingPackageResourceDecorator.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.resource.caching.resource;
+
+import java.io.Serializable;
+
+import org.apache.wicket.request.resource.IPackageResource;
+import org.apache.wicket.request.resource.PackageResourceDecorator;
+
+/**
+ * wraps an existing {@link IPackageResource} and disables caching via 
+ * {@link org.apache.wicket.request.resource.caching.IResourceCachingStrategy}
+ * by returning {@code null} for the cache key in method 
+ * {@link org.apache.wicket.request.resource.caching.IStaticCacheableResource#getCacheKey()}
+ *
+ * @autor Peter Ertl
+ */
+public class NonCachingPackageResourceDecorator extends PackageResourceDecorator
+{
+	public NonCachingPackageResourceDecorator(final IPackageResource resource)
+	{
+		super(resource);
+	}
+
+	@Override
+	public Serializable getCacheKey()
+	{
+		// disable caching by returning null
+		return null;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/91c604d5/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/version/RequestCycleCachedResourceVersion.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/version/RequestCycleCachedResourceVersion.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/version/RequestCycleCachedResourceVersion.java
index dbcec9d..03bd350 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/version/RequestCycleCachedResourceVersion.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/caching/version/RequestCycleCachedResourceVersion.java
@@ -81,7 +81,7 @@ public class RequestCycleCachedResourceVersion implements IResourceVersion
 			key = resource.getCacheKey();
 
 			// does cache exist within current request cycle?
-			if (cache == null)
+			if (cache == null && key != null)
 			{
 				// no, so create it
 				requestCycle.setMetaData(CACHE_KEY, cache = Generics.newHashMap());