001 package org.shiftone.jrat.util;
002
003
004 import org.shiftone.jrat.util.io.IOUtil;
005 import org.shiftone.jrat.util.log.Logger;
006 import org.shiftone.jrat.util.regex.GlobMatcher;
007
008 import java.io.ByteArrayOutputStream;
009 import java.io.File;
010 import java.io.IOException;
011 import java.io.InputStream;
012 import java.net.MalformedURLException;
013 import java.net.URL;
014 import java.net.URLClassLoader;
015
016
017 /**
018 * Class GlobClassLoader
019 *
020 * @author jeff@shiftone.org (Jeff Drost)
021 */
022 public class GlobClassLoader extends URLClassLoader {
023
024 private static final Logger LOG = Logger.getLogger(GlobClassLoader.class);
025 private ClassLoader parent = null;
026 private GlobMatcher globMatcher = null;
027
028 public GlobClassLoader(URL[] urls, String globPattern, ClassLoader parent) {
029
030 super(urls, parent);
031
032 this.parent = parent;
033 this.globMatcher = new GlobMatcher(globPattern);
034 }
035
036
037 public GlobClassLoader(File file, String globPattern, ClassLoader parent) throws MalformedURLException {
038 this(new URL[]{file.toURL()}, globPattern, parent);
039 }
040
041
042 public GlobClassLoader(URL[] urls, String globPattern) {
043
044 super(urls);
045
046 globMatcher = new GlobMatcher(globPattern);
047 }
048
049
050 protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
051
052 Class klass = null;
053
054 if (globMatcher.isMatch(name)) {
055 klass = loadClassHere(name);
056 } else {
057 klass = super.loadClass(name, resolve);
058 }
059
060 return klass;
061 }
062
063
064 private Class loadClassHere(String name) throws ClassNotFoundException {
065
066 Class klass = null;
067 String resourceName = null;
068 byte[] bytes = null;
069
070 LOG.debug("loadClassHere(" + name + ")");
071
072 try {
073 resourceName = name.replace('.', '/').concat(".class");
074 bytes = loadClassData(resourceName);
075 klass = defineClass(name, bytes, 0, bytes.length);
076 }
077 catch (Exception e) {
078 throw new ClassNotFoundException("not found :" + name, e);
079 }
080
081 return klass;
082 }
083
084
085 private byte[] loadClassData(String resourceName) throws IOException {
086
087 ClassLoader loader = null;
088 ByteArrayOutputStream out = null;
089 InputStream in = null;
090
091 in = getResourceAsStream(resourceName);
092
093 if (in == null) {
094 throw new IOException("class resource not found : " + resourceName);
095 }
096
097 out = new ByteArrayOutputStream();
098
099 IOUtil.copy(in, out);
100
101 return out.toByteArray();
102 }
103 }