WICKET-5429 ResourceReference's properties are not preserved when using reference replacement
(cherry picked from commit 2ced99eac4f85c9c59be978b198a9368aeaeff20) Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/46d768cc Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/46d768cc Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/46d768cc Branch: refs/heads/sandbox/WICKET-4686 Commit: 46d768cc2def47c358248bfc7d0afc0b54f36412 Parents: dc5fe23 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Tue Dec 17 12:25:11 2013 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Tue Dec 17 12:28:24 2013 +0200 ---------------------------------------------------------------------- .../wicket/markup/head/ResourceAggregator.java | 98 ++++++++++++++++++++ .../wicket/protocol/http/WebApplication.java | 5 +- .../ReplacementResourceBundleReference.java | 42 +++++++++ 3 files changed, 143 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/46d768cc/wicket-core/src/main/java/org/apache/wicket/markup/head/ResourceAggregator.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/ResourceAggregator.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/ResourceAggregator.java index e235551..c09fce6 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/ResourceAggregator.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/ResourceAggregator.java @@ -31,7 +31,9 @@ import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.behavior.Behavior; import org.apache.wicket.markup.html.DecoratingHeaderResponse; import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.resource.ResourceReference; import org.apache.wicket.resource.CircularDependencyException; +import org.apache.wicket.resource.bundles.ReplacementResourceBundleReference; import org.apache.wicket.util.lang.Classes; /** @@ -408,10 +410,106 @@ public class ResourceAggregator extends DecoratingHeaderResponse { return item; } + + bundle = preserveDetails(item, bundle); + if (item instanceof IWrappedHeaderItem) { bundle = ((IWrappedHeaderItem)item).wrap(bundle); } return bundle; } + + /** + * Preserves the resource reference details for resource replacements. + * + * For example if CSS resource with media <em>screen</em> is replaced with + * {@link org.apache.wicket.protocol.http.WebApplication#addResourceReplacement(org.apache.wicket.request.resource.CssResourceReference, org.apache.wicket.request.resource.ResourceReference)} then the replacement will + * will inherit the media attribute + * + * @param item The replaced header item + * @param bundle The bundle that represents the replacement + * @return the bundle with the preserved details + */ + protected HeaderItem preserveDetails(HeaderItem item, HeaderItem bundle) + { + HeaderItem resultBundle; + if (item instanceof CssReferenceHeaderItem && bundle instanceof CssReferenceHeaderItem) + { + CssReferenceHeaderItem originalHeaderItem = (CssReferenceHeaderItem) item; + resultBundle = preserveCssDetails(originalHeaderItem, (CssReferenceHeaderItem) bundle); + } + else if (item instanceof JavaScriptReferenceHeaderItem && bundle instanceof JavaScriptReferenceHeaderItem) + { + JavaScriptReferenceHeaderItem originalHeaderItem = (JavaScriptReferenceHeaderItem) item; + resultBundle = preserveJavaScriptDetails(originalHeaderItem, (JavaScriptReferenceHeaderItem) bundle); + } + else + { + resultBundle = bundle; + } + + return resultBundle; + } + + /** + * Preserves the resource reference details for JavaScript resource replacements. + * + * For example if CSS resource with media <em>screen</em> is replaced with + * {@link org.apache.wicket.protocol.http.WebApplication#addResourceReplacement(org.apache.wicket.request.resource.JavaScriptResourceReference, org.apache.wicket.request.resource.ResourceReference)} then the replacement will + * will inherit the media attribute + * + * @param item The replaced header item + * @param bundle The bundle that represents the replacement + * @return the bundle with the preserved details + */ + private HeaderItem preserveJavaScriptDetails(JavaScriptReferenceHeaderItem item, JavaScriptReferenceHeaderItem bundle) + { + HeaderItem resultBundle; + ResourceReference bundleReference = bundle.getReference(); + if (bundleReference instanceof ReplacementResourceBundleReference) + { + resultBundle = JavaScriptHeaderItem.forReference(bundleReference, + item.getPageParameters(), + item.getId(), + item.isDefer(), + item.getCharset(), + item.getCondition() + ); + } + else + { + resultBundle = bundle; + } + return resultBundle; + } + + /** + * Preserves the resource reference details for CSS resource replacements. + * + * For example if CSS resource with media <em>screen</em> is replaced with + * {@link org.apache.wicket.protocol.http.WebApplication#addResourceReplacement(org.apache.wicket.request.resource.CssResourceReference, org.apache.wicket.request.resource.ResourceReference)} then the replacement will + * will inherit the media attribute + * + * @param item The replaced header item + * @param bundle The bundle that represents the replacement + * @return the bundle with the preserved details + */ + protected HeaderItem preserveCssDetails(CssReferenceHeaderItem item, CssReferenceHeaderItem bundle) + { + HeaderItem resultBundle; + ResourceReference bundleReference = bundle.getReference(); + if (bundleReference instanceof ReplacementResourceBundleReference) + { + resultBundle = CssHeaderItem.forReference(bundleReference, + item.getPageParameters(), + item.getMedia(), + item.getCondition()); + } + else + { + resultBundle = bundle; + } + return resultBundle; + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/46d768cc/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java index 22bbfda..b8cd025 100644 --- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java +++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java @@ -66,6 +66,7 @@ import org.apache.wicket.request.mapper.mount.MountMapper; import org.apache.wicket.request.resource.CssResourceReference; import org.apache.wicket.request.resource.JavaScriptResourceReference; import org.apache.wicket.request.resource.ResourceReference; +import org.apache.wicket.resource.bundles.ReplacementResourceBundleReference; import org.apache.wicket.resource.bundles.ResourceBundleReference; import org.apache.wicket.session.HttpSessionStore; import org.apache.wicket.session.ISessionStore; @@ -407,7 +408,7 @@ public abstract class WebApplication extends Application public final void addResourceReplacement(JavaScriptResourceReference base, ResourceReference replacement) { - ResourceBundleReference bundle = new ResourceBundleReference(replacement); + ReplacementResourceBundleReference bundle = new ReplacementResourceBundleReference(replacement); bundle.addProvidedResources(JavaScriptHeaderItem.forReference(base)); getResourceBundles().addBundle(JavaScriptHeaderItem.forReference(bundle)); } @@ -428,7 +429,7 @@ public abstract class WebApplication extends Application public final void addResourceReplacement(CssResourceReference base, ResourceReference replacement) { - ResourceBundleReference bundle = new ResourceBundleReference(replacement); + ReplacementResourceBundleReference bundle = new ReplacementResourceBundleReference(replacement); bundle.addProvidedResources(CssHeaderItem.forReference(base)); getResourceBundles().addBundle(CssHeaderItem.forReference(bundle)); } http://git-wip-us.apache.org/repos/asf/wicket/blob/46d768cc/wicket-core/src/main/java/org/apache/wicket/resource/bundles/ReplacementResourceBundleReference.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/resource/bundles/ReplacementResourceBundleReference.java b/wicket-core/src/main/java/org/apache/wicket/resource/bundles/ReplacementResourceBundleReference.java new file mode 100644 index 0000000..08b6610 --- /dev/null +++ b/wicket-core/src/main/java/org/apache/wicket/resource/bundles/ReplacementResourceBundleReference.java @@ -0,0 +1,42 @@ +/* + * 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.resource.bundles; + +import org.apache.wicket.request.resource.ResourceReference; + +/** + * An extension of ResourceBundleReference that is used especially + * for resource replacements + * + * @see org.apache.wicket.protocol.http.WebApplication#addResourceReplacement(org.apache.wicket.request.resource.CssResourceReference, org.apache.wicket.request.resource.ResourceReference) + * @see org.apache.wicket.protocol.http.WebApplication#addResourceReplacement(org.apache.wicket.request.resource.JavaScriptResourceReference, org.apache.wicket.request.resource.ResourceReference) + * @since 6.13 + */ +public class ReplacementResourceBundleReference extends ResourceBundleReference +{ + private static final long serialVersionUID = 1L; + + /** + * Creates a new bundle reference from the given reference. + * + * @param bundleRef + */ + public ReplacementResourceBundleReference(ResourceReference bundleRef) + { + super(bundleRef); + } +}
