You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by jb...@apache.org on 2013/07/21 01:03:45 UTC

svn commit: r1505235 - /tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java

Author: jboynes
Date: Sat Jul 20 23:03:45 2013
New Revision: 1505235

URL: http://svn.apache.org/r1505235
Log:
Have JspC recognize configuration from web fragments.

Modified:
    tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java

Modified: tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java?rev=1505235&r1=1505234&r2=1505235&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java (original)
+++ tomcat/trunk/java/org/apache/jasper/servlet/JspCServletContext.java Sat Jul 20 23:03:45 2013
@@ -22,11 +22,12 @@ import java.io.InputStream;
 import java.io.PrintWriter;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.Collections;
 import java.util.EnumSet;
 import java.util.Enumeration;
 import java.util.EventListener;
+import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Hashtable;
 import java.util.Map;
 import java.util.Set;
 import java.util.Vector;
@@ -45,9 +46,13 @@ import javax.servlet.descriptor.JspConfi
 import org.apache.jasper.JasperException;
 import org.apache.jasper.compiler.Localizer;
 import org.apache.jasper.util.ExceptionUtils;
+import org.apache.tomcat.JarScanType;
 import org.apache.tomcat.util.descriptor.web.Constants;
+import org.apache.tomcat.util.descriptor.web.FragmentJarScannerCallback;
 import org.apache.tomcat.util.descriptor.web.WebXml;
 import org.apache.tomcat.util.descriptor.web.WebXmlParser;
+import org.apache.tomcat.util.scan.StandardJarScanFilter;
+import org.apache.tomcat.util.scan.StandardJarScanner;
 
 
 /**
@@ -66,7 +71,7 @@ public class JspCServletContext implemen
     /**
      * Servlet context attributes.
      */
-    private final Hashtable<String,Object> myAttributes;
+    private final Map<String,Object> myAttributes;
 
 
     /**
@@ -107,15 +112,16 @@ public class JspCServletContext implemen
     public JspCServletContext(PrintWriter aLogWriter, URL aResourceBaseURL)
             throws JasperException {
 
-        myAttributes = new Hashtable<>();
+        myAttributes = new HashMap<>();
         myLogWriter = aLogWriter;
         myResourceBaseURL = aResourceBaseURL;
 
-        // Build the merged web.xml
-        // TODO - Process fragments
-        // TODO - Check to see if annotations can impact anything JspC
-        //        cares about and if yes, process fragments too.
-        this.webXml = new WebXml();
+        this.webXml = buildMergedWebXml();
+        jspConfigDescriptor = webXml.getJspConfigDescriptor();
+    }
+
+    private WebXml buildMergedWebXml() throws JasperException {
+        WebXml webXml = new WebXml();
 
         WebXmlParser webXmlParser = new WebXmlParser(false, false);
         // Use this class's classloader as Ant will have set the TCCL to its own
@@ -131,7 +137,33 @@ public class JspCServletContext implemen
             throw new JasperException(e);
         }
 
-        jspConfigDescriptor = webXml.getJspConfigDescriptor();
+        // if the application is metadata-complete then we can skip fragment processing
+        if (webXml.isMetadataComplete()) {
+            return webXml;
+        }
+
+        Map<String, WebXml> fragments = scanForFragments(webXmlParser);
+        Set<WebXml> orderedFragments = WebXml.orderWebFragments(webXml, fragments, this);
+
+        // JspC is not affected by annotations so skip that processing, proceed to merge
+        webXml.merge(orderedFragments);
+        return webXml;
+    }
+
+    private Map<String, WebXml> scanForFragments(WebXmlParser webXmlParser) throws JasperException {
+        StandardJarScanner scanner = new StandardJarScanner();
+        // TODO - enabling this means initializing the classloader first in JspC
+        scanner.setScanClassPath(false);
+        // TODO - configure filter rules from Ant rather then system properties
+        scanner.setJarScanFilter(new StandardJarScanFilter());
+
+        FragmentJarScannerCallback callback = new FragmentJarScannerCallback(webXmlParser, false);
+        scanner.scan(JarScanType.PLUGGABILITY, this, callback);
+        if (!callback.isOk()) {
+            // TODO - message
+            throw new JasperException(Localizer.getMessage(""));
+        }
+        return callback.getFragments();
     }
 
 
@@ -153,7 +185,7 @@ public class JspCServletContext implemen
      */
     @Override
     public Enumeration<String> getAttributeNames() {
-        return myAttributes.keys();
+        return Collections.enumeration(myAttributes.keySet());
     }
 
 



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