001 /***************************************************************************** 002 * Copyright (c) PicoContainer Organization. All rights reserved. * 003 * ------------------------------------------------------------------------- * 004 * The software in this package is published under the terms of the BSD * 005 * style license a copy of which has been included with this distribution in * 006 * the LICENSE.txt file. * 007 * * 008 * Idea by Rachel Davies, Original code by various * 009 *****************************************************************************/ 010 package org.nanocontainer.aop.defaults; 011 012 import org.apache.oro.text.regex.MalformedPatternException; 013 import org.apache.oro.text.regex.Pattern; 014 import org.apache.oro.text.regex.Perl5Compiler; 015 import org.apache.oro.text.regex.Perl5Matcher; 016 import org.nanocontainer.aop.ComponentPointcut; 017 import org.nanocontainer.aop.MalformedRegularExpressionException; 018 019 /** 020 * Component pointcut that matches the component name against a regular 021 * expression. 022 * 023 * @author Stephen Molitor 024 * @version $Revision: 3144 $ 025 */ 026 public class NameMatchesComponentPointcut implements ComponentPointcut { 027 028 private final Pattern pattern; 029 private final Perl5Matcher matcher = new Perl5Matcher(); 030 031 /** 032 * Creates a new <code>NameMatchesComponentPointcut</code> that will match 033 * the component key against the given regular expression. The regular 034 * expression must be an <a 035 * href="http://jakarta.apache.org/oro/index.html">ORO </a> Perl5 regular 036 * expression. 037 * 038 * @param regex the regular expression to match against the component name. 039 * @throws org.nanocontainer.aop.MalformedRegularExpressionException 040 * if the regular expression is 041 * invalid. 042 */ 043 public NameMatchesComponentPointcut(String regex) throws MalformedRegularExpressionException { 044 Perl5Compiler compiler = new Perl5Compiler(); 045 try { 046 pattern = compiler.compile(regex); 047 } catch (MalformedPatternException e) { 048 throw new MalformedRegularExpressionException("malformed component name regular expression", e); 049 } 050 } 051 052 /** 053 * Tests to see if the component key's toString() value matches the regular expression passed 054 * to the constructor. 055 * 056 * @param componentKey the component key to match against. 057 * @return true if the regular expression passed to the constructor matches 058 * against <code>componentKey</code>, else false. 059 */ 060 public boolean picks(Object componentKey) { 061 String componentName = (String) componentKey.toString(); 062 return matcher.contains(componentName, pattern); 063 } 064 065 }