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 public boolean hasMoreElements() {
090 return iterator.hasNext();
091 }
092
093 public URL nextElement() {
094 return iterator.next();
095 }
096
097 };
098 }
099
100 @Override
101 protected synchronized Class<?> loadClass(String name, boolean resolve)
102 throws ClassNotFoundException {
103
104 Class<?> clazz = findLoadedClass(name);
105
106 if (clazz == null) {
107 if (_systemClassLoader != null) {
108 try {
109 clazz = _systemClassLoader.loadClass(name);
110 }
111 catch (ClassNotFoundException cnfe) {
112 }
113 }
114
115 if (clazz == null) {
116 try {
117 clazz = findClass(name);
118 }
119 catch (ClassNotFoundException cnfe) {
120 clazz = super.loadClass(name, resolve);
121 }
122 }
123 }
124
125 if (resolve) {
126 resolveClass(clazz);
127 }
128
129 return clazz;
130 }
131
132 private List<URL> _buildURLs(Enumeration<URL> url) {
133 if (url == null) {
134 return new ArrayList<URL>();
135 }
136
137 List<URL> urls = new ArrayList<URL>();
138
139 while (url.hasMoreElements()) {
140 urls.add(url.nextElement());
141 }
142
143 return urls;
144 }
145
146 private ClassLoader _systemClassLoader;
147
148 }