/* * Copyright (c) 2014. Escalon System-Entwicklung, Dietrich Schulten * * 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 de.escalon.hypermedia.action; /** * Allows to determine possible values for an argument annotated with {@link Select}. * * @author Dietrich Schulten */ public interface Options { /** * Gets possible values for an argument annotated with {@link Select}. The default implementation {@link * StringOptions} just passes on a given String array as possible values. Sometimes the possible values are more * dynamic and depend on the context. Therefore, an Options implementation can also determine possible values based * on another argument to the same call. The example below shows how to get possible options from a custom * DetailOptions implementation which needs a personId for that: * <pre> * @RequestMapping("/customer/{personId}/details") * public HttpEntity<Resource<List<String>> showDetails( * @PathVariable Long personId, * @RequestParam("detail") * @Select(options = DetailOptions.class, args = "personId") * List<String> details) { * ... * } * </pre> * <p>The <code>@Select</code> annotation above says that the possible detail values come from a DetailOptions * class which determines those values based on the personId. Note how the <code>personId</code> is passed to * showDetails as argument to the same call, alongside the <code>details</code> argument. This allows us to resolve * the <code>"personId"</code> arg defined for DetailOptions to an actual value.</p> <p>Within the call to {@link * Options#get} the args array contains the values specified by the args annotation attribute in the given order * . In * the example above, DetailOptions receives the personId and can read possible options for that particular * person.</p> * * @param value * parameters to be used by the implementation. Could be literal values as used by {@link StringOptions} or * some argument to a custom implementation of Options, such as an SQL string. * @param args * from the same method call, as defined by {@link Select#args()}. The possible values for a parameter * might * depend on the context. In that case, you can use {@link Select#args()} to pass other argument values * received in the same method call to an implementation of {@link Options}. See above for an example. * @return possible values * @see StringOptions */ public Object[] get(String[] value, Object... args); }