Author: markt
Date: Fri Jun 14 07:42:41 2013
New Revision: 1492979

URL: http://svn.apache.org/r1492979
Log:
Get JarScanFilter working with default values

Added:
    tomcat/trunk/java/org/apache/tomcat/JarScanFilter.java
      - copied, changed from r1492978, 
tomcat/trunk/java/org/apache/tomcat/JarScanType.java
    tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java
Modified:
    tomcat/trunk/conf/catalina.properties
    tomcat/trunk/java/org/apache/catalina/startup/Constants.java
    tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
    tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java
    tomcat/trunk/java/org/apache/jasper/Constants.java
    tomcat/trunk/java/org/apache/jasper/compiler/TldLocationsCache.java
    tomcat/trunk/java/org/apache/tomcat/JarScanType.java
    tomcat/trunk/java/org/apache/tomcat/JarScanner.java
    tomcat/trunk/java/org/apache/tomcat/util/scan/Constants.java
    tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java

Modified: tomcat/trunk/conf/catalina.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/conf/catalina.properties?rev=1492979&r1=1492978&r2=1492979&view=diff
==============================================================================
--- tomcat/trunk/conf/catalina.properties (original)
+++ tomcat/trunk/conf/catalina.properties Fri Jun 14 07:42:41 2013
@@ -73,13 +73,14 @@ server.loader=
 # starting with file:.
 shared.loader=
 
-# List of JAR files that should not be scanned using the JarScanner
+# Default list of JAR files that should not be scanned using the JarScanner
 # functionality. This is typically used to scan JARs for configuration
 # information. JARs that do not contain such information may be excluded from
 # the scan to speed up the scanning process. This is the default list. JARs on
-# this list are excluded from all scans. Scan specific lists (to exclude JARs
-# from individual scans) follow this. The list must be a comma separated list 
of
-# JAR file names.
+# this list are excluded from all scans. The list must be a comma separated 
list
+# of JAR file names.
+# The list of JARs to skip may be over-ridden at a Context level for individual
+# scan types by configuring a JarScanner with a nested JarScanFilter.
 # The JARs listed below include:
 # - Tomcat Bootstrap JARs
 # - Tomcat API JARs
@@ -87,7 +88,7 @@ shared.loader=
 # - Jasper JARs
 # - Tomcat JARs
 # - Common non-Tomcat JARs
-tomcat.util.scan.DefaultJarScanner.jarsToSkip=\
+tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\
 bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,\
 annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar,\
 catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-tribes.jar,\
@@ -109,17 +110,13 @@ jmx-tools.jar,jta*.jar,log4j*.jar,mail*.
 xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar,\
 junit.jar,junit-*.jar,ant-launcher.jar
 
-# Additional JARs (over and above the default JARs listed above) to skip when
-# scanning for Servlet 3.0 pluggability features. These features include web
-# fragments, annotations, SCIs and classes that match @HandlesTypes. The list
-# must be a comma separated list of JAR file names.
-org.apache.catalina.startup.ContextConfig.jarsToSkip=
+# Default list of JAR files that should be scanned that overrides the default
+# jarsToSkip list above. This is typically used to include a specific JAR that
+# has been excluded by a broad file name pattern in the jarsToSkip list.
+# The list of JARs to scan may be over-ridden at a Context level for individual
+# scan types by configuring a JarScanner with a nested JarScanFilter.
+tomcat.util.scan.StandardJarScanFilter.jarsToScan=
 
-# Additional JARs (over and above the default JARs listed above) to skip when
-# scanning for TLDs. The list must be a comma separated list of JAR file names.
-org.apache.catalina.startup.TldConfig.jarsToSkip=
-
-#
 # String cache configuration.
 tomcat.util.buf.StringCache.byte.enabled=true
 #tomcat.util.buf.StringCache.char.enabled=true

