blob: 5e6be51acb0b0d2111a0889ffaf4bb6fbdacc1ef [file] [log] [blame]
/*
* 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.ignite.compatibility.testframework.util;
import java.io.File;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLClassLoader;
import org.jetbrains.annotations.Nullable;
/**
* Utility class for compatibility tests.
*
* May contain code duplication because of using a newly added code in the 'core' module which absent in previous
* releases and which should be included in the classpath of separate JVM process.
*/
@SuppressWarnings("Duplicates")
public class CompatibilityTestsUtils {
/** 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();
/**
* 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;
}
}
/**
* Checks if the given directory is empty.
*
* @param dir Directory to check.
* @return {@code true} if the given directory is empty or doesn't exist, otherwise {@code false}.
*/
@SuppressWarnings("ConstantConditions")
public static boolean isDirectoryEmpty(File dir) {
return !dir.exists() || (dir.isDirectory() && dir.list().length == 0);
}
}