001: /*
002: * Copyright 2002-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.aop.support;
018:
019: import java.io.Serializable;
020:
021: import org.aopalliance.aop.Advice;
022:
023: import org.springframework.aop.Pointcut;
024: import org.springframework.util.ObjectUtils;
025:
026: /**
027: * Convenient class for regexp method pointcuts that hold an Advice,
028: * making them an {@link org.springframework.aop.Advisor}.
029: *
030: * <p>Configure this class using the "pattern" and "patterns"
031: * pass-through properties. These are analogous to the pattern
032: * and patterns properties of {@link AbstractRegexpMethodPointcut}.
033: *
034: * <p>Can delegate to any {@link AbstractRegexpMethodPointcut} subclass.
035: * By default, {@link JdkRegexpMethodPointcut} will be used. To choose
036: * a specific one, override the {@link #createPointcut} method.
037: *
038: * @author Rod Johnson
039: * @author Juergen Hoeller
040: * @see #setPattern
041: * @see #setPatterns
042: * @see JdkRegexpMethodPointcut
043: */
044: public class RegexpMethodPointcutAdvisor extends
045: AbstractGenericPointcutAdvisor {
046:
047: private String[] patterns;
048:
049: private AbstractRegexpMethodPointcut pointcut;
050:
051: private final Object pointcutMonitor = new SerializableMonitor();
052:
053: /**
054: * Create an empty RegexpMethodPointcutAdvisor.
055: * @see #setPattern
056: * @see #setPatterns
057: * @see #setAdvice
058: */
059: public RegexpMethodPointcutAdvisor() {
060: }
061:
062: /**
063: * Create a RegexpMethodPointcutAdvisor for the given advice.
064: * The pattern still needs to be specified afterwards.
065: * @param advice the advice to use
066: * @see #setPattern
067: * @see #setPatterns
068: */
069: public RegexpMethodPointcutAdvisor(Advice advice) {
070: setAdvice(advice);
071: }
072:
073: /**
074: * Create a RegexpMethodPointcutAdvisor for the given advice.
075: * @param pattern the pattern to use
076: * @param advice the advice to use
077: */
078: public RegexpMethodPointcutAdvisor(String pattern, Advice advice) {
079: setPattern(pattern);
080: setAdvice(advice);
081: }
082:
083: /**
084: * Create a RegexpMethodPointcutAdvisor for the given advice.
085: * @param patterns the patterns to use
086: * @param advice the advice to use
087: */
088: public RegexpMethodPointcutAdvisor(String[] patterns, Advice advice) {
089: setPatterns(patterns);
090: setAdvice(advice);
091: }
092:
093: /**
094: * Set the regular expression defining methods to match.
095: * <p>Use either this method or {@link #setPatterns}, not both.
096: * @see #setPatterns
097: */
098: public void setPattern(String pattern) {
099: setPatterns(new String[] { pattern });
100: }
101:
102: /**
103: * Set the regular expressions defining methods to match.
104: * To be passed through to the pointcut implementation.
105: * <p>Matching will be the union of all these; if any of the
106: * patterns matches, the pointcut matches.
107: * @see AbstractRegexpMethodPointcut#setPatterns
108: */
109: public void setPatterns(String[] patterns) {
110: this .patterns = patterns;
111: }
112:
113: /**
114: * Initialize the singleton Pointcut held within this Advisor.
115: */
116: public Pointcut getPointcut() {
117: synchronized (this .pointcutMonitor) {
118: if (this .pointcut == null) {
119: this .pointcut = createPointcut();
120: this .pointcut.setPatterns(this .patterns);
121: }
122: return pointcut;
123: }
124: }
125:
126: /**
127: * Create the actual pointcut: By default, a {@link JdkRegexpMethodPointcut}
128: * will be used.
129: * @return the Pointcut instance (never <code>null</code>)
130: */
131: protected AbstractRegexpMethodPointcut createPointcut() {
132: return new JdkRegexpMethodPointcut();
133: }
134:
135: public String toString() {
136: return getClass().getName() + ": advice [" + getAdvice()
137: + "], pointcut patterns "
138: + ObjectUtils.nullSafeToString(this .patterns);
139: }
140:
141: /**
142: * Empty class used for a serializable monitor object.
143: */
144: private static class SerializableMonitor implements Serializable {
145: }
146:
147: }
|