Modified: tomcat/trunk/java/org/apache/catalina/startup/Constants.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/Constants.java?rev=1492979&r1=1492978&r2=1492979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/Constants.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/Constants.java Fri Jun 14 
07:42:41 2013
@@ -34,13 +34,6 @@ public final class Constants {
     public static final String HostContextXml = "context.xml.default";
     public static final String HostWebXml = "web.xml.default";
 
-    public static final String DEFAULT_JARS_TO_SKIP =
-            "tomcat.util.scan.DefaultJarScanner.jarsToSkip";
-    public static final String PLUGGABILITY_JARS_TO_SKIP =
-            "org.apache.catalina.startup.ContextConfig.jarsToSkip";
-    public static final String TLD_JARS_TO_SKIP =
-            "org.apache.catalina.startup.TldConfig.jarsToSkip";
-
     /**
      * A dummy value used to suppress loading the default web.xml file.
      *

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=1492979&r1=1492978&r2=1492979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Fri Jun 14 
07:42:41 2013
@@ -41,7 +41,6 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.Set;
-import java.util.StringTokenizer;
 import java.util.concurrent.ConcurrentHashMap;
 
 import javax.servlet.MultipartConfigElement;
@@ -149,13 +148,6 @@ public class ContextConfig implements Li
      */
     protected static final Properties authenticators;
 
-    /**
-     * The list of JARs that will be skipped when scanning a web application
-     * for JARs. This means the JAR will not be scanned for web fragments, 
SCIs,
-     * annotations or classes that match @HandlesTypes.
-     */
-    private static final Set<String> pluggabilityJarsToSkip = new HashSet<>();
-
     static {
         // Load our mapping properties for the standard authenticators
         InputStream is =
@@ -172,20 +164,6 @@ public class ContextConfig implements Li
         }
         authenticators = props;
 
-        // Load the list of JARS to skip
-        addJarsToSkip(Constants.DEFAULT_JARS_TO_SKIP);
-        addJarsToSkip(Constants.PLUGGABILITY_JARS_TO_SKIP);
-    }
-
-    private static void addJarsToSkip(String systemPropertyName) {
-        String jarList = System.getProperty(systemPropertyName);
-        if (jarList != null) {
-            StringTokenizer tokenizer = new StringTokenizer(jarList, ",");
-            while (tokenizer.hasMoreElements()) {
-                pluggabilityJarsToSkip.add(tokenizer.nextToken());
-            }
-        }
-
     }
 
     /**
@@ -2043,8 +2021,8 @@ public class ContextConfig implements Li
         JarScanner jarScanner = context.getJarScanner();
         FragmentJarScannerCallback callback = new FragmentJarScannerCallback();
 
-        jarScanner.scan(JarScanType.SERVLET3_PLUGGABILITY,
-                context.getServletContext(), callback, pluggabilityJarsToSkip);
+        jarScanner.scan(JarScanType.PLUGGABILITY,
+                context.getServletContext(), callback);
 
         return callback.getFragments();
     }

Modified: tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java?rev=1492979&r1=1492978&r2=1492979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/TldConfig.java Fri Jun 14 
07:42:41 2013
@@ -26,7 +26,6 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
-import java.util.StringTokenizer;
 
 import javax.servlet.ServletContext;
 import javax.servlet.descriptor.TaglibDescriptor;
@@ -65,9 +64,6 @@ public final class TldConfig  implements
     private static final String WEB_INF_LIB = "/WEB-INF/lib/";
 
 
-    // Names of JARs that are known not to contain any TLDs
-    private static volatile Set<String> noTldJars = null;
-
     private static final org.apache.juli.logging.Log log=
         org.apache.juli.logging.LogFactory.getLog( TldConfig.class );
 
@@ -123,47 +119,6 @@ public final class TldConfig  implements
     }
 
 
-    static {
-        // Set the default list of JARs to skip for TLDs
-        StringBuilder jarList = new StringBuilder(System.getProperty(
-                Constants.DEFAULT_JARS_TO_SKIP, ""));
-
-        String tldJars = System.getProperty(Constants.TLD_JARS_TO_SKIP, "");
-        if (tldJars.length() > 0) {
-            if (jarList.length() > 0) {
-                jarList.append(',');
-            }
-            jarList.append(tldJars);
-        }
-
-        if (jarList.length() > 0) {
-            setNoTldJars(jarList.toString());
-        }
-    }
-
-    /**
-     * Sets the list of JARs that are known not to contain any TLDs.
-     *
-     * @param jarNames List of comma-separated names of JAR files that are
-     * known not to contain any TLDs.
-     */
-    public static synchronized void setNoTldJars(String jarNames) {
-        if (jarNames == null) {
-            noTldJars = null;
-        } else {
-            if (noTldJars == null) {
-                noTldJars = new HashSet<>();
-            } else {
-                noTldJars.clear();
-            }
-            StringTokenizer tokenizer = new StringTokenizer(jarNames, ",");
-            while (tokenizer.hasMoreElements()) {
-                noTldJars.add(tokenizer.nextToken());
-            }
-        }
-    }
-
-
     // ----------------------------------------------------- Instance Variables
 
     /**
@@ -264,7 +219,7 @@ public final class TldConfig  implements
         // Stages 3b & 4
         JarScanner jarScanner = context.getJarScanner();
         jarScanner.scan(JarScanType.TLD, context.getServletContext(),
-                new TldJarScannerCallback(), noTldJars);
+                new TldJarScannerCallback());
 
         // Now add all the listeners we found to the listeners for this context
         String list[] = getTldListeners();

Modified: tomcat/trunk/java/org/apache/jasper/Constants.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/Constants.java?rev=1492979&r1=1492978&r2=1492979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/Constants.java (original)
+++ tomcat/trunk/java/org/apache/jasper/Constants.java Fri Jun 14 07:42:41 2013
@@ -211,20 +211,6 @@ public class Constants {
     public static final String CATALINA_HOME_PROP = "catalina.home";
 
     /**
-     * Name of system property containing default list of JARs to skip when
-     * scanning JARs for configuration elements such as TLDs.
-     */
-    public static final String DEFAULT_JAR_SKIP_PROP=
-            "tomcat.util.scan.DefaultJarScanner.jarsToSkip";
-
-    /**
-     * Name of system property containing additional list of JARs to skip when
-     * scanning for TLDs.
-     */
-    public static final String TLD_JAR_SKIP_PROP=
-            "org.apache.catalina.startup.TldConfig.jarsToSkip";
-
-    /**
      * Retain reference to default character set so we don't have to look it 
up.
      */
     public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");

