1477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit/** 2477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * Copyright (C) 2008 Google Inc. 3477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * 4477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * Licensed under the Apache License, Version 2.0 (the "License"); 5477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * you may not use this file except in compliance with the License. 6477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * You may obtain a copy of the License at 7477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * 8477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * http://www.apache.org/licenses/LICENSE-2.0 9477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * 10477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * Unless required by applicable law or agreed to in writing, software 11477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * distributed under the License is distributed on an "AS IS" BASIS, 12477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * See the License for the specific language governing permissions and 14477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * limitations under the License. 15477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit */ 16477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit 17477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkitpackage com.google.inject.spi; 18477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit 19d9c913acca55023ef5d76a32c3d4a51ee6b420cbsberlinimport static com.google.common.base.Preconditions.checkNotNull; 20b7a02b02d81c830d148355c90bc309bcd66fb592sberlin 21b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport com.google.common.collect.ImmutableList; 22b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport com.google.inject.Binder; 23477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkitimport com.google.inject.matcher.Matcher; 24b7a02b02d81c830d148355c90bc309bcd66fb592sberlin 25b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport org.aopalliance.intercept.MethodInterceptor; 26b7a02b02d81c830d148355c90bc309bcd66fb592sberlin 27477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkitimport java.lang.reflect.Method; 28477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkitimport java.util.List; 29477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit 30477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit/** 3100ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * Registration of interceptors for matching methods of matching classes. Instances are created 3200ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * explicitly in a module using {@link com.google.inject.Binder#bindInterceptor( 3300ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * Matcher, Matcher, MethodInterceptor[]) bindInterceptor()} statements: 3400ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * <pre> 3500ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * bindInterceptor(Matchers.subclassesOf(MyAction.class), 3600ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * Matchers.annotatedWith(Transactional.class), 3700ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * new MyTransactionInterceptor());</pre> 38477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * 39a843a95d620de9c8046e67a8f51619b3fedf77d3limpbizkit * or from an injectable type listener using {@link TypeEncounter#bindInterceptor(Matcher, 40ee79246d47f0e4a0a4f86543809135620487332dlimpbizkit * org.aopalliance.intercept.MethodInterceptor[]) TypeEncounter.bindInterceptor()}. 4103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit * 42477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit * @author jessewilson@google.com (Jesse Wilson) 43c489adf4671b41765698d167e13960d998190c5elimpbizkit * @since 2.0 44477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit */ 4500ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkitpublic final class InterceptorBinding implements Element { 46477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit private final Object source; 47477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit private final Matcher<? super Class<?>> classMatcher; 48477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit private final Matcher<? super Method> methodMatcher; 4903b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit private final ImmutableList<MethodInterceptor> interceptors; 50477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit 5100ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit InterceptorBinding( 52477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit Object source, 53477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit Matcher<? super Class<?>> classMatcher, 54477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit Matcher<? super Method> methodMatcher, 55477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit MethodInterceptor[] interceptors) { 56477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit this.source = checkNotNull(source, "source"); 57477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit this.classMatcher = checkNotNull(classMatcher, "classMatcher"); 58477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit this.methodMatcher = checkNotNull(methodMatcher, "methodMatcher"); 595221c15e183cb7029a305766d137d909f77e8941sberlin this.interceptors = ImmutableList.copyOf(interceptors); 60477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit } 61477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit 62477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit public Object getSource() { 63477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit return source; 64477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit } 65477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit 66477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit public Matcher<? super Class<?>> getClassMatcher() { 67477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit return classMatcher; 68477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit } 69477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit 70477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit public Matcher<? super Method> getMethodMatcher() { 71477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit return methodMatcher; 72477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit } 73477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit 74477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit public List<MethodInterceptor> getInterceptors() { 75477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit return interceptors; 76477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit } 77477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit 78afa4b5dd2056a8427657186d1804313c3f34fbfelimpbizkit public <T> T acceptVisitor(ElementVisitor<T> visitor) { 7903b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit return visitor.visit(this); 8003b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit } 8103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit 8203b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit public void applyTo(Binder binder) { 8303b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit binder.withSource(getSource()).bindInterceptor(classMatcher, methodMatcher, 8403b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit interceptors.toArray(new MethodInterceptor[interceptors.size()])); 85477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit } 86477f9f9ce3e1077866b579e99cd33ab824f1ee69limpbizkit} 87