Skip to content

Commit

Permalink
ignite-6745 URLClassLoader.getURLs() usages are removed
Browse files Browse the repository at this point in the history
  • Loading branch information
agura committed Dec 28, 2017
1 parent 33ad0ad commit ee2a6f7
Show file tree
Hide file tree
Showing 9 changed files with 186 additions and 78 deletions.
Expand Up @@ -26,7 +26,6 @@
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.BitSet; import java.util.BitSet;
import java.util.Collection; import java.util.Collection;
Expand All @@ -39,13 +38,12 @@
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.UUID; import java.util.UUID;
import org.apache.ignite.internal.util.IgniteUtils;
import org.apache.ignite.internal.GridCodegenConverter; import org.apache.ignite.internal.GridCodegenConverter;
import org.apache.ignite.internal.GridDirectCollection; import org.apache.ignite.internal.GridDirectCollection;
import org.apache.ignite.internal.GridDirectMap; import org.apache.ignite.internal.GridDirectMap;
import org.apache.ignite.internal.GridDirectTransient; import org.apache.ignite.internal.GridDirectTransient;
import org.apache.ignite.internal.IgniteCodeGeneratingFail; import org.apache.ignite.internal.IgniteCodeGeneratingFail;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersionEx;
import org.apache.ignite.internal.util.typedef.internal.SB; import org.apache.ignite.internal.util.typedef.internal.SB;
import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.lang.IgniteUuid;
Expand Down Expand Up @@ -879,9 +877,9 @@ private Collection<Class<? extends Message>> classes() throws Exception {
} }
}); });


URLClassLoader ldr = (URLClassLoader)getClass().getClassLoader(); ClassLoader ldr = getClass().getClassLoader();


