Author: mgrigorov Date: Wed Oct 26 13:20:06 2011 New Revision: 1189195 URL: http://svn.apache.org/viewvc?rev=1189195&view=rev Log: WICKET-4161 AbstractResourceAggregatingHeaderResponse does not order javascript properly
Make it possible to group js/css url or content, not just resource references. Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/ResourceUtil.java wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/AbstractDependencyRespectingResourceAggregatingHeaderResponse.java wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/AbstractResourceAggregatingHeaderResponse.java wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/ResourceReferenceAndStringData.java wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/ResourceUtil.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/ResourceUtil.java?rev=1189195&r1=1189194&r2=1189195&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/ResourceUtil.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/ResourceUtil.java Wed Oct 26 13:20:06 2011 @@ -22,7 +22,9 @@ import java.nio.charset.Charset; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.markup.html.IHeaderResponse; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.ResourceReference; +import org.apache.wicket.resource.aggregation.ResourceReferenceAndStringData; import org.apache.wicket.util.io.IOUtils; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.ResourceStreamNotFoundException; @@ -53,7 +55,9 @@ public class ResourceUtil * @param string * the string argument to pass to those methods that accept it (js = id / css = * media) + * @deprecated Will be removed in the next major release */ + @Deprecated public static void renderTo(IHeaderResponse resp, ResourceReference ref, boolean css, String string) { @@ -82,6 +86,60 @@ public class ResourceUtil } /** + * Helper that calls the proper IHeaderResponse.render*Reference method based on the input. + * + * @param resp + * the response to call render*Reference methods on + * @param data + */ + // TODO Wicket.next - make this method work with an improved version of +// ResourceReferenceAndStringData + public static void renderTo(IHeaderResponse resp, ResourceReferenceAndStringData data) + { + boolean css = data.isCss(); + ResourceReference reference = data.getReference(); + PageParameters parameters = data.getParameters(); + String idOrMedia = data.getIdOrMedia(); + CharSequence content = data.getContent(); + + if (css) + { + String condition = data.getCssCondition(); + + if (Strings.isEmpty(content) == false) + { + resp.renderCSS(content, idOrMedia); + } + else if (reference == null) + { + resp.renderCSSReference(data.getUrl(), idOrMedia, condition); + } + else + { + resp.renderCSSReference(reference, parameters, idOrMedia, condition); + } + } + else + { + boolean defer = data.isJsDefer(); + String charset = data.getCharset(); + + if (Strings.isEmpty(content) == false) + { + resp.renderJavaScript(content, idOrMedia); + } + else if (reference == null) + { + resp.renderJavaScriptReference(data.getUrl(), idOrMedia, defer, charset); + } + else + { + resp.renderJavaScriptReference(reference, parameters, idOrMedia, defer, charset); + } + } + } + + /** * read string with platform default encoding from resource stream * * @param resourceStream Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/AbstractDependencyRespectingResourceAggregatingHeaderResponse.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/AbstractDependencyRespectingResourceAggregatingHeaderResponse.java?rev=1189195&r1=1189194&r2=1189195&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/AbstractDependencyRespectingResourceAggregatingHeaderResponse.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/AbstractDependencyRespectingResourceAggregatingHeaderResponse.java Wed Oct 26 13:20:06 2011 @@ -80,10 +80,11 @@ public abstract class AbstractDependency } private static ResourceReferenceAndStringData toData( - AbstractResourceDependentResourceReference child) + AbstractResourceDependentResourceReference reference) { - boolean css = ResourceType.CSS.equals(child.getResourceType()); - String string = css ? child.getMedia() : child.getUniqueId(); - return new ResourceReferenceAndStringData(child, string, css); + boolean css = ResourceType.CSS.equals(reference.getResourceType()); + String string = css ? reference.getMedia() : reference.getUniqueId(); + return new ResourceReferenceAndStringData(reference, null, null, string, css, false, null, + null); } } Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/AbstractResourceAggregatingHeaderResponse.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/AbstractResourceAggregatingHeaderResponse.java?rev=1189195&r1=1189194&r2=1189195&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/AbstractResourceAggregatingHeaderResponse.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/AbstractResourceAggregatingHeaderResponse.java Wed Oct 26 13:20:06 2011 @@ -27,6 +27,8 @@ import java.util.TreeMap; import org.apache.wicket.markup.html.DecoratingHeaderResponse; import org.apache.wicket.markup.html.IHeaderResponse; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.request.resource.IResource; import org.apache.wicket.request.resource.ResourceReference; import org.apache.wicket.resource.ResourceUtil; @@ -74,25 +76,29 @@ public abstract class AbstractResourceAg @Override public void renderJavaScriptReference(ResourceReference reference) { - topLevelReferences.add(new ResourceReferenceAndStringData(reference, null, false)); + topLevelReferences.add(new ResourceReferenceAndStringData(reference, null, null, null, + false, false, null, null)); } @Override public void renderJavaScriptReference(ResourceReference reference, String id) { - topLevelReferences.add(new ResourceReferenceAndStringData(reference, id, false)); + topLevelReferences.add(new ResourceReferenceAndStringData(reference, null, null, id, false, + false, null, null)); } @Override public void renderCSSReference(ResourceReference reference) { - topLevelReferences.add(new ResourceReferenceAndStringData(reference, null, true)); + topLevelReferences.add(new ResourceReferenceAndStringData(reference, null, null, null, + true, false, null, null)); } @Override public void renderCSSReference(ResourceReference reference, String media) { - topLevelReferences.add(new ResourceReferenceAndStringData(reference, media, true)); + topLevelReferences.add(new ResourceReferenceAndStringData(reference, null, null, media, + true, false, null, null)); } @Override @@ -188,7 +194,7 @@ public abstract class AbstractResourceAg * to render your collection how you want to render them. * * For instance, if you want to aggregate your groups into a single HTTP request, you can - * override this method, create the URL to your aggregation servlet (or {@link Resource}), and + * override this method, create the URL to your aggregation servlet (or {@link IResource}), and * then call <tt>getRealResponse().renderJavaScriptReference(yourUrl)</tt>, or the appropriate * method to render the URL for a group of CSS references. * @@ -239,8 +245,7 @@ public abstract class AbstractResourceAg */ protected void render(ResourceReferenceAndStringData data) { - ResourceUtil.renderTo(getRealResponse(), data.getReference(), data.isCss(), - data.getString()); + ResourceUtil.renderTo(getRealResponse(), data); } /** @@ -265,29 +270,102 @@ public abstract class AbstractResourceAg @Override public void renderJavaScriptReference(String url) { - // TODO: can we aggregate this? probably shouldn't... - getRealResponse().renderJavaScriptReference(url); + topLevelReferences.add(new ResourceReferenceAndStringData(null, null, url, null, false, + false, null, null)); } @Override public void renderJavaScriptReference(String url, String id) { - // TODO: can we aggregate this? probably shouldn't... - getRealResponse().renderJavaScriptReference(url, id); + topLevelReferences.add(new ResourceReferenceAndStringData(null, null, url, id, false, + false, null, null)); } @Override public void renderCSSReference(String url) { - // TODO: can we aggregate this? probably shouldn't... - getRealResponse().renderCSSReference(url); + topLevelReferences.add(new ResourceReferenceAndStringData(null, null, url, null, true, + false, null, null)); } @Override public void renderCSSReference(String url, String media) { - // TODO: can we aggregate this? probably shouldn't... - getRealResponse().renderCSSReference(url, media); + topLevelReferences.add(new ResourceReferenceAndStringData(null, null, url, media, true, + false, null, null)); + } + + @Override + public void renderJavaScriptReference(ResourceReference reference, PageParameters parameters, + String id) + { + topLevelReferences.add(new ResourceReferenceAndStringData(reference, parameters, null, id, + false, false, null, null)); + } + + @Override + public void renderJavaScriptReference(ResourceReference reference, PageParameters parameters, + String id, boolean defer) + { + topLevelReferences.add(new ResourceReferenceAndStringData(reference, parameters, null, id, + false, defer, null, null)); + } + + @Override + public void renderJavaScriptReference(ResourceReference reference, PageParameters parameters, + String id, boolean defer, String charset) + { + topLevelReferences.add(new ResourceReferenceAndStringData(reference, parameters, null, id, + false, defer, charset, null)); + } + + @Override + public void renderJavaScriptReference(String url, String id, boolean defer) + { + topLevelReferences.add(new ResourceReferenceAndStringData(null, null, url, null, false, + defer, null, null)); + } + + @Override + public void renderJavaScriptReference(String url, String id, boolean defer, String charset) + { + topLevelReferences.add(new ResourceReferenceAndStringData(null, null, url, id, false, + defer, charset, null)); + } + + @Override + public void renderJavaScript(CharSequence javascript, String id) + { + topLevelReferences.add(new ResourceReferenceAndStringData(javascript, false, id)); + } + + @Override + public void renderCSS(CharSequence css, String media) + { + topLevelReferences.add(new ResourceReferenceAndStringData(css, true, media)); + } + + @Override + public void renderCSSReference(ResourceReference reference, PageParameters pageParameters, + String media) + { + topLevelReferences.add(new ResourceReferenceAndStringData(reference, pageParameters, null, + media, true, false, null, null)); + } + + @Override + public void renderCSSReference(ResourceReference reference, PageParameters pageParameters, + String media, String condition) + { + topLevelReferences.add(new ResourceReferenceAndStringData(reference, null, null, media, + true, false, null, condition)); + } + + @Override + public void renderCSSReference(String url, String media, String condition) + { + topLevelReferences.add(new ResourceReferenceAndStringData(null, null, url, media, true, + false, null, condition)); } } Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/ResourceReferenceAndStringData.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/ResourceReferenceAndStringData.java?rev=1189195&r1=1189194&r2=1189195&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/ResourceReferenceAndStringData.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/resource/aggregation/ResourceReferenceAndStringData.java Wed Oct 26 13:20:06 2011 @@ -16,6 +16,7 @@ */ package org.apache.wicket.resource.aggregation; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.ResourceReference; /** @@ -30,25 +31,88 @@ import org.apache.wicket.request.resourc * * @author Jeremy Thomerson */ +// TODO Wicket.next - Improve this class by splitting it in more specialized ones (one for JS, +// another for CSS, ...) public class ResourceReferenceAndStringData { private final ResourceReference reference; - private final String string; - private final boolean css; + private final PageParameters parameters; + private final String url; + private final String idOrMedia; + private final boolean isCss; + private final boolean jsDefer; + private final String charset; + private final String cssCondition; + private final CharSequence content; /** - * Construct with fields. + * Construct. * * @param reference - * @param string - * @param css + * @param parameters + * @param url + * @param idOrMedia + * @param isCss + * @param jsDefer + * @param charset + * @param cssCondition */ - public ResourceReferenceAndStringData(ResourceReference reference, String string, boolean css) + public ResourceReferenceAndStringData(ResourceReference reference, PageParameters parameters, + String url, String idOrMedia, boolean isCss, boolean jsDefer, String charset, + String cssCondition) { - super(); this.reference = reference; - this.string = string; - this.css = css; + this.parameters = parameters; + this.url = url; + this.idOrMedia = idOrMedia; + this.isCss = isCss; + this.jsDefer = jsDefer; + this.charset = charset; + this.cssCondition = cssCondition; + content = null; + } + + /** + * Construct. + * + * @param reference + * @param idOrMedia + * @param isCss + * @deprecated use the other constructors instead + */ + @Deprecated + public ResourceReferenceAndStringData(ResourceReference reference, String idOrMedia, + boolean isCss) + { + this.reference = reference; + parameters = null; + url = null; + this.idOrMedia = idOrMedia; + this.isCss = isCss; + jsDefer = false; + charset = null; + cssCondition = null; + content = null; + } + + /** + * Construct. + * + * @param content + * @param isCss + * @param idOrMedia + */ + public ResourceReferenceAndStringData(CharSequence content, boolean isCss, String idOrMedia) + { + this.content = content; + this.isCss = isCss; + reference = null; + parameters = null; + url = null; + this.idOrMedia = idOrMedia; + jsDefer = false; + charset = null; + cssCondition = null; } /** @@ -60,11 +124,37 @@ public class ResourceReferenceAndStringD } /** + * @return the parameters for the resource reference + */ + public PageParameters getParameters() + { + return parameters; + } + + /** + * @return the resource reference that the user rendered + */ + public String getUrl() + { + return url; + } + + /** + * @return the string representing media (if this isCss()), or id (if not, meaning it's js) + */ + public String getIdOrMedia() + { + return idOrMedia; + } + + /** * @return the string representing media (if this isCss()), or id (if not, meaning it's js) + * @deprecated use {@link #getIdOrMedia()} instead */ + @Deprecated public String getString() { - return string; + return getIdOrMedia(); } /** @@ -72,7 +162,39 @@ public class ResourceReferenceAndStringD */ public boolean isCss() { - return css; + return isCss; + } + + /** + * @return whether the script should be deferred + */ + public boolean isJsDefer() + { + return jsDefer; + } + + /** + * @return the charset to use when loading the script + */ + public String getCharset() + { + return charset; + } + + /** + * @return the IE CSS condition + */ + public String getCssCondition() + { + return cssCondition; + } + + /** + * @return inline content of CSS or JS contribution + */ + public CharSequence getContent() + { + return content; } @Override @@ -80,9 +202,15 @@ public class ResourceReferenceAndStringD { final int prime = 31; int result = 1; - result = prime * result + (css ? 1231 : 1237); + result = prime * result + ((charset == null) ? 0 : charset.hashCode()); + result = prime * result + ((content == null) ? 0 : content.hashCode()); + result = prime * result + ((cssCondition == null) ? 0 : cssCondition.hashCode()); + result = prime * result + ((idOrMedia == null) ? 0 : idOrMedia.hashCode()); + result = prime * result + (isCss ? 1231 : 1237); + result = prime * result + (jsDefer ? 1231 : 1237); + result = prime * result + ((parameters == null) ? 0 : parameters.hashCode()); result = prime * result + ((reference == null) ? 0 : reference.hashCode()); - result = prime * result + ((string == null) ? 0 : string.hashCode()); + result = prime * result + ((url == null) ? 0 : url.hashCode()); return result; } @@ -96,7 +224,44 @@ public class ResourceReferenceAndStringD if (getClass() != obj.getClass()) return false; ResourceReferenceAndStringData other = (ResourceReferenceAndStringData)obj; - if (css != other.css) + if (charset == null) + { + if (other.charset != null) + return false; + } + else if (!charset.equals(other.charset)) + return false; + if (content == null) + { + if (other.content != null) + return false; + } + else if (!content.equals(other.content)) + return false; + if (cssCondition == null) + { + if (other.cssCondition != null) + return false; + } + else if (!cssCondition.equals(other.cssCondition)) + return false; + if (idOrMedia == null) + { + if (other.idOrMedia != null) + return false; + } + else if (!idOrMedia.equals(other.idOrMedia)) + return false; + if (isCss != other.isCss) + return false; + if (jsDefer != other.jsDefer) + return false; + if (parameters == null) + { + if (other.parameters != null) + return false; + } + else if (!parameters.equals(other.parameters)) return false; if (reference == null) { @@ -105,12 +270,12 @@ public class ResourceReferenceAndStringD } else if (!reference.equals(other.reference)) return false; - if (string == null) + if (url == null) { - if (other.string != null) + if (other.url != null) return false; } - else if (!string.equals(other.string)) + else if (!url.equals(other.url)) return false; return true; } @@ -118,7 +283,9 @@ public class ResourceReferenceAndStringD @Override public String toString() { - return "ResourceReferenceAndStringData [reference=" + reference + ", string=" + string + - ", css=" + css + "]"; + return "ResourceReferenceAndStringData [reference=" + reference + ", parameters=" + + parameters + ", url=" + url + ", idOrMedia=" + idOrMedia + ", isCss=" + isCss + + ", jsDefer=" + jsDefer + ", charset=" + charset + ", cssCondition=" + cssCondition + + ", content=" + content + "]"; } } \ No newline at end of file Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java?rev=1189195&r1=1189194&r2=1189195&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java (original) +++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java Wed Oct 26 13:20:06 2011 @@ -112,7 +112,7 @@ public class DecoratingHeaderResponseTes @Override protected Integer newGroupingKey(ResourceReferenceAndStringData ref) { - return Integer.parseInt(ref.getString()) % 2; + return Integer.parseInt(ref.getIdOrMedia()) % 2; } }; }