001/* 002 * Copyright 2002-2012 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 * https://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 017package org.springframework.aop.framework.adapter; 018 019import java.io.Serializable; 020import java.util.ArrayList; 021import java.util.List; 022 023import org.aopalliance.aop.Advice; 024import org.aopalliance.intercept.MethodInterceptor; 025 026import org.springframework.aop.Advisor; 027import org.springframework.aop.support.DefaultPointcutAdvisor; 028 029/** 030 * Default implementation of the {@link AdvisorAdapterRegistry} interface. 031 * Supports {@link org.aopalliance.intercept.MethodInterceptor}, 032 * {@link org.springframework.aop.MethodBeforeAdvice}, 033 * {@link org.springframework.aop.AfterReturningAdvice}, 034 * {@link org.springframework.aop.ThrowsAdvice}. 035 * 036 * @author Rod Johnson 037 * @author Rob Harrop 038 * @author Juergen Hoeller 039 */ 040@SuppressWarnings("serial") 041public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry, Serializable { 042 043 private final List<AdvisorAdapter> adapters = new ArrayList<AdvisorAdapter>(3); 044 045 046 /** 047 * Create a new DefaultAdvisorAdapterRegistry, registering well-known adapters. 048 */ 049 public DefaultAdvisorAdapterRegistry() { 050 registerAdvisorAdapter(new MethodBeforeAdviceAdapter()); 051 registerAdvisorAdapter(new AfterReturningAdviceAdapter()); 052 registerAdvisorAdapter(new ThrowsAdviceAdapter()); 053 } 054 055 056 @Override 057 public Advisor wrap(Object adviceObject) throws UnknownAdviceTypeException { 058 if (adviceObject instanceof Advisor) { 059 return (Advisor) adviceObject; 060 } 061 if (!(adviceObject instanceof Advice)) { 062 throw new UnknownAdviceTypeException(adviceObject); 063 } 064 Advice advice = (Advice) adviceObject; 065 if (advice instanceof MethodInterceptor) { 066 // So well-known it doesn't even need an adapter. 067 return new DefaultPointcutAdvisor(advice); 068 } 069 for (AdvisorAdapter adapter : this.adapters) { 070 // Check that it is supported. 071 if (adapter.supportsAdvice(advice)) { 072 return new DefaultPointcutAdvisor(advice); 073 } 074 } 075 throw new UnknownAdviceTypeException(advice); 076 } 077 078 @Override 079 public MethodInterceptor[] getInterceptors(Advisor advisor) throws UnknownAdviceTypeException { 080 List<MethodInterceptor> interceptors = new ArrayList<MethodInterceptor>(3); 081 Advice advice = advisor.getAdvice(); 082 if (advice instanceof MethodInterceptor) { 083 interceptors.add((MethodInterceptor) advice); 084 } 085 for (AdvisorAdapter adapter : this.adapters) { 086 if (adapter.supportsAdvice(advice)) { 087 interceptors.add(adapter.getInterceptor(advisor)); 088 } 089 } 090 if (interceptors.isEmpty()) { 091 throw new UnknownAdviceTypeException(advisor.getAdvice()); 092 } 093 return interceptors.toArray(new MethodInterceptor[interceptors.size()]); 094 } 095 096 @Override 097 public void registerAdvisorAdapter(AdvisorAdapter adapter) { 098 this.adapters.add(adapter); 099 } 100 101}