for (URL url : ldr.getURLs()) { for (URL url : IgniteUtils.classLoaderUrls(ldr)) {
File file = new File(url.toURI()); File file = new File(url.toURI());


int prefixLen = file.getPath().length() + 1; int prefixLen = file.getPath().length() + 1;
Expand Down
Expand Up @@ -19,7 +19,6 @@


import java.io.File; import java.io.File;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.UUID; import java.util.UUID;
Expand All @@ -32,6 +31,7 @@
import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteEx;
import org.apache.ignite.internal.processors.resource.GridSpringResourceContext; import org.apache.ignite.internal.processors.resource.GridSpringResourceContext;
import org.apache.ignite.internal.util.IgniteUtils;
import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteInClosure; import org.apache.ignite.lang.IgniteInClosure;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
Expand Down Expand Up @@ -164,12 +164,13 @@ protected IgniteEx startGrid(final String igniteInstanceName, final String ver,
filteredJvmArgs.add(arg); filteredJvmArgs.add(arg);
} }


URLClassLoader ldr = (URLClassLoader)CLASS_LOADER; ClassLoader ldr = CLASS_LOADER;


final Collection<Dependency> dependencies = getDependencies(ver); final Collection<Dependency> dependencies = getDependencies(ver);


StringBuilder pathBuilder = new StringBuilder(); StringBuilder pathBuilder = new StringBuilder();
for (URL url : ldr.getURLs()) {
for (URL url : IgniteUtils.classLoaderUrls(ldr)) {
String path = url.getPath(); String path = url.getPath();


boolean excluded = false; boolean excluded = false;
Expand Down
Expand Up @@ -23,7 +23,6 @@
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
Expand All @@ -33,6 +32,7 @@
import org.apache.ignite.Ignition; import org.apache.ignite.Ignition;
import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.util.GridJavaProcess; import org.apache.ignite.internal.util.GridJavaProcess;
import org.apache.ignite.internal.util.IgniteUtils;
import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.internal.util.typedef.X;
import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteInClosure; import org.apache.ignite.lang.IgniteInClosure;
Expand Down Expand Up @@ -137,9 +137,8 @@ private static Thread delayedDumpClasspath() {


X.println("Ignite startup/Init closure/post configuration closure is probably hanging at"); X.println("Ignite startup/Init closure/post configuration closure is probably hanging at");


for (StackTraceElement ste : mainThread.getStackTrace()) { for (StackTraceElement ste : mainThread.getStackTrace())
X.println("\t" + ste.toString()); X.println("\t" + ste.toString());
}


X.println("\nDumping classpath"); X.println("\nDumping classpath");
dumpClasspath(); dumpClasspath();
Expand All @@ -157,14 +156,10 @@ private static Thread delayedDumpClasspath() {
* Dumps classpath to output stream. * Dumps classpath to output stream.
*/ */
private static void dumpClasspath() { private static void dumpClasspath() {
final ClassLoader clsLdr = IgniteCompatibilityNodeRunner.class.getClassLoader(); ClassLoader clsLdr = IgniteCompatibilityNodeRunner.class.getClassLoader();
if (clsLdr instanceof URLClassLoader) {
URLClassLoader ldr = (URLClassLoader)clsLdr;


for (URL url : ldr.getURLs()) { for (URL url : IgniteUtils.classLoaderUrls(clsLdr))
X.println("Classpath url: [" + url.getPath() + "]"); X.println("Classpath url: [" + url.getPath() + ']');
}
}
} }


/** /**
Expand Down
Expand Up @@ -23,7 +23,6 @@
import java.math.BigDecimal; import java.math.BigDecimal;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Time; import java.sql.Time;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
Expand All @@ -48,6 +47,7 @@
import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteException;
import org.apache.ignite.IgniteLogger; import org.apache.ignite.IgniteLogger;
import org.apache.ignite.internal.util.IgniteUtils;
import org.apache.ignite.binary.BinaryBasicIdMapper; import org.apache.ignite.binary.BinaryBasicIdMapper;
import org.apache.ignite.binary.BinaryBasicNameMapper; import org.apache.ignite.binary.BinaryBasicNameMapper;
import org.apache.ignite.binary.BinaryIdMapper; import org.apache.ignite.binary.BinaryIdMapper;
Expand Down Expand Up @@ -553,55 +553,53 @@ private static Iterable<String> classesInPackage(String pkgName) {


ClassLoader ldr = U.gridClassLoader(); ClassLoader ldr = U.gridClassLoader();


if (ldr instanceof URLClassLoader) { String pkgPath = pkgName.replaceAll("\\.", "/");
String pkgPath = pkgName.replaceAll("\\.", "/");


URL[] urls = ((URLClassLoader)ldr).getURLs(); URL[] urls = IgniteUtils.classLoaderUrls(ldr);


for (URL url : urls) { for (URL url : urls) {
String proto = url.getProtocol().toLowerCase(); String proto = url.getProtocol().toLowerCase();


if ("file".equals(proto)) { if ("file".equals(proto)) {
try { try {
File cpElement = new File(url.toURI()); File cpElement = new File(url.toURI());


if (cpElement.isDirectory()) { if (cpElement.isDirectory()) {
File pkgDir = new File(cpElement, pkgPath); File pkgDir = new File(cpElement, pkgPath);


if (pkgDir.isDirectory()) { if (pkgDir.isDirectory()) {
for (File file : pkgDir.listFiles()) { for (File file : pkgDir.listFiles()) {
String fileName = file.getName(); String fileName = file.getName();


if (file.isFile() && fileName.toLowerCase().endsWith(".class")) if (file.isFile() && fileName.toLowerCase().endsWith(".class"))
clsNames.add(pkgName + '.' + fileName.substring(0, fileName.length() - 6)); clsNames.add(pkgName + '.' + fileName.substring(0, fileName.length() - 6));
}
} }
} }
else if (cpElement.isFile()) { }
try { else if (cpElement.isFile()) {
JarFile jar = new JarFile(cpElement); try {
JarFile jar = new JarFile(cpElement);


Enumeration<JarEntry> entries = jar.entries(); Enumeration<JarEntry> entries = jar.entries();


while (entries.hasMoreElements()) { while (entries.hasMoreElements()) {
String entry = entries.nextElement().getName(); String entry = entries.nextElement().getName();


if (entry.startsWith(pkgPath) && entry.endsWith(".class")) { if (entry.startsWith(pkgPath) && entry.endsWith(".class")) {
String clsName = entry.substring(pkgPath.length() + 1, entry.length() - 6); String clsName = entry.substring(pkgPath.length() + 1, entry.length() - 6);


if (!clsName.contains("/") && !clsName.contains("\\")) if (!clsName.contains("/") && !clsName.contains("\\"))
clsNames.add(pkgName + '.' + clsName); clsNames.add(pkgName + '.' + clsName);
}
} }
} }
catch (IOException ignored) { }
// No-op. catch (IOException ignored) {
} // No-op.
} }
} }
catch (URISyntaxException ignored) { }
// No-op. catch (URISyntaxException ignored) {
} // No-op.
} }
} }
} }
Expand Down
Expand Up @@ -20,6 +20,7 @@
import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteException;
import org.apache.ignite.internal.util.ClassCache; import org.apache.ignite.internal.util.ClassCache;
import org.apache.ignite.internal.util.IgniteUtils;
import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.internal.util.typedef.internal.U;
Expand Down Expand Up @@ -60,10 +61,10 @@ public class HadoopClassLoader extends URLClassLoader implements ClassCache {
"org.apache.ignite.internal.processors.hadoop.impl.v2.HadoopShutdownHookManager"; "org.apache.ignite.internal.processors.hadoop.impl.v2.HadoopShutdownHookManager";


/** */ /** */
private static final URLClassLoader APP_CLS_LDR = (URLClassLoader)HadoopClassLoader.class.getClassLoader(); private static final ClassLoader APP_CLS_LDR = HadoopClassLoader.class.getClassLoader();


/** */ /** */
private static final Collection<URL> appJars = F.asList(APP_CLS_LDR.getURLs()); private static final Collection<URL> appJars = F.asList(IgniteUtils.classLoaderUrls(APP_CLS_LDR));


/** Mutex for native libraries initialization. */ /** Mutex for native libraries initialization. */
private static final Object LIBS_MUX = new Object(); private static final Object LIBS_MUX = new Object();
Expand Down
Expand Up @@ -240,8 +240,6 @@
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jsr166.ConcurrentHashMap8; import org.jsr166.ConcurrentHashMap8;
import sun.misc.SharedSecrets;
import sun.misc.URLClassPath;
import sun.misc.Unsafe; import sun.misc.Unsafe;


import static org.apache.ignite.IgniteSystemProperties.IGNITE_DISABLE_HOSTNAME_VERIFIER; import static org.apache.ignite.IgniteSystemProperties.IGNITE_DISABLE_HOSTNAME_VERIFIER;
Expand Down Expand Up @@ -527,6 +525,21 @@ public abstract class IgniteUtils {
/** */ /** */
private static final boolean assertionsEnabled; private static final boolean assertionsEnabled;


/** Empty URL array. */
private static final URL[] EMPTY_URL_ARR = new URL[0];

/** Builtin class loader class.
*
* Note: needs for compatibility with Java 9.
*/
private static final Class bltClsLdrCls = defaultClassLoaderClass();

/** Url class loader field.
*
* Note: needs for compatibility with Java 9.
*/
private static final Field urlClsLdrField = urlClassLoaderField();

/* /*
* Initializes enterprise check. * Initializes enterprise check.
*/ */
Expand Down Expand Up @@ -7535,6 +7548,50 @@ public static void awaitQuiet(CyclicBarrier barrier) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }


/**
* Returns URLs of class loader
*
* @param clsLdr Class loader.
*/
public static URL[] classLoaderUrls(ClassLoader clsLdr) {
if (clsLdr == null)
return EMPTY_URL_ARR;
else if (clsLdr instanceof URLClassLoader)
return ((URLClassLoader)clsLdr).getURLs();
else if (bltClsLdrCls != null && urlClsLdrField != null && bltClsLdrCls.isAssignableFrom(clsLdr.getClass())) {
try {
return ((URLClassLoader)urlClsLdrField.get(clsLdr)).getURLs();
}
catch (IllegalAccessException e) {
return EMPTY_URL_ARR;
}
}
else
return EMPTY_URL_ARR;
}

/** */
@Nullable private static Class defaultClassLoaderClass() {
try {
return Class.forName("jdk.internal.loader.BuiltinClassLoader");
}
catch (ClassNotFoundException e) {
return null;
}
}

/** */
@Nullable private static Field urlClassLoaderField() {
try {
Class cls = defaultClassLoaderClass();

return cls == null ? null : cls.getDeclaredField("ucp");
}
catch (NoSuchFieldException e) {
return null;
}
}

/** /**
* Sleeps for given number of milliseconds. * Sleeps for given number of milliseconds.
* *
Expand Down
Expand Up @@ -18,6 +18,7 @@
package org.apache.ignite.internal.processors.hadoop; package org.apache.ignite.internal.processors.hadoop;


import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteException;
import org.apache.ignite.internal.util.IgniteUtils;
import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.internal.util.typedef.X;


Expand All @@ -32,10 +33,10 @@
*/ */
public class HadoopTestClassLoader extends URLClassLoader { public class HadoopTestClassLoader extends URLClassLoader {
/** Parent class loader. */ /** Parent class loader. */
private static final URLClassLoader APP_CLS_LDR = (URLClassLoader)HadoopTestClassLoader.class.getClassLoader(); private static final ClassLoader APP_CLS_LDR = HadoopTestClassLoader.class.getClassLoader();


/** */ /** */
private static final Collection<URL> APP_JARS = F.asList(APP_CLS_LDR.getURLs()); private static final Collection<URL> APP_JARS = F.asList(IgniteUtils.classLoaderUrls(APP_CLS_LDR));


/** All participating URLs. */ /** All participating URLs. */
private static final URL[] URLS; private static final URL[] URLS;
Expand Down

0 comments on commit ee2a6f7

Please sign in to comment.