/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.module.framework;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
/**
* @author Miguel Pastor
*/
public class ModuleFrameworkClassLoader extends URLClassLoader {
public ModuleFrameworkClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
@Override
public URL getResource(String name) {
URL url = findResource(name);
if (url == null) {
url = super.getResource(name);
}
return url;
}
@Override
public Enumeration<URL> getResources(String name) throws IOException {
final List<URL> urls = new ArrayList<>();
urls.addAll(_buildURLs(null));
Enumeration<URL> localURLs = findResources(name);
urls.addAll(_buildURLs(localURLs));
Enumeration<URL> parentURLs = null;
ClassLoader parentClassLoader = getParent();
if (parentClassLoader != null) {
parentURLs = parentClassLoader.getResources(name);
}
urls.addAll(_buildURLs(parentURLs));
return new Enumeration<URL>() {
@Override
public boolean hasMoreElements() {
return _iterator.hasNext();
}
@Override
public URL nextElement() {
return _iterator.next();
}
private final Iterator<URL> _iterator = urls.iterator();
};
}
@Override
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException {
Object lock = getClassLoadingLock(name);
synchronized (lock) {
Class<?> clazz = findLoadedClass(name);
if (clazz == null) {
try {
clazz = findClass(name);
}
catch (ClassNotFoundException cnfe) {
clazz = super.loadClass(name, resolve);
}
}
if (resolve) {
resolveClass(clazz);
}
return clazz;
}
}
private List<URL> _buildURLs(Enumeration<URL> url) {
if (url == null) {
return new ArrayList<>();
}
List<URL> urls = new ArrayList<>();
while (url.hasMoreElements()) {
urls.add(url.nextElement());
}
return urls;
}
static {
ClassLoader.registerAsParallelCapable();
}
}