001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.wicket.markup.head; 018 019import java.util.Arrays; 020import java.util.Collections; 021import java.util.List; 022 023import org.apache.wicket.request.IRequestHandler; 024import org.apache.wicket.request.Response; 025import org.apache.wicket.request.cycle.RequestCycle; 026import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler; 027import org.apache.wicket.request.mapper.parameter.PageParameters; 028import org.apache.wicket.request.resource.ResourceReference; 029import org.apache.wicket.resource.bundles.IResourceBundle; 030import org.apache.wicket.util.lang.Args; 031import org.apache.wicket.util.string.Strings; 032 033/** 034 * {@link HeaderItem} for script tags that are rendered using a {@link ResourceReference}. 035 * 036 * @author papegaaij 037 */ 038public class JavaScriptReferenceHeaderItem extends AbstractJavaScriptReferenceHeaderItem 039 implements 040 IReferenceHeaderItem 041{ 042 private final ResourceReference reference; 043 private final PageParameters pageParameters; 044 045 /** 046 * Creates a new {@code JavaScriptReferenceHeaderItem}. 047 * 048 * @param reference 049 * resource reference pointing to the javascript resource 050 * @param pageParameters 051 * the parameters for this Javascript resource reference 052 * @param id 053 * id that will be used to filter duplicate reference (it's still filtered by URL 054 * too) 055 */ 056 public JavaScriptReferenceHeaderItem(ResourceReference reference, PageParameters pageParameters, String id) 057 { 058 this.reference = Args.notNull(reference, "reference"); 059 this.pageParameters = pageParameters; 060 setId(id); 061 } 062 063 /** 064 * @return the resource reference pointing to the javascript resource 065 */ 066 @Override 067 public ResourceReference getReference() 068 { 069 return reference; 070 } 071 072 /** 073 * @return the parameters for this Javascript resource reference 074 */ 075 public PageParameters getPageParameters() 076 { 077 return pageParameters; 078 } 079 080 @Override 081 public List<HeaderItem> getDependencies() 082 { 083 return getReference().getDependencies(); 084 } 085 086 @Override 087 public Iterable<? extends HeaderItem> getProvidedResources() 088 { 089 if (getReference() instanceof IResourceBundle) 090 return ((IResourceBundle)getReference()).getProvidedResources(); 091 return super.getProvidedResources(); 092 } 093 094 @Override 095 public void render(Response response) 096 { 097 internalRenderJavaScriptReference(response, getUrl()); 098 } 099 100 @Override 101 public Iterable<?> getRenderTokens() 102 { 103 String url = Strings.stripJSessionId(getUrl()); 104 if (Strings.isEmpty(getId())) 105 return Collections.singletonList("javascript-" + url); 106 else 107 return Arrays.asList("javascript-" + getId(), "javascript-" + url); 108 } 109 110 @Override 111 public String toString() 112 { 113 return "JavaScriptReferenceHeaderItem(" + getReference() + ", " + getPageParameters() + ')'; 114 } 115 116 private String getUrl() 117 { 118 IRequestHandler handler = new ResourceReferenceRequestHandler(getReference(), 119 getPageParameters()); 120 return RequestCycle.get().urlFor(handler).toString(); 121 } 122 123 @Override 124 public int hashCode() 125 { 126 // Not using `Objects.hash` for performance reasons 127 int result = super.hashCode(); 128 result = 31 * result + (reference != null ? reference.hashCode() : 0); 129 result = 31 * result + (pageParameters != null ? pageParameters.hashCode() : 0); 130 return result; 131 } 132 133 @Override 134 public boolean equals(Object o) 135 { 136 if (this == o) return true; 137 if (o == null || getClass() != o.getClass()) return false; 138 if (!super.equals(o)) return false; 139 JavaScriptReferenceHeaderItem that = (JavaScriptReferenceHeaderItem) o; 140 return java.util.Objects.equals(reference, that.reference) && 141 java.util.Objects.equals(pageParameters, that.pageParameters); 142 } 143}