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.framework;
018:
019: import java.util.LinkedList;
020: import java.util.List;
021:
022: import org.springframework.util.Assert;
023:
024: /**
025: * Base class for proxy factories.
026: * Provides convenient access to a configurable AopProxyFactory.
027: *
028: * @author Juergen Hoeller
029: * @since 2.0.3
030: * @see #createAopProxy()
031: */
032: public class ProxyCreatorSupport extends AdvisedSupport {
033:
034: /** The AopProxyFactory to use */
035: private AopProxyFactory aopProxyFactory;
036:
037: /** List of AdvisedSupportListener */
038: private List listeners = new LinkedList();
039:
040: /** Set to true when the first AOP proxy has been created */
041: private boolean active = false;
042:
043: /**
044: * Create a new ProxyCreatorSupport instance.
045: */
046: public ProxyCreatorSupport() {
047: this .aopProxyFactory = new DefaultAopProxyFactory();
048: }
049:
050: /**
051: * Create a new ProxyCreatorSupport instance.
052: * @param aopProxyFactory the AopProxyFactory to use
053: */
054: public ProxyCreatorSupport(AopProxyFactory aopProxyFactory) {
055: Assert.notNull(aopProxyFactory,
056: "AopProxyFactory must not be null");
057: this .aopProxyFactory = aopProxyFactory;
058: }
059:
060: /**
061: * Customize the AopProxyFactory, allowing different strategies
062: * to be dropped in without changing the core framework.
063: * <p>Default is {@link DefaultAopProxyFactory}, using dynamic JDK
064: * proxies or CGLIB proxies based on the requirements.
065: */
066: public void setAopProxyFactory(AopProxyFactory aopProxyFactory) {
067: Assert.notNull(aopProxyFactory,
068: "AopProxyFactory must not be null");
069: this .aopProxyFactory = aopProxyFactory;
070: }
071:
072: /**
073: * Return the AopProxyFactory that this ProxyConfig uses.
074: */
075: public AopProxyFactory getAopProxyFactory() {
076: return this .aopProxyFactory;
077: }
078:
079: /**
080: * Add the given AdvisedSupportListener to this proxy configuration.
081: * @param listener the listener to register
082: */
083: public void addListener(AdvisedSupportListener listener) {
084: Assert.notNull(listener,
085: "AdvisedSupportListener must not be null");
086: this .listeners.add(listener);
087: }
088:
089: /**
090: * Remove the given AdvisedSupportListener from this proxy configuration.
091: * @param listener the listener to deregister
092: */
093: public void removeListener(AdvisedSupportListener listener) {
094: Assert.notNull(listener,
095: "AdvisedSupportListener must not be null");
096: this .listeners.remove(listener);
097: }
098:
099: /**
100: * Subclasses should call this to get a new AOP proxy. They should <b>not</b>
101: * create an AOP proxy with <code>this</code> as an argument.
102: */
103: protected final synchronized AopProxy createAopProxy() {
104: if (!this .active) {
105: activate();
106: }
107: return getAopProxyFactory().createAopProxy(this );
108: }
109:
110: /**
111: * Activate this proxy configuration.
112: * @see AdvisedSupportListener#activated
113: */
114: private void activate() {
115: this .active = true;
116: for (int i = 0; i < this .listeners.size(); i++) {
117: ((AdvisedSupportListener) this .listeners.get(i))
118: .activated(this );
119: }
120: }
121:
122: /**
123: * Propagate advice change event to all AdvisedSupportListeners.
124: * @see AdvisedSupportListener#adviceChanged
125: */
126: protected void adviceChanged() {
127: super .adviceChanged();
128: synchronized (this ) {
129: if (this .active) {
130: for (int i = 0; i < this .listeners.size(); i++) {
131: ((AdvisedSupportListener) this .listeners.get(i))
132: .adviceChanged(this );
133: }
134: }
135: }
136: }
137:
138: /**
139: * Subclasses can call this to check whether any AOP proxies have been created yet.
140: */
141: protected final synchronized boolean isActive() {
142: return this.active;
143: }
144:
145: }
|