From c64f0b5a4b83ea764348e0c9203dc0ab1439b4c1 Mon Sep 17 00:00:00 2001 From: markt Date: Mon, 5 Jan 2009 19:20:11 +0000 Subject: [PATCH] Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=46471 Use the URL of the JAR as well as the path within the JAR to identify a tag file to keep tag file definitions unique. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@731651 13f79535-47bb-0310-9956-ffa450edef68 --- .../jasper/compiler/ImplicitTagLibraryInfo.java | 1 + java/org/apache/jasper/compiler/JspUtil.java | 34 +++++++++++- .../apache/jasper/compiler/ParserController.java | 20 +++++++- .../apache/jasper/compiler/TagFileProcessor.java | 60 ++++++++++++++++++++-- .../apache/jasper/compiler/TagLibraryInfoImpl.java | 7 ++- 5 files changed, 111 insertions(+), 11 deletions(-) diff --git a/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java b/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java index 318b44b01..049b0334a 100644 --- a/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java +++ b/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java @@ -194,6 +194,7 @@ class ImplicitTagLibraryInfo extends TagLibraryInfo { tagInfo = TagFileProcessor.parseTagFileDirectives(pc, shortName, path, + pc.getJspCompilationContext().getTagFileJarUrl(path), this); } catch (JasperException je) { throw new RuntimeException(je.toString(), je); diff --git a/java/org/apache/jasper/compiler/JspUtil.java b/java/org/apache/jasper/compiler/JspUtil.java index bbadd294a..e1ca665dd 100644 --- a/java/org/apache/jasper/compiler/JspUtil.java +++ b/java/org/apache/jasper/compiler/JspUtil.java @@ -26,7 +26,6 @@ import java.util.Vector; import java.util.jar.JarFile; import java.util.zip.ZipEntry; -import org.apache.jasper.Constants; import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; import org.xml.sax.Attributes; @@ -818,9 +817,31 @@ public class JspUtil { * * @return Fully-qualified class name of the tag handler corresponding to * the given tag file path + * + * @deprecated Use {@link #getTagHandlerClassName(String, String, + * ErrorDispatcher) + * See https://issues.apache.org/bugzilla/show_bug.cgi?id=46471 */ public static String getTagHandlerClassName(String path, ErrorDispatcher err) throws JasperException { + return getTagHandlerClassName(path, null, err); + } + + /** + * Gets the fully-qualified class name of the tag handler corresponding to + * the given tag file path. + * + * @param path + * Tag file path + * @param err + * Error dispatcher + * + * @return Fully-qualified class name of the tag handler corresponding to + * the given tag file path + */ + public static String getTagHandlerClassName(String path, String urn, + ErrorDispatcher err) throws JasperException { + String className = null; int begin = 0; @@ -848,7 +869,7 @@ public class JspUtil { } else { index = path.indexOf(META_INF_TAGS); if (index != -1) { - className = "org.apache.jsp.tag.meta."; + className = getClassNameBase(urn); begin = index + META_INF_TAGS.length(); } else { err.jspError("jsp.error.tagfile.illegalPath", path); @@ -860,6 +881,15 @@ public class JspUtil { return className; } + private static String getClassNameBase(String urn) { + StringBuffer base = new StringBuffer("org.apache.jsp.tag.meta."); + if (urn != null) { + base.append(makeJavaPackage(urn)); + base.append('.'); + } + return base.toString(); + } + /** * Converts the given path to a Java package or fully-qualified class name * diff --git a/java/org/apache/jasper/compiler/ParserController.java b/java/org/apache/jasper/compiler/ParserController.java index 50dc1d02b..999356f2e 100644 --- a/java/org/apache/jasper/compiler/ParserController.java +++ b/java/org/apache/jasper/compiler/ParserController.java @@ -144,15 +144,31 @@ class ParserController implements TagConstants { * This is invoked by the compiler * * @param inFileName The name of the tag file to be parsed. + * @deprecated Use {@link #parseTagFileDirectives(String, URL)} + * See https://issues.apache.org/bugzilla/show_bug.cgi?id=46471 */ public Node.Nodes parseTagFileDirectives(String inFileName) throws FileNotFoundException, JasperException, IOException { + return parseTagFileDirectives( + inFileName, ctxt.getTagFileJarUrl(inFileName)); + } + + /** + * Extracts tag file directive information from the given tag file. + * + * This is invoked by the compiler + * + * @param inFileName The name of the tag file to be parsed. + * @param tagFileJarUrl The location of the tag file. + */ + public Node.Nodes parseTagFileDirectives(String inFileName, + URL tagFileJarUrl) + throws FileNotFoundException, JasperException, IOException { boolean isTagFileSave = isTagFile; boolean directiveOnlySave = directiveOnly; isTagFile = true; directiveOnly = true; - Node.Nodes page = doParse(inFileName, null, - ctxt.getTagFileJarUrl(inFileName)); + Node.Nodes page = doParse(inFileName, null, tagFileJarUrl); directiveOnly = directiveOnlySave; isTagFile = isTagFileSave; return page; diff --git a/java/org/apache/jasper/compiler/TagFileProcessor.java b/java/org/apache/jasper/compiler/TagFileProcessor.java index bdd3bda74..f88704201 100644 --- a/java/org/apache/jasper/compiler/TagFileProcessor.java +++ b/java/org/apache/jasper/compiler/TagFileProcessor.java @@ -19,6 +19,8 @@ package org.apache.jasper.compiler; import java.io.FileNotFoundException; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; import java.net.URLClassLoader; import java.util.Iterator; import java.util.Vector; @@ -380,7 +382,8 @@ class TagFileProcessor { bodycontent = TagInfo.BODY_CONTENT_SCRIPTLESS; } - String tagClassName = JspUtil.getTagHandlerClassName(path, err); + String tagClassName = JspUtil.getTagHandlerClassName( + path, tagLibInfo.getReliableURN(), err); TagVariableInfo[] tagVariableInfos = new TagVariableInfo[variableVector .size()]; @@ -502,16 +505,46 @@ class TagFileProcessor { * @param tagLibInfo * the TagLibraryInfo object associated with this TagInfo * @return a TagInfo object assembled from the directives in the tag file. + * @deprecated Use {@link TagFileProcessor#parseTagFileDirectives( + * ParserController, String, String, URL, TagLibraryInfo)} + * See https://issues.apache.org/bugzilla/show_bug.cgi?id=46471 */ public static TagInfo parseTagFileDirectives(ParserController pc, String name, String path, TagLibraryInfo tagLibInfo) throws JasperException { + return parseTagFileDirectives(pc, name, path, + pc.getJspCompilationContext().getTagFileJarUrl(path), + tagLibInfo); + } + + /** + * Parses the tag file, and collects information on the directives included + * in it. The method is used to obtain the info on the tag file, when the + * handler that it represents is referenced. The tag file is not compiled + * here. + * + * @param pc + * the current ParserController used in this compilation + * @param name + * the tag name as specified in the TLD + * @param tagfile + * the path for the tagfile + * @param tagFileJarUrl + * the url for the Jar containign the tag file + * @param tagLibInfo + * the TagLibraryInfo object associated with this TagInfo + * @return a TagInfo object assembled from the directives in the tag file. + */ + public static TagInfo parseTagFileDirectives(ParserController pc, + String name, String path, URL tagFileJarUrl, TagLibraryInfo tagLibInfo) + throws JasperException { + ErrorDispatcher err = pc.getCompiler().getErrorDispatcher(); Node.Nodes page = null; try { - page = pc.parseTagFileDirectives(path); + page = pc.parseTagFileDirectives(path, tagFileJarUrl); } catch (FileNotFoundException e) { err.jspError("jsp.error.file.not.found", path); } catch (IOException e) { @@ -532,16 +565,33 @@ class TagFileProcessor { private Class loadTagFile(Compiler compiler, String tagFilePath, TagInfo tagInfo, PageInfo parentPageInfo) throws JasperException { + URL tagFileJarUrl = null; + if (tagFilePath.startsWith("/META-INF/")) { + try { + tagFileJarUrl = new URL("jar:" + + compiler.getCompilationContext().getTldLocation( + tagInfo.getTagLibrary().getURI())[0] + "!/"); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + String tagFileJarPath; + if (tagFileJarUrl == null) { + tagFileJarPath = ""; + } else { + tagFileJarPath = tagFileJarUrl.toString(); + } + JspCompilationContext ctxt = compiler.getCompilationContext(); JspRuntimeContext rctxt = ctxt.getRuntimeContext(); - JspServletWrapper wrapper = rctxt.getWrapper(tagFilePath); + JspServletWrapper wrapper = rctxt.getWrapper(tagFileJarPath + tagFilePath); synchronized (rctxt) { if (wrapper == null) { wrapper = new JspServletWrapper(ctxt.getServletContext(), ctxt .getOptions(), tagFilePath, tagInfo, ctxt - .getRuntimeContext(), ctxt.getTagFileJarUrl(tagFilePath)); - rctxt.addWrapper(tagFilePath, wrapper); + .getRuntimeContext(), tagFileJarUrl); + rctxt.addWrapper(tagFileJarPath + tagFilePath, wrapper); // Use same classloader and classpath for compiling tag files wrapper.getJspEngineContext().setClassLoader( diff --git a/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java b/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java index 3f7351a5e..ad67f4c41 100644 --- a/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java +++ b/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java @@ -478,13 +478,16 @@ class TagLibraryInfoImpl extends TagLibraryInfo implements TagConstants { if (path.startsWith("/META-INF/tags")) { // Tag file packaged in JAR + // See https://issues.apache.org/bugzilla/show_bug.cgi?id=46471 + // This needs to be removed once all the broken code that depends on + // it has been removed ctxt.setTagFileJarUrl(path, jarFileUrl); } else if (!path.startsWith("/WEB-INF/tags")) { err.jspError("jsp.error.tagfile.illegalPath", path); } TagInfo tagInfo = TagFileProcessor.parseTagFileDirectives( - parserController, name, path, this); + parserController, name, path, jarFileUrl, this); return new TagFileInfo(name, path, tagInfo); } @@ -686,7 +689,7 @@ class TagLibraryInfoImpl extends TagLibraryInfo implements TagConstants { } else if ("param-value".equals(tname)) { initParam[1] = element.getBody(); } else if ("description".equals(tname)) { - ; // Do nothing + // Do nothing } else { if (log.isWarnEnabled()) { log.warn(Localizer.getMessage( -- 2.11.0