📄 advisedsupport.java
字号:
/**
* Return the index (from 0) of the given advisor,
* or -1 if no such advisor applies to this proxy.
* The return value of this method can be used to index into
* the Advisors array.
* @param advisor advisor to search for
* @return index from 0 of this advisor, or -1 if there's
* no such advisor.
*/
public int indexOf(Advisor advisor) {
return this.advisors.indexOf(advisor);
}
public final boolean removeAdvisor(Advisor advisor) {
int index = indexOf(advisor);
if (index == -1) {
return false;
}
else {
removeAdvisor(index);
return true;
}
}
public void removeAdvisor(int index) throws AopConfigException {
if (isFrozen())
throw new AopConfigException("Cannot remove Advisor: config is frozen");
if (index < 0 || index > advisors.size() - 1)
throw new AopConfigException("Advisor index " + index + " is out of bounds: " +
"Only have " + advisors.size() + " advisors");
Advisor advisor = (Advisor) advisors.get(index);
if (advisor instanceof IntroductionAdvisor) {
IntroductionAdvisor ia = (IntroductionAdvisor) advisor;
// We need to remove interfaces
for (int j = 0; j < ia.getInterfaces().length; j++) {
removeInterface(ia.getInterfaces()[j]);
}
}
this.advisors.remove(index);
updateAdvisorsArray();
adviceChanged();
}
/**
* Convenience method to remove an interceptor.
*/
public final boolean removeInterceptor(Interceptor interceptor) throws AopConfigException {
int index = indexOf(interceptor);
if (index == -1) {
return false;
}
else {
removeAdvisor(index);
return true;
}
}
/**
* Set the interfaces to be proxied.
* @param interfaces the interfaces to set
*/
public void setInterfaces(Class[] interfaces) {
this.interfaces.clear();
for (int i = 0; i < interfaces.length; i++) {
addInterface(interfaces[i]);
}
}
/**
* Add a new proxied interface.
* @param newInterface additional interface to proxy
*/
public void addInterface(Class newInterface) {
this.interfaces.add(newInterface);
adviceChanged();
logger.debug("Added new aspect interface: " + newInterface);
}
/**
* Remove a proxied interface.
* Does nothing if it isn't proxied.
*/
public boolean removeInterface(Class intf) {
return this.interfaces.remove(intf);
}
public final Class[] getProxiedInterfaces() {
return (Class[]) this.interfaces.toArray(new Class[this.interfaces.size()]);
}
private void addAdvisorInternal(int pos, Advisor advice) throws AopConfigException {
if (isFrozen()) {
throw new AopConfigException("Cannot add advisor: config is frozen");
}
this.advisors.add(pos, advice);
updateAdvisorsArray();
adviceChanged();
}
public void addAdvisor(int pos, IntroductionAdvisor advisor) throws AopConfigException {
advisor.validateInterfaces();
// if the advisor passed validation we can make the change
for (int i = 0; i < advisor.getInterfaces().length; i++) {
addInterface(advisor.getInterfaces()[i]);
}
addAdvisorInternal(pos, advisor);
}
public void addAdvisor(int pos, Advisor advisor) throws AopConfigException {
if (advisor instanceof IntroductionAdvisor) {
addAdvisor(pos, (IntroductionAdvisor) advisor);
}
else {
addAdvisorInternal(pos, advisor);
}
}
public void addAdvisor(Advisor advice) {
int pos = this.advisors.size();
addAdvisor(pos, advice);
}
/**
* Bring the array up to date with the list.
*/
private void updateAdvisorsArray() {
this.advisorsArray = (Advisor[]) this.advisors.toArray(new Advisor[this.advisors.size()]);
}
public final Advisor[] getAdvisors() {
return this.advisorsArray;
}
/**
* Replace the given advisor.
* <b>NB:</b>If the advisor is an IntroductionAdvisor
* and the replacement is not or implements different interfaces,
* the proxy will need to be re-obtained or the old interfaces
* won't be supported and the new interface won't be implemented.
* @param a advisor to replace
* @param b advisor to replace it with
* @return whether it was replaced. If the advisor wasn't found in the
* list of advisors, this method returns false and does nothing.
*/
public final boolean replaceAdvisor(Advisor a, Advisor b) throws AopConfigException {
int index = indexOf(a);
if (index == -1 || b == null) {
return false;
}
removeAdvisor(index);
addAdvisor(index, b);
return true;
}
/**
* Is this interceptor included in any advisor?
* @param mi interceptor to check inclusion of
* @return whether this interceptor instance could be run in an invocation
*/
public final boolean interceptorIncluded(Interceptor mi) {
if (this.advisors.size() == 0) {
return false;
}
for (int i = 0; i < this.advisors.size(); i++) {
Advisor advice = (Advisor) this.advisors.get(i);
if (advice.getAdvice() == mi) {
return true;
}
}
return false;
}
/**
* Count interceptors of the given class
* @param interceptorClass class of the interceptor to check
* @return the count of the interceptors of this class or subclasses
*/
public final int countInterceptorsOfType(Class interceptorClass) {
if (this.advisors.size() == 0) {
return 0;
}
int count = 0;
for (int i = 0; i < this.advisors.size(); i++) {
Advisor advisor = (Advisor) this.advisors.get(i);
if (interceptorClass.isAssignableFrom(advisor.getAdvice().getClass())) {
++count;
}
}
return count;
}
/**
* Invoked when advice has changed.
*/
private synchronized void adviceChanged() {
if (this.isActive) {
for (int i = 0; i < this.listeners.size(); i++) {
((AdvisedSupportListener) this.listeners.get(i)).adviceChanged(this);
}
}
}
private void activate() {
this.isActive = true;
for (int i = 0; i < this.listeners.size(); i++) {
((AdvisedSupportListener) this.listeners.get(i)).activated(this);
}
}
/**
* Subclasses should call this to get a new AOP proxy. They should <b>not</b>
* create an AOP proxy with this as an argument.
*/
protected synchronized AopProxy createAopProxy() {
if (!this.isActive) {
activate();
}
return getAopProxyFactory().createAopProxy(this);
}
/**
* Subclasses can call this to check whether any AOP proxies have been created yet.
*/
protected final boolean isActive() {
return isActive;
}
public String toProxyConfigString() {
return toString();
}
/**
* For debugging/diagnostic use.
*/
public String toString() {
StringBuffer sb = new StringBuffer(getClass().getName() + ": ");
sb.append(this.interfaces.size()).append(" interfaces=[");
sb.append(StringUtils.collectionToCommaDelimitedString(this.interfaces)).append("]; ");
sb.append(this.advisors.size()).append(" pointcuts=[");
sb.append(StringUtils.collectionToCommaDelimitedString(this.advisors)).append("]; ");
sb.append("targetSource=[").append(this.targetSource).append("]; ");
sb.append("advisorChainFactory=").append(this.advisorChainFactory);
sb.append(super.toString());
return sb.toString();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -