001/* 002 * Copyright (c) 2007-2016 Concurrent, Inc. All Rights Reserved. 003 * 004 * Project and contact information: http://www.cascading.org/ 005 * 006 * This file is part of the Cascading project. 007 * 008 * Licensed under the Apache License, Version 2.0 (the "License"); 009 * you may not use this file except in compliance with the License. 010 * You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, software 015 * distributed under the License is distributed on an "AS IS" BASIS, 016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 017 * See the License for the specific language governing permissions and 018 * limitations under the License. 019 */ 020 021package cascading.management.annotation; 022 023import java.lang.annotation.ElementType; 024import java.lang.annotation.Retention; 025import java.lang.annotation.RetentionPolicy; 026import java.lang.annotation.Target; 027 028/** 029 * Property annotations can be used to send additional information about certain aspects of Cascading classes 030 * to the {@link cascading.management.DocumentService}. The properties are present at runtime and allow a 031 * DocumentService to inspect, process or persist them. 032 * <p/> 033 * Property annotations can be applied to {@link cascading.tap.Tap}s, {@link cascading.scheme.Scheme}s, 034 * and any {@link cascading.operation.Operation} sub-classes (like Function or Aggregator). 035 * <p/> 036 * Property annotations can be applied to any method or field members, so that they can be accessed via 037 * java.lang.Class#getMethods() and java.lang.Class.getFields() respectively. If the member is protected/private, 038 * there will be an attempt to bypass the protected/private scope to retrieve the value. 039 * <p/> 040 * By default the {@link Visibility} is {@link Visibility#PUBLIC}, and optionality is {@code true}. 041 */ 042@Retention(RetentionPolicy.RUNTIME) 043@Target({ElementType.METHOD, ElementType.FIELD}) 044public @interface Property 045 { 046 /** 047 * The display name for the property value. Does not need to match the bean property or field name. 048 * 049 * @return the display name 050 */ 051 String name(); 052 053 /** 054 * The display visibility, see {@link Visibility}. 055 * 056 * @return the display visibility 057 */ 058 Visibility visibility() default Visibility.PUBLIC; 059 060 /** 061 * Whether the field name and null should be displayed if the value is {@code null}. 062 * <p/> 063 * When {@code true}, no data (field name, visibility, and the {@code null} value are sent to the display. The property 064 * is ignored. 065 * 066 * @return whether the field should be displayed if {@code null} 067 */ 068 boolean optional() default true; 069 }