001
014
015 package com.liferay.portal.module.framework;
016
017 import java.io.IOException;
018
019 import java.net.URL;
020 import java.net.URLClassLoader;
021
022 import java.util.ArrayList;
023 import java.util.Enumeration;
024 import java.util.Iterator;
025 import java.util.List;
026
027
030 public class ModuleFrameworkClassLoader extends URLClassLoader {
031
032 public ModuleFrameworkClassLoader(URL[] urls, ClassLoader parent) {
033 super(urls, parent);
034 }
035
036 @Override
037 public URL getResource(String name) {
038 URL url = findResource(name);
039
040 if (url == null) {
041 url = super.getResource(name);
042 }
043
044 return url;
045 }
046
047 @Override
048 public Enumeration<URL> getResources(String name) throws IOException {
049 final List<URL> urls = new ArrayList<>();
050
051 urls.addAll(_buildURLs(null));
052
053 Enumeration<URL> localURLs = findResources(name);
054
055 urls.addAll(_buildURLs(localURLs));
056
057 Enumeration<URL> parentURLs = null;
058
059 ClassLoader parentClassLoader = getParent();
060
061 if (parentClassLoader != null) {
062 parentURLs = parentClassLoader.getResources(name);
063 }
064
065 urls.addAll(_buildURLs(parentURLs));
066
067 return new Enumeration<URL>() {
068
069 final Iterator<URL> iterator = urls.iterator();
070
071 @Override
072 public boolean hasMoreElements() {
073 return iterator.hasNext();
074 }
075
076 @Override
077 public URL nextElement() {
078 return iterator.next();
079 }
080
081 };
082 }
083
084 @Override
085 protected Class<?> loadClass(String name, boolean resolve)
086 throws ClassNotFoundException {
087
088 Object lock = getClassLoadingLock(name);
089
090 synchronized (lock) {
091 Class<?> clazz = findLoadedClass(name);
092
093 if (clazz == null) {
094 try {
095 clazz = findClass(name);
096 }
097 catch (ClassNotFoundException cnfe) {
098 clazz = super.loadClass(name, resolve);
099 }
100 }
101
102 if (resolve) {
103 resolveClass(clazz);
104 }
105
106 return clazz;
107 }
108 }
109
110 private List<URL> _buildURLs(Enumeration<URL> url) {
111 if (url == null) {
112 return new ArrayList<>();
113 }
114
115 List<URL> urls = new ArrayList<>();
116
117 while (url.hasMoreElements()) {
118 urls.add(url.nextElement());
119 }
120
121 return urls;
122 }
123
124 static {
125 ClassLoader.registerAsParallelCapable();
126 }
127
128 }