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}