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 final Iterator<URL> iterator = urls.iterator();
069
070 @Override
071 public boolean hasMoreElements() {
072 return iterator.hasNext();
073 }
074
075 @Override
076 public URL nextElement() {
077 return iterator.next();
078 }
079
080 };
081 }
082
083 @Override
084 protected Class<?> loadClass(String name, boolean resolve)
085 throws ClassNotFoundException {
086
087 Object lock = getClassLoadingLock(name);
088
089 synchronized (lock) {
090 Class<?> clazz = findLoadedClass(name);
091
092 if (clazz == null) {
093 try {
094 clazz = findClass(name);
095 }
096 catch (ClassNotFoundException cnfe) {
097 clazz = super.loadClass(name, resolve);
098 }
099 }
100
101 if (resolve) {
102 resolveClass(clazz);
103 }
104
105 return clazz;
106 }
107 }
108
109 private List<URL> _buildURLs(Enumeration<URL> url) {
110 if (url == null) {
111 return new ArrayList<>();
112 }
113
114 List<URL> urls = new ArrayList<>();
115
116 while (url.hasMoreElements()) {
117 urls.add(url.nextElement());
118 }
119
120 return urls;
121 }
122
123 static {
124 ClassLoader.registerAsParallelCapable();
125 }
126
127 }