| @@ -18,6 +18,7 @@ | |||
| package org.apache.tools.ant; | |||
| import java.io.ByteArrayOutputStream; | |||
| import java.io.Closeable; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.IOException; | |||
| @@ -48,7 +49,6 @@ import org.apache.tools.ant.util.CollectionUtils; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| import org.apache.tools.ant.util.JavaEnvUtils; | |||
| import org.apache.tools.ant.util.LoaderUtils; | |||
| import org.apache.tools.ant.util.ReflectUtil; | |||
| import org.apache.tools.ant.util.VectorSet; | |||
| import org.apache.tools.zip.ZipLong; | |||
| @@ -69,7 +69,7 @@ import org.apache.tools.zip.ZipLong; | |||
| * </p> | |||
| * | |||
| */ | |||
| public class AntClassLoader extends ClassLoader implements SubBuildListener { | |||
| public class AntClassLoader extends ClassLoader implements SubBuildListener, Closeable { | |||
| private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); | |||
| @@ -1550,20 +1550,15 @@ public class AntClassLoader extends ClassLoader implements SubBuildListener { | |||
| return "AntClassLoader[" + getClasspath() + "]"; | |||
| } | |||
| private static Class<?> subClassToLoad = null; | |||
| private static final Class<?>[] CONSTRUCTOR_ARGS = new Class[] { | |||
| ClassLoader.class, Project.class, Path.class, Boolean.TYPE | |||
| }; | |||
| /** {@inheritDoc} */ | |||
| @Override | |||
| public Enumeration<URL> getResources(String name) throws IOException { | |||
| return getNamedResources(name); | |||
| } | |||
| static { | |||
| if (JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_1_5)) { | |||
| try { | |||
| subClassToLoad = | |||
| Class.forName("org.apache.tools.ant.loader.AntClassLoader5"); | |||
| } catch (final ClassNotFoundException e) { | |||
| // this is Java5 but the installation is lacking our subclass | |||
| } | |||
| } | |||
| /** {@inheritDoc} */ | |||
| public void close() { | |||
| cleanup(); | |||
| } | |||
| /** | |||
| @@ -1573,15 +1568,6 @@ public class AntClassLoader extends ClassLoader implements SubBuildListener { | |||
| final Project project, | |||
| final Path path, | |||
| final boolean parentFirst) { | |||
| if (subClassToLoad != null) { | |||
| return (AntClassLoader) | |||
| ReflectUtil.newInstance(subClassToLoad, | |||
| CONSTRUCTOR_ARGS, | |||
| new Object[] { | |||
| parent, project, path, | |||
| Boolean.valueOf(parentFirst) | |||
| }); | |||
| } | |||
| return new AntClassLoader(parent, project, path, parentFirst); | |||
| } | |||
| @@ -18,20 +18,15 @@ | |||
| package org.apache.tools.ant.loader; | |||
| import java.io.Closeable; | |||
| import java.io.IOException; | |||
| import java.net.URL; | |||
| import java.util.Enumeration; | |||
| import org.apache.tools.ant.AntClassLoader; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.types.Path; | |||
| /** | |||
| * Overrides getResources which became non-final in Java5 and | |||
| * implements Closeable | |||
| * @deprecated since 1.9.7 | |||
| * Just use {@link AntClassLoader} itself. | |||
| */ | |||
| public class AntClassLoader5 extends AntClassLoader implements Closeable { | |||
| public class AntClassLoader5 extends AntClassLoader { | |||
| /** | |||
| * Creates a classloader for the given project using the classpath given. | |||
| * | |||
| @@ -53,13 +48,4 @@ public class AntClassLoader5 extends AntClassLoader implements Closeable { | |||
| super(parent, project, classpath, parentFirst); | |||
| } | |||
| /** {@inheritDoc} */ | |||
| public Enumeration<URL> getResources(String name) throws IOException { | |||
| return getNamedResources(name); | |||
| } | |||
| /** {@inheritDoc} */ | |||
| public void close() { | |||
| cleanup(); | |||
| } | |||
| } | |||
| @@ -19,16 +19,21 @@ | |||
| package org.apache.tools.ant; | |||
| import static org.junit.Assert.assertEquals; | |||
| import static org.junit.Assert.assertFalse; | |||
| import static org.junit.Assert.assertNotNull; | |||
| import static org.junit.Assert.assertNull; | |||
| import static org.junit.Assert.assertTrue; | |||
| import static org.junit.Assert.fail; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.io.PrintStream; | |||
| import java.net.URL; | |||
| import java.util.Enumeration; | |||
| import org.apache.tools.ant.types.Path; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| import org.apache.tools.ant.util.CollectionUtils; | |||
| import org.junit.After; | |||
| import org.junit.Before; | |||
| import org.junit.Rule; | |||
| @@ -199,6 +204,44 @@ public class AntClassLoaderTest { | |||
| } | |||
| } | |||
| /** | |||
| * Asserts that getResources won't return resources that cannot be | |||
| * seen by AntClassLoader but by ClassLoader.this.parent. | |||
| * | |||
| * @see <a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=46752"> | |||
| * https://issues.apache.org/bugzilla/show_bug.cgi?id=46752</a> | |||
| */ | |||
| @Test | |||
| public void testGetResources() throws IOException { | |||
| AntClassLoader acl = new AntClassLoader(new EmptyLoader(), null, | |||
| new Path(null), true); | |||
| assertNull(acl.getResource("META-INF/MANIFEST.MF")); | |||
| assertFalse(acl.getResources("META-INF/MANIFEST.MF").hasMoreElements()); | |||
| // double check using system classloader as parent | |||
| acl = new AntClassLoader(null, null, new Path(null), true); | |||
| assertNotNull(acl.getResource("META-INF/MANIFEST.MF")); | |||
| assertTrue(acl.getResources("META-INF/MANIFEST.MF").hasMoreElements()); | |||
| } | |||
| @Test | |||
| public void testGetResourcesUsingFactory() throws IOException { | |||
| AntClassLoader acl = | |||
| AntClassLoader.newAntClassLoader(new EmptyLoader(), null, | |||
| new Path(null), true); | |||
| assertNull(acl.getResource("META-INF/MANIFEST.MF")); | |||
| assertFalse(acl.getResources("META-INF/MANIFEST.MF").hasMoreElements()); | |||
| } | |||
| private static class EmptyLoader extends ClassLoader { | |||
| public URL getResource(String n) { | |||
| return null; | |||
| } | |||
| public Enumeration getResources(String n) { | |||
| return new CollectionUtils.EmptyEnumeration(); | |||
| } | |||
| } | |||
| private static class GetPackageWrapper extends ClassLoader { | |||
| GetPackageWrapper(ClassLoader parent) { | |||
| super(parent); | |||
| @@ -1,73 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.loader; | |||
| import java.io.IOException; | |||
| import java.net.URL; | |||
| import java.util.Enumeration; | |||
| import org.apache.tools.ant.AntClassLoader; | |||
| import org.apache.tools.ant.types.Path; | |||
| import org.apache.tools.ant.util.CollectionUtils; | |||
| import org.junit.Test; | |||
| import static org.junit.Assert.assertFalse; | |||
| import static org.junit.Assert.assertNotNull; | |||
| import static org.junit.Assert.assertNull; | |||
| import static org.junit.Assert.assertTrue; | |||
| public class AntClassLoader5Test { | |||
| /** | |||
| * Asserts that getResources won't return resources that cannot be | |||
| * seen by AntClassLoader but by ClassLoader.this.parent. | |||
| * | |||
| * @see <a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=46752"> | |||
| * https://issues.apache.org/bugzilla/show_bug.cgi?id=46752</a> | |||
| */ | |||
| @Test | |||
| public void testGetResources() throws IOException { | |||
| AntClassLoader acl = new AntClassLoader5(new EmptyLoader(), null, | |||
| new Path(null), true); | |||
| assertNull(acl.getResource("META-INF/MANIFEST.MF")); | |||
| assertFalse(acl.getResources("META-INF/MANIFEST.MF").hasMoreElements()); | |||
| // double check using system classloader as parent | |||
| acl = new AntClassLoader5(null, null, new Path(null), true); | |||
| assertNotNull(acl.getResource("META-INF/MANIFEST.MF")); | |||
| assertTrue(acl.getResources("META-INF/MANIFEST.MF").hasMoreElements()); | |||
| } | |||
| @Test | |||
| public void testGetResourcesUsingFactory() throws IOException { | |||
| AntClassLoader acl = | |||
| AntClassLoader.newAntClassLoader(new EmptyLoader(), null, | |||
| new Path(null), true); | |||
| assertNull(acl.getResource("META-INF/MANIFEST.MF")); | |||
| assertFalse(acl.getResources("META-INF/MANIFEST.MF").hasMoreElements()); | |||
| } | |||
| private static class EmptyLoader extends ClassLoader { | |||
| public URL getResource(String n) { | |||
| return null; | |||
| } | |||
| public Enumeration getResources(String n) { | |||
| return new CollectionUtils.EmptyEnumeration(); | |||
| } | |||
| } | |||
| } | |||