ClassFilterProcessor.java :  » UML » jtracert » com » google » code » jtracert » classFilter » Java Open Source

Java Open Source » UML » jtracert 
jtracert » com » google » code » jtracert » classFilter » ClassFilterProcessor.java
package com.google.code.jtracert.classFilter;

import static com.google.code.jtracert.classFilter.FilterAction.ALLOW;
import static com.google.code.jtracert.classFilter.FilterAction.DENY;
import com.google.code.jtracert.classFilter.impl.AllowClassFilter;
import com.google.code.jtracert.classFilter.impl.DenyBootstrapAndExtensionsClassLoaders;
import com.google.code.jtracert.classFilter.impl.DenyClassByPackageNameFilter;
import com.google.code.jtracert.classFilter.impl.DenyJTracertClassesFilter;
import com.google.code.jtracert.agent.JTracertAgent;

import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;

/**
 * Distributed under GNU GENERAL PUBLIC LICENSE Version 3
 *
 * @author Dmitry.Bedrin@gmail.com
 */
public class ClassFilterProcessor {

    private Collection<ClassFilter> classFilters = new LinkedList<ClassFilter>();

    /**
     *
     */
    public ClassFilterProcessor() {
        addFilter(new AllowClassFilter());
        addFilter(new DenyJTracertClassesFilter());
        if (!JTracertAgent.isRetransformSystemClasses()) {
            addFilter(new DenyBootstrapAndExtensionsClassLoaders());
        }
        addFilter(new DenyClassByPackageNameFilter("sun.reflect")); // todo investigate why this filter is necessary
        //addFilter(new DenyClassByPackageNameFilter("org.apache.log4j"));
    }

    /**
     * @param classFilters
     */
    public ClassFilterProcessor(Collection<ClassFilter> classFilters) {
        this.classFilters = classFilters;
    }

    /**
     * @param classFilter
     * @return
     */
    public synchronized boolean addFilter(ClassFilter classFilter) {
        return classFilters.add(classFilter);
    }

    /**
     * @param classFilter
     * @return
     */
    public synchronized boolean removeClassFilter(ClassFilter classFilter) {
        return classFilters.remove(classFilter);
    }

    /**
     * @return
     */
    public Collection<ClassFilter> getClassFilters() {
        return Collections.unmodifiableCollection(classFilters);
    }

    /**
     * @param className
     * @param classLoader
     * @return
     */
    public synchronized boolean processClass(String className, ClassLoader classLoader) {

        FilterAction classNameFilterAction = ALLOW;
        FilterAction classLoaderFilterAction = ALLOW;

        for (ClassFilter classFilter : classFilters) {
            classNameFilterAction =
                    classNameFilterAction.apply(classFilter.filterClassName(className));
            classLoaderFilterAction =
                    classLoaderFilterAction.apply(classFilter.filterClassLoader(classLoader));
        }

        return !((DENY == classNameFilterAction) || (DENY == classLoaderFilterAction));

    }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.