Author: jboynes
Date: Fri Jul 19 03:11:40 2013
New Revision: 1504753

URL: http://svn.apache.org/r1504753
Log:
Extract FragmentJarScannerCallback to descriptor package so it can be reused by 
Jasper

Added:
    
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
   (with props)
Modified:
    tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java

Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=1504753&r1=1504752&r2=1504753&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Fri Jul 19 
03:11:40 2013
@@ -24,7 +24,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.UnsupportedEncodingException;
-import java.net.JarURLConnection;
 import java.net.MalformedURLException;
 import java.net.URISyntaxException;
 import java.net.URL;
@@ -75,7 +74,6 @@ import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.JarScanType;
 import org.apache.tomcat.JarScanner;
-import org.apache.tomcat.JarScannerCallback;
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.bcel.classfile.AnnotationElementValue;
 import org.apache.tomcat.util.bcel.classfile.AnnotationEntry;
@@ -96,6 +94,7 @@ import org.apache.tomcat.util.descriptor
 import org.apache.tomcat.util.descriptor.web.ErrorPage;
 import org.apache.tomcat.util.descriptor.web.FilterDef;
 import org.apache.tomcat.util.descriptor.web.FilterMap;
+import org.apache.tomcat.util.descriptor.web.FragmentJarScannerCallback;
 import org.apache.tomcat.util.descriptor.web.JspPropertyGroup;
 import org.apache.tomcat.util.descriptor.web.JspPropertyGroupDescriptorImpl;
 import org.apache.tomcat.util.descriptor.web.LoginConfig;
@@ -1949,7 +1948,15 @@ public class ContextConfig implements Li
     protected Map<String,WebXml> processJarsForWebFragments() {
 
         JarScanner jarScanner = context.getJarScanner();
-        FragmentJarScannerCallback callback = new FragmentJarScannerCallback();
+        boolean delegate = false;
+        if (context instanceof StandardContext) {
+            delegate = ((StandardContext) context).getDelegate();
+        }
+        FragmentJarScannerCallback callback =
+                new FragmentJarScannerCallback(webXmlParser, delegate);
+        if (!callback.isOk()) {
+            ok = false;
+        }
 
         jarScanner.scan(JarScanType.PLUGGABILITY,
                 context.getServletContext(), callback);
@@ -2649,115 +2656,6 @@ public class ContextConfig implements Li
         return result;
     }
 
