/*
* Copyright 2010-2017 Norwegian Agency for Public Management and eGovernment (Difi)
*
* Licensed under the EUPL, Version 1.1 or – as soon they
* will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
*
* You may not use this work except in compliance with the Licence.
*
* You may obtain a copy of the Licence at:
*
* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
*
* Unless required by applicable law or agreed to in
* writing, software distributed under the Licence is
* distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the Licence for the specific language governing
* permissions and limitations under the Licence.
*/
package no.difi.oxalis.commons.filesystem;
import no.difi.oxalis.api.lang.OxalisPluginException;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.StreamSupport;
/**
* Util class used to support use of class loader in Oxalis.
*
* @author erlend
* @since 4.0.0
*/
public class ClassLoaderUtils {
/**
* Inititiates a {@link ClassLoader} from {@link Path}. Behaviour changes based upon input:
* <p>
* <ul>
* <li>Path is `null` - Returns current class loader.</li>
* <li>Path is a file - Returns class loader using that file only.</li>
* <li>Path is a directory - Returns class loader using all jar-files in directory.</li>
* <li>Otherwise is exception thrown.</li>
* </ul>
*
* @param path Path to be used when initiating class loader.
* @return Class loader ready for use.
*/
public static ClassLoader initiate(Path path) {
// `null` -> Return current class loader.
if (path == null)
return Thread.currentThread().getContextClassLoader();
// Is directory -> Return class loader with all jars in directory.
else if (Files.isDirectory(path))
return new URLClassLoader(
findJarFiles(path),
Thread.currentThread().getContextClassLoader()
);
// Is file -> Return class loader using file.
else if (Files.isRegularFile(path))
return new URLClassLoader(
new URL[]{FileUtils.toUrl(path)},
Thread.currentThread().getContextClassLoader()
);
// Otherwise throw exception.
else
throw new OxalisPluginException(String.format("Unable to load class loader for '%s'.", path));
}
protected static URL[] findJarFiles(Path directory) {
String glob = "*.{jar}";
try (DirectoryStream<Path> stream = Files.newDirectoryStream(directory, glob)) {
return StreamSupport.stream(stream.spliterator(), false)
.map(FileUtils::toUrl)
.toArray(URL[]::new);
} catch (IOException e) {
throw new OxalisPluginException(
String.format("Error during list of '%s' files in '%s'.", glob, directory));
}
}
}