org.springframework.aop.framework.asm.DefaultCodeGenerationStrategySelector.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.aop.framework.asm.DefaultCodeGenerationStrategySelector.java

Source

/*
 * Copyright 2002-2007 the original author or authors.
 *
 * 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 org.springframework.aop.framework.asm;

import java.lang.reflect.Method;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.springframework.aop.framework.Advised;
import org.springframework.aop.framework.AdvisedSupport;

/**
 * @author Rob Harrop
 */
public class DefaultCodeGenerationStrategySelector implements CodeGenerationStrategySelector {

    private static final Log logger = LogFactory.getLog(DefaultCodeGenerationStrategySelector.class);

    public CodeGenerationStrategy select(AdvisedSupport advised, Method method, Class targetClass) {
        if (Advised.class == method.getDeclaringClass()) {
            return new AdvisedMixinCodeGenerationStrategy();
        }

        // need the advice chain to do perform anymore selections
        List chain = advised.getAdvisorChainFactory().getInterceptorsAndDynamicInterceptionAdvice(advised, method,
                targetClass);

        CodeGenerationStrategy strategy = null;

        if (isHashCodeMethod(method)) {
            strategy = new HashCodeCodeGenerationStrategy();
        }

        // TODO: consider adding explicit expose proxy support to certain strategies
        // TODO: consider factoring out certain calls such as release for the target source
        if (chain.isEmpty() && (!advised.isExposeProxy())) {
            if (advised.getTargetSource().isStatic()) {
                strategy = new StraightToTargetCodeGenerationStrategy();
            } else {
                strategy = new NonStaticTargetSourceCodeGenerationStrategy();
            }
            // TODO: add explicit support for empty target source
        } else {
            // TODO: add explicit support for static target sources
            // TODO: add explicit support for an empty target source
            // TODO: add agressive inlining for before/after advice
            strategy = new AdvisedCodeGenerationStrategy();
        }

        if (logger.isInfoEnabled()) {
            logger.info("Selected strategy [" + strategy.getClass().getName() + "] for method [" + method + "].");
        }

        return strategy;
    }

    private boolean isHashCodeMethod(Method method) {
        return ((method.getDeclaringClass() == Object.class) && (method.getParameterTypes().length == 0)
                && "hashCode".equals(method.getName()));
    }
}