optionally allow unescaped urls in UrlClassLoader, correct implementation, see IDEA-58670

This commit is contained in:
Eugene Zhuravlev
2010-09-20 08:56:43 +04:00
parent 405906ce5b
commit 9f1a9eef77
6 changed files with 13 additions and 15 deletions
@@ -50,7 +50,7 @@ class ClassPath {
private static final long NS_THRESHOLD = 10000000L;
private static PrintStream ourOrder;
private volatile boolean myAcceptUnescapedUrls;
private final boolean myAcceptUnescapedUrls;
@SuppressWarnings({"UnusedDeclaration"})
private static void printOrder(Loader loader, String resource) {
@@ -79,8 +79,13 @@ class ClassPath {
}
public ClassPath(URL[] urls, boolean canLockJars, boolean canUseCache) {
this(urls, canLockJars, canUseCache, false);
}
public ClassPath(URL[] urls, boolean canLockJars, boolean canUseCache, boolean acceptUnescapedUrls) {
myCanLockJars = canLockJars;
myCanUseCache = canUseCache;
myAcceptUnescapedUrls = acceptUnescapedUrls;
push(urls);
}
@@ -205,10 +210,6 @@ class ClassPath {
}
}
public void setAcceptUnescapedUrls(boolean acceptUnescapedUrls) {
myAcceptUnescapedUrls = acceptUnescapedUrls;
}
private class MyEnumeration implements Enumeration<URL> {
private int myIndex = 0;
private Resource myRes = null;
@@ -46,6 +46,10 @@ public class UrlClassLoader extends ClassLoader {
}
public UrlClassLoader(List<URL> urls, ClassLoader parent, boolean canLockJars, boolean canUseCache) {
this(urls, parent, canLockJars, canUseCache, false);
}
public UrlClassLoader(List<URL> urls, ClassLoader parent, boolean canLockJars, boolean canUseCache, boolean acceptUnescapedUrls) {
super(parent);
myClassPath = new ClassPath(urls.toArray(new URL[urls.size()]), canLockJars, canUseCache);
@@ -57,10 +61,6 @@ public class UrlClassLoader extends ClassLoader {
myURLs.add(url);
}
public void setAcceptUnescapedUrls(boolean acceptUnescapedUrls) {
myClassPath.setAcceptUnescapedUrls(acceptUnescapedUrls);
}
public List<URL> getUrls() {
return Collections.unmodifiableList(myURLs);
}
@@ -164,7 +164,7 @@ public class AntInstallation {
Properties properties = new Properties();
InputStream stream = null;
try {
stream = new UrlClassLoader(Collections.singletonList(antJar.toURL()), null).getResourceAsStream(VERSION_RESOURCE);
stream = new UrlClassLoader(Collections.singletonList(antJar.toURL()), null, false, false, true).getResourceAsStream(VERSION_RESOURCE);
properties.load(stream);
}
catch (MalformedURLException e) {
@@ -31,7 +31,7 @@ public class AntResourcesClassLoader extends UrlClassLoader {
private final Set<String> myMisses = new HashSet<String>();
public AntResourcesClassLoader(final List<URL> urls, final ClassLoader parentLoader, final boolean canLockJars, final boolean canUseCache) {
super(urls, parentLoader, canLockJars, canUseCache);
super(urls, parentLoader, canLockJars, canUseCache, true);
}
protected Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
@@ -310,9 +310,7 @@ public class CustomAntElementsRegistry {
if (urls.size() == 0) {
return parentLoader;
}
final AntResourcesClassLoader loader = new AntResourcesClassLoader(urls, parentLoader, false, false);
loader.setAcceptUnescapedUrls(true);
return loader;
return new AntResourcesClassLoader(urls, parentLoader, false, false);
}
public static List<URL> collectUrls(AntDomClasspathElement typedef) {
@@ -587,7 +587,6 @@ public class AntTypeDefImpl extends AntTaskImpl implements AntTypeDef {
}
final AntResourcesClassLoader loader = new AntResourcesClassLoader(urls, parentLoader, false, false);
loader.setAcceptUnescapedUrls(true);
LOADERS_CACHE.setClassLoader(urls, loader);
return loader;
}