Modified: tomcat/trunk/java/org/apache/jasper/compiler/TldLocationsCache.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/TldLocationsCache.java?rev=1492979&r1=1492978&r2=1492979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/compiler/TldLocationsCache.java 
(original)
+++ tomcat/trunk/java/org/apache/jasper/compiler/TldLocationsCache.java Fri Jun 
14 07:42:41 2013
@@ -22,15 +22,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.JarURLConnection;
 import java.net.URL;
-import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Set;
-import java.util.StringTokenizer;
 
 import javax.servlet.ServletContext;
 
-import org.apache.jasper.Constants;
 import org.apache.jasper.JasperException;
 import org.apache.jasper.util.ExceptionUtils;
 import org.apache.jasper.xmlparser.ParserUtils;
@@ -96,55 +93,10 @@ public class TldLocationsCache {
     private static final String JAR_EXT = ".jar";
     private static final String TLD_EXT = ".tld";
 
-    // Names of JARs that are known not to contain any TLDs
-    private static Set<String> noTldJars = null;
-
     // Flag that indicates that an INFO level message has been provided that
     // there are JARs that could be skipped
     private static volatile boolean showTldScanWarning = true;
 
-    static {
-        // Set the default list of JARs to skip for TLDs
-        // Set the default list of JARs to skip for TLDs
-        StringBuilder jarList = new StringBuilder(System.getProperty(
-                Constants.DEFAULT_JAR_SKIP_PROP, ""));
-
-        String tldJars = System.getProperty(Constants.TLD_JAR_SKIP_PROP, "");
-        if (tldJars.length() > 0) {
-            if (jarList.length() > 0) {
-                jarList.append(',');
-            }
-            jarList.append(tldJars);
-        }
-
-        if (jarList.length() > 0) {
-            setNoTldJars(jarList.toString());
-        }
-    }
-
-    /**
-     * Sets the list of JARs that are known not to contain any TLDs.
-     *
-     * @param jarNames List of comma-separated names of JAR files that are
-     * known not to contain any TLDs
-     */
-    public static synchronized void setNoTldJars(String jarNames) {
-        if (jarNames == null) {
-            noTldJars = null;
-        } else {
-            if (noTldJars == null) {
-                noTldJars = new HashSet<>();
-            } else {
-                noTldJars.clear();
-            }
-            StringTokenizer tokenizer = new StringTokenizer(jarNames, ",");
-            while (tokenizer.hasMoreElements()) {
-                noTldJars.add(tokenizer.nextToken());
-            }
-        }
-    }
-
-
     /**
      * The mapping of the 'global' tag library URI to the location (resource
      * path) of the TLD associated with that tag library. The location is
@@ -244,7 +196,7 @@ public class TldLocationsCache {
             JarScanner jarScanner = JarScannerFactory.getJarScanner(ctxt);
             if (jarScanner != null) {
                 jarScanner.scan(JarScanType.TLD, ctxt,
-                        new TldJarScannerCallback(), noTldJars);
+                        new TldJarScannerCallback());
             }
 
             initialized = true;

Copied: tomcat/trunk/java/org/apache/tomcat/JarScanFilter.java (from r1492978, 
tomcat/trunk/java/org/apache/tomcat/JarScanType.java)
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/JarScanFilter.java?p2=tomcat/trunk/java/org/apache/tomcat/JarScanFilter.java&p1=tomcat/trunk/java/org/apache/tomcat/JarScanType.java&r1=1492978&r2=1492979&rev=1492979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/JarScanType.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/JarScanFilter.java Fri Jun 14 07:42:41 
2013
@@ -16,8 +16,16 @@
  */
 package org.apache.tomcat;
 
-public enum JarScanType {
-    TLD,
-    SERVLET3_PLUGGABILITY,
-    OTHER
+public interface JarScanFilter {
+
+    /**
+     *
+     * @param jarScanType   The type of JAR scan currently being performed
+     * @param jarName       The name of the JAR file (without any path
+     *                          information) to be checked to see if it should
+     *                          be included in the results or not
+     * @return <code>true</code> if the JAR should be returned in the results,
+     *             <code>false</code> if it should be excluded
+     */
+    boolean check(JarScanType jarScanType, String jarName);
 }

Modified: tomcat/trunk/java/org/apache/tomcat/JarScanType.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/JarScanType.java?rev=1492979&r1=1492978&r2=1492979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/JarScanType.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/JarScanType.java Fri Jun 14 07:42:41 
2013
@@ -18,6 +18,6 @@ package org.apache.tomcat;
 
 public enum JarScanType {
     TLD,
-    SERVLET3_PLUGGABILITY,
+    PLUGGABILITY,
     OTHER
 }

Modified: tomcat/trunk/java/org/apache/tomcat/JarScanner.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/JarScanner.java?rev=1492979&r1=1492978&r2=1492979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/JarScanner.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/JarScanner.java Fri Jun 14 07:42:41 2013
@@ -16,8 +16,6 @@
  */
 package org.apache.tomcat;
 
-import java.util.Set;
-
 import javax.servlet.ServletContext;
 
 /**
@@ -37,9 +35,8 @@ public interface JarScanner {
      * @param context       The ServletContext - used to locate and access
      *                      WEB-INF/lib
      * @param callback      The handler to process any JARs found
-     * @param jarsToSkip    List of JARs to ignore
      */
-    public void scan(JarScanType scanType, ServletContext context, 
JarScannerCallback callback,
-            Set<String> jarsToSkip);
+    public void scan(JarScanType scanType, ServletContext context,
+            JarScannerCallback callback);
 
 }

Modified: tomcat/trunk/java/org/apache/tomcat/util/scan/Constants.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/scan/Constants.java?rev=1492979&r1=1492978&r2=1492979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/scan/Constants.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/scan/Constants.java Fri Jun 14 
07:42:41 2013
@@ -26,7 +26,9 @@ public final class Constants {
 
     /* System properties */
     public static final String SKIP_JARS_PROPERTY =
-        "tomcat.util.scan.DefaultJarScanner.jarsToSkip";
+            "tomcat.util.scan.StandardJarScanFilter.jarsToSkip";
+    public static final String SCAN_JARS_PROPERTY =
+            "tomcat.util.scan.StandardJarScanFilter.jarsToScan";
 
     /* Commons strings */
     public static final String JAR_EXT = ".jar";

Added: tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java?rev=1492979&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java 
(added)
+++ tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanFilter.java 
Fri Jun 14 07:42:41 2013
@@ -0,0 +1,220 @@
+/*
+ *  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.scan;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import org.apache.tomcat.JarScanFilter;
+import org.apache.tomcat.JarScanType;
+import org.apache.tomcat.util.file.Matcher;
+
+public class StandardJarScanFilter implements JarScanFilter {
+
+    private final ReadWriteLock configurationLock =
+            new ReentrantReadWriteLock();
+
+    private String defaultSkip;
+    private String defaultScan;
+    private Set<String[]> defaultSkipSet = new HashSet<>();
+    private Set<String[]> defaultScanSet = new HashSet<>();
+
+    private String tldSkip;
+    private String tldScan;
+    private Set<String[]> tldSkipSet = new HashSet<>();
+    private Set<String[]> tldScanSet = new HashSet<>();
+    private boolean defaultTldScan = true;
+
+    private String pluggabilitySkip;
+    private String pluggabilityScan;
+    private Set<String[]> pluggabilitySkipSet = new HashSet<>();
+    private Set<String[]> pluggabilityScanSet = new HashSet<>();
+    private boolean defaultPluggabilityScan = true;
+
+    public StandardJarScanFilter() {
+        // Set the defaults from the system properties
+        defaultSkip = System.getProperty(Constants.SKIP_JARS_PROPERTY);
+        populateSetFromAttribute(defaultSkip, defaultSkipSet);
+        defaultScan = System.getProperty(Constants.SCAN_JARS_PROPERTY);
+        populateSetFromAttribute(defaultScan, defaultScanSet);
+        tldSkip = System.getProperty(Constants.SKIP_JARS_PROPERTY);
+        populateSetFromAttribute(tldSkip, tldSkipSet);
+        tldScan = System.getProperty(Constants.SCAN_JARS_PROPERTY);
+        populateSetFromAttribute(tldScan, tldScanSet);
+        pluggabilitySkip = System.getProperty(Constants.SKIP_JARS_PROPERTY);
+        populateSetFromAttribute(pluggabilitySkip, pluggabilitySkipSet);
+        pluggabilityScan = System.getProperty(Constants.SCAN_JARS_PROPERTY);
+        populateSetFromAttribute(pluggabilityScan, pluggabilityScanSet);
+    }
+
+
+    public String getTldSkip() {
+        return tldSkip;
+    }
+
+
+    public void setTldSkip(String tldSkip) {
+        this.tldSkip = tldSkip;
+        Lock writeLock = configurationLock.writeLock();
+        try {
+            writeLock.lock();
+            populateSetFromAttribute(tldSkip, tldSkipSet);
+        } finally {
+            writeLock.unlock();
+        }
+    }
+
+
+    public String getTldScan() {
+        return tldScan;
+    }
+
+
+    public void setTldScan(String tldScan) {
+        this.tldScan = tldScan;
+        Lock writeLock = configurationLock.writeLock();
+        try {
+            writeLock.lock();
+            populateSetFromAttribute(tldScan, tldScanSet);
+        } finally {
+            writeLock.unlock();
+        }
+    }
+
+
+    public boolean isDefaultTldScan() {
+        return defaultTldScan;
+    }
+
+
+    public void setDefaultTldScan(boolean defaultTldScan) {
+        this.defaultTldScan = defaultTldScan;
+    }
+
+
+    public String getPluggabilitySkip() {
+        return pluggabilitySkip;
+    }
+
+
+    public void setPluggabilitySkip(String pluggabilitySkip) {
+        this.pluggabilitySkip = pluggabilitySkip;
+        Lock writeLock = configurationLock.writeLock();
+        try {
+            writeLock.lock();
+            populateSetFromAttribute(pluggabilitySkip, pluggabilitySkipSet);
+        } finally {
+            writeLock.unlock();
+        }
+    }
+
+
+    public String getPluggabilityScan() {
+        return pluggabilityScan;
+    }
+
+
+    public void setPluggabilityScan(String pluggabilityScan) {
+        this.pluggabilityScan = pluggabilityScan;
+        Lock writeLock = configurationLock.writeLock();
+        try {
+            writeLock.lock();
+            populateSetFromAttribute(pluggabilityScan, pluggabilityScanSet);
+        } finally {
+            writeLock.unlock();
+        }
+    }
+
+
+    public boolean isDefaultPluggabilityScan() {
+        return defaultPluggabilityScan;
+    }
+
+
+    public void setDefaultPluggabilityScan(boolean defaultPluggabilityScan) {
+        this.defaultPluggabilityScan = defaultPluggabilityScan;
+    }
+
+
+    @Override
+    public boolean check(JarScanType jarScanType, String jarName) {
+        boolean defaultScan;
+        Set<String[]> toSkip = new HashSet<>();
+        Set<String[]> toScan = new HashSet<>();
+
+        Lock readLock = configurationLock.readLock();
+        try  {
+            readLock.lock();
+            switch (jarScanType) {
+                case TLD: {
+                    defaultScan = defaultTldScan;
+                    toSkip.addAll(tldSkipSet);
+                    toScan.addAll(tldScanSet);
+                    break;
+                }
+                case PLUGGABILITY: {
+                    defaultScan = defaultPluggabilityScan;
+                    toSkip.addAll(pluggabilitySkipSet);
+                    toScan.addAll(pluggabilityScanSet);
+                    break;
+                }
+                case OTHER:
+                default: {
+                    defaultScan = true;
+                    toSkip.addAll(defaultSkipSet);
+                    toScan.addAll(defaultScanSet);
+                }
+            }
+        } finally {
+            readLock.unlock();
+        }
+
+        if (defaultScan) {
+            if (Matcher.matchPath(toSkip, jarName)) {
+                if (Matcher.matchPath(toScan, jarName)) {
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+            return true;
+        } else {
+            if (Matcher.matchPath(toScan, jarName)) {
+                if (Matcher.matchPath(toSkip, jarName)) {
+                    return false;
+                } else {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    private void populateSetFromAttribute(String attribute, Set<String[]> set) 
{
+        set.clear();
+        if (attribute != null) {
+            StringTokenizer tokenizer = new StringTokenizer(attribute, ",");
+            while (tokenizer.hasMoreElements()) {
+                set.add(Matcher.tokenizePathAsArray(tokenizer.nextToken()));
+            }
+        }
+    }
+}

Modified: tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java?rev=1492979&r1=1492978&r2=1492979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java Fri 
Jun 14 07:42:41 2013
@@ -14,7 +14,6 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-
 package org.apache.tomcat.util.scan;
 
 import java.io.File;
@@ -25,19 +24,17 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.net.URLConnection;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
-import java.util.StringTokenizer;
 
 import javax.servlet.ServletContext;
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.JarScanFilter;
 import org.apache.tomcat.JarScanType;
 import org.apache.tomcat.JarScanner;
 import org.apache.tomcat.JarScannerCallback;
-import org.apache.tomcat.util.file.Matcher;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -58,24 +55,12 @@ public class StandardJarScanner implemen
 
     private static final Log log = LogFactory.getLog(StandardJarScanner.class);
 
-    private static final Set<String> defaultJarsToSkip = new HashSet<>();
-
     /**
      * The string resources for this package.
      */
     private static final StringManager sm =
         StringManager.getManager(Constants.Package);
 
-    static {
-        String jarList = System.getProperty(Constants.SKIP_JARS_PROPERTY);
-        if (jarList != null) {
-            StringTokenizer tokenizer = new StringTokenizer(jarList, ",");
-            while (tokenizer.hasMoreElements()) {
-                defaultJarsToSkip.add(tokenizer.nextToken());
-            }
-        }
-    }
-
     /**
      * Controls the classpath scanning extension.
      */
@@ -123,6 +108,17 @@ public class StandardJarScanner implemen
     }
 
     /**
+     * Controls the filtering of the results from the scan for JARs
+     */
+    private JarScanFilter jarScanFilter = new StandardJarScanFilter();
+    public JarScanFilter getJarScanFilter() {
+        return jarScanFilter;
+    }
+    public void setJarScanFilter(JarScanFilter jarScanFilter) {
+        this.jarScanFilter = jarScanFilter;
+    }
+
+    /**
      * Scan the provided ServletContext and class loader for JAR files. Each 
JAR
      * file found will be passed to the callback handler to be processed.
      *
@@ -132,29 +128,15 @@ public class StandardJarScanner implemen
      * @param context       The ServletContext - used to locate and access
      *                      WEB-INF/lib
      * @param callback      The handler to process any JARs found
-     * @param jarsToSkip    List of JARs to ignore. If this list is null, a
-     *                      default list will be read from the system property
-     *                      defined by {@link Constants#SKIP_JARS_PROPERTY}
      */
     @Override
     public void scan(JarScanType scanType, ServletContext context,
-            JarScannerCallback callback, Set<String> jarsToSkip) {
+            JarScannerCallback callback) {
 
         if (log.isTraceEnabled()) {
             log.trace(sm.getString("jarScan.webinflibStart"));
         }
 
-        Set<String> ignoredJars;
-        if (jarsToSkip == null) {
-            ignoredJars = defaultJarsToSkip;
-        } else {
-            ignoredJars = jarsToSkip;
-        }
-        Set<String[]> ignoredJarsTokens = new HashSet<>();
-        for (String pattern: ignoredJars) {
-            ignoredJarsTokens.add(Matcher.tokenizePathAsArray(pattern));
-        }
-
         // Scan WEB-INF/lib
         Set<String> dirList = context.getResourcePaths(Constants.WEB_INF_LIB);
         if (dirList != null) {
@@ -162,8 +144,8 @@ public class StandardJarScanner implemen
             while (it.hasNext()) {
                 String path = it.next();
                 if (path.endsWith(Constants.JAR_EXT) &&
-                    !Matcher.matchPath(ignoredJarsTokens,
-                        path.substring(path.lastIndexOf('/')+1))) {
+                        jarScanFilter.check(scanType,
+                                path.substring(path.lastIndexOf('/')+1))) {
                     // Need to scan this JAR
                     if (log.isDebugEnabled()) {
                         log.debug(sm.getString("jarScan.webinflibJarScan", 
path));
@@ -239,8 +221,8 @@ public class StandardJarScanner implemen
                         String jarName = getJarName(urls[i]);
 
                         // Skip JARs known not to be interesting
-                        if (jarName != null && !Matcher.matchPath(
-                                ignoredJarsTokens, jarName)) {
+                        if (jarName != null &&
+                                jarScanFilter.check(scanType, jarName)) {
                             if (log.isDebugEnabled()) {
                                 
log.debug(sm.getString("jarScan.classloaderJarScan", urls[i]));
                             }



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

Reply via email to