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
037
038
039 }
040
041 @Override
042 public URL getResource(String name) {
043 URL url = null;
044
045 if (_systemClassLoader != null) {
046 url = _systemClassLoader.getResource(name);
047 }
048
049 if (url == null) {
050 url = findResource(name);
051
052 if (url == null) {
053 url = super.getResource(name);
054 }
055 }
056
057 return url;
058 }
059
060 @Override
061 public Enumeration<URL> getResources(String name) throws IOException {
062 final List<URL> urls = new ArrayList<URL>();
063
064 Enumeration<URL> systemURLs = null;
065
066 if (_systemClassLoader != null) {
067 systemURLs = _systemClassLoader.getResources(name);
068 }
069
070 urls.addAll(_buildURLs(systemURLs));
071
072 Enumeration<URL> localURLs = findResources(name);
073
074 urls.addAll(_buildURLs(localURLs));
075
076 Enumeration<URL> parentURLs = null;
077
078 ClassLoader parentClassLoader = getParent();
079
080 if (parentClassLoader != null) {
081 parentURLs = parentClassLoader.getResources(name);
082 }
083
084 urls.addAll(_buildURLs(parentURLs));
085
086 return new Enumeration<URL>() {
087 final Iterator<URL> iterator = urls.iterator();
088
089 @Override
090 public boolean hasMoreElements() {
091 return iterator.hasNext();
092 }
093
094 @Override
095 public URL nextElement() {
096 return iterator.next();
097 }
098
099 };
100 }
101
102 @Override
103 protected synchronized Class<?> loadClass(String name, boolean resolve)
104 throws ClassNotFoundException {
105
106 Class<?> clazz = findLoadedClass(name);
107
108 if (clazz == null) {
109 if (_systemClassLoader != null) {
110 try {
111 clazz = _systemClassLoader.loadClass(name);
112 }
113 catch (ClassNotFoundException cnfe) {
114 }
115 }
116
117 if (clazz == null) {
118 try {
119 clazz = findClass(name);
120 }
121 catch (ClassNotFoundException cnfe) {
122 clazz = super.loadClass(name, resolve);
123 }
124 }
125 }
126
127 if (resolve) {
128 resolveClass(clazz);
129 }
130
131 return clazz;
132 }
133
134 private List<URL> _buildURLs(Enumeration<URL> url) {
135 if (url == null) {
136 return new ArrayList<URL>();
137 }
138
139 List<URL> urls = new ArrayList<URL>();
140
141 while (url.hasMoreElements()) {
142 urls.add(url.nextElement());
143 }
144
145 return urls;
146 }
147
148 private ClassLoader _systemClassLoader;
149
150 }