001/*
002 * Copyright 2022-2025 Revetware LLC.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package com.soklet.core;
018
019import javax.annotation.Nonnull;
020import java.util.List;
021
022/**
023 * Contract for determining parameter values to inject when invoking <em>Resource Methods</em>.
024 * <p>
025 * Soklet's default implementation of this type, {@link com.soklet.core.impl.DefaultResourceMethodParameterProvider}, is sufficient for most applications.
026 * <p>
027 * However, should a custom implementation be necessary for your application, documentation is available at <a href="https://www.soklet.com/docs/request-handling#resource-method-parameter-injection">https://www.soklet.com/docs/request-handling#resource-method-parameter-injection</a>.
028 *
029 * @author <a href="https://www.revetkn.com">Mark Allen</a>
030 */
031@FunctionalInterface
032public interface ResourceMethodParameterProvider {
033        /**
034         * For the given {@code request} and {@code resourceMethod}, vends the list of parameters to use when invoking the
035         * underlying Java method located at {@link ResourceMethod#getMethod()}.
036         * <p>
037         * The size of the returned list of parameters must exactly match the number of parameters required by the Java method signature.
038         *
039         * @param request        the HTTP request
040         * @param resourceMethod the <em>Resource Method</em> associated with the HTTP request
041         * @return the list of parameters to use when performing Java method invocation, or the empty list if no parameters are necessary
042         */
043        @Nonnull
044        List<Object> parameterValuesForResourceMethod(@Nonnull Request request,
045                                                                                                                                                                                                @Nonnull ResourceMethod resourceMethod);
046}