001package org.hl7.fhir.dstu3.model;
002
003
004
005/*
006  Copyright (c) 2011+, HL7, Inc.
007  All rights reserved.
008  
009  Redistribution and use in source and binary forms, with or without modification, 
010  are permitted provided that the following conditions are met:
011  
012   * Redistributions of source code must retain the above copyright notice, this 
013     list of conditions and the following disclaimer.
014   * Redistributions in binary form must reproduce the above copyright notice, 
015     this list of conditions and the following disclaimer in the documentation 
016     and/or other materials provided with the distribution.
017   * Neither the name of HL7 nor the names of its contributors may be used to 
018     endorse or promote products derived from this software without specific 
019     prior written permission.
020  
021  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
022  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
023  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
024  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
025  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
026  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
027  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
028  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
029  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
030  POSSIBILITY OF SUCH DAMAGE.
031  
032*/
033
034// Generated on Fri, Mar 16, 2018 15:21+1100 for FHIR v3.0.x
035import java.util.ArrayList;
036import java.util.Date;
037import java.util.List;
038
039import org.hl7.fhir.dstu3.model.Enumerations.BindingStrength;
040import org.hl7.fhir.dstu3.model.Enumerations.BindingStrengthEnumFactory;
041import org.hl7.fhir.dstu3.model.Enumerations.PublicationStatus;
042import org.hl7.fhir.dstu3.model.Enumerations.PublicationStatusEnumFactory;
043import org.hl7.fhir.dstu3.model.Enumerations.SearchParamType;
044import org.hl7.fhir.dstu3.model.Enumerations.SearchParamTypeEnumFactory;
045import org.hl7.fhir.exceptions.FHIRException;
046import org.hl7.fhir.exceptions.FHIRFormatError;
047import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
048import org.hl7.fhir.utilities.Utilities;
049
050import ca.uhn.fhir.model.api.annotation.Block;
051import ca.uhn.fhir.model.api.annotation.Child;
052import ca.uhn.fhir.model.api.annotation.ChildOrder;
053import ca.uhn.fhir.model.api.annotation.Description;
054import ca.uhn.fhir.model.api.annotation.ResourceDef;
055import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
056/**
057 * A formal computable definition of an operation (on the RESTful interface) or a named query (using the search interaction).
058 */
059@ResourceDef(name="OperationDefinition", profile="http://hl7.org/fhir/Profile/OperationDefinition")
060@ChildOrder(names={"url", "version", "name", "status", "kind", "experimental", "date", "publisher", "contact", "description", "useContext", "jurisdiction", "purpose", "idempotent", "code", "comment", "base", "resource", "system", "type", "instance", "parameter", "overload"})
061public class OperationDefinition extends MetadataResource {
062
063    public enum OperationKind {
064        /**
065         * This operation is invoked as an operation.
066         */
067        OPERATION, 
068        /**
069         * This operation is a named query, invoked using the search mechanism.
070         */
071        QUERY, 
072        /**
073         * added to help the parsers with the generic types
074         */
075        NULL;
076        public static OperationKind fromCode(String codeString) throws FHIRException {
077            if (codeString == null || "".equals(codeString))
078                return null;
079        if ("operation".equals(codeString))
080          return OPERATION;
081        if ("query".equals(codeString))
082          return QUERY;
083        if (Configuration.isAcceptInvalidEnums())
084          return null;
085        else
086          throw new FHIRException("Unknown OperationKind code '"+codeString+"'");
087        }
088        public String toCode() {
089          switch (this) {
090            case OPERATION: return "operation";
091            case QUERY: return "query";
092            case NULL: return null;
093            default: return "?";
094          }
095        }
096        public String getSystem() {
097          switch (this) {
098            case OPERATION: return "http://hl7.org/fhir/operation-kind";
099            case QUERY: return "http://hl7.org/fhir/operation-kind";
100            case NULL: return null;
101            default: return "?";
102          }
103        }
104        public String getDefinition() {
105          switch (this) {
106            case OPERATION: return "This operation is invoked as an operation.";
107            case QUERY: return "This operation is a named query, invoked using the search mechanism.";
108            case NULL: return null;
109            default: return "?";
110          }
111        }
112        public String getDisplay() {
113          switch (this) {
114            case OPERATION: return "Operation";
115            case QUERY: return "Query";
116            case NULL: return null;
117            default: return "?";
118          }
119        }
120    }
121
122  public static class OperationKindEnumFactory implements EnumFactory<OperationKind> {
123    public OperationKind fromCode(String codeString) throws IllegalArgumentException {
124      if (codeString == null || "".equals(codeString))
125            if (codeString == null || "".equals(codeString))
126                return null;
127        if ("operation".equals(codeString))
128          return OperationKind.OPERATION;
129        if ("query".equals(codeString))
130          return OperationKind.QUERY;
131        throw new IllegalArgumentException("Unknown OperationKind code '"+codeString+"'");
132        }
133        public Enumeration<OperationKind> fromType(PrimitiveType<?> code) throws FHIRException {
134          if (code == null)
135            return null;
136          if (code.isEmpty())
137            return new Enumeration<OperationKind>(this);
138          String codeString = code.asStringValue();
139          if (codeString == null || "".equals(codeString))
140            return null;
141        if ("operation".equals(codeString))
142          return new Enumeration<OperationKind>(this, OperationKind.OPERATION);
143        if ("query".equals(codeString))
144          return new Enumeration<OperationKind>(this, OperationKind.QUERY);
145        throw new FHIRException("Unknown OperationKind code '"+codeString+"'");
146        }
147    public String toCode(OperationKind code) {
148      if (code == OperationKind.OPERATION)
149        return "operation";
150      if (code == OperationKind.QUERY)
151        return "query";
152      return "?";
153      }
154    public String toSystem(OperationKind code) {
155      return code.getSystem();
156      }
157    }
158
159    public enum OperationParameterUse {
160        /**
161         * This is an input parameter.
162         */
163        IN, 
164        /**
165         * This is an output parameter.
166         */
167        OUT, 
168        /**
169         * added to help the parsers with the generic types
170         */
171        NULL;
172        public static OperationParameterUse fromCode(String codeString) throws FHIRException {
173            if (codeString == null || "".equals(codeString))
174                return null;
175        if ("in".equals(codeString))
176          return IN;
177        if ("out".equals(codeString))
178          return OUT;
179        if (Configuration.isAcceptInvalidEnums())
180          return null;
181        else
182          throw new FHIRException("Unknown OperationParameterUse code '"+codeString+"'");
183        }
184        public String toCode() {
185          switch (this) {
186            case IN: return "in";
187            case OUT: return "out";
188            case NULL: return null;
189            default: return "?";
190          }
191        }
192        public String getSystem() {
193          switch (this) {
194            case IN: return "http://hl7.org/fhir/operation-parameter-use";
195            case OUT: return "http://hl7.org/fhir/operation-parameter-use";
196            case NULL: return null;
197            default: return "?";
198          }
199        }
200        public String getDefinition() {
201          switch (this) {
202            case IN: return "This is an input parameter.";
203            case OUT: return "This is an output parameter.";
204            case NULL: return null;
205            default: return "?";
206          }
207        }
208        public String getDisplay() {
209          switch (this) {
210            case IN: return "In";
211            case OUT: return "Out";
212            case NULL: return null;
213            default: return "?";
214          }
215        }
216    }
217
218  public static class OperationParameterUseEnumFactory implements EnumFactory<OperationParameterUse> {
219    public OperationParameterUse fromCode(String codeString) throws IllegalArgumentException {
220      if (codeString == null || "".equals(codeString))
221            if (codeString == null || "".equals(codeString))
222                return null;
223        if ("in".equals(codeString))
224          return OperationParameterUse.IN;
225        if ("out".equals(codeString))
226          return OperationParameterUse.OUT;
227        throw new IllegalArgumentException("Unknown OperationParameterUse code '"+codeString+"'");
228        }
229        public Enumeration<OperationParameterUse> fromType(PrimitiveType<?> code) throws FHIRException {
230          if (code == null)
231            return null;
232          if (code.isEmpty())
233            return new Enumeration<OperationParameterUse>(this);
234          String codeString = code.asStringValue();
235          if (codeString == null || "".equals(codeString))
236            return null;
237        if ("in".equals(codeString))
238          return new Enumeration<OperationParameterUse>(this, OperationParameterUse.IN);
239        if ("out".equals(codeString))
240          return new Enumeration<OperationParameterUse>(this, OperationParameterUse.OUT);
241        throw new FHIRException("Unknown OperationParameterUse code '"+codeString+"'");
242        }
243    public String toCode(OperationParameterUse code) {
244      if (code == OperationParameterUse.IN)
245        return "in";
246      if (code == OperationParameterUse.OUT)
247        return "out";
248      return "?";
249      }
250    public String toSystem(OperationParameterUse code) {
251      return code.getSystem();
252      }
253    }
254
255    @Block()
256    public static class OperationDefinitionParameterComponent extends BackboneElement implements IBaseBackboneElement {
257        /**
258         * The name of used to identify the parameter.
259         */
260        @Child(name = "name", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=false)
261        @Description(shortDefinition="Name in Parameters.parameter.name or in URL", formalDefinition="The name of used to identify the parameter." )
262        protected CodeType name;
263
264        /**
265         * Whether this is an input or an output parameter.
266         */
267        @Child(name = "use", type = {CodeType.class}, order=2, min=1, max=1, modifier=false, summary=false)
268        @Description(shortDefinition="in | out", formalDefinition="Whether this is an input or an output parameter." )
269        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/operation-parameter-use")
270        protected Enumeration<OperationParameterUse> use;
271
272        /**
273         * The minimum number of times this parameter SHALL appear in the request or response.
274         */
275        @Child(name = "min", type = {IntegerType.class}, order=3, min=1, max=1, modifier=false, summary=false)
276        @Description(shortDefinition="Minimum Cardinality", formalDefinition="The minimum number of times this parameter SHALL appear in the request or response." )
277        protected IntegerType min;
278
279        /**
280         * The maximum number of times this element is permitted to appear in the request or response.
281         */
282        @Child(name = "max", type = {StringType.class}, order=4, min=1, max=1, modifier=false, summary=false)
283        @Description(shortDefinition="Maximum Cardinality (a number or *)", formalDefinition="The maximum number of times this element is permitted to appear in the request or response." )
284        protected StringType max;
285
286        /**
287         * Describes the meaning or use of this parameter.
288         */
289        @Child(name = "documentation", type = {StringType.class}, order=5, min=0, max=1, modifier=false, summary=false)
290        @Description(shortDefinition="Description of meaning/use", formalDefinition="Describes the meaning or use of this parameter." )
291        protected StringType documentation;
292
293        /**
294         * The type for this parameter.
295         */
296        @Child(name = "type", type = {CodeType.class}, order=6, min=0, max=1, modifier=false, summary=false)
297        @Description(shortDefinition="What type this parameter has", formalDefinition="The type for this parameter." )
298        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/all-types")
299        protected CodeType type;
300
301        /**
302         * How the parameter is understood as a search parameter. This is only used if the parameter type is 'string'.
303         */
304        @Child(name = "searchType", type = {CodeType.class}, order=7, min=0, max=1, modifier=false, summary=false)
305        @Description(shortDefinition="number | date | string | token | reference | composite | quantity | uri", formalDefinition="How the parameter is understood as a search parameter. This is only used if the parameter type is 'string'." )
306        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/search-param-type")
307        protected Enumeration<SearchParamType> searchType;
308
309        /**
310         * A profile the specifies the rules that this parameter must conform to.
311         */
312        @Child(name = "profile", type = {StructureDefinition.class}, order=8, min=0, max=1, modifier=false, summary=false)
313        @Description(shortDefinition="Profile on the type", formalDefinition="A profile the specifies the rules that this parameter must conform to." )
314        protected Reference profile;
315
316        /**
317         * The actual object that is the target of the reference (A profile the specifies the rules that this parameter must conform to.)
318         */
319        protected StructureDefinition profileTarget;
320
321        /**
322         * Binds to a value set if this parameter is coded (code, Coding, CodeableConcept).
323         */
324        @Child(name = "binding", type = {}, order=9, min=0, max=1, modifier=false, summary=false)
325        @Description(shortDefinition="ValueSet details if this is coded", formalDefinition="Binds to a value set if this parameter is coded (code, Coding, CodeableConcept)." )
326        protected OperationDefinitionParameterBindingComponent binding;
327
328        /**
329         * The parts of a nested Parameter.
330         */
331        @Child(name = "part", type = {OperationDefinitionParameterComponent.class}, order=10, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
332        @Description(shortDefinition="Parts of a nested Parameter", formalDefinition="The parts of a nested Parameter." )
333        protected List<OperationDefinitionParameterComponent> part;
334
335        private static final long serialVersionUID = -885506257L;
336
337    /**
338     * Constructor
339     */
340      public OperationDefinitionParameterComponent() {
341        super();
342      }
343
344    /**
345     * Constructor
346     */
347      public OperationDefinitionParameterComponent(CodeType name, Enumeration<OperationParameterUse> use, IntegerType min, StringType max) {
348        super();
349        this.name = name;
350        this.use = use;
351        this.min = min;
352        this.max = max;
353      }
354
355        /**
356         * @return {@link #name} (The name of used to identify the parameter.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
357         */
358        public CodeType getNameElement() { 
359          if (this.name == null)
360            if (Configuration.errorOnAutoCreate())
361              throw new Error("Attempt to auto-create OperationDefinitionParameterComponent.name");
362            else if (Configuration.doAutoCreate())
363              this.name = new CodeType(); // bb
364          return this.name;
365        }
366
367        public boolean hasNameElement() { 
368          return this.name != null && !this.name.isEmpty();
369        }
370
371        public boolean hasName() { 
372          return this.name != null && !this.name.isEmpty();
373        }
374
375        /**
376         * @param value {@link #name} (The name of used to identify the parameter.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
377         */
378        public OperationDefinitionParameterComponent setNameElement(CodeType value) { 
379          this.name = value;
380          return this;
381        }
382
383        /**
384         * @return The name of used to identify the parameter.
385         */
386        public String getName() { 
387          return this.name == null ? null : this.name.getValue();
388        }
389
390        /**
391         * @param value The name of used to identify the parameter.
392         */
393        public OperationDefinitionParameterComponent setName(String value) { 
394            if (this.name == null)
395              this.name = new CodeType();
396            this.name.setValue(value);
397          return this;
398        }
399
400        /**
401         * @return {@link #use} (Whether this is an input or an output parameter.). This is the underlying object with id, value and extensions. The accessor "getUse" gives direct access to the value
402         */
403        public Enumeration<OperationParameterUse> getUseElement() { 
404          if (this.use == null)
405            if (Configuration.errorOnAutoCreate())
406              throw new Error("Attempt to auto-create OperationDefinitionParameterComponent.use");
407            else if (Configuration.doAutoCreate())
408              this.use = new Enumeration<OperationParameterUse>(new OperationParameterUseEnumFactory()); // bb
409          return this.use;
410        }
411
412        public boolean hasUseElement() { 
413          return this.use != null && !this.use.isEmpty();
414        }
415
416        public boolean hasUse() { 
417          return this.use != null && !this.use.isEmpty();
418        }
419
420        /**
421         * @param value {@link #use} (Whether this is an input or an output parameter.). This is the underlying object with id, value and extensions. The accessor "getUse" gives direct access to the value
422         */
423        public OperationDefinitionParameterComponent setUseElement(Enumeration<OperationParameterUse> value) { 
424          this.use = value;
425          return this;
426        }
427
428        /**
429         * @return Whether this is an input or an output parameter.
430         */
431        public OperationParameterUse getUse() { 
432          return this.use == null ? null : this.use.getValue();
433        }
434
435        /**
436         * @param value Whether this is an input or an output parameter.
437         */
438        public OperationDefinitionParameterComponent setUse(OperationParameterUse value) { 
439            if (this.use == null)
440              this.use = new Enumeration<OperationParameterUse>(new OperationParameterUseEnumFactory());
441            this.use.setValue(value);
442          return this;
443        }
444
445        /**
446         * @return {@link #min} (The minimum number of times this parameter SHALL appear in the request or response.). This is the underlying object with id, value and extensions. The accessor "getMin" gives direct access to the value
447         */
448        public IntegerType getMinElement() { 
449          if (this.min == null)
450            if (Configuration.errorOnAutoCreate())
451              throw new Error("Attempt to auto-create OperationDefinitionParameterComponent.min");
452            else if (Configuration.doAutoCreate())
453              this.min = new IntegerType(); // bb
454          return this.min;
455        }
456
457        public boolean hasMinElement() { 
458          return this.min != null && !this.min.isEmpty();
459        }
460
461        public boolean hasMin() { 
462          return this.min != null && !this.min.isEmpty();
463        }
464
465        /**
466         * @param value {@link #min} (The minimum number of times this parameter SHALL appear in the request or response.). This is the underlying object with id, value and extensions. The accessor "getMin" gives direct access to the value
467         */
468        public OperationDefinitionParameterComponent setMinElement(IntegerType value) { 
469          this.min = value;
470          return this;
471        }
472
473        /**
474         * @return The minimum number of times this parameter SHALL appear in the request or response.
475         */
476        public int getMin() { 
477          return this.min == null || this.min.isEmpty() ? 0 : this.min.getValue();
478        }
479
480        /**
481         * @param value The minimum number of times this parameter SHALL appear in the request or response.
482         */
483        public OperationDefinitionParameterComponent setMin(int value) { 
484            if (this.min == null)
485              this.min = new IntegerType();
486            this.min.setValue(value);
487          return this;
488        }
489
490        /**
491         * @return {@link #max} (The maximum number of times this element is permitted to appear in the request or response.). This is the underlying object with id, value and extensions. The accessor "getMax" gives direct access to the value
492         */
493        public StringType getMaxElement() { 
494          if (this.max == null)
495            if (Configuration.errorOnAutoCreate())
496              throw new Error("Attempt to auto-create OperationDefinitionParameterComponent.max");
497            else if (Configuration.doAutoCreate())
498              this.max = new StringType(); // bb
499          return this.max;
500        }
501
502        public boolean hasMaxElement() { 
503          return this.max != null && !this.max.isEmpty();
504        }
505
506        public boolean hasMax() { 
507          return this.max != null && !this.max.isEmpty();
508        }
509
510        /**
511         * @param value {@link #max} (The maximum number of times this element is permitted to appear in the request or response.). This is the underlying object with id, value and extensions. The accessor "getMax" gives direct access to the value
512         */
513        public OperationDefinitionParameterComponent setMaxElement(StringType value) { 
514          this.max = value;
515          return this;
516        }
517
518        /**
519         * @return The maximum number of times this element is permitted to appear in the request or response.
520         */
521        public String getMax() { 
522          return this.max == null ? null : this.max.getValue();
523        }
524
525        /**
526         * @param value The maximum number of times this element is permitted to appear in the request or response.
527         */
528        public OperationDefinitionParameterComponent setMax(String value) { 
529            if (this.max == null)
530              this.max = new StringType();
531            this.max.setValue(value);
532          return this;
533        }
534
535        /**
536         * @return {@link #documentation} (Describes the meaning or use of this parameter.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
537         */
538        public StringType getDocumentationElement() { 
539          if (this.documentation == null)
540            if (Configuration.errorOnAutoCreate())
541              throw new Error("Attempt to auto-create OperationDefinitionParameterComponent.documentation");
542            else if (Configuration.doAutoCreate())
543              this.documentation = new StringType(); // bb
544          return this.documentation;
545        }
546
547        public boolean hasDocumentationElement() { 
548          return this.documentation != null && !this.documentation.isEmpty();
549        }
550
551        public boolean hasDocumentation() { 
552          return this.documentation != null && !this.documentation.isEmpty();
553        }
554
555        /**
556         * @param value {@link #documentation} (Describes the meaning or use of this parameter.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
557         */
558        public OperationDefinitionParameterComponent setDocumentationElement(StringType value) { 
559          this.documentation = value;
560          return this;
561        }
562
563        /**
564         * @return Describes the meaning or use of this parameter.
565         */
566        public String getDocumentation() { 
567          return this.documentation == null ? null : this.documentation.getValue();
568        }
569
570        /**
571         * @param value Describes the meaning or use of this parameter.
572         */
573        public OperationDefinitionParameterComponent setDocumentation(String value) { 
574          if (Utilities.noString(value))
575            this.documentation = null;
576          else {
577            if (this.documentation == null)
578              this.documentation = new StringType();
579            this.documentation.setValue(value);
580          }
581          return this;
582        }
583
584        /**
585         * @return {@link #type} (The type for this parameter.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
586         */
587        public CodeType getTypeElement() { 
588          if (this.type == null)
589            if (Configuration.errorOnAutoCreate())
590              throw new Error("Attempt to auto-create OperationDefinitionParameterComponent.type");
591            else if (Configuration.doAutoCreate())
592              this.type = new CodeType(); // bb
593          return this.type;
594        }
595
596        public boolean hasTypeElement() { 
597          return this.type != null && !this.type.isEmpty();
598        }
599
600        public boolean hasType() { 
601          return this.type != null && !this.type.isEmpty();
602        }
603
604        /**
605         * @param value {@link #type} (The type for this parameter.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
606         */
607        public OperationDefinitionParameterComponent setTypeElement(CodeType value) { 
608          this.type = value;
609          return this;
610        }
611
612        /**
613         * @return The type for this parameter.
614         */
615        public String getType() { 
616          return this.type == null ? null : this.type.getValue();
617        }
618
619        /**
620         * @param value The type for this parameter.
621         */
622        public OperationDefinitionParameterComponent setType(String value) { 
623          if (Utilities.noString(value))
624            this.type = null;
625          else {
626            if (this.type == null)
627              this.type = new CodeType();
628            this.type.setValue(value);
629          }
630          return this;
631        }
632
633        /**
634         * @return {@link #searchType} (How the parameter is understood as a search parameter. This is only used if the parameter type is 'string'.). This is the underlying object with id, value and extensions. The accessor "getSearchType" gives direct access to the value
635         */
636        public Enumeration<SearchParamType> getSearchTypeElement() { 
637          if (this.searchType == null)
638            if (Configuration.errorOnAutoCreate())
639              throw new Error("Attempt to auto-create OperationDefinitionParameterComponent.searchType");
640            else if (Configuration.doAutoCreate())
641              this.searchType = new Enumeration<SearchParamType>(new SearchParamTypeEnumFactory()); // bb
642          return this.searchType;
643        }
644
645        public boolean hasSearchTypeElement() { 
646          return this.searchType != null && !this.searchType.isEmpty();
647        }
648
649        public boolean hasSearchType() { 
650          return this.searchType != null && !this.searchType.isEmpty();
651        }
652
653        /**
654         * @param value {@link #searchType} (How the parameter is understood as a search parameter. This is only used if the parameter type is 'string'.). This is the underlying object with id, value and extensions. The accessor "getSearchType" gives direct access to the value
655         */
656        public OperationDefinitionParameterComponent setSearchTypeElement(Enumeration<SearchParamType> value) { 
657          this.searchType = value;
658          return this;
659        }
660
661        /**
662         * @return How the parameter is understood as a search parameter. This is only used if the parameter type is 'string'.
663         */
664        public SearchParamType getSearchType() { 
665          return this.searchType == null ? null : this.searchType.getValue();
666        }
667
668        /**
669         * @param value How the parameter is understood as a search parameter. This is only used if the parameter type is 'string'.
670         */
671        public OperationDefinitionParameterComponent setSearchType(SearchParamType value) { 
672          if (value == null)
673            this.searchType = null;
674          else {
675            if (this.searchType == null)
676              this.searchType = new Enumeration<SearchParamType>(new SearchParamTypeEnumFactory());
677            this.searchType.setValue(value);
678          }
679          return this;
680        }
681
682        /**
683         * @return {@link #profile} (A profile the specifies the rules that this parameter must conform to.)
684         */
685        public Reference getProfile() { 
686          if (this.profile == null)
687            if (Configuration.errorOnAutoCreate())
688              throw new Error("Attempt to auto-create OperationDefinitionParameterComponent.profile");
689            else if (Configuration.doAutoCreate())
690              this.profile = new Reference(); // cc
691          return this.profile;
692        }
693
694        public boolean hasProfile() { 
695          return this.profile != null && !this.profile.isEmpty();
696        }
697
698        /**
699         * @param value {@link #profile} (A profile the specifies the rules that this parameter must conform to.)
700         */
701        public OperationDefinitionParameterComponent setProfile(Reference value)  { 
702          this.profile = value;
703          return this;
704        }
705
706        /**
707         * @return {@link #profile} The actual object that is the target of the reference. The reference library doesn't populate this, but you can use it to hold the resource if you resolve it. (A profile the specifies the rules that this parameter must conform to.)
708         */
709        public StructureDefinition getProfileTarget() { 
710          if (this.profileTarget == null)
711            if (Configuration.errorOnAutoCreate())
712              throw new Error("Attempt to auto-create OperationDefinitionParameterComponent.profile");
713            else if (Configuration.doAutoCreate())
714              this.profileTarget = new StructureDefinition(); // aa
715          return this.profileTarget;
716        }
717
718        /**
719         * @param value {@link #profile} The actual object that is the target of the reference. The reference library doesn't use these, but you can use it to hold the resource if you resolve it. (A profile the specifies the rules that this parameter must conform to.)
720         */
721        public OperationDefinitionParameterComponent setProfileTarget(StructureDefinition value) { 
722          this.profileTarget = value;
723          return this;
724        }
725
726        /**
727         * @return {@link #binding} (Binds to a value set if this parameter is coded (code, Coding, CodeableConcept).)
728         */
729        public OperationDefinitionParameterBindingComponent getBinding() { 
730          if (this.binding == null)
731            if (Configuration.errorOnAutoCreate())
732              throw new Error("Attempt to auto-create OperationDefinitionParameterComponent.binding");
733            else if (Configuration.doAutoCreate())
734              this.binding = new OperationDefinitionParameterBindingComponent(); // cc
735          return this.binding;
736        }
737
738        public boolean hasBinding() { 
739          return this.binding != null && !this.binding.isEmpty();
740        }
741
742        /**
743         * @param value {@link #binding} (Binds to a value set if this parameter is coded (code, Coding, CodeableConcept).)
744         */
745        public OperationDefinitionParameterComponent setBinding(OperationDefinitionParameterBindingComponent value)  { 
746          this.binding = value;
747          return this;
748        }
749
750        /**
751         * @return {@link #part} (The parts of a nested Parameter.)
752         */
753        public List<OperationDefinitionParameterComponent> getPart() { 
754          if (this.part == null)
755            this.part = new ArrayList<OperationDefinitionParameterComponent>();
756          return this.part;
757        }
758
759        /**
760         * @return Returns a reference to <code>this</code> for easy method chaining
761         */
762        public OperationDefinitionParameterComponent setPart(List<OperationDefinitionParameterComponent> thePart) { 
763          this.part = thePart;
764          return this;
765        }
766
767        public boolean hasPart() { 
768          if (this.part == null)
769            return false;
770          for (OperationDefinitionParameterComponent item : this.part)
771            if (!item.isEmpty())
772              return true;
773          return false;
774        }
775
776        public OperationDefinitionParameterComponent addPart() { //3
777          OperationDefinitionParameterComponent t = new OperationDefinitionParameterComponent();
778          if (this.part == null)
779            this.part = new ArrayList<OperationDefinitionParameterComponent>();
780          this.part.add(t);
781          return t;
782        }
783
784        public OperationDefinitionParameterComponent addPart(OperationDefinitionParameterComponent t) { //3
785          if (t == null)
786            return this;
787          if (this.part == null)
788            this.part = new ArrayList<OperationDefinitionParameterComponent>();
789          this.part.add(t);
790          return this;
791        }
792
793        /**
794         * @return The first repetition of repeating field {@link #part}, creating it if it does not already exist
795         */
796        public OperationDefinitionParameterComponent getPartFirstRep() { 
797          if (getPart().isEmpty()) {
798            addPart();
799          }
800          return getPart().get(0);
801        }
802
803        protected void listChildren(List<Property> children) {
804          super.listChildren(children);
805          children.add(new Property("name", "code", "The name of used to identify the parameter.", 0, 1, name));
806          children.add(new Property("use", "code", "Whether this is an input or an output parameter.", 0, 1, use));
807          children.add(new Property("min", "integer", "The minimum number of times this parameter SHALL appear in the request or response.", 0, 1, min));
808          children.add(new Property("max", "string", "The maximum number of times this element is permitted to appear in the request or response.", 0, 1, max));
809          children.add(new Property("documentation", "string", "Describes the meaning or use of this parameter.", 0, 1, documentation));
810          children.add(new Property("type", "code", "The type for this parameter.", 0, 1, type));
811          children.add(new Property("searchType", "code", "How the parameter is understood as a search parameter. This is only used if the parameter type is 'string'.", 0, 1, searchType));
812          children.add(new Property("profile", "Reference(StructureDefinition)", "A profile the specifies the rules that this parameter must conform to.", 0, 1, profile));
813          children.add(new Property("binding", "", "Binds to a value set if this parameter is coded (code, Coding, CodeableConcept).", 0, 1, binding));
814          children.add(new Property("part", "@OperationDefinition.parameter", "The parts of a nested Parameter.", 0, java.lang.Integer.MAX_VALUE, part));
815        }
816
817        @Override
818        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
819          switch (_hash) {
820          case 3373707: /*name*/  return new Property("name", "code", "The name of used to identify the parameter.", 0, 1, name);
821          case 116103: /*use*/  return new Property("use", "code", "Whether this is an input or an output parameter.", 0, 1, use);
822          case 108114: /*min*/  return new Property("min", "integer", "The minimum number of times this parameter SHALL appear in the request or response.", 0, 1, min);
823          case 107876: /*max*/  return new Property("max", "string", "The maximum number of times this element is permitted to appear in the request or response.", 0, 1, max);
824          case 1587405498: /*documentation*/  return new Property("documentation", "string", "Describes the meaning or use of this parameter.", 0, 1, documentation);
825          case 3575610: /*type*/  return new Property("type", "code", "The type for this parameter.", 0, 1, type);
826          case -710454014: /*searchType*/  return new Property("searchType", "code", "How the parameter is understood as a search parameter. This is only used if the parameter type is 'string'.", 0, 1, searchType);
827          case -309425751: /*profile*/  return new Property("profile", "Reference(StructureDefinition)", "A profile the specifies the rules that this parameter must conform to.", 0, 1, profile);
828          case -108220795: /*binding*/  return new Property("binding", "", "Binds to a value set if this parameter is coded (code, Coding, CodeableConcept).", 0, 1, binding);
829          case 3433459: /*part*/  return new Property("part", "@OperationDefinition.parameter", "The parts of a nested Parameter.", 0, java.lang.Integer.MAX_VALUE, part);
830          default: return super.getNamedProperty(_hash, _name, _checkValid);
831          }
832
833        }
834
835      @Override
836      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
837        switch (hash) {
838        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // CodeType
839        case 116103: /*use*/ return this.use == null ? new Base[0] : new Base[] {this.use}; // Enumeration<OperationParameterUse>
840        case 108114: /*min*/ return this.min == null ? new Base[0] : new Base[] {this.min}; // IntegerType
841        case 107876: /*max*/ return this.max == null ? new Base[0] : new Base[] {this.max}; // StringType
842        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : new Base[] {this.documentation}; // StringType
843        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // CodeType
844        case -710454014: /*searchType*/ return this.searchType == null ? new Base[0] : new Base[] {this.searchType}; // Enumeration<SearchParamType>
845        case -309425751: /*profile*/ return this.profile == null ? new Base[0] : new Base[] {this.profile}; // Reference
846        case -108220795: /*binding*/ return this.binding == null ? new Base[0] : new Base[] {this.binding}; // OperationDefinitionParameterBindingComponent
847        case 3433459: /*part*/ return this.part == null ? new Base[0] : this.part.toArray(new Base[this.part.size()]); // OperationDefinitionParameterComponent
848        default: return super.getProperty(hash, name, checkValid);
849        }
850
851      }
852
853      @Override
854      public Base setProperty(int hash, String name, Base value) throws FHIRException {
855        switch (hash) {
856        case 3373707: // name
857          this.name = castToCode(value); // CodeType
858          return value;
859        case 116103: // use
860          value = new OperationParameterUseEnumFactory().fromType(castToCode(value));
861          this.use = (Enumeration) value; // Enumeration<OperationParameterUse>
862          return value;
863        case 108114: // min
864          this.min = castToInteger(value); // IntegerType
865          return value;
866        case 107876: // max
867          this.max = castToString(value); // StringType
868          return value;
869        case 1587405498: // documentation
870          this.documentation = castToString(value); // StringType
871          return value;
872        case 3575610: // type
873          this.type = castToCode(value); // CodeType
874          return value;
875        case -710454014: // searchType
876          value = new SearchParamTypeEnumFactory().fromType(castToCode(value));
877          this.searchType = (Enumeration) value; // Enumeration<SearchParamType>
878          return value;
879        case -309425751: // profile
880          this.profile = castToReference(value); // Reference
881          return value;
882        case -108220795: // binding
883          this.binding = (OperationDefinitionParameterBindingComponent) value; // OperationDefinitionParameterBindingComponent
884          return value;
885        case 3433459: // part
886          this.getPart().add((OperationDefinitionParameterComponent) value); // OperationDefinitionParameterComponent
887          return value;
888        default: return super.setProperty(hash, name, value);
889        }
890
891      }
892
893      @Override
894      public Base setProperty(String name, Base value) throws FHIRException {
895        if (name.equals("name")) {
896          this.name = castToCode(value); // CodeType
897        } else if (name.equals("use")) {
898          value = new OperationParameterUseEnumFactory().fromType(castToCode(value));
899          this.use = (Enumeration) value; // Enumeration<OperationParameterUse>
900        } else if (name.equals("min")) {
901          this.min = castToInteger(value); // IntegerType
902        } else if (name.equals("max")) {
903          this.max = castToString(value); // StringType
904        } else if (name.equals("documentation")) {
905          this.documentation = castToString(value); // StringType
906        } else if (name.equals("type")) {
907          this.type = castToCode(value); // CodeType
908        } else if (name.equals("searchType")) {
909          value = new SearchParamTypeEnumFactory().fromType(castToCode(value));
910          this.searchType = (Enumeration) value; // Enumeration<SearchParamType>
911        } else if (name.equals("profile")) {
912          this.profile = castToReference(value); // Reference
913        } else if (name.equals("binding")) {
914          this.binding = (OperationDefinitionParameterBindingComponent) value; // OperationDefinitionParameterBindingComponent
915        } else if (name.equals("part")) {
916          this.getPart().add((OperationDefinitionParameterComponent) value);
917        } else
918          return super.setProperty(name, value);
919        return value;
920      }
921
922      @Override
923      public Base makeProperty(int hash, String name) throws FHIRException {
924        switch (hash) {
925        case 3373707:  return getNameElement();
926        case 116103:  return getUseElement();
927        case 108114:  return getMinElement();
928        case 107876:  return getMaxElement();
929        case 1587405498:  return getDocumentationElement();
930        case 3575610:  return getTypeElement();
931        case -710454014:  return getSearchTypeElement();
932        case -309425751:  return getProfile(); 
933        case -108220795:  return getBinding(); 
934        case 3433459:  return addPart(); 
935        default: return super.makeProperty(hash, name);
936        }
937
938      }
939
940      @Override
941      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
942        switch (hash) {
943        case 3373707: /*name*/ return new String[] {"code"};
944        case 116103: /*use*/ return new String[] {"code"};
945        case 108114: /*min*/ return new String[] {"integer"};
946        case 107876: /*max*/ return new String[] {"string"};
947        case 1587405498: /*documentation*/ return new String[] {"string"};
948        case 3575610: /*type*/ return new String[] {"code"};
949        case -710454014: /*searchType*/ return new String[] {"code"};
950        case -309425751: /*profile*/ return new String[] {"Reference"};
951        case -108220795: /*binding*/ return new String[] {};
952        case 3433459: /*part*/ return new String[] {"@OperationDefinition.parameter"};
953        default: return super.getTypesForProperty(hash, name);
954        }
955
956      }
957
958      @Override
959      public Base addChild(String name) throws FHIRException {
960        if (name.equals("name")) {
961          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.name");
962        }
963        else if (name.equals("use")) {
964          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.use");
965        }
966        else if (name.equals("min")) {
967          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.min");
968        }
969        else if (name.equals("max")) {
970          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.max");
971        }
972        else if (name.equals("documentation")) {
973          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.documentation");
974        }
975        else if (name.equals("type")) {
976          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.type");
977        }
978        else if (name.equals("searchType")) {
979          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.searchType");
980        }
981        else if (name.equals("profile")) {
982          this.profile = new Reference();
983          return this.profile;
984        }
985        else if (name.equals("binding")) {
986          this.binding = new OperationDefinitionParameterBindingComponent();
987          return this.binding;
988        }
989        else if (name.equals("part")) {
990          return addPart();
991        }
992        else
993          return super.addChild(name);
994      }
995
996      public OperationDefinitionParameterComponent copy() {
997        OperationDefinitionParameterComponent dst = new OperationDefinitionParameterComponent();
998        copyValues(dst);
999        dst.name = name == null ? null : name.copy();
1000        dst.use = use == null ? null : use.copy();
1001        dst.min = min == null ? null : min.copy();
1002        dst.max = max == null ? null : max.copy();
1003        dst.documentation = documentation == null ? null : documentation.copy();
1004        dst.type = type == null ? null : type.copy();
1005        dst.searchType = searchType == null ? null : searchType.copy();
1006        dst.profile = profile == null ? null : profile.copy();
1007        dst.binding = binding == null ? null : binding.copy();
1008        if (part != null) {
1009          dst.part = new ArrayList<OperationDefinitionParameterComponent>();
1010          for (OperationDefinitionParameterComponent i : part)
1011            dst.part.add(i.copy());
1012        };
1013        return dst;
1014      }
1015
1016      @Override
1017      public boolean equalsDeep(Base other_) {
1018        if (!super.equalsDeep(other_))
1019          return false;
1020        if (!(other_ instanceof OperationDefinitionParameterComponent))
1021          return false;
1022        OperationDefinitionParameterComponent o = (OperationDefinitionParameterComponent) other_;
1023        return compareDeep(name, o.name, true) && compareDeep(use, o.use, true) && compareDeep(min, o.min, true)
1024           && compareDeep(max, o.max, true) && compareDeep(documentation, o.documentation, true) && compareDeep(type, o.type, true)
1025           && compareDeep(searchType, o.searchType, true) && compareDeep(profile, o.profile, true) && compareDeep(binding, o.binding, true)
1026           && compareDeep(part, o.part, true);
1027      }
1028
1029      @Override
1030      public boolean equalsShallow(Base other_) {
1031        if (!super.equalsShallow(other_))
1032          return false;
1033        if (!(other_ instanceof OperationDefinitionParameterComponent))
1034          return false;
1035        OperationDefinitionParameterComponent o = (OperationDefinitionParameterComponent) other_;
1036        return compareValues(name, o.name, true) && compareValues(use, o.use, true) && compareValues(min, o.min, true)
1037           && compareValues(max, o.max, true) && compareValues(documentation, o.documentation, true) && compareValues(type, o.type, true)
1038           && compareValues(searchType, o.searchType, true);
1039      }
1040
1041      public boolean isEmpty() {
1042        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(name, use, min, max, documentation
1043          , type, searchType, profile, binding, part);
1044      }
1045
1046  public String fhirType() {
1047    return "OperationDefinition.parameter";
1048
1049  }
1050
1051  }
1052
1053    @Block()
1054    public static class OperationDefinitionParameterBindingComponent extends BackboneElement implements IBaseBackboneElement {
1055        /**
1056         * Indicates the degree of conformance expectations associated with this binding - that is, the degree to which the provided value set must be adhered to in the instances.
1057         */
1058        @Child(name = "strength", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=false)
1059        @Description(shortDefinition="required | extensible | preferred | example", formalDefinition="Indicates the degree of conformance expectations associated with this binding - that is, the degree to which the provided value set must be adhered to in the instances." )
1060        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/binding-strength")
1061        protected Enumeration<BindingStrength> strength;
1062
1063        /**
1064         * Points to the value set or external definition (e.g. implicit value set) that identifies the set of codes to be used.
1065         */
1066        @Child(name = "valueSet", type = {UriType.class, ValueSet.class}, order=2, min=1, max=1, modifier=false, summary=false)
1067        @Description(shortDefinition="Source of value set", formalDefinition="Points to the value set or external definition (e.g. implicit value set) that identifies the set of codes to be used." )
1068        protected Type valueSet;
1069
1070        private static final long serialVersionUID = 857140521L;
1071
1072    /**
1073     * Constructor
1074     */
1075      public OperationDefinitionParameterBindingComponent() {
1076        super();
1077      }
1078
1079    /**
1080     * Constructor
1081     */
1082      public OperationDefinitionParameterBindingComponent(Enumeration<BindingStrength> strength, Type valueSet) {
1083        super();
1084        this.strength = strength;
1085        this.valueSet = valueSet;
1086      }
1087
1088        /**
1089         * @return {@link #strength} (Indicates the degree of conformance expectations associated with this binding - that is, the degree to which the provided value set must be adhered to in the instances.). This is the underlying object with id, value and extensions. The accessor "getStrength" gives direct access to the value
1090         */
1091        public Enumeration<BindingStrength> getStrengthElement() { 
1092          if (this.strength == null)
1093            if (Configuration.errorOnAutoCreate())
1094              throw new Error("Attempt to auto-create OperationDefinitionParameterBindingComponent.strength");
1095            else if (Configuration.doAutoCreate())
1096              this.strength = new Enumeration<BindingStrength>(new BindingStrengthEnumFactory()); // bb
1097          return this.strength;
1098        }
1099
1100        public boolean hasStrengthElement() { 
1101          return this.strength != null && !this.strength.isEmpty();
1102        }
1103
1104        public boolean hasStrength() { 
1105          return this.strength != null && !this.strength.isEmpty();
1106        }
1107
1108        /**
1109         * @param value {@link #strength} (Indicates the degree of conformance expectations associated with this binding - that is, the degree to which the provided value set must be adhered to in the instances.). This is the underlying object with id, value and extensions. The accessor "getStrength" gives direct access to the value
1110         */
1111        public OperationDefinitionParameterBindingComponent setStrengthElement(Enumeration<BindingStrength> value) { 
1112          this.strength = value;
1113          return this;
1114        }
1115
1116        /**
1117         * @return Indicates the degree of conformance expectations associated with this binding - that is, the degree to which the provided value set must be adhered to in the instances.
1118         */
1119        public BindingStrength getStrength() { 
1120          return this.strength == null ? null : this.strength.getValue();
1121        }
1122
1123        /**
1124         * @param value Indicates the degree of conformance expectations associated with this binding - that is, the degree to which the provided value set must be adhered to in the instances.
1125         */
1126        public OperationDefinitionParameterBindingComponent setStrength(BindingStrength value) { 
1127            if (this.strength == null)
1128              this.strength = new Enumeration<BindingStrength>(new BindingStrengthEnumFactory());
1129            this.strength.setValue(value);
1130          return this;
1131        }
1132
1133        /**
1134         * @return {@link #valueSet} (Points to the value set or external definition (e.g. implicit value set) that identifies the set of codes to be used.)
1135         */
1136        public Type getValueSet() { 
1137          return this.valueSet;
1138        }
1139
1140        /**
1141         * @return {@link #valueSet} (Points to the value set or external definition (e.g. implicit value set) that identifies the set of codes to be used.)
1142         */
1143        public UriType getValueSetUriType() throws FHIRException { 
1144          if (this.valueSet == null)
1145            return null;
1146          if (!(this.valueSet instanceof UriType))
1147            throw new FHIRException("Type mismatch: the type UriType was expected, but "+this.valueSet.getClass().getName()+" was encountered");
1148          return (UriType) this.valueSet;
1149        }
1150
1151        public boolean hasValueSetUriType() { 
1152          return this != null && this.valueSet instanceof UriType;
1153        }
1154
1155        /**
1156         * @return {@link #valueSet} (Points to the value set or external definition (e.g. implicit value set) that identifies the set of codes to be used.)
1157         */
1158        public Reference getValueSetReference() throws FHIRException { 
1159          if (this.valueSet == null)
1160            return null;
1161          if (!(this.valueSet instanceof Reference))
1162            throw new FHIRException("Type mismatch: the type Reference was expected, but "+this.valueSet.getClass().getName()+" was encountered");
1163          return (Reference) this.valueSet;
1164        }
1165
1166        public boolean hasValueSetReference() { 
1167          return this != null && this.valueSet instanceof Reference;
1168        }
1169
1170        public boolean hasValueSet() { 
1171          return this.valueSet != null && !this.valueSet.isEmpty();
1172        }
1173
1174        /**
1175         * @param value {@link #valueSet} (Points to the value set or external definition (e.g. implicit value set) that identifies the set of codes to be used.)
1176         */
1177        public OperationDefinitionParameterBindingComponent setValueSet(Type value) throws FHIRFormatError { 
1178          if (value != null && !(value instanceof UriType || value instanceof Reference))
1179            throw new FHIRFormatError("Not the right type for OperationDefinition.parameter.binding.valueSet[x]: "+value.fhirType());
1180          this.valueSet = value;
1181          return this;
1182        }
1183
1184        protected void listChildren(List<Property> children) {
1185          super.listChildren(children);
1186          children.add(new Property("strength", "code", "Indicates the degree of conformance expectations associated with this binding - that is, the degree to which the provided value set must be adhered to in the instances.", 0, 1, strength));
1187          children.add(new Property("valueSet[x]", "uri|Reference(ValueSet)", "Points to the value set or external definition (e.g. implicit value set) that identifies the set of codes to be used.", 0, 1, valueSet));
1188        }
1189
1190        @Override
1191        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1192          switch (_hash) {
1193          case 1791316033: /*strength*/  return new Property("strength", "code", "Indicates the degree of conformance expectations associated with this binding - that is, the degree to which the provided value set must be adhered to in the instances.", 0, 1, strength);
1194          case -1438410321: /*valueSet[x]*/  return new Property("valueSet[x]", "uri|Reference(ValueSet)", "Points to the value set or external definition (e.g. implicit value set) that identifies the set of codes to be used.", 0, 1, valueSet);
1195          case -1410174671: /*valueSet*/  return new Property("valueSet[x]", "uri|Reference(ValueSet)", "Points to the value set or external definition (e.g. implicit value set) that identifies the set of codes to be used.", 0, 1, valueSet);
1196          case -1438416261: /*valueSetUri*/  return new Property("valueSet[x]", "uri|Reference(ValueSet)", "Points to the value set or external definition (e.g. implicit value set) that identifies the set of codes to be used.", 0, 1, valueSet);
1197          case 295220506: /*valueSetReference*/  return new Property("valueSet[x]", "uri|Reference(ValueSet)", "Points to the value set or external definition (e.g. implicit value set) that identifies the set of codes to be used.", 0, 1, valueSet);
1198          default: return super.getNamedProperty(_hash, _name, _checkValid);
1199          }
1200
1201        }
1202
1203      @Override
1204      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1205        switch (hash) {
1206        case 1791316033: /*strength*/ return this.strength == null ? new Base[0] : new Base[] {this.strength}; // Enumeration<BindingStrength>
1207        case -1410174671: /*valueSet*/ return this.valueSet == null ? new Base[0] : new Base[] {this.valueSet}; // Type
1208        default: return super.getProperty(hash, name, checkValid);
1209        }
1210
1211      }
1212
1213      @Override
1214      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1215        switch (hash) {
1216        case 1791316033: // strength
1217          value = new BindingStrengthEnumFactory().fromType(castToCode(value));
1218          this.strength = (Enumeration) value; // Enumeration<BindingStrength>
1219          return value;
1220        case -1410174671: // valueSet
1221          this.valueSet = castToType(value); // Type
1222          return value;
1223        default: return super.setProperty(hash, name, value);
1224        }
1225
1226      }
1227
1228      @Override
1229      public Base setProperty(String name, Base value) throws FHIRException {
1230        if (name.equals("strength")) {
1231          value = new BindingStrengthEnumFactory().fromType(castToCode(value));
1232          this.strength = (Enumeration) value; // Enumeration<BindingStrength>
1233        } else if (name.equals("valueSet[x]")) {
1234          this.valueSet = castToType(value); // Type
1235        } else
1236          return super.setProperty(name, value);
1237        return value;
1238      }
1239
1240      @Override
1241      public Base makeProperty(int hash, String name) throws FHIRException {
1242        switch (hash) {
1243        case 1791316033:  return getStrengthElement();
1244        case -1438410321:  return getValueSet(); 
1245        case -1410174671:  return getValueSet(); 
1246        default: return super.makeProperty(hash, name);
1247        }
1248
1249      }
1250
1251      @Override
1252      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1253        switch (hash) {
1254        case 1791316033: /*strength*/ return new String[] {"code"};
1255        case -1410174671: /*valueSet*/ return new String[] {"uri", "Reference"};
1256        default: return super.getTypesForProperty(hash, name);
1257        }
1258
1259      }
1260
1261      @Override
1262      public Base addChild(String name) throws FHIRException {
1263        if (name.equals("strength")) {
1264          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.strength");
1265        }
1266        else if (name.equals("valueSetUri")) {
1267          this.valueSet = new UriType();
1268          return this.valueSet;
1269        }
1270        else if (name.equals("valueSetReference")) {
1271          this.valueSet = new Reference();
1272          return this.valueSet;
1273        }
1274        else
1275          return super.addChild(name);
1276      }
1277
1278      public OperationDefinitionParameterBindingComponent copy() {
1279        OperationDefinitionParameterBindingComponent dst = new OperationDefinitionParameterBindingComponent();
1280        copyValues(dst);
1281        dst.strength = strength == null ? null : strength.copy();
1282        dst.valueSet = valueSet == null ? null : valueSet.copy();
1283        return dst;
1284      }
1285
1286      @Override
1287      public boolean equalsDeep(Base other_) {
1288        if (!super.equalsDeep(other_))
1289          return false;
1290        if (!(other_ instanceof OperationDefinitionParameterBindingComponent))
1291          return false;
1292        OperationDefinitionParameterBindingComponent o = (OperationDefinitionParameterBindingComponent) other_;
1293        return compareDeep(strength, o.strength, true) && compareDeep(valueSet, o.valueSet, true);
1294      }
1295
1296      @Override
1297      public boolean equalsShallow(Base other_) {
1298        if (!super.equalsShallow(other_))
1299          return false;
1300        if (!(other_ instanceof OperationDefinitionParameterBindingComponent))
1301          return false;
1302        OperationDefinitionParameterBindingComponent o = (OperationDefinitionParameterBindingComponent) other_;
1303        return compareValues(strength, o.strength, true);
1304      }
1305
1306      public boolean isEmpty() {
1307        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(strength, valueSet);
1308      }
1309
1310  public String fhirType() {
1311    return "OperationDefinition.parameter.binding";
1312
1313  }
1314
1315  }
1316
1317    @Block()
1318    public static class OperationDefinitionOverloadComponent extends BackboneElement implements IBaseBackboneElement {
1319        /**
1320         * Name of parameter to include in overload.
1321         */
1322        @Child(name = "parameterName", type = {StringType.class}, order=1, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1323        @Description(shortDefinition="Name of parameter to include in overload", formalDefinition="Name of parameter to include in overload." )
1324        protected List<StringType> parameterName;
1325
1326        /**
1327         * Comments to go on overload.
1328         */
1329        @Child(name = "comment", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=false)
1330        @Description(shortDefinition="Comments to go on overload", formalDefinition="Comments to go on overload." )
1331        protected StringType comment;
1332
1333        private static final long serialVersionUID = -907948545L;
1334
1335    /**
1336     * Constructor
1337     */
1338      public OperationDefinitionOverloadComponent() {
1339        super();
1340      }
1341
1342        /**
1343         * @return {@link #parameterName} (Name of parameter to include in overload.)
1344         */
1345        public List<StringType> getParameterName() { 
1346          if (this.parameterName == null)
1347            this.parameterName = new ArrayList<StringType>();
1348          return this.parameterName;
1349        }
1350
1351        /**
1352         * @return Returns a reference to <code>this</code> for easy method chaining
1353         */
1354        public OperationDefinitionOverloadComponent setParameterName(List<StringType> theParameterName) { 
1355          this.parameterName = theParameterName;
1356          return this;
1357        }
1358
1359        public boolean hasParameterName() { 
1360          if (this.parameterName == null)
1361            return false;
1362          for (StringType item : this.parameterName)
1363            if (!item.isEmpty())
1364              return true;
1365          return false;
1366        }
1367
1368        /**
1369         * @return {@link #parameterName} (Name of parameter to include in overload.)
1370         */
1371        public StringType addParameterNameElement() {//2 
1372          StringType t = new StringType();
1373          if (this.parameterName == null)
1374            this.parameterName = new ArrayList<StringType>();
1375          this.parameterName.add(t);
1376          return t;
1377        }
1378
1379        /**
1380         * @param value {@link #parameterName} (Name of parameter to include in overload.)
1381         */
1382        public OperationDefinitionOverloadComponent addParameterName(String value) { //1
1383          StringType t = new StringType();
1384          t.setValue(value);
1385          if (this.parameterName == null)
1386            this.parameterName = new ArrayList<StringType>();
1387          this.parameterName.add(t);
1388          return this;
1389        }
1390
1391        /**
1392         * @param value {@link #parameterName} (Name of parameter to include in overload.)
1393         */
1394        public boolean hasParameterName(String value) { 
1395          if (this.parameterName == null)
1396            return false;
1397          for (StringType v : this.parameterName)
1398            if (v.getValue().equals(value)) // string
1399              return true;
1400          return false;
1401        }
1402
1403        /**
1404         * @return {@link #comment} (Comments to go on overload.). This is the underlying object with id, value and extensions. The accessor "getComment" gives direct access to the value
1405         */
1406        public StringType getCommentElement() { 
1407          if (this.comment == null)
1408            if (Configuration.errorOnAutoCreate())
1409              throw new Error("Attempt to auto-create OperationDefinitionOverloadComponent.comment");
1410            else if (Configuration.doAutoCreate())
1411              this.comment = new StringType(); // bb
1412          return this.comment;
1413        }
1414
1415        public boolean hasCommentElement() { 
1416          return this.comment != null && !this.comment.isEmpty();
1417        }
1418
1419        public boolean hasComment() { 
1420          return this.comment != null && !this.comment.isEmpty();
1421        }
1422
1423        /**
1424         * @param value {@link #comment} (Comments to go on overload.). This is the underlying object with id, value and extensions. The accessor "getComment" gives direct access to the value
1425         */
1426        public OperationDefinitionOverloadComponent setCommentElement(StringType value) { 
1427          this.comment = value;
1428          return this;
1429        }
1430
1431        /**
1432         * @return Comments to go on overload.
1433         */
1434        public String getComment() { 
1435          return this.comment == null ? null : this.comment.getValue();
1436        }
1437
1438        /**
1439         * @param value Comments to go on overload.
1440         */
1441        public OperationDefinitionOverloadComponent setComment(String value) { 
1442          if (Utilities.noString(value))
1443            this.comment = null;
1444          else {
1445            if (this.comment == null)
1446              this.comment = new StringType();
1447            this.comment.setValue(value);
1448          }
1449          return this;
1450        }
1451
1452        protected void listChildren(List<Property> children) {
1453          super.listChildren(children);
1454          children.add(new Property("parameterName", "string", "Name of parameter to include in overload.", 0, java.lang.Integer.MAX_VALUE, parameterName));
1455          children.add(new Property("comment", "string", "Comments to go on overload.", 0, 1, comment));
1456        }
1457
1458        @Override
1459        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1460          switch (_hash) {
1461          case -379607596: /*parameterName*/  return new Property("parameterName", "string", "Name of parameter to include in overload.", 0, java.lang.Integer.MAX_VALUE, parameterName);
1462          case 950398559: /*comment*/  return new Property("comment", "string", "Comments to go on overload.", 0, 1, comment);
1463          default: return super.getNamedProperty(_hash, _name, _checkValid);
1464          }
1465
1466        }
1467
1468      @Override
1469      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1470        switch (hash) {
1471        case -379607596: /*parameterName*/ return this.parameterName == null ? new Base[0] : this.parameterName.toArray(new Base[this.parameterName.size()]); // StringType
1472        case 950398559: /*comment*/ return this.comment == null ? new Base[0] : new Base[] {this.comment}; // StringType
1473        default: return super.getProperty(hash, name, checkValid);
1474        }
1475
1476      }
1477
1478      @Override
1479      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1480        switch (hash) {
1481        case -379607596: // parameterName
1482          this.getParameterName().add(castToString(value)); // StringType
1483          return value;
1484        case 950398559: // comment
1485          this.comment = castToString(value); // StringType
1486          return value;
1487        default: return super.setProperty(hash, name, value);
1488        }
1489
1490      }
1491
1492      @Override
1493      public Base setProperty(String name, Base value) throws FHIRException {
1494        if (name.equals("parameterName")) {
1495          this.getParameterName().add(castToString(value));
1496        } else if (name.equals("comment")) {
1497          this.comment = castToString(value); // StringType
1498        } else
1499          return super.setProperty(name, value);
1500        return value;
1501      }
1502
1503      @Override
1504      public Base makeProperty(int hash, String name) throws FHIRException {
1505        switch (hash) {
1506        case -379607596:  return addParameterNameElement();
1507        case 950398559:  return getCommentElement();
1508        default: return super.makeProperty(hash, name);
1509        }
1510
1511      }
1512
1513      @Override
1514      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1515        switch (hash) {
1516        case -379607596: /*parameterName*/ return new String[] {"string"};
1517        case 950398559: /*comment*/ return new String[] {"string"};
1518        default: return super.getTypesForProperty(hash, name);
1519        }
1520
1521      }
1522
1523      @Override
1524      public Base addChild(String name) throws FHIRException {
1525        if (name.equals("parameterName")) {
1526          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.parameterName");
1527        }
1528        else if (name.equals("comment")) {
1529          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.comment");
1530        }
1531        else
1532          return super.addChild(name);
1533      }
1534
1535      public OperationDefinitionOverloadComponent copy() {
1536        OperationDefinitionOverloadComponent dst = new OperationDefinitionOverloadComponent();
1537        copyValues(dst);
1538        if (parameterName != null) {
1539          dst.parameterName = new ArrayList<StringType>();
1540          for (StringType i : parameterName)
1541            dst.parameterName.add(i.copy());
1542        };
1543        dst.comment = comment == null ? null : comment.copy();
1544        return dst;
1545      }
1546
1547      @Override
1548      public boolean equalsDeep(Base other_) {
1549        if (!super.equalsDeep(other_))
1550          return false;
1551        if (!(other_ instanceof OperationDefinitionOverloadComponent))
1552          return false;
1553        OperationDefinitionOverloadComponent o = (OperationDefinitionOverloadComponent) other_;
1554        return compareDeep(parameterName, o.parameterName, true) && compareDeep(comment, o.comment, true)
1555          ;
1556      }
1557
1558      @Override
1559      public boolean equalsShallow(Base other_) {
1560        if (!super.equalsShallow(other_))
1561          return false;
1562        if (!(other_ instanceof OperationDefinitionOverloadComponent))
1563          return false;
1564        OperationDefinitionOverloadComponent o = (OperationDefinitionOverloadComponent) other_;
1565        return compareValues(parameterName, o.parameterName, true) && compareValues(comment, o.comment, true)
1566          ;
1567      }
1568
1569      public boolean isEmpty() {
1570        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(parameterName, comment);
1571      }
1572
1573  public String fhirType() {
1574    return "OperationDefinition.overload";
1575
1576  }
1577
1578  }
1579
1580    /**
1581     * Whether this is an operation or a named query.
1582     */
1583    @Child(name = "kind", type = {CodeType.class}, order=0, min=1, max=1, modifier=false, summary=false)
1584    @Description(shortDefinition="operation | query", formalDefinition="Whether this is an operation or a named query." )
1585    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/operation-kind")
1586    protected Enumeration<OperationKind> kind;
1587
1588    /**
1589     * Explaination of why this operation definition is needed and why it has been designed as it has.
1590     */
1591    @Child(name = "purpose", type = {MarkdownType.class}, order=1, min=0, max=1, modifier=false, summary=false)
1592    @Description(shortDefinition="Why this operation definition is defined", formalDefinition="Explaination of why this operation definition is needed and why it has been designed as it has." )
1593    protected MarkdownType purpose;
1594
1595    /**
1596     * Operations that are idempotent (see [HTTP specification definition of idempotent](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)) may be invoked by performing an HTTP GET operation instead of a POST.
1597     */
1598    @Child(name = "idempotent", type = {BooleanType.class}, order=2, min=0, max=1, modifier=false, summary=true)
1599    @Description(shortDefinition="Whether content is unchanged by the operation", formalDefinition="Operations that are idempotent (see [HTTP specification definition of idempotent](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)) may be invoked by performing an HTTP GET operation instead of a POST." )
1600    protected BooleanType idempotent;
1601
1602    /**
1603     * The name used to invoke the operation.
1604     */
1605    @Child(name = "code", type = {CodeType.class}, order=3, min=1, max=1, modifier=false, summary=true)
1606    @Description(shortDefinition="Name used to invoke the operation", formalDefinition="The name used to invoke the operation." )
1607    protected CodeType code;
1608
1609    /**
1610     * Additional information about how to use this operation or named query.
1611     */
1612    @Child(name = "comment", type = {StringType.class}, order=4, min=0, max=1, modifier=false, summary=false)
1613    @Description(shortDefinition="Additional information about use", formalDefinition="Additional information about how to use this operation or named query." )
1614    protected StringType comment;
1615
1616    /**
1617     * Indicates that this operation definition is a constraining profile on the base.
1618     */
1619    @Child(name = "base", type = {OperationDefinition.class}, order=5, min=0, max=1, modifier=false, summary=true)
1620    @Description(shortDefinition="Marks this as a profile of the base", formalDefinition="Indicates that this operation definition is a constraining profile on the base." )
1621    protected Reference base;
1622
1623    /**
1624     * The actual object that is the target of the reference (Indicates that this operation definition is a constraining profile on the base.)
1625     */
1626    protected OperationDefinition baseTarget;
1627
1628    /**
1629     * The types on which this operation can be executed.
1630     */
1631    @Child(name = "resource", type = {CodeType.class}, order=6, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
1632    @Description(shortDefinition="Types this operation applies to", formalDefinition="The types on which this operation can be executed." )
1633    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/resource-types")
1634    protected List<CodeType> resource;
1635
1636    /**
1637     * Indicates whether this operation or named query can be invoked at the system level (e.g. without needing to choose a resource type for the context).
1638     */
1639    @Child(name = "system", type = {BooleanType.class}, order=7, min=1, max=1, modifier=false, summary=true)
1640    @Description(shortDefinition="Invoke at the system level?", formalDefinition="Indicates whether this operation or named query can be invoked at the system level (e.g. without needing to choose a resource type for the context)." )
1641    protected BooleanType system;
1642
1643    /**
1644     * Indicates whether this operation or named query can be invoked at the resource type level for any given resource type level (e.g. without needing to choose a specific resource id for the context).
1645     */
1646    @Child(name = "type", type = {BooleanType.class}, order=8, min=1, max=1, modifier=false, summary=true)
1647    @Description(shortDefinition="Invole at the type level?", formalDefinition="Indicates whether this operation or named query can be invoked at the resource type level for any given resource type level (e.g. without needing to choose a specific resource id for the context)." )
1648    protected BooleanType type;
1649
1650    /**
1651     * Indicates whether this operation can be invoked on a particular instance of one of the given types.
1652     */
1653    @Child(name = "instance", type = {BooleanType.class}, order=9, min=1, max=1, modifier=false, summary=true)
1654    @Description(shortDefinition="Invoke on an instance?", formalDefinition="Indicates whether this operation can be invoked on a particular instance of one of the given types." )
1655    protected BooleanType instance;
1656
1657    /**
1658     * The parameters for the operation/query.
1659     */
1660    @Child(name = "parameter", type = {}, order=10, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1661    @Description(shortDefinition="Parameters for the operation/query", formalDefinition="The parameters for the operation/query." )
1662    protected List<OperationDefinitionParameterComponent> parameter;
1663
1664    /**
1665     * Defines an appropriate combination of parameters to use when invoking this operation, to help code generators when generating overloaded parameter sets for this operation.
1666     */
1667    @Child(name = "overload", type = {}, order=11, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1668    @Description(shortDefinition="Define overloaded variants for when  generating code", formalDefinition="Defines an appropriate combination of parameters to use when invoking this operation, to help code generators when generating overloaded parameter sets for this operation." )
1669    protected List<OperationDefinitionOverloadComponent> overload;
1670
1671    private static final long serialVersionUID = 1292377899L;
1672
1673  /**
1674   * Constructor
1675   */
1676    public OperationDefinition() {
1677      super();
1678    }
1679
1680  /**
1681   * Constructor
1682   */
1683    public OperationDefinition(StringType name, Enumeration<PublicationStatus> status, Enumeration<OperationKind> kind, CodeType code, BooleanType system, BooleanType type, BooleanType instance) {
1684      super();
1685      this.name = name;
1686      this.status = status;
1687      this.kind = kind;
1688      this.code = code;
1689      this.system = system;
1690      this.type = type;
1691      this.instance = instance;
1692    }
1693
1694    /**
1695     * @return {@link #url} (An absolute URI that is used to identify this operation definition when it is referenced in a specification, model, design or an instance. This SHALL be a URL, SHOULD be globally unique, and SHOULD be an address at which this operation definition is (or will be) published. The URL SHOULD include the major version of the operation definition. For more information see [Technical and Business Versions](resource.html#versions).). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
1696     */
1697    public UriType getUrlElement() { 
1698      if (this.url == null)
1699        if (Configuration.errorOnAutoCreate())
1700          throw new Error("Attempt to auto-create OperationDefinition.url");
1701        else if (Configuration.doAutoCreate())
1702          this.url = new UriType(); // bb
1703      return this.url;
1704    }
1705
1706    public boolean hasUrlElement() { 
1707      return this.url != null && !this.url.isEmpty();
1708    }
1709
1710    public boolean hasUrl() { 
1711      return this.url != null && !this.url.isEmpty();
1712    }
1713
1714    /**
1715     * @param value {@link #url} (An absolute URI that is used to identify this operation definition when it is referenced in a specification, model, design or an instance. This SHALL be a URL, SHOULD be globally unique, and SHOULD be an address at which this operation definition is (or will be) published. The URL SHOULD include the major version of the operation definition. For more information see [Technical and Business Versions](resource.html#versions).). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
1716     */
1717    public OperationDefinition setUrlElement(UriType value) { 
1718      this.url = value;
1719      return this;
1720    }
1721
1722    /**
1723     * @return An absolute URI that is used to identify this operation definition when it is referenced in a specification, model, design or an instance. This SHALL be a URL, SHOULD be globally unique, and SHOULD be an address at which this operation definition is (or will be) published. The URL SHOULD include the major version of the operation definition. For more information see [Technical and Business Versions](resource.html#versions).
1724     */
1725    public String getUrl() { 
1726      return this.url == null ? null : this.url.getValue();
1727    }
1728
1729    /**
1730     * @param value An absolute URI that is used to identify this operation definition when it is referenced in a specification, model, design or an instance. This SHALL be a URL, SHOULD be globally unique, and SHOULD be an address at which this operation definition is (or will be) published. The URL SHOULD include the major version of the operation definition. For more information see [Technical and Business Versions](resource.html#versions).
1731     */
1732    public OperationDefinition setUrl(String value) { 
1733      if (Utilities.noString(value))
1734        this.url = null;
1735      else {
1736        if (this.url == null)
1737          this.url = new UriType();
1738        this.url.setValue(value);
1739      }
1740      return this;
1741    }
1742
1743    /**
1744     * @return {@link #version} (The identifier that is used to identify this version of the operation definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the operation definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence.). This is the underlying object with id, value and extensions. The accessor "getVersion" gives direct access to the value
1745     */
1746    public StringType getVersionElement() { 
1747      if (this.version == null)
1748        if (Configuration.errorOnAutoCreate())
1749          throw new Error("Attempt to auto-create OperationDefinition.version");
1750        else if (Configuration.doAutoCreate())
1751          this.version = new StringType(); // bb
1752      return this.version;
1753    }
1754
1755    public boolean hasVersionElement() { 
1756      return this.version != null && !this.version.isEmpty();
1757    }
1758
1759    public boolean hasVersion() { 
1760      return this.version != null && !this.version.isEmpty();
1761    }
1762
1763    /**
1764     * @param value {@link #version} (The identifier that is used to identify this version of the operation definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the operation definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence.). This is the underlying object with id, value and extensions. The accessor "getVersion" gives direct access to the value
1765     */
1766    public OperationDefinition setVersionElement(StringType value) { 
1767      this.version = value;
1768      return this;
1769    }
1770
1771    /**
1772     * @return The identifier that is used to identify this version of the operation definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the operation definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence.
1773     */
1774    public String getVersion() { 
1775      return this.version == null ? null : this.version.getValue();
1776    }
1777
1778    /**
1779     * @param value The identifier that is used to identify this version of the operation definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the operation definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence.
1780     */
1781    public OperationDefinition setVersion(String value) { 
1782      if (Utilities.noString(value))
1783        this.version = null;
1784      else {
1785        if (this.version == null)
1786          this.version = new StringType();
1787        this.version.setValue(value);
1788      }
1789      return this;
1790    }
1791
1792    /**
1793     * @return {@link #name} (A natural language name identifying the operation definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
1794     */
1795    public StringType getNameElement() { 
1796      if (this.name == null)
1797        if (Configuration.errorOnAutoCreate())
1798          throw new Error("Attempt to auto-create OperationDefinition.name");
1799        else if (Configuration.doAutoCreate())
1800          this.name = new StringType(); // bb
1801      return this.name;
1802    }
1803
1804    public boolean hasNameElement() { 
1805      return this.name != null && !this.name.isEmpty();
1806    }
1807
1808    public boolean hasName() { 
1809      return this.name != null && !this.name.isEmpty();
1810    }
1811
1812    /**
1813     * @param value {@link #name} (A natural language name identifying the operation definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
1814     */
1815    public OperationDefinition setNameElement(StringType value) { 
1816      this.name = value;
1817      return this;
1818    }
1819
1820    /**
1821     * @return A natural language name identifying the operation definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.
1822     */
1823    public String getName() { 
1824      return this.name == null ? null : this.name.getValue();
1825    }
1826
1827    /**
1828     * @param value A natural language name identifying the operation definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.
1829     */
1830    public OperationDefinition setName(String value) { 
1831        if (this.name == null)
1832          this.name = new StringType();
1833        this.name.setValue(value);
1834      return this;
1835    }
1836
1837    /**
1838     * @return {@link #status} (The status of this operation definition. Enables tracking the life-cycle of the content.). This is the underlying object with id, value and extensions. The accessor "getStatus" gives direct access to the value
1839     */
1840    public Enumeration<PublicationStatus> getStatusElement() { 
1841      if (this.status == null)
1842        if (Configuration.errorOnAutoCreate())
1843          throw new Error("Attempt to auto-create OperationDefinition.status");
1844        else if (Configuration.doAutoCreate())
1845          this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory()); // bb
1846      return this.status;
1847    }
1848
1849    public boolean hasStatusElement() { 
1850      return this.status != null && !this.status.isEmpty();
1851    }
1852
1853    public boolean hasStatus() { 
1854      return this.status != null && !this.status.isEmpty();
1855    }
1856
1857    /**
1858     * @param value {@link #status} (The status of this operation definition. Enables tracking the life-cycle of the content.). This is the underlying object with id, value and extensions. The accessor "getStatus" gives direct access to the value
1859     */
1860    public OperationDefinition setStatusElement(Enumeration<PublicationStatus> value) { 
1861      this.status = value;
1862      return this;
1863    }
1864
1865    /**
1866     * @return The status of this operation definition. Enables tracking the life-cycle of the content.
1867     */
1868    public PublicationStatus getStatus() { 
1869      return this.status == null ? null : this.status.getValue();
1870    }
1871
1872    /**
1873     * @param value The status of this operation definition. Enables tracking the life-cycle of the content.
1874     */
1875    public OperationDefinition setStatus(PublicationStatus value) { 
1876        if (this.status == null)
1877          this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory());
1878        this.status.setValue(value);
1879      return this;
1880    }
1881
1882    /**
1883     * @return {@link #kind} (Whether this is an operation or a named query.). This is the underlying object with id, value and extensions. The accessor "getKind" gives direct access to the value
1884     */
1885    public Enumeration<OperationKind> getKindElement() { 
1886      if (this.kind == null)
1887        if (Configuration.errorOnAutoCreate())
1888          throw new Error("Attempt to auto-create OperationDefinition.kind");
1889        else if (Configuration.doAutoCreate())
1890          this.kind = new Enumeration<OperationKind>(new OperationKindEnumFactory()); // bb
1891      return this.kind;
1892    }
1893
1894    public boolean hasKindElement() { 
1895      return this.kind != null && !this.kind.isEmpty();
1896    }
1897
1898    public boolean hasKind() { 
1899      return this.kind != null && !this.kind.isEmpty();
1900    }
1901
1902    /**
1903     * @param value {@link #kind} (Whether this is an operation or a named query.). This is the underlying object with id, value and extensions. The accessor "getKind" gives direct access to the value
1904     */
1905    public OperationDefinition setKindElement(Enumeration<OperationKind> value) { 
1906      this.kind = value;
1907      return this;
1908    }
1909
1910    /**
1911     * @return Whether this is an operation or a named query.
1912     */
1913    public OperationKind getKind() { 
1914      return this.kind == null ? null : this.kind.getValue();
1915    }
1916
1917    /**
1918     * @param value Whether this is an operation or a named query.
1919     */
1920    public OperationDefinition setKind(OperationKind value) { 
1921        if (this.kind == null)
1922          this.kind = new Enumeration<OperationKind>(new OperationKindEnumFactory());
1923        this.kind.setValue(value);
1924      return this;
1925    }
1926
1927    /**
1928     * @return {@link #experimental} (A boolean value to indicate that this operation definition is authored for testing purposes (or education/evaluation/marketing), and is not intended to be used for genuine usage.). This is the underlying object with id, value and extensions. The accessor "getExperimental" gives direct access to the value
1929     */
1930    public BooleanType getExperimentalElement() { 
1931      if (this.experimental == null)
1932        if (Configuration.errorOnAutoCreate())
1933          throw new Error("Attempt to auto-create OperationDefinition.experimental");
1934        else if (Configuration.doAutoCreate())
1935          this.experimental = new BooleanType(); // bb
1936      return this.experimental;
1937    }
1938
1939    public boolean hasExperimentalElement() { 
1940      return this.experimental != null && !this.experimental.isEmpty();
1941    }
1942
1943    public boolean hasExperimental() { 
1944      return this.experimental != null && !this.experimental.isEmpty();
1945    }
1946
1947    /**
1948     * @param value {@link #experimental} (A boolean value to indicate that this operation definition is authored for testing purposes (or education/evaluation/marketing), and is not intended to be used for genuine usage.). This is the underlying object with id, value and extensions. The accessor "getExperimental" gives direct access to the value
1949     */
1950    public OperationDefinition setExperimentalElement(BooleanType value) { 
1951      this.experimental = value;
1952      return this;
1953    }
1954
1955    /**
1956     * @return A boolean value to indicate that this operation definition is authored for testing purposes (or education/evaluation/marketing), and is not intended to be used for genuine usage.
1957     */
1958    public boolean getExperimental() { 
1959      return this.experimental == null || this.experimental.isEmpty() ? false : this.experimental.getValue();
1960    }
1961
1962    /**
1963     * @param value A boolean value to indicate that this operation definition is authored for testing purposes (or education/evaluation/marketing), and is not intended to be used for genuine usage.
1964     */
1965    public OperationDefinition setExperimental(boolean value) { 
1966        if (this.experimental == null)
1967          this.experimental = new BooleanType();
1968        this.experimental.setValue(value);
1969      return this;
1970    }
1971
1972    /**
1973     * @return {@link #date} (The date  (and optionally time) when the operation definition was published. The date must change if and when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the operation definition changes.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
1974     */
1975    public DateTimeType getDateElement() { 
1976      if (this.date == null)
1977        if (Configuration.errorOnAutoCreate())
1978          throw new Error("Attempt to auto-create OperationDefinition.date");
1979        else if (Configuration.doAutoCreate())
1980          this.date = new DateTimeType(); // bb
1981      return this.date;
1982    }
1983
1984    public boolean hasDateElement() { 
1985      return this.date != null && !this.date.isEmpty();
1986    }
1987
1988    public boolean hasDate() { 
1989      return this.date != null && !this.date.isEmpty();
1990    }
1991
1992    /**
1993     * @param value {@link #date} (The date  (and optionally time) when the operation definition was published. The date must change if and when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the operation definition changes.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
1994     */
1995    public OperationDefinition setDateElement(DateTimeType value) { 
1996      this.date = value;
1997      return this;
1998    }
1999
2000    /**
2001     * @return The date  (and optionally time) when the operation definition was published. The date must change if and when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the operation definition changes.
2002     */
2003    public Date getDate() { 
2004      return this.date == null ? null : this.date.getValue();
2005    }
2006
2007    /**
2008     * @param value The date  (and optionally time) when the operation definition was published. The date must change if and when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the operation definition changes.
2009     */
2010    public OperationDefinition setDate(Date value) { 
2011      if (value == null)
2012        this.date = null;
2013      else {
2014        if (this.date == null)
2015          this.date = new DateTimeType();
2016        this.date.setValue(value);
2017      }
2018      return this;
2019    }
2020
2021    /**
2022     * @return {@link #publisher} (The name of the individual or organization that published the operation definition.). This is the underlying object with id, value and extensions. The accessor "getPublisher" gives direct access to the value
2023     */
2024    public StringType getPublisherElement() { 
2025      if (this.publisher == null)
2026        if (Configuration.errorOnAutoCreate())
2027          throw new Error("Attempt to auto-create OperationDefinition.publisher");
2028        else if (Configuration.doAutoCreate())
2029          this.publisher = new StringType(); // bb
2030      return this.publisher;
2031    }
2032
2033    public boolean hasPublisherElement() { 
2034      return this.publisher != null && !this.publisher.isEmpty();
2035    }
2036
2037    public boolean hasPublisher() { 
2038      return this.publisher != null && !this.publisher.isEmpty();
2039    }
2040
2041    /**
2042     * @param value {@link #publisher} (The name of the individual or organization that published the operation definition.). This is the underlying object with id, value and extensions. The accessor "getPublisher" gives direct access to the value
2043     */
2044    public OperationDefinition setPublisherElement(StringType value) { 
2045      this.publisher = value;
2046      return this;
2047    }
2048
2049    /**
2050     * @return The name of the individual or organization that published the operation definition.
2051     */
2052    public String getPublisher() { 
2053      return this.publisher == null ? null : this.publisher.getValue();
2054    }
2055
2056    /**
2057     * @param value The name of the individual or organization that published the operation definition.
2058     */
2059    public OperationDefinition setPublisher(String value) { 
2060      if (Utilities.noString(value))
2061        this.publisher = null;
2062      else {
2063        if (this.publisher == null)
2064          this.publisher = new StringType();
2065        this.publisher.setValue(value);
2066      }
2067      return this;
2068    }
2069
2070    /**
2071     * @return {@link #contact} (Contact details to assist a user in finding and communicating with the publisher.)
2072     */
2073    public List<ContactDetail> getContact() { 
2074      if (this.contact == null)
2075        this.contact = new ArrayList<ContactDetail>();
2076      return this.contact;
2077    }
2078
2079    /**
2080     * @return Returns a reference to <code>this</code> for easy method chaining
2081     */
2082    public OperationDefinition setContact(List<ContactDetail> theContact) { 
2083      this.contact = theContact;
2084      return this;
2085    }
2086
2087    public boolean hasContact() { 
2088      if (this.contact == null)
2089        return false;
2090      for (ContactDetail item : this.contact)
2091        if (!item.isEmpty())
2092          return true;
2093      return false;
2094    }
2095
2096    public ContactDetail addContact() { //3
2097      ContactDetail t = new ContactDetail();
2098      if (this.contact == null)
2099        this.contact = new ArrayList<ContactDetail>();
2100      this.contact.add(t);
2101      return t;
2102    }
2103
2104    public OperationDefinition addContact(ContactDetail t) { //3
2105      if (t == null)
2106        return this;
2107      if (this.contact == null)
2108        this.contact = new ArrayList<ContactDetail>();
2109      this.contact.add(t);
2110      return this;
2111    }
2112
2113    /**
2114     * @return The first repetition of repeating field {@link #contact}, creating it if it does not already exist
2115     */
2116    public ContactDetail getContactFirstRep() { 
2117      if (getContact().isEmpty()) {
2118        addContact();
2119      }
2120      return getContact().get(0);
2121    }
2122
2123    /**
2124     * @return {@link #description} (A free text natural language description of the operation definition from a consumer's perspective.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
2125     */
2126    public MarkdownType getDescriptionElement() { 
2127      if (this.description == null)
2128        if (Configuration.errorOnAutoCreate())
2129          throw new Error("Attempt to auto-create OperationDefinition.description");
2130        else if (Configuration.doAutoCreate())
2131          this.description = new MarkdownType(); // bb
2132      return this.description;
2133    }
2134
2135    public boolean hasDescriptionElement() { 
2136      return this.description != null && !this.description.isEmpty();
2137    }
2138
2139    public boolean hasDescription() { 
2140      return this.description != null && !this.description.isEmpty();
2141    }
2142
2143    /**
2144     * @param value {@link #description} (A free text natural language description of the operation definition from a consumer's perspective.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
2145     */
2146    public OperationDefinition setDescriptionElement(MarkdownType value) { 
2147      this.description = value;
2148      return this;
2149    }
2150
2151    /**
2152     * @return A free text natural language description of the operation definition from a consumer's perspective.
2153     */
2154    public String getDescription() { 
2155      return this.description == null ? null : this.description.getValue();
2156    }
2157
2158    /**
2159     * @param value A free text natural language description of the operation definition from a consumer's perspective.
2160     */
2161    public OperationDefinition setDescription(String value) { 
2162      if (value == null)
2163        this.description = null;
2164      else {
2165        if (this.description == null)
2166          this.description = new MarkdownType();
2167        this.description.setValue(value);
2168      }
2169      return this;
2170    }
2171
2172    /**
2173     * @return {@link #useContext} (The content was developed with a focus and intent of supporting the contexts that are listed. These terms may be used to assist with indexing and searching for appropriate operation definition instances.)
2174     */
2175    public List<UsageContext> getUseContext() { 
2176      if (this.useContext == null)
2177        this.useContext = new ArrayList<UsageContext>();
2178      return this.useContext;
2179    }
2180
2181    /**
2182     * @return Returns a reference to <code>this</code> for easy method chaining
2183     */
2184    public OperationDefinition setUseContext(List<UsageContext> theUseContext) { 
2185      this.useContext = theUseContext;
2186      return this;
2187    }
2188
2189    public boolean hasUseContext() { 
2190      if (this.useContext == null)
2191        return false;
2192      for (UsageContext item : this.useContext)
2193        if (!item.isEmpty())
2194          return true;
2195      return false;
2196    }
2197
2198    public UsageContext addUseContext() { //3
2199      UsageContext t = new UsageContext();
2200      if (this.useContext == null)
2201        this.useContext = new ArrayList<UsageContext>();
2202      this.useContext.add(t);
2203      return t;
2204    }
2205
2206    public OperationDefinition addUseContext(UsageContext t) { //3
2207      if (t == null)
2208        return this;
2209      if (this.useContext == null)
2210        this.useContext = new ArrayList<UsageContext>();
2211      this.useContext.add(t);
2212      return this;
2213    }
2214
2215    /**
2216     * @return The first repetition of repeating field {@link #useContext}, creating it if it does not already exist
2217     */
2218    public UsageContext getUseContextFirstRep() { 
2219      if (getUseContext().isEmpty()) {
2220        addUseContext();
2221      }
2222      return getUseContext().get(0);
2223    }
2224
2225    /**
2226     * @return {@link #jurisdiction} (A legal or geographic region in which the operation definition is intended to be used.)
2227     */
2228    public List<CodeableConcept> getJurisdiction() { 
2229      if (this.jurisdiction == null)
2230        this.jurisdiction = new ArrayList<CodeableConcept>();
2231      return this.jurisdiction;
2232    }
2233
2234    /**
2235     * @return Returns a reference to <code>this</code> for easy method chaining
2236     */
2237    public OperationDefinition setJurisdiction(List<CodeableConcept> theJurisdiction) { 
2238      this.jurisdiction = theJurisdiction;
2239      return this;
2240    }
2241
2242    public boolean hasJurisdiction() { 
2243      if (this.jurisdiction == null)
2244        return false;
2245      for (CodeableConcept item : this.jurisdiction)
2246        if (!item.isEmpty())
2247          return true;
2248      return false;
2249    }
2250
2251    public CodeableConcept addJurisdiction() { //3
2252      CodeableConcept t = new CodeableConcept();
2253      if (this.jurisdiction == null)
2254        this.jurisdiction = new ArrayList<CodeableConcept>();
2255      this.jurisdiction.add(t);
2256      return t;
2257    }
2258
2259    public OperationDefinition addJurisdiction(CodeableConcept t) { //3
2260      if (t == null)
2261        return this;
2262      if (this.jurisdiction == null)
2263        this.jurisdiction = new ArrayList<CodeableConcept>();
2264      this.jurisdiction.add(t);
2265      return this;
2266    }
2267
2268    /**
2269     * @return The first repetition of repeating field {@link #jurisdiction}, creating it if it does not already exist
2270     */
2271    public CodeableConcept getJurisdictionFirstRep() { 
2272      if (getJurisdiction().isEmpty()) {
2273        addJurisdiction();
2274      }
2275      return getJurisdiction().get(0);
2276    }
2277
2278    /**
2279     * @return {@link #purpose} (Explaination of why this operation definition is needed and why it has been designed as it has.). This is the underlying object with id, value and extensions. The accessor "getPurpose" gives direct access to the value
2280     */
2281    public MarkdownType getPurposeElement() { 
2282      if (this.purpose == null)
2283        if (Configuration.errorOnAutoCreate())
2284          throw new Error("Attempt to auto-create OperationDefinition.purpose");
2285        else if (Configuration.doAutoCreate())
2286          this.purpose = new MarkdownType(); // bb
2287      return this.purpose;
2288    }
2289
2290    public boolean hasPurposeElement() { 
2291      return this.purpose != null && !this.purpose.isEmpty();
2292    }
2293
2294    public boolean hasPurpose() { 
2295      return this.purpose != null && !this.purpose.isEmpty();
2296    }
2297
2298    /**
2299     * @param value {@link #purpose} (Explaination of why this operation definition is needed and why it has been designed as it has.). This is the underlying object with id, value and extensions. The accessor "getPurpose" gives direct access to the value
2300     */
2301    public OperationDefinition setPurposeElement(MarkdownType value) { 
2302      this.purpose = value;
2303      return this;
2304    }
2305
2306    /**
2307     * @return Explaination of why this operation definition is needed and why it has been designed as it has.
2308     */
2309    public String getPurpose() { 
2310      return this.purpose == null ? null : this.purpose.getValue();
2311    }
2312
2313    /**
2314     * @param value Explaination of why this operation definition is needed and why it has been designed as it has.
2315     */
2316    public OperationDefinition setPurpose(String value) { 
2317      if (value == null)
2318        this.purpose = null;
2319      else {
2320        if (this.purpose == null)
2321          this.purpose = new MarkdownType();
2322        this.purpose.setValue(value);
2323      }
2324      return this;
2325    }
2326
2327    /**
2328     * @return {@link #idempotent} (Operations that are idempotent (see [HTTP specification definition of idempotent](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)) may be invoked by performing an HTTP GET operation instead of a POST.). This is the underlying object with id, value and extensions. The accessor "getIdempotent" gives direct access to the value
2329     */
2330    public BooleanType getIdempotentElement() { 
2331      if (this.idempotent == null)
2332        if (Configuration.errorOnAutoCreate())
2333          throw new Error("Attempt to auto-create OperationDefinition.idempotent");
2334        else if (Configuration.doAutoCreate())
2335          this.idempotent = new BooleanType(); // bb
2336      return this.idempotent;
2337    }
2338
2339    public boolean hasIdempotentElement() { 
2340      return this.idempotent != null && !this.idempotent.isEmpty();
2341    }
2342
2343    public boolean hasIdempotent() { 
2344      return this.idempotent != null && !this.idempotent.isEmpty();
2345    }
2346
2347    /**
2348     * @param value {@link #idempotent} (Operations that are idempotent (see [HTTP specification definition of idempotent](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)) may be invoked by performing an HTTP GET operation instead of a POST.). This is the underlying object with id, value and extensions. The accessor "getIdempotent" gives direct access to the value
2349     */
2350    public OperationDefinition setIdempotentElement(BooleanType value) { 
2351      this.idempotent = value;
2352      return this;
2353    }
2354
2355    /**
2356     * @return Operations that are idempotent (see [HTTP specification definition of idempotent](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)) may be invoked by performing an HTTP GET operation instead of a POST.
2357     */
2358    public boolean getIdempotent() { 
2359      return this.idempotent == null || this.idempotent.isEmpty() ? false : this.idempotent.getValue();
2360    }
2361
2362    /**
2363     * @param value Operations that are idempotent (see [HTTP specification definition of idempotent](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)) may be invoked by performing an HTTP GET operation instead of a POST.
2364     */
2365    public OperationDefinition setIdempotent(boolean value) { 
2366        if (this.idempotent == null)
2367          this.idempotent = new BooleanType();
2368        this.idempotent.setValue(value);
2369      return this;
2370    }
2371
2372    /**
2373     * @return {@link #code} (The name used to invoke the operation.). This is the underlying object with id, value and extensions. The accessor "getCode" gives direct access to the value
2374     */
2375    public CodeType getCodeElement() { 
2376      if (this.code == null)
2377        if (Configuration.errorOnAutoCreate())
2378          throw new Error("Attempt to auto-create OperationDefinition.code");
2379        else if (Configuration.doAutoCreate())
2380          this.code = new CodeType(); // bb
2381      return this.code;
2382    }
2383
2384    public boolean hasCodeElement() { 
2385      return this.code != null && !this.code.isEmpty();
2386    }
2387
2388    public boolean hasCode() { 
2389      return this.code != null && !this.code.isEmpty();
2390    }
2391
2392    /**
2393     * @param value {@link #code} (The name used to invoke the operation.). This is the underlying object with id, value and extensions. The accessor "getCode" gives direct access to the value
2394     */
2395    public OperationDefinition setCodeElement(CodeType value) { 
2396      this.code = value;
2397      return this;
2398    }
2399
2400    /**
2401     * @return The name used to invoke the operation.
2402     */
2403    public String getCode() { 
2404      return this.code == null ? null : this.code.getValue();
2405    }
2406
2407    /**
2408     * @param value The name used to invoke the operation.
2409     */
2410    public OperationDefinition setCode(String value) { 
2411        if (this.code == null)
2412          this.code = new CodeType();
2413        this.code.setValue(value);
2414      return this;
2415    }
2416
2417    /**
2418     * @return {@link #comment} (Additional information about how to use this operation or named query.). This is the underlying object with id, value and extensions. The accessor "getComment" gives direct access to the value
2419     */
2420    public StringType getCommentElement() { 
2421      if (this.comment == null)
2422        if (Configuration.errorOnAutoCreate())
2423          throw new Error("Attempt to auto-create OperationDefinition.comment");
2424        else if (Configuration.doAutoCreate())
2425          this.comment = new StringType(); // bb
2426      return this.comment;
2427    }
2428
2429    public boolean hasCommentElement() { 
2430      return this.comment != null && !this.comment.isEmpty();
2431    }
2432
2433    public boolean hasComment() { 
2434      return this.comment != null && !this.comment.isEmpty();
2435    }
2436
2437    /**
2438     * @param value {@link #comment} (Additional information about how to use this operation or named query.). This is the underlying object with id, value and extensions. The accessor "getComment" gives direct access to the value
2439     */
2440    public OperationDefinition setCommentElement(StringType value) { 
2441      this.comment = value;
2442      return this;
2443    }
2444
2445    /**
2446     * @return Additional information about how to use this operation or named query.
2447     */
2448    public String getComment() { 
2449      return this.comment == null ? null : this.comment.getValue();
2450    }
2451
2452    /**
2453     * @param value Additional information about how to use this operation or named query.
2454     */
2455    public OperationDefinition setComment(String value) { 
2456      if (Utilities.noString(value))
2457        this.comment = null;
2458      else {
2459        if (this.comment == null)
2460          this.comment = new StringType();
2461        this.comment.setValue(value);
2462      }
2463      return this;
2464    }
2465
2466    /**
2467     * @return {@link #base} (Indicates that this operation definition is a constraining profile on the base.)
2468     */
2469    public Reference getBase() { 
2470      if (this.base == null)
2471        if (Configuration.errorOnAutoCreate())
2472          throw new Error("Attempt to auto-create OperationDefinition.base");
2473        else if (Configuration.doAutoCreate())
2474          this.base = new Reference(); // cc
2475      return this.base;
2476    }
2477
2478    public boolean hasBase() { 
2479      return this.base != null && !this.base.isEmpty();
2480    }
2481
2482    /**
2483     * @param value {@link #base} (Indicates that this operation definition is a constraining profile on the base.)
2484     */
2485    public OperationDefinition setBase(Reference value)  { 
2486      this.base = value;
2487      return this;
2488    }
2489
2490    /**
2491     * @return {@link #base} The actual object that is the target of the reference. The reference library doesn't populate this, but you can use it to hold the resource if you resolve it. (Indicates that this operation definition is a constraining profile on the base.)
2492     */
2493    public OperationDefinition getBaseTarget() { 
2494      if (this.baseTarget == null)
2495        if (Configuration.errorOnAutoCreate())
2496          throw new Error("Attempt to auto-create OperationDefinition.base");
2497        else if (Configuration.doAutoCreate())
2498          this.baseTarget = new OperationDefinition(); // aa
2499      return this.baseTarget;
2500    }
2501
2502    /**
2503     * @param value {@link #base} The actual object that is the target of the reference. The reference library doesn't use these, but you can use it to hold the resource if you resolve it. (Indicates that this operation definition is a constraining profile on the base.)
2504     */
2505    public OperationDefinition setBaseTarget(OperationDefinition value) { 
2506      this.baseTarget = value;
2507      return this;
2508    }
2509
2510    /**
2511     * @return {@link #resource} (The types on which this operation can be executed.)
2512     */
2513    public List<CodeType> getResource() { 
2514      if (this.resource == null)
2515        this.resource = new ArrayList<CodeType>();
2516      return this.resource;
2517    }
2518
2519    /**
2520     * @return Returns a reference to <code>this</code> for easy method chaining
2521     */
2522    public OperationDefinition setResource(List<CodeType> theResource) { 
2523      this.resource = theResource;
2524      return this;
2525    }
2526
2527    public boolean hasResource() { 
2528      if (this.resource == null)
2529        return false;
2530      for (CodeType item : this.resource)
2531        if (!item.isEmpty())
2532          return true;
2533      return false;
2534    }
2535
2536    /**
2537     * @return {@link #resource} (The types on which this operation can be executed.)
2538     */
2539    public CodeType addResourceElement() {//2 
2540      CodeType t = new CodeType();
2541      if (this.resource == null)
2542        this.resource = new ArrayList<CodeType>();
2543      this.resource.add(t);
2544      return t;
2545    }
2546
2547    /**
2548     * @param value {@link #resource} (The types on which this operation can be executed.)
2549     */
2550    public OperationDefinition addResource(String value) { //1
2551      CodeType t = new CodeType();
2552      t.setValue(value);
2553      if (this.resource == null)
2554        this.resource = new ArrayList<CodeType>();
2555      this.resource.add(t);
2556      return this;
2557    }
2558
2559    /**
2560     * @param value {@link #resource} (The types on which this operation can be executed.)
2561     */
2562    public boolean hasResource(String value) { 
2563      if (this.resource == null)
2564        return false;
2565      for (CodeType v : this.resource)
2566        if (v.getValue().equals(value)) // code
2567          return true;
2568      return false;
2569    }
2570
2571    /**
2572     * @return {@link #system} (Indicates whether this operation or named query can be invoked at the system level (e.g. without needing to choose a resource type for the context).). This is the underlying object with id, value and extensions. The accessor "getSystem" gives direct access to the value
2573     */
2574    public BooleanType getSystemElement() { 
2575      if (this.system == null)
2576        if (Configuration.errorOnAutoCreate())
2577          throw new Error("Attempt to auto-create OperationDefinition.system");
2578        else if (Configuration.doAutoCreate())
2579          this.system = new BooleanType(); // bb
2580      return this.system;
2581    }
2582
2583    public boolean hasSystemElement() { 
2584      return this.system != null && !this.system.isEmpty();
2585    }
2586
2587    public boolean hasSystem() { 
2588      return this.system != null && !this.system.isEmpty();
2589    }
2590
2591    /**
2592     * @param value {@link #system} (Indicates whether this operation or named query can be invoked at the system level (e.g. without needing to choose a resource type for the context).). This is the underlying object with id, value and extensions. The accessor "getSystem" gives direct access to the value
2593     */
2594    public OperationDefinition setSystemElement(BooleanType value) { 
2595      this.system = value;
2596      return this;
2597    }
2598
2599    /**
2600     * @return Indicates whether this operation or named query can be invoked at the system level (e.g. without needing to choose a resource type for the context).
2601     */
2602    public boolean getSystem() { 
2603      return this.system == null || this.system.isEmpty() ? false : this.system.getValue();
2604    }
2605
2606    /**
2607     * @param value Indicates whether this operation or named query can be invoked at the system level (e.g. without needing to choose a resource type for the context).
2608     */
2609    public OperationDefinition setSystem(boolean value) { 
2610        if (this.system == null)
2611          this.system = new BooleanType();
2612        this.system.setValue(value);
2613      return this;
2614    }
2615
2616    /**
2617     * @return {@link #type} (Indicates whether this operation or named query can be invoked at the resource type level for any given resource type level (e.g. without needing to choose a specific resource id for the context).). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
2618     */
2619    public BooleanType getTypeElement() { 
2620      if (this.type == null)
2621        if (Configuration.errorOnAutoCreate())
2622          throw new Error("Attempt to auto-create OperationDefinition.type");
2623        else if (Configuration.doAutoCreate())
2624          this.type = new BooleanType(); // bb
2625      return this.type;
2626    }
2627
2628    public boolean hasTypeElement() { 
2629      return this.type != null && !this.type.isEmpty();
2630    }
2631
2632    public boolean hasType() { 
2633      return this.type != null && !this.type.isEmpty();
2634    }
2635
2636    /**
2637     * @param value {@link #type} (Indicates whether this operation or named query can be invoked at the resource type level for any given resource type level (e.g. without needing to choose a specific resource id for the context).). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
2638     */
2639    public OperationDefinition setTypeElement(BooleanType value) { 
2640      this.type = value;
2641      return this;
2642    }
2643
2644    /**
2645     * @return Indicates whether this operation or named query can be invoked at the resource type level for any given resource type level (e.g. without needing to choose a specific resource id for the context).
2646     */
2647    public boolean getType() { 
2648      return this.type == null || this.type.isEmpty() ? false : this.type.getValue();
2649    }
2650
2651    /**
2652     * @param value Indicates whether this operation or named query can be invoked at the resource type level for any given resource type level (e.g. without needing to choose a specific resource id for the context).
2653     */
2654    public OperationDefinition setType(boolean value) { 
2655        if (this.type == null)
2656          this.type = new BooleanType();
2657        this.type.setValue(value);
2658      return this;
2659    }
2660
2661    /**
2662     * @return {@link #instance} (Indicates whether this operation can be invoked on a particular instance of one of the given types.). This is the underlying object with id, value and extensions. The accessor "getInstance" gives direct access to the value
2663     */
2664    public BooleanType getInstanceElement() { 
2665      if (this.instance == null)
2666        if (Configuration.errorOnAutoCreate())
2667          throw new Error("Attempt to auto-create OperationDefinition.instance");
2668        else if (Configuration.doAutoCreate())
2669          this.instance = new BooleanType(); // bb
2670      return this.instance;
2671    }
2672
2673    public boolean hasInstanceElement() { 
2674      return this.instance != null && !this.instance.isEmpty();
2675    }
2676
2677    public boolean hasInstance() { 
2678      return this.instance != null && !this.instance.isEmpty();
2679    }
2680
2681    /**
2682     * @param value {@link #instance} (Indicates whether this operation can be invoked on a particular instance of one of the given types.). This is the underlying object with id, value and extensions. The accessor "getInstance" gives direct access to the value
2683     */
2684    public OperationDefinition setInstanceElement(BooleanType value) { 
2685      this.instance = value;
2686      return this;
2687    }
2688
2689    /**
2690     * @return Indicates whether this operation can be invoked on a particular instance of one of the given types.
2691     */
2692    public boolean getInstance() { 
2693      return this.instance == null || this.instance.isEmpty() ? false : this.instance.getValue();
2694    }
2695
2696    /**
2697     * @param value Indicates whether this operation can be invoked on a particular instance of one of the given types.
2698     */
2699    public OperationDefinition setInstance(boolean value) { 
2700        if (this.instance == null)
2701          this.instance = new BooleanType();
2702        this.instance.setValue(value);
2703      return this;
2704    }
2705
2706    /**
2707     * @return {@link #parameter} (The parameters for the operation/query.)
2708     */
2709    public List<OperationDefinitionParameterComponent> getParameter() { 
2710      if (this.parameter == null)
2711        this.parameter = new ArrayList<OperationDefinitionParameterComponent>();
2712      return this.parameter;
2713    }
2714
2715    /**
2716     * @return Returns a reference to <code>this</code> for easy method chaining
2717     */
2718    public OperationDefinition setParameter(List<OperationDefinitionParameterComponent> theParameter) { 
2719      this.parameter = theParameter;
2720      return this;
2721    }
2722
2723    public boolean hasParameter() { 
2724      if (this.parameter == null)
2725        return false;
2726      for (OperationDefinitionParameterComponent item : this.parameter)
2727        if (!item.isEmpty())
2728          return true;
2729      return false;
2730    }
2731
2732    public OperationDefinitionParameterComponent addParameter() { //3
2733      OperationDefinitionParameterComponent t = new OperationDefinitionParameterComponent();
2734      if (this.parameter == null)
2735        this.parameter = new ArrayList<OperationDefinitionParameterComponent>();
2736      this.parameter.add(t);
2737      return t;
2738    }
2739
2740    public OperationDefinition addParameter(OperationDefinitionParameterComponent t) { //3
2741      if (t == null)
2742        return this;
2743      if (this.parameter == null)
2744        this.parameter = new ArrayList<OperationDefinitionParameterComponent>();
2745      this.parameter.add(t);
2746      return this;
2747    }
2748
2749    /**
2750     * @return The first repetition of repeating field {@link #parameter}, creating it if it does not already exist
2751     */
2752    public OperationDefinitionParameterComponent getParameterFirstRep() { 
2753      if (getParameter().isEmpty()) {
2754        addParameter();
2755      }
2756      return getParameter().get(0);
2757    }
2758
2759    /**
2760     * @return {@link #overload} (Defines an appropriate combination of parameters to use when invoking this operation, to help code generators when generating overloaded parameter sets for this operation.)
2761     */
2762    public List<OperationDefinitionOverloadComponent> getOverload() { 
2763      if (this.overload == null)
2764        this.overload = new ArrayList<OperationDefinitionOverloadComponent>();
2765      return this.overload;
2766    }
2767
2768    /**
2769     * @return Returns a reference to <code>this</code> for easy method chaining
2770     */
2771    public OperationDefinition setOverload(List<OperationDefinitionOverloadComponent> theOverload) { 
2772      this.overload = theOverload;
2773      return this;
2774    }
2775
2776    public boolean hasOverload() { 
2777      if (this.overload == null)
2778        return false;
2779      for (OperationDefinitionOverloadComponent item : this.overload)
2780        if (!item.isEmpty())
2781          return true;
2782      return false;
2783    }
2784
2785    public OperationDefinitionOverloadComponent addOverload() { //3
2786      OperationDefinitionOverloadComponent t = new OperationDefinitionOverloadComponent();
2787      if (this.overload == null)
2788        this.overload = new ArrayList<OperationDefinitionOverloadComponent>();
2789      this.overload.add(t);
2790      return t;
2791    }
2792
2793    public OperationDefinition addOverload(OperationDefinitionOverloadComponent t) { //3
2794      if (t == null)
2795        return this;
2796      if (this.overload == null)
2797        this.overload = new ArrayList<OperationDefinitionOverloadComponent>();
2798      this.overload.add(t);
2799      return this;
2800    }
2801
2802    /**
2803     * @return The first repetition of repeating field {@link #overload}, creating it if it does not already exist
2804     */
2805    public OperationDefinitionOverloadComponent getOverloadFirstRep() { 
2806      if (getOverload().isEmpty()) {
2807        addOverload();
2808      }
2809      return getOverload().get(0);
2810    }
2811
2812      protected void listChildren(List<Property> children) {
2813        super.listChildren(children);
2814        children.add(new Property("url", "uri", "An absolute URI that is used to identify this operation definition when it is referenced in a specification, model, design or an instance. This SHALL be a URL, SHOULD be globally unique, and SHOULD be an address at which this operation definition is (or will be) published. The URL SHOULD include the major version of the operation definition. For more information see [Technical and Business Versions](resource.html#versions).", 0, 1, url));
2815        children.add(new Property("version", "string", "The identifier that is used to identify this version of the operation definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the operation definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence.", 0, 1, version));
2816        children.add(new Property("name", "string", "A natural language name identifying the operation definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.", 0, 1, name));
2817        children.add(new Property("status", "code", "The status of this operation definition. Enables tracking the life-cycle of the content.", 0, 1, status));
2818        children.add(new Property("kind", "code", "Whether this is an operation or a named query.", 0, 1, kind));
2819        children.add(new Property("experimental", "boolean", "A boolean value to indicate that this operation definition is authored for testing purposes (or education/evaluation/marketing), and is not intended to be used for genuine usage.", 0, 1, experimental));
2820        children.add(new Property("date", "dateTime", "The date  (and optionally time) when the operation definition was published. The date must change if and when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the operation definition changes.", 0, 1, date));
2821        children.add(new Property("publisher", "string", "The name of the individual or organization that published the operation definition.", 0, 1, publisher));
2822        children.add(new Property("contact", "ContactDetail", "Contact details to assist a user in finding and communicating with the publisher.", 0, java.lang.Integer.MAX_VALUE, contact));
2823        children.add(new Property("description", "markdown", "A free text natural language description of the operation definition from a consumer's perspective.", 0, 1, description));
2824        children.add(new Property("useContext", "UsageContext", "The content was developed with a focus and intent of supporting the contexts that are listed. These terms may be used to assist with indexing and searching for appropriate operation definition instances.", 0, java.lang.Integer.MAX_VALUE, useContext));
2825        children.add(new Property("jurisdiction", "CodeableConcept", "A legal or geographic region in which the operation definition is intended to be used.", 0, java.lang.Integer.MAX_VALUE, jurisdiction));
2826        children.add(new Property("purpose", "markdown", "Explaination of why this operation definition is needed and why it has been designed as it has.", 0, 1, purpose));
2827        children.add(new Property("idempotent", "boolean", "Operations that are idempotent (see [HTTP specification definition of idempotent](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)) may be invoked by performing an HTTP GET operation instead of a POST.", 0, 1, idempotent));
2828        children.add(new Property("code", "code", "The name used to invoke the operation.", 0, 1, code));
2829        children.add(new Property("comment", "string", "Additional information about how to use this operation or named query.", 0, 1, comment));
2830        children.add(new Property("base", "Reference(OperationDefinition)", "Indicates that this operation definition is a constraining profile on the base.", 0, 1, base));
2831        children.add(new Property("resource", "code", "The types on which this operation can be executed.", 0, java.lang.Integer.MAX_VALUE, resource));
2832        children.add(new Property("system", "boolean", "Indicates whether this operation or named query can be invoked at the system level (e.g. without needing to choose a resource type for the context).", 0, 1, system));
2833        children.add(new Property("type", "boolean", "Indicates whether this operation or named query can be invoked at the resource type level for any given resource type level (e.g. without needing to choose a specific resource id for the context).", 0, 1, type));
2834        children.add(new Property("instance", "boolean", "Indicates whether this operation can be invoked on a particular instance of one of the given types.", 0, 1, instance));
2835        children.add(new Property("parameter", "", "The parameters for the operation/query.", 0, java.lang.Integer.MAX_VALUE, parameter));
2836        children.add(new Property("overload", "", "Defines an appropriate combination of parameters to use when invoking this operation, to help code generators when generating overloaded parameter sets for this operation.", 0, java.lang.Integer.MAX_VALUE, overload));
2837      }
2838
2839      @Override
2840      public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2841        switch (_hash) {
2842        case 116079: /*url*/  return new Property("url", "uri", "An absolute URI that is used to identify this operation definition when it is referenced in a specification, model, design or an instance. This SHALL be a URL, SHOULD be globally unique, and SHOULD be an address at which this operation definition is (or will be) published. The URL SHOULD include the major version of the operation definition. For more information see [Technical and Business Versions](resource.html#versions).", 0, 1, url);
2843        case 351608024: /*version*/  return new Property("version", "string", "The identifier that is used to identify this version of the operation definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the operation definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence.", 0, 1, version);
2844        case 3373707: /*name*/  return new Property("name", "string", "A natural language name identifying the operation definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.", 0, 1, name);
2845        case -892481550: /*status*/  return new Property("status", "code", "The status of this operation definition. Enables tracking the life-cycle of the content.", 0, 1, status);
2846        case 3292052: /*kind*/  return new Property("kind", "code", "Whether this is an operation or a named query.", 0, 1, kind);
2847        case -404562712: /*experimental*/  return new Property("experimental", "boolean", "A boolean value to indicate that this operation definition is authored for testing purposes (or education/evaluation/marketing), and is not intended to be used for genuine usage.", 0, 1, experimental);
2848        case 3076014: /*date*/  return new Property("date", "dateTime", "The date  (and optionally time) when the operation definition was published. The date must change if and when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the operation definition changes.", 0, 1, date);
2849        case 1447404028: /*publisher*/  return new Property("publisher", "string", "The name of the individual or organization that published the operation definition.", 0, 1, publisher);
2850        case 951526432: /*contact*/  return new Property("contact", "ContactDetail", "Contact details to assist a user in finding and communicating with the publisher.", 0, java.lang.Integer.MAX_VALUE, contact);
2851        case -1724546052: /*description*/  return new Property("description", "markdown", "A free text natural language description of the operation definition from a consumer's perspective.", 0, 1, description);
2852        case -669707736: /*useContext*/  return new Property("useContext", "UsageContext", "The content was developed with a focus and intent of supporting the contexts that are listed. These terms may be used to assist with indexing and searching for appropriate operation definition instances.", 0, java.lang.Integer.MAX_VALUE, useContext);
2853        case -507075711: /*jurisdiction*/  return new Property("jurisdiction", "CodeableConcept", "A legal or geographic region in which the operation definition is intended to be used.", 0, java.lang.Integer.MAX_VALUE, jurisdiction);
2854        case -220463842: /*purpose*/  return new Property("purpose", "markdown", "Explaination of why this operation definition is needed and why it has been designed as it has.", 0, 1, purpose);
2855        case 1680468793: /*idempotent*/  return new Property("idempotent", "boolean", "Operations that are idempotent (see [HTTP specification definition of idempotent](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)) may be invoked by performing an HTTP GET operation instead of a POST.", 0, 1, idempotent);
2856        case 3059181: /*code*/  return new Property("code", "code", "The name used to invoke the operation.", 0, 1, code);
2857        case 950398559: /*comment*/  return new Property("comment", "string", "Additional information about how to use this operation or named query.", 0, 1, comment);
2858        case 3016401: /*base*/  return new Property("base", "Reference(OperationDefinition)", "Indicates that this operation definition is a constraining profile on the base.", 0, 1, base);
2859        case -341064690: /*resource*/  return new Property("resource", "code", "The types on which this operation can be executed.", 0, java.lang.Integer.MAX_VALUE, resource);
2860        case -887328209: /*system*/  return new Property("system", "boolean", "Indicates whether this operation or named query can be invoked at the system level (e.g. without needing to choose a resource type for the context).", 0, 1, system);
2861        case 3575610: /*type*/  return new Property("type", "boolean", "Indicates whether this operation or named query can be invoked at the resource type level for any given resource type level (e.g. without needing to choose a specific resource id for the context).", 0, 1, type);
2862        case 555127957: /*instance*/  return new Property("instance", "boolean", "Indicates whether this operation can be invoked on a particular instance of one of the given types.", 0, 1, instance);
2863        case 1954460585: /*parameter*/  return new Property("parameter", "", "The parameters for the operation/query.", 0, java.lang.Integer.MAX_VALUE, parameter);
2864        case 529823674: /*overload*/  return new Property("overload", "", "Defines an appropriate combination of parameters to use when invoking this operation, to help code generators when generating overloaded parameter sets for this operation.", 0, java.lang.Integer.MAX_VALUE, overload);
2865        default: return super.getNamedProperty(_hash, _name, _checkValid);
2866        }
2867
2868      }
2869
2870      @Override
2871      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2872        switch (hash) {
2873        case 116079: /*url*/ return this.url == null ? new Base[0] : new Base[] {this.url}; // UriType
2874        case 351608024: /*version*/ return this.version == null ? new Base[0] : new Base[] {this.version}; // StringType
2875        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // StringType
2876        case -892481550: /*status*/ return this.status == null ? new Base[0] : new Base[] {this.status}; // Enumeration<PublicationStatus>
2877        case 3292052: /*kind*/ return this.kind == null ? new Base[0] : new Base[] {this.kind}; // Enumeration<OperationKind>
2878        case -404562712: /*experimental*/ return this.experimental == null ? new Base[0] : new Base[] {this.experimental}; // BooleanType
2879        case 3076014: /*date*/ return this.date == null ? new Base[0] : new Base[] {this.date}; // DateTimeType
2880        case 1447404028: /*publisher*/ return this.publisher == null ? new Base[0] : new Base[] {this.publisher}; // StringType
2881        case 951526432: /*contact*/ return this.contact == null ? new Base[0] : this.contact.toArray(new Base[this.contact.size()]); // ContactDetail
2882        case -1724546052: /*description*/ return this.description == null ? new Base[0] : new Base[] {this.description}; // MarkdownType
2883        case -669707736: /*useContext*/ return this.useContext == null ? new Base[0] : this.useContext.toArray(new Base[this.useContext.size()]); // UsageContext
2884        case -507075711: /*jurisdiction*/ return this.jurisdiction == null ? new Base[0] : this.jurisdiction.toArray(new Base[this.jurisdiction.size()]); // CodeableConcept
2885        case -220463842: /*purpose*/ return this.purpose == null ? new Base[0] : new Base[] {this.purpose}; // MarkdownType
2886        case 1680468793: /*idempotent*/ return this.idempotent == null ? new Base[0] : new Base[] {this.idempotent}; // BooleanType
2887        case 3059181: /*code*/ return this.code == null ? new Base[0] : new Base[] {this.code}; // CodeType
2888        case 950398559: /*comment*/ return this.comment == null ? new Base[0] : new Base[] {this.comment}; // StringType
2889        case 3016401: /*base*/ return this.base == null ? new Base[0] : new Base[] {this.base}; // Reference
2890        case -341064690: /*resource*/ return this.resource == null ? new Base[0] : this.resource.toArray(new Base[this.resource.size()]); // CodeType
2891        case -887328209: /*system*/ return this.system == null ? new Base[0] : new Base[] {this.system}; // BooleanType
2892        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // BooleanType
2893        case 555127957: /*instance*/ return this.instance == null ? new Base[0] : new Base[] {this.instance}; // BooleanType
2894        case 1954460585: /*parameter*/ return this.parameter == null ? new Base[0] : this.parameter.toArray(new Base[this.parameter.size()]); // OperationDefinitionParameterComponent
2895        case 529823674: /*overload*/ return this.overload == null ? new Base[0] : this.overload.toArray(new Base[this.overload.size()]); // OperationDefinitionOverloadComponent
2896        default: return super.getProperty(hash, name, checkValid);
2897        }
2898
2899      }
2900
2901      @Override
2902      public Base setProperty(int hash, String name, Base value) throws FHIRException {
2903        switch (hash) {
2904        case 116079: // url
2905          this.url = castToUri(value); // UriType
2906          return value;
2907        case 351608024: // version
2908          this.version = castToString(value); // StringType
2909          return value;
2910        case 3373707: // name
2911          this.name = castToString(value); // StringType
2912          return value;
2913        case -892481550: // status
2914          value = new PublicationStatusEnumFactory().fromType(castToCode(value));
2915          this.status = (Enumeration) value; // Enumeration<PublicationStatus>
2916          return value;
2917        case 3292052: // kind
2918          value = new OperationKindEnumFactory().fromType(castToCode(value));
2919          this.kind = (Enumeration) value; // Enumeration<OperationKind>
2920          return value;
2921        case -404562712: // experimental
2922          this.experimental = castToBoolean(value); // BooleanType
2923          return value;
2924        case 3076014: // date
2925          this.date = castToDateTime(value); // DateTimeType
2926          return value;
2927        case 1447404028: // publisher
2928          this.publisher = castToString(value); // StringType
2929          return value;
2930        case 951526432: // contact
2931          this.getContact().add(castToContactDetail(value)); // ContactDetail
2932          return value;
2933        case -1724546052: // description
2934          this.description = castToMarkdown(value); // MarkdownType
2935          return value;
2936        case -669707736: // useContext
2937          this.getUseContext().add(castToUsageContext(value)); // UsageContext
2938          return value;
2939        case -507075711: // jurisdiction
2940          this.getJurisdiction().add(castToCodeableConcept(value)); // CodeableConcept
2941          return value;
2942        case -220463842: // purpose
2943          this.purpose = castToMarkdown(value); // MarkdownType
2944          return value;
2945        case 1680468793: // idempotent
2946          this.idempotent = castToBoolean(value); // BooleanType
2947          return value;
2948        case 3059181: // code
2949          this.code = castToCode(value); // CodeType
2950          return value;
2951        case 950398559: // comment
2952          this.comment = castToString(value); // StringType
2953          return value;
2954        case 3016401: // base
2955          this.base = castToReference(value); // Reference
2956          return value;
2957        case -341064690: // resource
2958          this.getResource().add(castToCode(value)); // CodeType
2959          return value;
2960        case -887328209: // system
2961          this.system = castToBoolean(value); // BooleanType
2962          return value;
2963        case 3575610: // type
2964          this.type = castToBoolean(value); // BooleanType
2965          return value;
2966        case 555127957: // instance
2967          this.instance = castToBoolean(value); // BooleanType
2968          return value;
2969        case 1954460585: // parameter
2970          this.getParameter().add((OperationDefinitionParameterComponent) value); // OperationDefinitionParameterComponent
2971          return value;
2972        case 529823674: // overload
2973          this.getOverload().add((OperationDefinitionOverloadComponent) value); // OperationDefinitionOverloadComponent
2974          return value;
2975        default: return super.setProperty(hash, name, value);
2976        }
2977
2978      }
2979
2980      @Override
2981      public Base setProperty(String name, Base value) throws FHIRException {
2982        if (name.equals("url")) {
2983          this.url = castToUri(value); // UriType
2984        } else if (name.equals("version")) {
2985          this.version = castToString(value); // StringType
2986        } else if (name.equals("name")) {
2987          this.name = castToString(value); // StringType
2988        } else if (name.equals("status")) {
2989          value = new PublicationStatusEnumFactory().fromType(castToCode(value));
2990          this.status = (Enumeration) value; // Enumeration<PublicationStatus>
2991        } else if (name.equals("kind")) {
2992          value = new OperationKindEnumFactory().fromType(castToCode(value));
2993          this.kind = (Enumeration) value; // Enumeration<OperationKind>
2994        } else if (name.equals("experimental")) {
2995          this.experimental = castToBoolean(value); // BooleanType
2996        } else if (name.equals("date")) {
2997          this.date = castToDateTime(value); // DateTimeType
2998        } else if (name.equals("publisher")) {
2999          this.publisher = castToString(value); // StringType
3000        } else if (name.equals("contact")) {
3001          this.getContact().add(castToContactDetail(value));
3002        } else if (name.equals("description")) {
3003          this.description = castToMarkdown(value); // MarkdownType
3004        } else if (name.equals("useContext")) {
3005          this.getUseContext().add(castToUsageContext(value));
3006        } else if (name.equals("jurisdiction")) {
3007          this.getJurisdiction().add(castToCodeableConcept(value));
3008        } else if (name.equals("purpose")) {
3009          this.purpose = castToMarkdown(value); // MarkdownType
3010        } else if (name.equals("idempotent")) {
3011          this.idempotent = castToBoolean(value); // BooleanType
3012        } else if (name.equals("code")) {
3013          this.code = castToCode(value); // CodeType
3014        } else if (name.equals("comment")) {
3015          this.comment = castToString(value); // StringType
3016        } else if (name.equals("base")) {
3017          this.base = castToReference(value); // Reference
3018        } else if (name.equals("resource")) {
3019          this.getResource().add(castToCode(value));
3020        } else if (name.equals("system")) {
3021          this.system = castToBoolean(value); // BooleanType
3022        } else if (name.equals("type")) {
3023          this.type = castToBoolean(value); // BooleanType
3024        } else if (name.equals("instance")) {
3025          this.instance = castToBoolean(value); // BooleanType
3026        } else if (name.equals("parameter")) {
3027          this.getParameter().add((OperationDefinitionParameterComponent) value);
3028        } else if (name.equals("overload")) {
3029          this.getOverload().add((OperationDefinitionOverloadComponent) value);
3030        } else
3031          return super.setProperty(name, value);
3032        return value;
3033      }
3034
3035      @Override
3036      public Base makeProperty(int hash, String name) throws FHIRException {
3037        switch (hash) {
3038        case 116079:  return getUrlElement();
3039        case 351608024:  return getVersionElement();
3040        case 3373707:  return getNameElement();
3041        case -892481550:  return getStatusElement();
3042        case 3292052:  return getKindElement();
3043        case -404562712:  return getExperimentalElement();
3044        case 3076014:  return getDateElement();
3045        case 1447404028:  return getPublisherElement();
3046        case 951526432:  return addContact(); 
3047        case -1724546052:  return getDescriptionElement();
3048        case -669707736:  return addUseContext(); 
3049        case -507075711:  return addJurisdiction(); 
3050        case -220463842:  return getPurposeElement();
3051        case 1680468793:  return getIdempotentElement();
3052        case 3059181:  return getCodeElement();
3053        case 950398559:  return getCommentElement();
3054        case 3016401:  return getBase(); 
3055        case -341064690:  return addResourceElement();
3056        case -887328209:  return getSystemElement();
3057        case 3575610:  return getTypeElement();
3058        case 555127957:  return getInstanceElement();
3059        case 1954460585:  return addParameter(); 
3060        case 529823674:  return addOverload(); 
3061        default: return super.makeProperty(hash, name);
3062        }
3063
3064      }
3065
3066      @Override
3067      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
3068        switch (hash) {
3069        case 116079: /*url*/ return new String[] {"uri"};
3070        case 351608024: /*version*/ return new String[] {"string"};
3071        case 3373707: /*name*/ return new String[] {"string"};
3072        case -892481550: /*status*/ return new String[] {"code"};
3073        case 3292052: /*kind*/ return new String[] {"code"};
3074        case -404562712: /*experimental*/ return new String[] {"boolean"};
3075        case 3076014: /*date*/ return new String[] {"dateTime"};
3076        case 1447404028: /*publisher*/ return new String[] {"string"};
3077        case 951526432: /*contact*/ return new String[] {"ContactDetail"};
3078        case -1724546052: /*description*/ return new String[] {"markdown"};
3079        case -669707736: /*useContext*/ return new String[] {"UsageContext"};
3080        case -507075711: /*jurisdiction*/ return new String[] {"CodeableConcept"};
3081        case -220463842: /*purpose*/ return new String[] {"markdown"};
3082        case 1680468793: /*idempotent*/ return new String[] {"boolean"};
3083        case 3059181: /*code*/ return new String[] {"code"};
3084        case 950398559: /*comment*/ return new String[] {"string"};
3085        case 3016401: /*base*/ return new String[] {"Reference"};
3086        case -341064690: /*resource*/ return new String[] {"code"};
3087        case -887328209: /*system*/ return new String[] {"boolean"};
3088        case 3575610: /*type*/ return new String[] {"boolean"};
3089        case 555127957: /*instance*/ return new String[] {"boolean"};
3090        case 1954460585: /*parameter*/ return new String[] {};
3091        case 529823674: /*overload*/ return new String[] {};
3092        default: return super.getTypesForProperty(hash, name);
3093        }
3094
3095      }
3096
3097      @Override
3098      public Base addChild(String name) throws FHIRException {
3099        if (name.equals("url")) {
3100          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.url");
3101        }
3102        else if (name.equals("version")) {
3103          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.version");
3104        }
3105        else if (name.equals("name")) {
3106          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.name");
3107        }
3108        else if (name.equals("status")) {
3109          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.status");
3110        }
3111        else if (name.equals("kind")) {
3112          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.kind");
3113        }
3114        else if (name.equals("experimental")) {
3115          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.experimental");
3116        }
3117        else if (name.equals("date")) {
3118          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.date");
3119        }
3120        else if (name.equals("publisher")) {
3121          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.publisher");
3122        }
3123        else if (name.equals("contact")) {
3124          return addContact();
3125        }
3126        else if (name.equals("description")) {
3127          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.description");
3128        }
3129        else if (name.equals("useContext")) {
3130          return addUseContext();
3131        }
3132        else if (name.equals("jurisdiction")) {
3133          return addJurisdiction();
3134        }
3135        else if (name.equals("purpose")) {
3136          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.purpose");
3137        }
3138        else if (name.equals("idempotent")) {
3139          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.idempotent");
3140        }
3141        else if (name.equals("code")) {
3142          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.code");
3143        }
3144        else if (name.equals("comment")) {
3145          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.comment");
3146        }
3147        else if (name.equals("base")) {
3148          this.base = new Reference();
3149          return this.base;
3150        }
3151        else if (name.equals("resource")) {
3152          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.resource");
3153        }
3154        else if (name.equals("system")) {
3155          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.system");
3156        }
3157        else if (name.equals("type")) {
3158          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.type");
3159        }
3160        else if (name.equals("instance")) {
3161          throw new FHIRException("Cannot call addChild on a singleton property OperationDefinition.instance");
3162        }
3163        else if (name.equals("parameter")) {
3164          return addParameter();
3165        }
3166        else if (name.equals("overload")) {
3167          return addOverload();
3168        }
3169        else
3170          return super.addChild(name);
3171      }
3172
3173  public String fhirType() {
3174    return "OperationDefinition";
3175
3176  }
3177
3178      public OperationDefinition copy() {
3179        OperationDefinition dst = new OperationDefinition();
3180        copyValues(dst);
3181        dst.url = url == null ? null : url.copy();
3182        dst.version = version == null ? null : version.copy();
3183        dst.name = name == null ? null : name.copy();
3184        dst.status = status == null ? null : status.copy();
3185        dst.kind = kind == null ? null : kind.copy();
3186        dst.experimental = experimental == null ? null : experimental.copy();
3187        dst.date = date == null ? null : date.copy();
3188        dst.publisher = publisher == null ? null : publisher.copy();
3189        if (contact != null) {
3190          dst.contact = new ArrayList<ContactDetail>();
3191          for (ContactDetail i : contact)
3192            dst.contact.add(i.copy());
3193        };
3194        dst.description = description == null ? null : description.copy();
3195        if (useContext != null) {
3196          dst.useContext = new ArrayList<UsageContext>();
3197          for (UsageContext i : useContext)
3198            dst.useContext.add(i.copy());
3199        };
3200        if (jurisdiction != null) {
3201          dst.jurisdiction = new ArrayList<CodeableConcept>();
3202          for (CodeableConcept i : jurisdiction)
3203            dst.jurisdiction.add(i.copy());
3204        };
3205        dst.purpose = purpose == null ? null : purpose.copy();
3206        dst.idempotent = idempotent == null ? null : idempotent.copy();
3207        dst.code = code == null ? null : code.copy();
3208        dst.comment = comment == null ? null : comment.copy();
3209        dst.base = base == null ? null : base.copy();
3210        if (resource != null) {
3211          dst.resource = new ArrayList<CodeType>();
3212          for (CodeType i : resource)
3213            dst.resource.add(i.copy());
3214        };
3215        dst.system = system == null ? null : system.copy();
3216        dst.type = type == null ? null : type.copy();
3217        dst.instance = instance == null ? null : instance.copy();
3218        if (parameter != null) {
3219          dst.parameter = new ArrayList<OperationDefinitionParameterComponent>();
3220          for (OperationDefinitionParameterComponent i : parameter)
3221            dst.parameter.add(i.copy());
3222        };
3223        if (overload != null) {
3224          dst.overload = new ArrayList<OperationDefinitionOverloadComponent>();
3225          for (OperationDefinitionOverloadComponent i : overload)
3226            dst.overload.add(i.copy());
3227        };
3228        return dst;
3229      }
3230
3231      protected OperationDefinition typedCopy() {
3232        return copy();
3233      }
3234
3235      @Override
3236      public boolean equalsDeep(Base other_) {
3237        if (!super.equalsDeep(other_))
3238          return false;
3239        if (!(other_ instanceof OperationDefinition))
3240          return false;
3241        OperationDefinition o = (OperationDefinition) other_;
3242        return compareDeep(kind, o.kind, true) && compareDeep(purpose, o.purpose, true) && compareDeep(idempotent, o.idempotent, true)
3243           && compareDeep(code, o.code, true) && compareDeep(comment, o.comment, true) && compareDeep(base, o.base, true)
3244           && compareDeep(resource, o.resource, true) && compareDeep(system, o.system, true) && compareDeep(type, o.type, true)
3245           && compareDeep(instance, o.instance, true) && compareDeep(parameter, o.parameter, true) && compareDeep(overload, o.overload, true)
3246          ;
3247      }
3248
3249      @Override
3250      public boolean equalsShallow(Base other_) {
3251        if (!super.equalsShallow(other_))
3252          return false;
3253        if (!(other_ instanceof OperationDefinition))
3254          return false;
3255        OperationDefinition o = (OperationDefinition) other_;
3256        return compareValues(kind, o.kind, true) && compareValues(purpose, o.purpose, true) && compareValues(idempotent, o.idempotent, true)
3257           && compareValues(code, o.code, true) && compareValues(comment, o.comment, true) && compareValues(resource, o.resource, true)
3258           && compareValues(system, o.system, true) && compareValues(type, o.type, true) && compareValues(instance, o.instance, true)
3259          ;
3260      }
3261
3262      public boolean isEmpty() {
3263        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(kind, purpose, idempotent
3264          , code, comment, base, resource, system, type, instance, parameter, overload
3265          );
3266      }
3267
3268  @Override
3269  public ResourceType getResourceType() {
3270    return ResourceType.OperationDefinition;
3271   }
3272
3273 /**
3274   * Search parameter: <b>date</b>
3275   * <p>
3276   * Description: <b>The operation definition publication date</b><br>
3277   * Type: <b>date</b><br>
3278   * Path: <b>OperationDefinition.date</b><br>
3279   * </p>
3280   */
3281  @SearchParamDefinition(name="date", path="OperationDefinition.date", description="The operation definition publication date", type="date" )
3282  public static final String SP_DATE = "date";
3283 /**
3284   * <b>Fluent Client</b> search parameter constant for <b>date</b>
3285   * <p>
3286   * Description: <b>The operation definition publication date</b><br>
3287   * Type: <b>date</b><br>
3288   * Path: <b>OperationDefinition.date</b><br>
3289   * </p>
3290   */
3291  public static final ca.uhn.fhir.rest.gclient.DateClientParam DATE = new ca.uhn.fhir.rest.gclient.DateClientParam(SP_DATE);
3292
3293 /**
3294   * Search parameter: <b>code</b>
3295   * <p>
3296   * Description: <b>Name used to invoke the operation</b><br>
3297   * Type: <b>token</b><br>
3298   * Path: <b>OperationDefinition.code</b><br>
3299   * </p>
3300   */
3301  @SearchParamDefinition(name="code", path="OperationDefinition.code", description="Name used to invoke the operation", type="token" )
3302  public static final String SP_CODE = "code";
3303 /**
3304   * <b>Fluent Client</b> search parameter constant for <b>code</b>
3305   * <p>
3306   * Description: <b>Name used to invoke the operation</b><br>
3307   * Type: <b>token</b><br>
3308   * Path: <b>OperationDefinition.code</b><br>
3309   * </p>
3310   */
3311  public static final ca.uhn.fhir.rest.gclient.TokenClientParam CODE = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_CODE);
3312
3313 /**
3314   * Search parameter: <b>instance</b>
3315   * <p>
3316   * Description: <b>Invoke on an instance?</b><br>
3317   * Type: <b>token</b><br>
3318   * Path: <b>OperationDefinition.instance</b><br>
3319   * </p>
3320   */
3321  @SearchParamDefinition(name="instance", path="OperationDefinition.instance", description="Invoke on an instance?", type="token" )
3322  public static final String SP_INSTANCE = "instance";
3323 /**
3324   * <b>Fluent Client</b> search parameter constant for <b>instance</b>
3325   * <p>
3326   * Description: <b>Invoke on an instance?</b><br>
3327   * Type: <b>token</b><br>
3328   * Path: <b>OperationDefinition.instance</b><br>
3329   * </p>
3330   */
3331  public static final ca.uhn.fhir.rest.gclient.TokenClientParam INSTANCE = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_INSTANCE);
3332
3333 /**
3334   * Search parameter: <b>kind</b>
3335   * <p>
3336   * Description: <b>operation | query</b><br>
3337   * Type: <b>token</b><br>
3338   * Path: <b>OperationDefinition.kind</b><br>
3339   * </p>
3340   */
3341  @SearchParamDefinition(name="kind", path="OperationDefinition.kind", description="operation | query", type="token" )
3342  public static final String SP_KIND = "kind";
3343 /**
3344   * <b>Fluent Client</b> search parameter constant for <b>kind</b>
3345   * <p>
3346   * Description: <b>operation | query</b><br>
3347   * Type: <b>token</b><br>
3348   * Path: <b>OperationDefinition.kind</b><br>
3349   * </p>
3350   */
3351  public static final ca.uhn.fhir.rest.gclient.TokenClientParam KIND = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_KIND);
3352
3353 /**
3354   * Search parameter: <b>jurisdiction</b>
3355   * <p>
3356   * Description: <b>Intended jurisdiction for the operation definition</b><br>
3357   * Type: <b>token</b><br>
3358   * Path: <b>OperationDefinition.jurisdiction</b><br>
3359   * </p>
3360   */
3361  @SearchParamDefinition(name="jurisdiction", path="OperationDefinition.jurisdiction", description="Intended jurisdiction for the operation definition", type="token" )
3362  public static final String SP_JURISDICTION = "jurisdiction";
3363 /**
3364   * <b>Fluent Client</b> search parameter constant for <b>jurisdiction</b>
3365   * <p>
3366   * Description: <b>Intended jurisdiction for the operation definition</b><br>
3367   * Type: <b>token</b><br>
3368   * Path: <b>OperationDefinition.jurisdiction</b><br>
3369   * </p>
3370   */
3371  public static final ca.uhn.fhir.rest.gclient.TokenClientParam JURISDICTION = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_JURISDICTION);
3372
3373 /**
3374   * Search parameter: <b>description</b>
3375   * <p>
3376   * Description: <b>The description of the operation definition</b><br>
3377   * Type: <b>string</b><br>
3378   * Path: <b>OperationDefinition.description</b><br>
3379   * </p>
3380   */
3381  @SearchParamDefinition(name="description", path="OperationDefinition.description", description="The description of the operation definition", type="string" )
3382  public static final String SP_DESCRIPTION = "description";
3383 /**
3384   * <b>Fluent Client</b> search parameter constant for <b>description</b>
3385   * <p>
3386   * Description: <b>The description of the operation definition</b><br>
3387   * Type: <b>string</b><br>
3388   * Path: <b>OperationDefinition.description</b><br>
3389   * </p>
3390   */
3391  public static final ca.uhn.fhir.rest.gclient.StringClientParam DESCRIPTION = new ca.uhn.fhir.rest.gclient.StringClientParam(SP_DESCRIPTION);
3392
3393 /**
3394   * Search parameter: <b>type</b>
3395   * <p>
3396   * Description: <b>Invole at the type level?</b><br>
3397   * Type: <b>token</b><br>
3398   * Path: <b>OperationDefinition.type</b><br>
3399   * </p>
3400   */
3401  @SearchParamDefinition(name="type", path="OperationDefinition.type", description="Invole at the type level?", type="token" )
3402  public static final String SP_TYPE = "type";
3403 /**
3404   * <b>Fluent Client</b> search parameter constant for <b>type</b>
3405   * <p>
3406   * Description: <b>Invole at the type level?</b><br>
3407   * Type: <b>token</b><br>
3408   * Path: <b>OperationDefinition.type</b><br>
3409   * </p>
3410   */
3411  public static final ca.uhn.fhir.rest.gclient.TokenClientParam TYPE = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_TYPE);
3412
3413 /**
3414   * Search parameter: <b>version</b>
3415   * <p>
3416   * Description: <b>The business version of the operation definition</b><br>
3417   * Type: <b>token</b><br>
3418   * Path: <b>OperationDefinition.version</b><br>
3419   * </p>
3420   */
3421  @SearchParamDefinition(name="version", path="OperationDefinition.version", description="The business version of the operation definition", type="token" )
3422  public static final String SP_VERSION = "version";
3423 /**
3424   * <b>Fluent Client</b> search parameter constant for <b>version</b>
3425   * <p>
3426   * Description: <b>The business version of the operation definition</b><br>
3427   * Type: <b>token</b><br>
3428   * Path: <b>OperationDefinition.version</b><br>
3429   * </p>
3430   */
3431  public static final ca.uhn.fhir.rest.gclient.TokenClientParam VERSION = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_VERSION);
3432
3433 /**
3434   * Search parameter: <b>url</b>
3435   * <p>
3436   * Description: <b>The uri that identifies the operation definition</b><br>
3437   * Type: <b>uri</b><br>
3438   * Path: <b>OperationDefinition.url</b><br>
3439   * </p>
3440   */
3441  @SearchParamDefinition(name="url", path="OperationDefinition.url", description="The uri that identifies the operation definition", type="uri" )
3442  public static final String SP_URL = "url";
3443 /**
3444   * <b>Fluent Client</b> search parameter constant for <b>url</b>
3445   * <p>
3446   * Description: <b>The uri that identifies the operation definition</b><br>
3447   * Type: <b>uri</b><br>
3448   * Path: <b>OperationDefinition.url</b><br>
3449   * </p>
3450   */
3451  public static final ca.uhn.fhir.rest.gclient.UriClientParam URL = new ca.uhn.fhir.rest.gclient.UriClientParam(SP_URL);
3452
3453 /**
3454   * Search parameter: <b>system</b>
3455   * <p>
3456   * Description: <b>Invoke at the system level?</b><br>
3457   * Type: <b>token</b><br>
3458   * Path: <b>OperationDefinition.system</b><br>
3459   * </p>
3460   */
3461  @SearchParamDefinition(name="system", path="OperationDefinition.system", description="Invoke at the system level?", type="token" )
3462  public static final String SP_SYSTEM = "system";
3463 /**
3464   * <b>Fluent Client</b> search parameter constant for <b>system</b>
3465   * <p>
3466   * Description: <b>Invoke at the system level?</b><br>
3467   * Type: <b>token</b><br>
3468   * Path: <b>OperationDefinition.system</b><br>
3469   * </p>
3470   */
3471  public static final ca.uhn.fhir.rest.gclient.TokenClientParam SYSTEM = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_SYSTEM);
3472
3473 /**
3474   * Search parameter: <b>name</b>
3475   * <p>
3476   * Description: <b>Computationally friendly name of the operation definition</b><br>
3477   * Type: <b>string</b><br>
3478   * Path: <b>OperationDefinition.name</b><br>
3479   * </p>
3480   */
3481  @SearchParamDefinition(name="name", path="OperationDefinition.name", description="Computationally friendly name of the operation definition", type="string" )
3482  public static final String SP_NAME = "name";
3483 /**
3484   * <b>Fluent Client</b> search parameter constant for <b>name</b>
3485   * <p>
3486   * Description: <b>Computationally friendly name of the operation definition</b><br>
3487   * Type: <b>string</b><br>
3488   * Path: <b>OperationDefinition.name</b><br>
3489   * </p>
3490   */
3491  public static final ca.uhn.fhir.rest.gclient.StringClientParam NAME = new ca.uhn.fhir.rest.gclient.StringClientParam(SP_NAME);
3492
3493 /**
3494   * Search parameter: <b>publisher</b>
3495   * <p>
3496   * Description: <b>Name of the publisher of the operation definition</b><br>
3497   * Type: <b>string</b><br>
3498   * Path: <b>OperationDefinition.publisher</b><br>
3499   * </p>
3500   */
3501  @SearchParamDefinition(name="publisher", path="OperationDefinition.publisher", description="Name of the publisher of the operation definition", type="string" )
3502  public static final String SP_PUBLISHER = "publisher";
3503 /**
3504   * <b>Fluent Client</b> search parameter constant for <b>publisher</b>
3505   * <p>
3506   * Description: <b>Name of the publisher of the operation definition</b><br>
3507   * Type: <b>string</b><br>
3508   * Path: <b>OperationDefinition.publisher</b><br>
3509   * </p>
3510   */
3511  public static final ca.uhn.fhir.rest.gclient.StringClientParam PUBLISHER = new ca.uhn.fhir.rest.gclient.StringClientParam(SP_PUBLISHER);
3512
3513 /**
3514   * Search parameter: <b>param-profile</b>
3515   * <p>
3516   * Description: <b>Profile on the type</b><br>
3517   * Type: <b>reference</b><br>
3518   * Path: <b>OperationDefinition.parameter.profile</b><br>
3519   * </p>
3520   */
3521  @SearchParamDefinition(name="param-profile", path="OperationDefinition.parameter.profile", description="Profile on the type", type="reference", target={StructureDefinition.class } )
3522  public static final String SP_PARAM_PROFILE = "param-profile";
3523 /**
3524   * <b>Fluent Client</b> search parameter constant for <b>param-profile</b>
3525   * <p>
3526   * Description: <b>Profile on the type</b><br>
3527   * Type: <b>reference</b><br>
3528   * Path: <b>OperationDefinition.parameter.profile</b><br>
3529   * </p>
3530   */
3531  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam PARAM_PROFILE = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_PARAM_PROFILE);
3532
3533/**
3534   * Constant for fluent queries to be used to add include statements. Specifies
3535   * the path value of "<b>OperationDefinition:param-profile</b>".
3536   */
3537  public static final ca.uhn.fhir.model.api.Include INCLUDE_PARAM_PROFILE = new ca.uhn.fhir.model.api.Include("OperationDefinition:param-profile").toLocked();
3538
3539 /**
3540   * Search parameter: <b>status</b>
3541   * <p>
3542   * Description: <b>The current status of the operation definition</b><br>
3543   * Type: <b>token</b><br>
3544   * Path: <b>OperationDefinition.status</b><br>
3545   * </p>
3546   */
3547  @SearchParamDefinition(name="status", path="OperationDefinition.status", description="The current status of the operation definition", type="token" )
3548  public static final String SP_STATUS = "status";
3549 /**
3550   * <b>Fluent Client</b> search parameter constant for <b>status</b>
3551   * <p>
3552   * Description: <b>The current status of the operation definition</b><br>
3553   * Type: <b>token</b><br>
3554   * Path: <b>OperationDefinition.status</b><br>
3555   * </p>
3556   */
3557  public static final ca.uhn.fhir.rest.gclient.TokenClientParam STATUS = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_STATUS);
3558
3559 /**
3560   * Search parameter: <b>base</b>
3561   * <p>
3562   * Description: <b>Marks this as a profile of the base</b><br>
3563   * Type: <b>reference</b><br>
3564   * Path: <b>OperationDefinition.base</b><br>
3565   * </p>
3566   */
3567  @SearchParamDefinition(name="base", path="OperationDefinition.base", description="Marks this as a profile of the base", type="reference", target={OperationDefinition.class } )
3568  public static final String SP_BASE = "base";
3569 /**
3570   * <b>Fluent Client</b> search parameter constant for <b>base</b>
3571   * <p>
3572   * Description: <b>Marks this as a profile of the base</b><br>
3573   * Type: <b>reference</b><br>
3574   * Path: <b>OperationDefinition.base</b><br>
3575   * </p>
3576   */
3577  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam BASE = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_BASE);
3578
3579/**
3580   * Constant for fluent queries to be used to add include statements. Specifies
3581   * the path value of "<b>OperationDefinition:base</b>".
3582   */
3583  public static final ca.uhn.fhir.model.api.Include INCLUDE_BASE = new ca.uhn.fhir.model.api.Include("OperationDefinition:base").toLocked();
3584
3585
3586}