You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2015/05/06 16:45:02 UTC

svn commit: r1678011 - /tomcat/trunk/java/org/apache/jasper/compiler/TagFileProcessor.java

Author: markt
Date: Wed May  6 14:45:02 2015
New Revision: 1678011

URL: http://svn.apache.org/r1678011
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=57887
Fix compilation for recursive tag files packaged in a JAR

Modified:
    tomcat/trunk/java/org/apache/jasper/compiler/TagFileProcessor.java

Modified: tomcat/trunk/java/org/apache/jasper/compiler/TagFileProcessor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/TagFileProcessor.java?rev=1678011&r1=1678010&r2=1678011&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/compiler/TagFileProcessor.java (original)
+++ tomcat/trunk/java/org/apache/jasper/compiler/TagFileProcessor.java Wed May  6 14:45:02 2015
@@ -517,6 +517,7 @@ class TagFileProcessor {
             TagInfo tagInfo, PageInfo parentPageInfo) throws JasperException {
 
         Jar tagJar = null;
+        Jar tagJarOriginal = null;
         try {
             if (tagFilePath.startsWith("/META-INF/")) {
                 try {
@@ -537,75 +538,83 @@ class TagFileProcessor {
             JspRuntimeContext rctxt = ctxt.getRuntimeContext();
 
             synchronized (rctxt) {
-                JspServletWrapper wrapper = rctxt.getWrapper(wrapperUri);
-                if (wrapper == null) {
-                    wrapper = new JspServletWrapper(ctxt.getServletContext(), ctxt
-                            .getOptions(), tagFilePath, tagInfo, ctxt
-                            .getRuntimeContext(), tagJar);
-                    rctxt.addWrapper(wrapperUri, wrapper);
-
-                    // Use same classloader and classpath for compiling tag files
-                    wrapper.getJspEngineContext().setClassLoader(
-                            ctxt.getClassLoader());
-                    wrapper.getJspEngineContext().setClassPath(ctxt.getClassPath());
-                } else {
-                    // Make sure that JspCompilationContext gets the latest TagInfo
-                    // for the tag file. TagInfo instance was created the last
-                    // time the tag file was scanned for directives, and the tag
-                    // file may have been modified since then.
-                    wrapper.getJspEngineContext().setTagInfo(tagInfo);
-                    // The tagJar passed to to the JspCompilationContext will
-                    // have been closed (see the finally block at the end of
-                    // this method) so update the the tagJar to one opened above
-                    wrapper.getJspEngineContext().setTagFileJar(tagJar);
-                }
-
-                Class<?> tagClazz;
-                int tripCount = wrapper.incTripCount();
+                JspServletWrapper wrapper = null;
                 try {
-                    if (tripCount > 0) {
-                        // When tripCount is greater than zero, a circular
-                        // dependency exists. The circularly dependent tag
-                        // file is compiled in prototype mode, to avoid infinite
-                        // recursion.
-
-                        JspServletWrapper tempWrapper = new JspServletWrapper(ctxt
-                                .getServletContext(), ctxt.getOptions(),
-                                tagFilePath, tagInfo, ctxt.getRuntimeContext(),
-                                tagJar);
+                    wrapper = rctxt.getWrapper(wrapperUri);
+                    if (wrapper == null) {
+                        wrapper = new JspServletWrapper(ctxt.getServletContext(), ctxt
+                                .getOptions(), tagFilePath, tagInfo, ctxt
+                                .getRuntimeContext(), tagJar);
+                        rctxt.addWrapper(wrapperUri, wrapper);
+
                         // Use same classloader and classpath for compiling tag files
-                        tempWrapper.getJspEngineContext().setClassLoader(
+                        wrapper.getJspEngineContext().setClassLoader(
                                 ctxt.getClassLoader());
-                        tempWrapper.getJspEngineContext().setClassPath(ctxt.getClassPath());
-                        tagClazz = tempWrapper.loadTagFilePrototype();
-                        tempVector.add(tempWrapper.getJspEngineContext()
-                                .getCompiler());
+                        wrapper.getJspEngineContext().setClassPath(ctxt.getClassPath());
                     } else {
-                        tagClazz = wrapper.loadTagFile();
+                        // Make sure that JspCompilationContext gets the latest TagInfo
+                        // for the tag file. TagInfo instance was created the last
+                        // time the tag file was scanned for directives, and the tag
+                        // file may have been modified since then.
+                        wrapper.getJspEngineContext().setTagInfo(tagInfo);
+                        // This compilation needs to use the current tagJar.
+                        // Compilation may be nested in which case the old tagJar
+                        // will need to be restored
+                        tagJarOriginal = wrapper.getJspEngineContext().getTagFileJar();
+                        wrapper.getJspEngineContext().setTagFileJar(tagJar);
                     }
-                } finally {
-                    wrapper.decTripCount();
-                }
 
-                // Add the dependents for this tag file to its parent's
-                // Dependent list. The only reliable dependency information
-                // can only be obtained from the tag instance.
-                try {
-                    Object tagIns = tagClazz.newInstance();
-                    if (tagIns instanceof JspSourceDependent) {
-                        Iterator<Entry<String,Long>> iter = ((JspSourceDependent)
-                                tagIns).getDependants().entrySet().iterator();
-                        while (iter.hasNext()) {
-                            Entry<String,Long> entry = iter.next();
-                            parentPageInfo.addDependant(entry.getKey(),
-                                    entry.getValue());
+                    Class<?> tagClazz;
+                    int tripCount = wrapper.incTripCount();
+                    try {
+                        if (tripCount > 0) {
+                            // When tripCount is greater than zero, a circular
+                            // dependency exists. The circularly dependent tag
+                            // file is compiled in prototype mode, to avoid infinite
+                            // recursion.
+
+                            JspServletWrapper tempWrapper = new JspServletWrapper(ctxt
+                                    .getServletContext(), ctxt.getOptions(),
+                                    tagFilePath, tagInfo, ctxt.getRuntimeContext(),
+                                    tagJar);
+                            // Use same classloader and classpath for compiling tag files
+                            tempWrapper.getJspEngineContext().setClassLoader(
+                                    ctxt.getClassLoader());
+                            tempWrapper.getJspEngineContext().setClassPath(ctxt.getClassPath());
+                            tagClazz = tempWrapper.loadTagFilePrototype();
+                            tempVector.add(tempWrapper.getJspEngineContext()
+                                    .getCompiler());
+                        } else {
+                            tagClazz = wrapper.loadTagFile();
                         }
+                    } finally {
+                        wrapper.decTripCount();
                     }
-                } catch (Exception e) {
-                    // ignore errors
-                }
 
-                return tagClazz;
+                    // Add the dependents for this tag file to its parent's
+                    // Dependent list. The only reliable dependency information
+                    // can only be obtained from the tag instance.
+                    try {
+                        Object tagIns = tagClazz.newInstance();
+                        if (tagIns instanceof JspSourceDependent) {
+                            Iterator<Entry<String,Long>> iter = ((JspSourceDependent)
+                                    tagIns).getDependants().entrySet().iterator();
+                            while (iter.hasNext()) {
+                                Entry<String,Long> entry = iter.next();
+                                parentPageInfo.addDependant(entry.getKey(),
+                                        entry.getValue());
+                            }
+                        }
+                    } catch (Exception e) {
+                        // ignore errors
+                    }
+
+                    return tagClazz;
+                } finally {
+                    if (wrapper != null && tagJarOriginal != null) {
+                        wrapper.getJspEngineContext().setTagFileJar(tagJarOriginal);
+                    }
+                }
             }
         } finally {
             if (tagJar != null) {



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org