// Copyright 2014 The Apache Software Foundation
//
// 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.apache.tapestry5.jcache.internal;

import org.apache.tapestry5.plastic.MethodInvocation;
import org.jsr107.ri.annotations.AbstractInternalCacheKeyInvocationContext;
import org.jsr107.ri.annotations.StaticCacheKeyInvocationContext;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * Tapestry-IoC specific cache key invocation context using {@link MethodInvocation}
 * 
 * @param <A>
 *            The type of annotation this context information is for. One of
 *            {@link javax.cache.annotation.CacheResult}, {@link javax.cache.annotation.CachePut},
 *            {@link javax.cache.annotation.CacheRemove}, or
 *            {@link javax.cache.annotation.CacheRemoveAll}.
 */
public class TapestryIoCInternalCacheKeyInvocationContext<A extends Annotation> extends
        AbstractInternalCacheKeyInvocationContext<MethodInvocation, A>
{

    /**
     * Create new cache key invocation context for the static context and
     * invocation
     * 
     * @param staticCacheKeyInvocationContext
     *            Static information about the invoked method
     * @param invocation
     *            The AOP Alliance invocation context
     */
    public TapestryIoCInternalCacheKeyInvocationContext(
            StaticCacheKeyInvocationContext<A> staticCacheKeyInvocationContext,
            MethodInvocation invocation)
    {
        super(staticCacheKeyInvocationContext, invocation);
    }

    @Override
    protected Object[] getParameters(MethodInvocation invocation)
    {
        Object[] parameters = new Object[invocation.getMethod().getParameterTypes().length];
        for (int i = 0; i < parameters.length; i++)
        {
            parameters[i] = invocation.getParameter(i);
        }
        return parameters;
    }

    @Override
    protected Method getMethod(MethodInvocation invocation)
    {
        return invocation.getMethod();
    }

    @Override
    protected Object getTarget(MethodInvocation invocation)
    {
        return invocation.getInstance();
    }

}
