/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.brooklyn.util.core.flags; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Annotation to indicate that a variable may be set through the use of a named argument, * looking for the name specified here or inferred from the annotated field/argument/object. * <p> * This is used to automate the processing where named arguments are passed in constructors * and other methods, and the values of those named arguments should be transferred to * other known fields/arguments/objects at runtime. * <p> * Fields on a class are typically set from values in a map with a call to * {@link FlagUtils#setFieldsFromFlags(java.util.Map, Object)}. * That method (and related, in the same class) will attend to the arguments here. */ @Retention(RetentionPolicy.RUNTIME) public @interface SetFromFlag { /** the flag (key) which should be used to find the value; if empty defaults to field/argument/object name */ String value() default ""; /** whether the object should not be changed once set; defaults to false * <p> * this is partially tested for in many routines, but not all; * when nullable=false the testing (when done) is guaranteed. * however if nullable is allowed we do not distinguish between null and unset * so explicitly setting null then setting to a value is not detected as an illegal mutating. */ boolean immutable() default false; /** whether the object is required & should not be set to null; defaults to true. * (there is no 'required' parameter, but setting nullable false then invoking * e.g. {@link FlagUtils#checkRequiredFields(Object)} has the effect of requiring a value) * <p> * code should call that method explicitly to enforce nullable false; * errors are not done during a call to setFieldsFromFlags * because fields may be initialised in multiple passes.) * <p> * this is partially tested for in many routines, but not all */ boolean nullable() default true; /** The default value, if it is not explicitly set. * <p> * The value will be coerced from String where required, for types supported by {@link TypeCoercions}. * <p> * The field will be initialised with its default value on the first call to setFieldsFromFlags * (or related). (The field will not be initialised if that method is not called.) */ String defaultVal() default ""; }