/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.logging.filter.jboss5; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.spi.Filter; import org.apache.log4j.spi.LoggingEvent; import org.jboss.classloader.spi.base.BaseClassLoader; import org.jboss.classloading.spi.dependency.ClassLoading; import org.jboss.classloading.spi.dependency.Module; import org.jboss.classloading.spi.visitor.ResourceContext; import org.jboss.classloading.spi.visitor.ResourceFilter; import org.jboss.classloading.spi.visitor.ResourceVisitor; import org.jboss.util.collection.WeakSet; /** * TCLFilter based on new CL architecute implementation * of JBoss5 * * @author Vicky Kak * */ public class TCLFilter extends Filter { /** The set of TCLs seen to match DeployURL */ private WeakSet matchSet = new WeakSet(); /** The set of TCLs seen to not match DeployURL */ private WeakSet missSet = new WeakSet(); /** The deployment URL string fragment to match against */ private String deployURL; /** Whether a match should return ACCEPT or DENY */ private boolean acceptOnMatch = true; private Pattern pattern; public boolean isAcceptOnMatch() { return acceptOnMatch; } public void setAcceptOnMatch(boolean acceptOnMatch) { this.acceptOnMatch = acceptOnMatch; } public String getDeployURL() { return deployURL; } public void setDeployURL(String deployURL) { this.deployURL = deployURL; this.pattern = Pattern.compile("^.*" + deployURL + ".*"); } public int decide(LoggingEvent event) { int ok = Filter.NEUTRAL; if (acceptOnMatch == true) { if (isMatchingTCL()) ok = Filter.ACCEPT; } else { if (isMatchingTCL()) ok = Filter.DENY; } return ok; } /** * Start with the current thread context class loader * * @return true if the caller tcl has a url matching our deployURL */ private boolean isMatchingTCL(){ ClassLoader tcl = Thread.currentThread().getContextClassLoader(); if( matchSet.contains(tcl) ) return true; if( missSet.contains(tcl) ) return false; // Search the class loader URLs for a match ClassLoader cl = tcl; while( cl != null ) { if (matchClassLoader(cl)) break; cl = cl.getParent(); } if( cl != null ) matchSet.add(tcl); else missSet.add(tcl); return (cl != null); } private boolean matchClassLoader(ClassLoader cl){ Module module = ClassLoading.getModuleForClassLoader(cl); if (module == null) return false; MatchFragment mf = new MatchFragment(); module.visit(mf, null, mf); return mf.isFound(); } private class MatchFragment implements ResourceVisitor, ResourceFilter{ private boolean found; private boolean visited; public ResourceFilter getFilter() { return null; } public boolean accepts(ResourceContext rc) { if (visited) { visited = false; // reset recursion filter return false; } return true; } public void visit(ResourceContext rc) { visited = true; if (found) return; String rcString = rc.getUrl().toExternalForm(); Matcher m = pattern.matcher(rcString); if (m.matches()) { found = true; //return; } //found = rcString.contains(deployURL); } public boolean isFound() { return found; } } }