You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/05/24 19:19:05 UTC
svn commit: r1597329 - in /tomee/tomee/trunk/tomee:
tomee-catalina/src/main/java/org/apache/tomee/catalina/
tomee-loader/src/main/java/org/apache/tomee/loader/
Author: rmannibucau
Date: Sat May 24 17:19:04 2014
New Revision: 1597329
URL: http://svn.apache.org/r1597329
Log:
cleaning up TomEEJarScanner, most of the code was just useless and better to use tomcat one if its featres were needed
Modified:
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java
tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/EmbeddedJarScanner.java
tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java
tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java
Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java?rev=1597329&r1=1597328&r2=1597329&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java (original)
+++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java Sat May 24 17:19:04 2014
@@ -23,6 +23,7 @@ import org.apache.catalina.core.Standard
import org.apache.catalina.core.StandardServer;
import org.apache.catalina.startup.Bootstrap;
import org.apache.catalina.startup.Catalina;
+import org.apache.catalina.startup.CatalinaProperties;
import org.apache.openejb.OpenEJB;
import org.apache.openejb.assembler.WebAppDeployer;
import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
@@ -36,7 +37,6 @@ import org.apache.openejb.config.sys.Tom
import org.apache.openejb.core.ParentClassLoaderFinder;
import org.apache.openejb.core.ServerFederation;
import org.apache.openejb.core.ThreadContext;
-import org.apache.openejb.loader.IO;
import org.apache.openejb.loader.Loader;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.server.ServerService;
@@ -191,18 +191,24 @@ public class TomcatLoader implements Loa
// set ignorable libraries from a tomee property instead of using the standard openejb one
// don't ignore standard openejb exclusions file
final Set<String> exclusions = new HashSet<String>(Arrays.asList(NewLoaderLogic.getExclusions()));
- final File catalinaProperties = new File(conf, "catalina.properties");
- if (catalinaProperties.exists()) {
- final Properties catalinaProps = IO.readProperties(catalinaProperties);
- final String jarToSkipProp = catalinaProps.getProperty("tomcat.util.scan.DefaultJarScanner.jarsToSkip");
+ {
+ final String jarToSkipProp = CatalinaProperties.getProperty("tomcat.util.scan.DefaultJarScanner.jarsToSkip");
if (jarToSkipProp != null) {
- for (String s : jarToSkipProp.split(",")) {
+ for (final String s : jarToSkipProp.split(",")) {
+ exclusions.add(NewLoaderLogic.sanitize(s.trim()));
+ }
+ }
+ }
+ {
+ final String jarToSkipProp = CatalinaProperties.getProperty("org.apache.catalina.startup.ContextConfig.jarsToSkip");
+ if (jarToSkipProp != null) {
+ for (final String s : jarToSkipProp.split(",")) {
exclusions.add(NewLoaderLogic.sanitize(s.trim()));
}
}
}
NewLoaderLogic.setExclusions(exclusions.toArray(new String[exclusions.size()]));
- System.setProperty(Constants.SKIP_JARS_PROPERTY, Join.join(",", exclusions));
+ System.setProperty(Constants.SKIP_JARS_PROPERTY, Join.join(",", exclusions)); // not sure we need it actually since we hook our scanner by default
// Install tomcat war builder
TomcatWebAppBuilder tomcatWebAppBuilder = (TomcatWebAppBuilder) SystemInstance.get().getComponent(WebAppBuilder.class);
Modified: tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/EmbeddedJarScanner.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/EmbeddedJarScanner.java?rev=1597329&r1=1597328&r2=1597329&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/EmbeddedJarScanner.java (original)
+++ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/EmbeddedJarScanner.java Sat May 24 17:19:04 2014
@@ -77,11 +77,6 @@ public class EmbeddedJarScanner implemen
continue;
}
- // Need to scan this JAR
- if (log.isDebugEnabled()) {
- log.debug(sm.getString("jarScan.webinflibJarScan", url.toExternalForm()));
- }
-
try {
process(callback, url);
} catch (final IOException e) {
@@ -131,9 +126,8 @@ public class EmbeddedJarScanner implemen
final URL jarURL = new URL("jar:" + urlStr + "!/");
final String fileName = URLs.toFile(jarURL).getName();
- // bug in tomcat 7.0.47 so we need to handle it manually
- // TODO: remove this hack when upgrading to Tomcat 7.0.48
- if (fileName.contains("tomcat7-websocket") && FRAGMENT_CALLBACK.equals(callback.getClass().getName())) {
+
+ if ((fileName.contains("tomcat7-websocket") || fileName.contains("tomcat-websocket")) && FRAGMENT_CALLBACK.equals(callback.getClass().getName())) {
final WebXml fragment = new WebXml();
fragment.setName("org_apache_tomcat_websocket");
fragment.setDistributable(true);
Modified: tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java?rev=1597329&r1=1597328&r2=1597329&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java (original)
+++ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java Sat May 24 17:19:04 2014
@@ -30,7 +30,6 @@ import org.apache.openejb.OpenEJBExcepti
import org.apache.openejb.OpenEJBRuntimeException;
import org.apache.openejb.config.TldScanner;
import org.apache.openejb.loader.IO;
-import org.apache.openejb.util.URLs;
import org.apache.openejb.util.reflection.Reflections;
import org.apache.tomcat.JarScannerCallback;
import org.apache.tomcat.util.descriptor.XmlErrorHandler;
@@ -39,40 +38,24 @@ import org.apache.tomcat.util.scan.Const
import org.apache.tomcat.util.scan.StandardJarScanner;
import javax.servlet.ServletContext;
-import java.io.File;
-import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
-import java.net.JarURLConnection;
-import java.net.MalformedURLException;
-import java.net.URISyntaxException;
import java.net.URL;
-import java.net.URLConnection;
import java.util.ArrayList;
-import java.util.HashSet;
import java.util.Hashtable;
-import java.util.Locale;
import java.util.Map;
import java.util.Set;
-import java.util.StringTokenizer;
+// we don't respect the StandardJarScanner contract for default callbacks (FragmentJarScannerCallback and TldJarScannerCallback)
+// but that's our default, this is overridable if needed
@SuppressWarnings("unchecked")
public class TomEEJarScanner extends StandardJarScanner {
private static final Log log = LogFactory.getLog(StandardJarScanner.class);
- public static final String DEEP_TREE_MATCH = "**";
-
- private static final String OS_NAME = System.getProperty("os.name").toLowerCase(Locale.ENGLISH);
- private static final String PATH_SEP = System.getProperty("path.separator");
- private static final boolean ON_NETWARE = isNetware();
- private static final boolean ON_DOS = isDos();
-
- protected static final Set<String[]> DEFAULT_JARS_TO_SKIP;
-
/**
* The string resources for this package.
*/
@@ -96,21 +79,6 @@ public class TomEEJarScanner extends Sta
private static final Thread SERVER_SCANNING_THREAD;
static {
- final Set<String> defaultJarsToSkip = new HashSet<String>();
- final String jarList = System.getProperty(Constants.SKIP_JARS_PROPERTY);
- if (jarList != null) {
- final StringTokenizer tokenizer = new StringTokenizer(jarList, ",");
- while (tokenizer.hasMoreElements()) {
- defaultJarsToSkip.add(tokenizer.nextToken());
- }
- }
-
- final Set<String[]> ignoredJarsTokens = new HashSet<String[]>();
- for (final String pattern : defaultJarsToSkip) {
- ignoredJarsTokens.add(tokenizePathAsArray(pattern));
- }
- DEFAULT_JARS_TO_SKIP = ignoredJarsTokens;
-
try {
final ClassLoader loader = TomEEJarScanner.class.getClassLoader();
@@ -202,7 +170,7 @@ public class TomEEJarScanner extends Sta
throw new OpenEJBException("scan with default algo");
}
- final Set<URL> urls = TldScanner.scan(context.getClassLoader());
+ final Set<URL> urls = TldScanner.scan(classLoader != null ? classLoader : context.getClassLoader());
for (URL url : urls) {
if (!SERVER_URLS.contains(url)) {
tldConfig(config, url);
@@ -218,10 +186,8 @@ public class TomEEJarScanner extends Sta
config.addApplicationListener(listener);
}
}
-
- return; // done, next code is a fallback if scan() throw an exception
- } catch (OpenEJBException oe) {
- // no-op
+ } catch (final OpenEJBException oe) {
+ log.error(oe.getMessage(), oe);
}
} else if (cbName.equals(tldLocationCache.getDeclaringClass().getName())) {
ensureServerTldsScanned();
@@ -243,86 +209,14 @@ public class TomEEJarScanner extends Sta
// add server ones
final Hashtable<String, Object> mappings = (Hashtable<String, Object>) Reflections.get(tldLocationsCache, "mappings");
mappings.putAll((Map<String, Object>) MAPPINGS.clone());
-
- return;
- } catch (OpenEJBException oe) {
- // no-op
+ } catch (final OpenEJBException oe) {
+ log.error(oe.getMessage(), oe);
}
} else {
log.debug("This callback " + callback + " is not known and perf optim will not be available");
}
-
- // Scan WEB-INF/lib
- final Set<String> dirList = context.getResourcePaths(Constants.WEB_INF_LIB);
- if (dirList != null) {
- for (final String path : dirList) {
- if (path.endsWith(Constants.JAR_EXT) &&
- !matchPath(DEFAULT_JARS_TO_SKIP,
- path.substring(path.lastIndexOf('/') + 1))) {
- // Need to scan this JAR
- URL url = null;
- try {
- // File URLs are always faster to work with so use them
- // if available.
- final String realPath = context.getRealPath(path);
- if (realPath == null) {
- url = context.getResource(path);
- } else {
- url = (new File(realPath)).toURI().toURL();
- }
- this.process(callback, url);
- } catch (IOException e) {
- log.warn(sm.getString("jarScan.webinflibFail", url), e);
- }
- } else {
- if (log.isTraceEnabled()) {
- log.trace(sm.getString("jarScan.webinflibJarNoScan", path));
- }
- }
- }
- }
-
- // Scan the classpath
- if (this.isScanClassPath()) {
- if (log.isTraceEnabled()) {
- log.trace(sm.getString("jarScan.classloaderStart"));
- }
-
-
- try {
- final ClassLoader loader = Thread.currentThread().getContextClassLoader();
- final Set<URL> tldFileUrls = TldScanner.scan(loader);
-
- final Set<URL> jarUlrs = this.discardFilePaths(tldFileUrls);
-
- for (final URL url : jarUlrs) {
- final String jarName = this.getJarName(url);
-
- // Skip JARs known not to be interesting and JARs
- // in WEB-INF/lib we have already scanned
- if (jarName != null && !(matchPath(DEFAULT_JARS_TO_SKIP, jarName) || url.toString().contains(Constants.WEB_INF_LIB + jarName))) {
-
- if (log.isDebugEnabled()) {
- log.debug(sm.getString("jarScan.classloaderJarScan", url));
- }
- try {
- this.process(callback, url);
- } catch (IOException ioe) {
- log.warn(sm.getString(
- "jarScan.classloaderFail", url), ioe);
- }
- } else {
- if (log.isTraceEnabled()) {
- log.trace(sm.getString("jarScan.classloaderJarNoScan", url));
- }
- }
- }
- } catch (OpenEJBException e) {
- log.warn("JarScan.TldScan Failed ", e);
- }
- }
-
} else {
+ log.info("Not expected scanner: " + callback);
super.scan(context, classLoader, callback, jarsToIgnore);
}
}
@@ -339,25 +233,6 @@ public class TomEEJarScanner extends Sta
}
}
- private Set<URL> discardFilePaths(final Set<URL> tldFileUrls) {
- final Set<String> jarPaths = new HashSet<String>();
-
- for (final URL tldFileUrl : tldFileUrls) {
- jarPaths.add(URLs.toFilePath(tldFileUrl));
- }
-
- final Set<URL> jars = new HashSet<URL>();
- for (final String jarPath : jarPaths) {
- try {
- final URL url = new File(jarPath).toURI().toURL();
- jars.add(url);
- } catch (MalformedURLException e) {
- log.warn("Skipping JAR file " + jarPath, e);
- }
- }
- return jars;
- }
-
private static void tldLocationCache(final Object tldLocationsCache, final URL url) {
String resource = url.toString();
String entry = null;
@@ -392,462 +267,4 @@ public class TomEEJarScanner extends Sta
IO.close(is);
}
}
-
- /*
- * Scan a URL for JARs with the optional extensions to look at all files
- * and all directories.
- */
- private void process(final JarScannerCallback callback, final URL url) throws IOException {
- final URLConnection conn = url.openConnection();
- if (conn instanceof JarURLConnection) {
-
- callback.scan((JarURLConnection) conn);
-
- } else {
-
- final String urlStr = url.toString();
-
- if (urlStr.startsWith("file:") || urlStr.startsWith("jndi:")) {
-
- if (urlStr.endsWith(Constants.JAR_EXT)) {
-
- final URL jarURL = new URL("jar:" + urlStr + "!/");
- callback.scan((JarURLConnection) jarURL.openConnection());
-
- } else {
- try {
-
- final File f = new File(url.toURI());
-
- if (f.isFile() && this.isScanAllFiles()) {
-
- // Treat this file as a JAR
- final URL jarURL = new URL("jar:" + urlStr + "!/");
- callback.scan((JarURLConnection) jarURL.openConnection());
-
- } else if (f.isDirectory() && this.isScanAllDirectories()) {
-
- final File metainf = new File(f.getAbsoluteFile() + File.separator + "META-INF");
-
- if (metainf.isDirectory()) {
- callback.scan(f);
- }
- }
- } catch (URISyntaxException e) {
- // Wrap the exception and re-throw
- final IOException ioe = new IOException();
- ioe.initCause(e);
- throw ioe;
- }
- }
- }
- }
- }
-
- /*
- * Extract the JAR name, if present, from a URL
- */
- private String getJarName(final URL url) {
-
- String name = null;
-
- final String path = url.getPath();
- final int end = path.indexOf(Constants.JAR_EXT);
- if (end != -1) {
- final int start = path.lastIndexOf('/', end);
- name = path.substring(start + 1, end + 4);
- } else if (this.isScanAllDirectories()) {
- final int start = path.lastIndexOf('/');
- name = path.substring(start + 1);
- }
-
- return name;
- }
-
- public static boolean matchPath(Set<String[]> patternSet, String str) {
- for (String[] patternTokens : patternSet) {
- if (matchPath(patternTokens, tokenizePathAsArray(str), true)) {
- return true;
- }
- }
- return false;
- }
-
- public static boolean matchPath(String[] tokenizedPattern, String[] strDirs,
- boolean isCaseSensitive) {
- int patIdxStart = 0;
- int patIdxEnd = tokenizedPattern.length - 1;
- int strIdxStart = 0;
- int strIdxEnd = strDirs.length - 1;
-
- // up to first '**'
- while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {
- String patDir = tokenizedPattern[patIdxStart];
- if (patDir.equals(DEEP_TREE_MATCH)) {
- break;
- }
- if (!match(patDir, strDirs[strIdxStart], isCaseSensitive)) {
- return false;
- }
- patIdxStart++;
- strIdxStart++;
- }
- if (strIdxStart > strIdxEnd) {
- // String is exhausted
- for (int i = patIdxStart; i <= patIdxEnd; i++) {
- if (!tokenizedPattern[i].equals(DEEP_TREE_MATCH)) {
- return false;
- }
- }
- return true;
- } else {
- if (patIdxStart > patIdxEnd) {
- // String not exhausted, but pattern is. Failure.
- return false;
- }
- }
-
- // up to last '**'
- while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {
- String patDir = tokenizedPattern[patIdxEnd];
- if (patDir.equals(DEEP_TREE_MATCH)) {
- break;
- }
- if (!match(patDir, strDirs[strIdxEnd], isCaseSensitive)) {
- return false;
- }
- patIdxEnd--;
- strIdxEnd--;
- }
- if (strIdxStart > strIdxEnd) {
- // String is exhausted
- for (int i = patIdxStart; i <= patIdxEnd; i++) {
- if (!tokenizedPattern[i].equals(DEEP_TREE_MATCH)) {
- return false;
- }
- }
- return true;
- }
-
- while (patIdxStart != patIdxEnd && strIdxStart <= strIdxEnd) {
- int patIdxTmp = -1;
- for (int i = patIdxStart + 1; i <= patIdxEnd; i++) {
- if (tokenizedPattern[i].equals(DEEP_TREE_MATCH)) {
- patIdxTmp = i;
- break;
- }
- }
- if (patIdxTmp == patIdxStart + 1) {
- // '**/**' situation, so skip one
- patIdxStart++;
- continue;
- }
- // Find the pattern between padIdxStart & padIdxTmp in str between
- // strIdxStart & strIdxEnd
- int patLength = (patIdxTmp - patIdxStart - 1);
- int strLength = (strIdxEnd - strIdxStart + 1);
- int foundIdx = -1;
- strLoop:
- for (int i = 0; i <= strLength - patLength; i++) {
- for (int j = 0; j < patLength; j++) {
- String subPat = tokenizedPattern[patIdxStart + j + 1];
- String subStr = strDirs[strIdxStart + i + j];
- if (!match(subPat, subStr, isCaseSensitive)) {
- continue strLoop;
- }
- }
-
- foundIdx = strIdxStart + i;
- break;
- }
-
- if (foundIdx == -1) {
- return false;
- }
-
- patIdxStart = patIdxTmp;
- strIdxStart = foundIdx + patLength;
- }
-
- for (int i = patIdxStart; i <= patIdxEnd; i++) {
- if (!tokenizedPattern[i].equals(DEEP_TREE_MATCH)) {
- return false;
- }
- }
-
- return true;
- }
-
- public static boolean match(String pattern, String str,
- boolean caseSensitive) {
- char[] patArr = pattern.toCharArray();
- char[] strArr = str.toCharArray();
- int patIdxStart = 0;
- int patIdxEnd = patArr.length - 1;
- int strIdxStart = 0;
- int strIdxEnd = strArr.length - 1;
- char ch;
-
- boolean containsStar = false;
- for (char aPatArr : patArr) {
- if (aPatArr == '*') {
- containsStar = true;
- break;
- }
- }
-
- if (!containsStar) {
- // No '*'s, so we make a shortcut
- if (patIdxEnd != strIdxEnd) {
- return false; // Pattern and string do not have the same size
- }
- for (int i = 0; i <= patIdxEnd; i++) {
- ch = patArr[i];
- if (ch != '?') {
- if (different(caseSensitive, ch, strArr[i])) {
- return false; // Character mismatch
- }
- }
- }
- return true; // String matches against pattern
- }
-
- if (patIdxEnd == 0) {
- return true; // Pattern contains only '*', which matches anything
- }
-
- // Process characters before first star
- while (true) {
- ch = patArr[patIdxStart];
- if (ch == '*' || strIdxStart > strIdxEnd) {
- break;
- }
- if (ch != '?') {
- if (different(caseSensitive, ch, strArr[strIdxStart])) {
- return false; // Character mismatch
- }
- }
- patIdxStart++;
- strIdxStart++;
- }
- if (strIdxStart > strIdxEnd) {
- // All characters in the string are used. Check if only '*'s are
- // left in the pattern. If so, we succeeded. Otherwise failure.
- return allStars(patArr, patIdxStart, patIdxEnd);
- }
-
- // Process characters after last star
- while (true) {
- ch = patArr[patIdxEnd];
- if (ch == '*' || strIdxStart > strIdxEnd) {
- break;
- }
- if (ch != '?') {
- if (different(caseSensitive, ch, strArr[strIdxEnd])) {
- return false; // Character mismatch
- }
- }
- patIdxEnd--;
- strIdxEnd--;
- }
- if (strIdxStart > strIdxEnd) {
- // All characters in the string are used. Check if only '*'s are
- // left in the pattern. If so, we succeeded. Otherwise failure.
- return allStars(patArr, patIdxStart, patIdxEnd);
- }
-
- // process pattern between stars. padIdxStart and patIdxEnd point
- // always to a '*'.
- while (patIdxStart != patIdxEnd && strIdxStart <= strIdxEnd) {
- int patIdxTmp = -1;
- for (int i = patIdxStart + 1; i <= patIdxEnd; i++) {
- if (patArr[i] == '*') {
- patIdxTmp = i;
- break;
- }
- }
- if (patIdxTmp == patIdxStart + 1) {
- // Two stars next to each other, skip the first one.
- patIdxStart++;
- continue;
- }
- // Find the pattern between padIdxStart & padIdxTmp in str between
- // strIdxStart & strIdxEnd
- int patLength = (patIdxTmp - patIdxStart - 1);
- int strLength = (strIdxEnd - strIdxStart + 1);
- int foundIdx = -1;
- strLoop:
- for (int i = 0; i <= strLength - patLength; i++) {
- for (int j = 0; j < patLength; j++) {
- ch = patArr[patIdxStart + j + 1];
- if (ch != '?') {
- if (different(caseSensitive, ch,
- strArr[strIdxStart + i + j])) {
- continue strLoop;
- }
- }
- }
-
- foundIdx = strIdxStart + i;
- break;
- }
-
- if (foundIdx == -1) {
- return false;
- }
-
- patIdxStart = patIdxTmp;
- strIdxStart = foundIdx + patLength;
- }
-
- // All characters in the string are used. Check if only '*'s are left
- // in the pattern. If so, we succeeded. Otherwise failure.
- return allStars(patArr, patIdxStart, patIdxEnd);
- }
-
- private static boolean allStars(char[] chars, int start, int end) {
- for (int i = start; i <= end; ++i) {
- if (chars[i] != '*') {
- return false;
- }
- }
- return true;
- }
-
- private static boolean different(
- boolean caseSensitive, char ch, char other) {
- return caseSensitive
- ? ch != other
- : Character.toUpperCase(ch) != Character.toUpperCase(other);
- }
-
- public static String[] tokenizePathAsArray(String path) {
- if (log.isTraceEnabled()) {
- log.trace(sm.getString("matcher.tokenize", path));
- }
- String root = null;
- if (isAbsolutePath(path)) {
- String[] s = dissect(path);
- root = s[0];
- path = s[1];
- }
- char sep = File.separatorChar;
- int start = 0;
- int len = path.length();
- int count = 0;
- for (int pos = 0; pos < len; pos++) {
- if (path.charAt(pos) == sep) {
- if (pos != start) {
- count++;
- }
- start = pos + 1;
- }
- }
- if (len != start) {
- count++;
- }
- String[] l = new String[count + ((root == null) ? 0 : 1)];
-
- if (root != null) {
- l[0] = root;
- count = 1;
- } else {
- count = 0;
- }
- start = 0;
- for (int pos = 0; pos < len; pos++) {
- if (path.charAt(pos) == sep) {
- if (pos != start) {
- String tok = path.substring(start, pos);
- l[count++] = tok;
- }
- start = pos + 1;
- }
- }
- if (len != start) {
- String tok = path.substring(start);
- l[count/*++*/] = tok;
- }
- return l;
- }
-
- private static String[] dissect(String path) {
- char sep = File.separatorChar;
- path = path.replace('/', sep).replace('\\', sep);
-
- String root;
- int colon = path.indexOf(':');
- if (colon > 0 && (ON_DOS || ON_NETWARE)) {
-
- int next = colon + 1;
- root = path.substring(0, next);
- char[] ca = path.toCharArray();
- root += sep;
- //remove the initial separator; the root has it.
- next = (ca[next] == sep) ? next + 1 : next;
-
- StringBuilder sbPath = new StringBuilder();
- // Eliminate consecutive slashes after the drive spec:
- for (int i = next; i < ca.length; i++) {
- if (ca[i] != sep || ca[i - 1] != sep) {
- sbPath.append(ca[i]);
- }
- }
- path = sbPath.toString();
- } else if (path.length() > 1 && path.charAt(1) == sep) {
- // UNC drive
- int nextsep = path.indexOf(sep, 2);
- nextsep = path.indexOf(sep, nextsep + 1);
- root = (nextsep > 2) ? path.substring(0, nextsep + 1) : path;
- path = path.substring(root.length());
- } else {
- root = File.separator;
- path = path.substring(1);
- }
- return new String[]{root, path};
- }
-
- private static boolean isAbsolutePath(String filename) {
- int len = filename.length();
- if (len == 0) {
- return false;
- }
- char sep = File.separatorChar;
- filename = filename.replace('/', sep).replace('\\', sep);
- char c = filename.charAt(0);
- if (!(ON_DOS || ON_NETWARE)) {
- return (c == sep);
- }
- if (c == sep) {
- // CheckStyle:MagicNumber OFF
- if (!(ON_DOS && len > 4 && filename.charAt(1) == sep)) {
- return false;
- }
- // CheckStyle:MagicNumber ON
- int nextsep = filename.indexOf(sep, 2);
- return nextsep > 2 && nextsep + 1 < len;
- }
- int colon = filename.indexOf(':');
- return (Character.isLetter(c) && colon == 1
- && filename.length() > 2 && filename.charAt(2) == sep)
- || (ON_NETWARE && colon > 0);
- }
-
- /**
- * Determines if our OS is Netware.
- *
- * @return true if we run on Netware
- */
- private static boolean isNetware() {
- return OS_NAME.contains("netware");
- }
-
- /**
- * Determines if our OS is DOS.
- *
- * @return true if we run on DOS
- */
- private static boolean isDos() {
- return PATH_SEP.equals(";") && !isNetware();
- }
}
Modified: tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java?rev=1597329&r1=1597328&r2=1597329&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java (original)
+++ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomcatHelper.java Sat May 24 17:19:04 2014
@@ -24,6 +24,7 @@ import org.apache.catalina.Wrapper;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.core.StandardServer;
import org.apache.openejb.loader.SystemInstance;
+import org.apache.tomcat.util.scan.StandardJarScanner;
import javax.management.MBeanServer;
import javax.management.ObjectName;
@@ -162,9 +163,11 @@ public class TomcatHelper {
return System.getProperty("tomcat.version", "7.").startsWith("7.");
}
- public static void configureJarScanner(Context standardContext) {
- try {
- if (!(standardContext.getJarScanner() instanceof TomEEJarScanner)) {
+ public static void configureJarScanner(final Context standardContext) {
+ try { // override only if default
+ if ("true".equalsIgnoreCase(SystemInstance.get().getProperty("tomee.tomcat.override.jar-scanner", "true"))
+ && !TomEEJarScanner.class.isInstance(standardContext.getJarScanner())
+ && StandardJarScanner.class.isInstance(standardContext.getJarScanner())) {
standardContext.setJarScanner(new TomEEJarScanner());
}
} catch (Exception e) {