001package org.hl7.fhir.r4.model.annotations; 002 003/* 004 * #%L 005 * HAPI FHIR Structures - HL7.org DSTU2 006 * %% 007 * Copyright (C) 2014 - 2015 University Health Network 008 * %% 009 * Licensed under the Apache License, Version 2.0 (the "License"); 010 * you may not use this file except in compliance with the License. 011 * You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, software 016 * distributed under the License is distributed on an "AS IS" BASIS, 017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 018 * See the License for the specific language governing permissions and 019 * limitations under the License. 020 * #L% 021 */ 022 023/* 024Copyright (c) 2011+, HL7, Inc. 025All rights reserved. 026 027Redistribution and use in source and binary forms, with or without modification, 028are permitted provided that the following conditions are met: 029 030 * Redistributions of source code must retain the above copyright notice, this 031 list of conditions and the following disclaimer. 032 * Redistributions in binary form must reproduce the above copyright notice, 033 this list of conditions and the following disclaimer in the documentation 034 and/or other materials provided with the distribution. 035 * Neither the name of HL7 nor the names of its contributors may be used to 036 endorse or promote products derived from this software without specific 037 prior written permission. 038 039THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 040ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 041WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 042IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 043INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 044NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 045PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 046WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 047ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 048POSSIBILITY OF SUCH DAMAGE. 049 050*/ 051 052import java.lang.annotation.ElementType; 053import java.lang.annotation.Retention; 054import java.lang.annotation.RetentionPolicy; 055import java.lang.annotation.Target; 056 057import org.hl7.fhir.r4.model.Enumeration; 058import org.hl7.fhir.r4.model.api.IBase; 059import org.hl7.fhir.r4.model.api.IBaseEnumFactory; 060 061/** 062 * Field annotation for fields within resource and datatype definitions, indicating 063 * a child of that type. 064 */ 065@Retention(RetentionPolicy.RUNTIME) 066@Target(value= {ElementType.FIELD}) 067public @interface Child { 068 069 /** 070 * Constant value to supply for {@link #order()} when the order is defined 071 * elsewhere 072 */ 073 int ORDER_UNKNOWN = -1; 074 075 /** 076 * Constant value to supply for {@link #max()} to indicate '*' (no maximum) 077 */ 078 int MAX_UNLIMITED = -1; 079 080 /** 081 * Constant value to supply for {@link #order()} to indicate that this child should replace the 082 * entry in the superclass with the same name (and take its {@link Child#order() order} value 083 * in the process). This is useful if you wish to redefine an existing field in a resource/type 084 * definition in order to constrain/extend it. 085 */ 086 int REPLACE_PARENT = -2; 087 088 /** 089 * The name of this field, as it will appear in serialized versions of the message 090 */ 091 String name(); 092 093 /** 094 * The order in which this field comes within its parent. The first field should have a 095 * value of 0, the second a value of 1, etc. 096 */ 097 int order() default ORDER_UNKNOWN; 098 099 /** 100 * The minimum number of repetitions allowed for this child 101 */ 102 int min() default 0; 103 104 /** 105 * The maximum number of repetitions allowed for this child. Should be 106 * set to {@link #MAX_UNLIMITED} if there is no limit to the number of 107 * repetitions. 108 */ 109 int max() default 1; 110 111 /** 112 * Lists the allowable types for this field, if the field supports multiple 113 * types (otherwise does not need to be populated). 114 * <p> 115 * For example, if this field supports either DateTimeDt or BooleanDt types, 116 * those two classes should be supplied here. 117 * </p> 118 */ 119 Class<? extends IBase>[] type() default {}; 120 121 /** 122 * For children which accept an {@link Enumeration} as the type, this 123 * field indicates the type to use for the enum factory 124 */ 125 Class<? extends IBaseEnumFactory<?>> enumFactory() default NoEnumFactory.class; 126 127 /** 128 * Is this element a modifier? 129 */ 130 boolean modifier() default false; 131 132 /** 133 * Should this element be included in the summary view 134 */ 135 boolean summary() default false; 136 137 // Not implemented 138// /** 139// * This value is used when extending a built-in model class and defining a 140// * field to replace a field within the built-in class. For example, the {@link Patient} 141// * resource has a {@link Patient#getName() name} field, but if you wanted to extend Patient and 142// * provide your own implementation of {@link HumanNameDt} (most likely your own subclass of 143// * HumanNameDt which adds extensions of your choosing) you could do that using a replacement field. 144// */ 145// String replaces() default ""; 146 147 public static class NoEnumFactory implements IBaseEnumFactory<Enum<?>> { 148 149 private NoEnumFactory() { 150 // non instantiable 151 } 152 153 @Override 154 public Enum<?> fromCode(String theCodeString) throws IllegalArgumentException { 155 return null; 156 } 157 158 @Override 159 public String toCode(Enum<?> theCode) { 160 return null; 161 } 162 163 } 164 165}