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}