-    private class FragmentJarScannerCallback implements JarScannerCallback {
-
-        private static final String FRAGMENT_LOCATION =
-            "META-INF/web-fragment.xml";
-        private final Map<String,WebXml> fragments = new HashMap<>();
-
-        @Override
-        public void scan(JarURLConnection jarConn, boolean isWebapp)
-                throws IOException {
-
-            URL url = jarConn.getURL();
-            URL resourceURL = jarConn.getJarFileURL();
-            Jar jar = null;
-            InputStream is = null;
-            WebXml fragment = new WebXml();
-
-            fragment.setWebappJar(isWebapp);
-            if (context instanceof StandardContext) {
-                fragment.setDelegate(((StandardContext) 
context).getDelegate());
-            }
-
-            try {
-                // Only web application JARs are checked for web-fragment.xml
-                // files
-                if (isWebapp) {
-                    jar = JarFactory.newInstance(url);
-                    is = jar.getInputStream(FRAGMENT_LOCATION);
-                }
-
-                if (is == null) {
-                    // If there is no web.xml, normal JAR no impact on
-                    // distributable
-                    fragment.setDistributable(true);
-                } else {
-                    InputSource source = new InputSource(
-                            resourceURL.toString() + "!/" + FRAGMENT_LOCATION);
-                    source.setByteStream(is);
-                    if (!webXmlParser.parseWebXml(source, fragment, true)) {
-                        ok = false;
-                    }
-                }
-            } finally {
-                if (jar != null) {
-                    jar.close();
-                }
-                fragment.setURL(url);
-                if (fragment.getName() == null) {
-                    fragment.setName(fragment.getURL().toString());
-                }
-                fragment.setJarName(extractJarFileName(url));
-                fragments.put(fragment.getName(), fragment);
-            }
-        }
-
-        private String extractJarFileName(URL input) {
-            String url = input.toString();
-            if (url.endsWith("!/")) {
-                // Remove it
-                url = url.substring(0, url.length() - 2);
-            }
-
-            // File name will now be whatever is after the final /
-            return url.substring(url.lastIndexOf('/') + 1);
-        }
-
-        @Override
-        public void scan(File file, boolean isWebapp) throws IOException {
-
-            InputStream stream = null;
-            WebXml fragment = new WebXml();
-
-            try {
-                File fragmentFile = new File(file, FRAGMENT_LOCATION);
-                if (fragmentFile.isFile()) {
-                    stream = new FileInputStream(fragmentFile);
-                    InputSource source =
-                        new 
InputSource(fragmentFile.toURI().toURL().toString());
-                    source.setByteStream(stream);
-                    if (!webXmlParser.parseWebXml(source, fragment, true)) {
-                        ok = false;
-                    }
-                } else {
-                    // If there is no web.xml, normal folder no impact on
-                    // distributable
-                    fragment.setDistributable(true);
-                }
-            } finally {
-                fragment.setURL(file.toURI().toURL());
-                if (fragment.getName() == null) {
-                    fragment.setName(fragment.getURL().toString());
-                }
-                fragment.setJarName(file.getName());
-                fragments.put(fragment.getName(), fragment);
-            }
-        }
-
-
-        @Override
-        public void scanWebInfClasses() {
-            // NO-OP. Fragments unpacked in WEB-INF classes are not handled,
-            // mainly because if there are multiple fragments there is no way 
to
-            // handle multiple web-fragment.xml files.
-        }
-
-        public Map<String,WebXml> getFragments() {
-            return fragments;
-        }
-    }
-
     private static class DefaultWebXmlCacheEntry {
         private final WebXml webXml;
         private final long globalTimeStamp;

Added: 
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java?rev=1504753&view=auto
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
 (added)
+++ 
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
 Fri Jul 19 03:11:40 2013
@@ -0,0 +1,152 @@
+/*
+ * 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.web;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tomcat.JarScannerCallback;
+import org.apache.tomcat.util.scan.Jar;
+import org.apache.tomcat.util.scan.JarFactory;
+import org.xml.sax.InputSource;
+
+/**
+* Callback handling a web-fragment.xml descriptor.
+*/
+public class FragmentJarScannerCallback implements JarScannerCallback {
+
+    private static final String FRAGMENT_LOCATION =
+        "META-INF/web-fragment.xml";
+    private final WebXmlParser webXmlParser;
+    private final boolean delegate;
+    private final Map<String,WebXml> fragments = new HashMap<>();
+    private boolean ok  = true;
+
+    public FragmentJarScannerCallback(WebXmlParser webXmlParser, boolean 
delegate) {
+        this.webXmlParser = webXmlParser;
+        this.delegate = delegate;
+    }
+
+    @Override
+    public void scan(JarURLConnection jarConn, boolean isWebapp)
+            throws IOException {
+
+        URL url = jarConn.getURL();
+        URL resourceURL = jarConn.getJarFileURL();
+        Jar jar = null;
+        InputStream is = null;
+        WebXml fragment = new WebXml();
+        fragment.setWebappJar(isWebapp);
+        fragment.setDelegate(delegate);
+
+        try {
+            // Only web application JARs are checked for web-fragment.xml
+            // files
+            if (isWebapp) {
+                jar = JarFactory.newInstance(url);
+                is = jar.getInputStream(FRAGMENT_LOCATION);
+            }
+
+            if (is == null) {
+                // If there is no web.xml, normal JAR no impact on
+                // distributable
+                fragment.setDistributable(true);
+            } else {
+                InputSource source = new InputSource(
+                        resourceURL.toString() + "!/" + FRAGMENT_LOCATION);
+                source.setByteStream(is);
+                if (!webXmlParser.parseWebXml(source, fragment, true)) {
+                    ok = false;
+                }
+            }
+        } finally {
+            if (jar != null) {
+                jar.close();
+            }
+            fragment.setURL(url);
+            if (fragment.getName() == null) {
+                fragment.setName(fragment.getURL().toString());
+            }
+            fragment.setJarName(extractJarFileName(url));
+            fragments.put(fragment.getName(), fragment);
+        }
+    }
+
+    private String extractJarFileName(URL input) {
+        String url = input.toString();
+        if (url.endsWith("!/")) {
+            // Remove it
+            url = url.substring(0, url.length() - 2);
+        }
+
+        // File name will now be whatever is after the final /
+        return url.substring(url.lastIndexOf('/') + 1);
+    }
+
+    @Override
+    public void scan(File file, boolean isWebapp) throws IOException {
+
+        InputStream stream = null;
+        WebXml fragment = new WebXml();
+
+        try {
+            File fragmentFile = new File(file, FRAGMENT_LOCATION);
+            if (fragmentFile.isFile()) {
+                stream = new FileInputStream(fragmentFile);
+                InputSource source =
+                    new InputSource(fragmentFile.toURI().toURL().toString());
+                source.setByteStream(stream);
+                if (!webXmlParser.parseWebXml(source, fragment, true)) {
+                    ok = false;
+                }
+            } else {
+                // If there is no web.xml, normal folder no impact on
+                // distributable
+                fragment.setDistributable(true);
+            }
+        } finally {
+            fragment.setURL(file.toURI().toURL());
+            if (fragment.getName() == null) {
+                fragment.setName(fragment.getURL().toString());
+            }
+            fragment.setJarName(file.getName());
+            fragments.put(fragment.getName(), fragment);
+        }
+    }
+
+
+    @Override
+    public void scanWebInfClasses() {
+        // NO-OP. Fragments unpacked in WEB-INF classes are not handled,
+        // mainly because if there are multiple fragments there is no way to
+        // handle multiple web-fragment.xml files.
+    }
+
+    public boolean isOk() {
+        return ok;
+    }
+
+    public Map<String,WebXml> getFragments() {
+        return fragments;
+    }
+}

Propchange: 
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
------------------------------------------------------------------------------
    svn:eol-style = native



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

Reply via email to