package com.griddynamics.jagger.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; /** * Holds and handles a custom url class loader based on provided classes url. * @n * Created by Andrey Badaev * Date: 26/12/16 */ public class UrlClassLoaderHolder { private static final Logger log = LoggerFactory.getLogger(UrlClassLoaderHolder.class); private volatile URLClassLoader urlClassLoader; public URLClassLoader get() { return urlClassLoader; } public boolean createFor(final String classesUrl) { try { log.info("Creating a classloader for classes url {} ...", classesUrl); final URL customClasses = new URL(classesUrl); this.urlClassLoader = new JaggerUrlClassLoader(new URL[]{customClasses}); log.info("Classloader for classes url {} successfully created", classesUrl); return true; } catch (MalformedURLException e) { this.urlClassLoader = null; log.error("Error during creating a custom class loader for classes url {}", classesUrl, e); } return false; } public boolean clear() { if (urlClassLoader != null) { log.info("Closing a classloader with custom url {} ...", Arrays.toString(urlClassLoader.getURLs())); try { urlClassLoader.close(); log.info("Classloader with custom url {} has been successfully closed.", Arrays.toString(urlClassLoader.getURLs())); } catch (IOException e) { log.error("Error during closing a classloader with custom url {}.", Arrays.toString(urlClassLoader.getURLs()), e); return false; } finally { urlClassLoader = null; } } return true; } }