1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
/*
* 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.tomcat.util.descriptor.tld;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Objects;
import org.apache.tomcat.util.scan.Jar;
import org.apache.tomcat.util.scan.JarFactory;
/**
* A TLD Resource Path as defined in JSP 7.3.2.
* <p/>
* This encapsulates references to Tag Library Descriptors that can be located
* in different places:
* <ul>
* <li>As resources within an application</li>
* <li>As entries in JAR files included in the application</li>
* <li>As resources provided by the container</li>
* </ul>
* When configuring a mapping from a well-known URI to a TLD, a user is allowed
* to specify just the name of a JAR file that implicitly contains a TLD in
* <code>META-INF/taglib.tld</code>. Such a mapping must be explicitly converted
* to a URL and entryName when using this implementation.
*/
public class TldResourcePath {
private final URL url;
private final String webappPath;
private final String entryName;
/**
* Constructor identifying a TLD resource directly.
*
* @param url the location of the TLD
* @param webappPath the web application path, if any, of the TLD
*/
public TldResourcePath(URL url, String webappPath) {
this(url, webappPath, null);
}
/**
* Constructor identifying a TLD packaged within a JAR file.
*
* @param url the location of the JAR
* @param webappPath the web application path, if any, of the JAR
* @param entryName the name of the entry in the JAR
*/
public TldResourcePath(URL url, String webappPath, String entryName) {
this.url = url;
this.webappPath = webappPath;
this.entryName = entryName;
}
/**
* Returns the URL of the TLD or of the JAR containing the TLD.
*
* @return the URL of the TLD
*/
public URL getUrl() {
return url;
}
/**
* Returns the path within the web application, if any, that the resource
* returned by {@link #getUrl()} was obtained from.
*
* @return the web application path or @null if the the resource is not
* located within a web application
*/
public String getWebappPath() {
return webappPath;
}
/**
* Returns the name of the JAR entry that contains the TLD.
* May be null to indicate the URL refers directly to the TLD itself.
*
* @return the name of the JAR entry that contains the TLD
*/
public String getEntryName() {
return entryName;
}
/**
* Return the external form of the URL representing this TLD.
* This can be used as a canonical location for the TLD itself, for example,
* as the systemId to use when parsing its XML.
*
* @return the external form of the URL representing this TLD
*/
public String toExternalForm() {
if (entryName == null) {
return url.toExternalForm();
} else {
return "jar:" + url.toExternalForm() + "!/" + entryName;
}
}
/**
* Opens a stream to access the TLD.
*
* @return a stream containing the TLD content
* @throws IOException if there was a problem opening the stream
*/
public InputStream openStream() throws IOException {
if (entryName == null) {
return url.openStream();
} else {
URL entryUrl = JarFactory.getJarEntryURL(url, entryName);
return entryUrl.openStream();
}
}
public Jar getJar() throws IOException {
if (entryName == null) {
return null;
} else {
return JarFactory.newInstance(url);
}
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
TldResourcePath other = (TldResourcePath) o;
return url.equals(other.url) &&
Objects.equals(webappPath, other.webappPath) &&
Objects.equals(entryName, other.entryName);
}
@Override
public int hashCode() {
int result = url.hashCode();
result = result * 31 + Objects.hashCode(webappPath);
result = result * 31 + Objects.hashCode(entryName);
return result;
}
}
|