001: /* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
002: *
003: * Licensed under the Apache License, Version 2.0 (the "License");
004: * you may not use this file except in compliance with the License.
005: * You may obtain a copy of the License at
006: *
007: * http://www.apache.org/licenses/LICENSE-2.0
008: *
009: * Unless required by applicable law or agreed to in writing, software
010: * distributed under the License is distributed on an "AS IS" BASIS,
011: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: * See the License for the specific language governing permissions and
013: * limitations under the License.
014: */
015:
016: package org.acegisecurity.intercept.method;
017:
018: import org.acegisecurity.ConfigAttributeDefinition;
019:
020: import org.aopalliance.intercept.MethodInvocation;
021:
022: import org.apache.commons.logging.Log;
023: import org.apache.commons.logging.LogFactory;
024:
025: import org.aspectj.lang.JoinPoint;
026: import org.aspectj.lang.reflect.CodeSignature;
027:
028: import org.springframework.util.Assert;
029:
030: import java.lang.reflect.Method;
031:
032: /**
033: * Abstract implementation of <Code>MethodDefinitionSource</code>.
034: *
035: * @author Ben Alex
036: * @version $Id: AbstractMethodDefinitionSource.java 1496 2006-05-23 13:38:33Z benalex $
037: */
038: public abstract class AbstractMethodDefinitionSource implements
039: MethodDefinitionSource {
040: //~ Static fields/initializers =====================================================================================
041:
042: private static final Log logger = LogFactory
043: .getLog(AbstractMethodDefinitionSource.class);
044:
045: //~ Methods ========================================================================================================
046:
047: public ConfigAttributeDefinition getAttributes(Object object)
048: throws IllegalArgumentException {
049: Assert.notNull(object, "Object cannot be null");
050:
051: if (object instanceof MethodInvocation) {
052: return this .lookupAttributes(((MethodInvocation) object)
053: .getMethod());
054: }
055:
056: if (object instanceof JoinPoint) {
057: JoinPoint jp = (JoinPoint) object;
058: Class targetClazz = jp.getTarget().getClass();
059: String targetMethodName = jp.getStaticPart().getSignature()
060: .getName();
061: Class[] types = ((CodeSignature) jp.getStaticPart()
062: .getSignature()).getParameterTypes();
063:
064: if (logger.isDebugEnabled()) {
065: logger.debug("Target Class: " + targetClazz);
066: logger.debug("Target Method Name: " + targetMethodName);
067:
068: for (int i = 0; i < types.length; i++) {
069: if (logger.isDebugEnabled()) {
070: logger.debug("Target Method Arg #" + i + ": "
071: + types[i]);
072: }
073: }
074: }
075:
076: try {
077: return this .lookupAttributes(targetClazz.getMethod(
078: targetMethodName, types));
079: } catch (NoSuchMethodException nsme) {
080: throw new IllegalArgumentException(
081: "Could not obtain target method from JoinPoint: "
082: + jp);
083: }
084: }
085:
086: throw new IllegalArgumentException(
087: "Object must be a MethodInvocation or JoinPoint");
088: }
089:
090: /**
091: * Performs the actual lookup of the relevant <code>ConfigAttributeDefinition</code> for the specified
092: * <code>Method</code> which is subject of the method invocation.<P>Provided so subclasses need only to
093: * provide one basic method to properly interface with the <code>MethodDefinitionSource</code>.</p>
094: * <p>Returns <code>null</code> if there are no matching attributes for the method.</p>
095: *
096: * @param method the method being invoked for which configuration attributes should be looked up
097: *
098: * @return the <code>ConfigAttributeDefinition</code> that applies to the specified <code>Method</code>
099: */
100: protected abstract ConfigAttributeDefinition lookupAttributes(
101: Method method);
102:
103: public boolean supports(Class clazz) {
104: return (MethodInvocation.class.isAssignableFrom(clazz) || JoinPoint.class
105: .isAssignableFrom(clazz));
106: }
107: }
|