001package com.hammurapi.common;
002
003import java.io.IOException;
004import java.net.URL;
005import java.util.Enumeration;
006import java.util.Vector;
007
008/**
009 * Class loader which filters classes/resources from another classloader. This classloader can be
010 * used for fine-grained loading of classes from a jar file which contains several logical groups of classes (e.g. packages)
011 * which have to be loaded individually, e.g. they have different dependencies.
012 * @author Pavel
013 *
014 */
015public abstract class FilterClassLoader extends ClassLoader {
016
017        private ClassLoader filtered;
018
019        protected FilterClassLoader(ClassLoader filtered) {
020                super();
021                this.filtered = filtered;
022        }
023
024        protected FilterClassLoader(ClassLoader filtered, ClassLoader parent) {
025                super(parent);
026                this.filtered = filtered;
027        }
028        
029        protected abstract boolean accept(String name);
030        
031        @Override
032        protected URL findResource(String name) {
033                return accept(name) ? filtered.getResource(name) : null;
034        }
035        
036        @Override
037        protected Enumeration<URL> findResources(String name) throws IOException {
038                return accept(name) ? filtered.getResources(name) : new Vector<URL>().elements();
039        }
040        
041        @Override
042        protected Class<?> findClass(String name) throws ClassNotFoundException {
043                if (accept(name.replace('.', '/')+".class")) {
044                        return filtered.loadClass(name);
045                }
046                return super.findClass(name);
047        }
048        
049}