|  | @@ -0,0 +1,120 @@
 | 
	
		
			
				|  |  | +/* Copyright 2004 Acegi Technology Pty Limited
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Licensed under the Apache License, Version 2.0 (the "License");
 | 
	
		
			
				|  |  | + * you may not use this file except in compliance with the License.
 | 
	
		
			
				|  |  | + * You may obtain a copy of the License at
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + *     http://www.apache.org/licenses/LICENSE-2.0
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Unless required by applicable law or agreed to in writing, software
 | 
	
		
			
				|  |  | + * distributed under the License is distributed on an "AS IS" BASIS,
 | 
	
		
			
				|  |  | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
	
		
			
				|  |  | + * See the License for the specific language governing permissions and
 | 
	
		
			
				|  |  | + * limitations under the License.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +package net.sf.acegisecurity.intercept.method;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import org.aopalliance.intercept.MethodInvocation;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import org.springframework.aop.framework.AopConfigException;
 | 
	
		
			
				|  |  | +import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.lang.reflect.AccessibleObject;
 | 
	
		
			
				|  |  | +import java.lang.reflect.Method;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Advisor driven by a {@link MethodDefinitionSource}, used to exclude a {@link
 | 
	
		
			
				|  |  | + * MethodSecurityInterceptor} from public (ie non-secure) methods.
 | 
	
		
			
				|  |  | + * 
 | 
	
		
			
				|  |  | + * <p>
 | 
	
		
			
				|  |  | + * Because the AOP framework caches advice calculations, this is normally
 | 
	
		
			
				|  |  | + * faster than just letting the <code>MethodSecurityInterceptor</code> run and
 | 
	
		
			
				|  |  | + * find out itself that it has no work to do.
 | 
	
		
			
				|  |  | + * </p>
 | 
	
		
			
				|  |  | + * 
 | 
	
		
			
				|  |  | + * <p>
 | 
	
		
			
				|  |  | + * This class also allows the use of Spring's
 | 
	
		
			
				|  |  | + * <code>DefaultAdvisorAutoProxyCreator</code>, which makes configuration
 | 
	
		
			
				|  |  | + * easier than setup a <code>ProxyFactoryBean</code> for each object requiring
 | 
	
		
			
				|  |  | + * security. Note that autoproxying is not supported for BeanFactory
 | 
	
		
			
				|  |  | + * implementations, as post-processing is automatic only for application
 | 
	
		
			
				|  |  | + * contexts.
 | 
	
		
			
				|  |  | + * </p>
 | 
	
		
			
				|  |  | + * 
 | 
	
		
			
				|  |  | + * <p>
 | 
	
		
			
				|  |  | + * Based on Spring's TransactionAttributeSourceAdvisor.
 | 
	
		
			
				|  |  | + * </p>
 | 
	
		
			
				|  |  | + * 
 | 
	
		
			
				|  |  | + * @author Ben Alex
 | 
	
		
			
				|  |  | + * @version $Id$
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +public class MethodDefinitionSourceAdvisor
 | 
	
		
			
				|  |  | +    extends StaticMethodMatcherPointcutAdvisor {
 | 
	
		
			
				|  |  | +    //~ Instance fields ========================================================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private MethodDefinitionSource transactionAttributeSource;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    //~ Constructors ===========================================================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public MethodDefinitionSourceAdvisor(MethodSecurityInterceptor advice) {
 | 
	
		
			
				|  |  | +        super(advice);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (advice.getObjectDefinitionSource() == null) {
 | 
	
		
			
				|  |  | +            throw new AopConfigException(
 | 
	
		
			
				|  |  | +                "Cannot construct a MethodDefinitionSourceAdvisor using a "
 | 
	
		
			
				|  |  | +                + "MethodSecurityInterceptor that has no ObjectDefinitionSource configured");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        this.transactionAttributeSource = advice.getObjectDefinitionSource();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    //~ Methods ================================================================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public boolean matches(Method m, Class targetClass) {
 | 
	
		
			
				|  |  | +        MethodInvocation methodInvocation = new InternalMethodInvocation(m);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return (this.transactionAttributeSource.getAttributes(methodInvocation) != null);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    //~ Inner Classes ==========================================================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * Represents a <code>MethodInvocation</code>.
 | 
	
		
			
				|  |  | +     * 
 | 
	
		
			
				|  |  | +     * <p>
 | 
	
		
			
				|  |  | +     * Required as <code>MethodDefinitionSource</code> only supports lookup of
 | 
	
		
			
				|  |  | +     * configuration attributes for <code>MethodInvocation</code>s.
 | 
	
		
			
				|  |  | +     * </p>
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private class InternalMethodInvocation implements MethodInvocation {
 | 
	
		
			
				|  |  | +        Method method;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public InternalMethodInvocation(Method method) {
 | 
	
		
			
				|  |  | +            this.method = method;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private InternalMethodInvocation() {}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public Object[] getArguments() {
 | 
	
		
			
				|  |  | +            throw new UnsupportedOperationException();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public Method getMethod() {
 | 
	
		
			
				|  |  | +            return this.method;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public AccessibleObject getStaticPart() {
 | 
	
		
			
				|  |  | +            throw new UnsupportedOperationException();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public Object getThis() {
 | 
	
		
			
				|  |  | +            throw new UnsupportedOperationException();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public Object proceed() throws Throwable {
 | 
	
		
			
				|  |  | +            throw new UnsupportedOperationException();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |