001package org.hl7.fhir.r4.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
035// Generated on Tue, May 12, 2020 07:26+1000 for FHIR v4.0.1
036
037import java.util.*;
038
039import org.hl7.fhir.utilities.Utilities;
040import org.hl7.fhir.r4.model.Enumerations.*;
041import ca.uhn.fhir.model.api.annotation.ResourceDef;
042import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
043import ca.uhn.fhir.model.api.annotation.Child;
044import ca.uhn.fhir.model.api.annotation.ChildOrder;
045import ca.uhn.fhir.model.api.annotation.Description;
046import ca.uhn.fhir.model.api.annotation.Block;
047import org.hl7.fhir.instance.model.api.*;
048import org.hl7.fhir.exceptions.FHIRException;
049/**
050 * A TerminologyCapabilities resource documents a set of capabilities (behaviors) of a FHIR Terminology Server that may be used as a statement of actual server functionality or a statement of required or desired server implementation.
051 */
052@ResourceDef(name="TerminologyCapabilities", profile="http://hl7.org/fhir/StructureDefinition/TerminologyCapabilities")
053@ChildOrder(names={"url", "version", "name", "title", "status", "experimental", "date", "publisher", "contact", "description", "useContext", "jurisdiction", "purpose", "copyright", "kind", "software", "implementation", "lockedDate", "codeSystem", "expansion", "codeSearch", "validateCode", "translation", "closure"})
054public class TerminologyCapabilities extends MetadataResource {
055
056    public enum CapabilityStatementKind {
057        /**
058         * The CapabilityStatement instance represents the present capabilities of a specific system instance.  This is the kind returned by /metadata for a FHIR server end-point.
059         */
060        INSTANCE, 
061        /**
062         * The CapabilityStatement instance represents the capabilities of a system or piece of software, independent of a particular installation.
063         */
064        CAPABILITY, 
065        /**
066         * The CapabilityStatement instance represents a set of requirements for other systems to meet; e.g. as part of an implementation guide or 'request for proposal'.
067         */
068        REQUIREMENTS, 
069        /**
070         * added to help the parsers with the generic types
071         */
072        NULL;
073        public static CapabilityStatementKind fromCode(String codeString) throws FHIRException {
074            if (codeString == null || "".equals(codeString))
075                return null;
076        if ("instance".equals(codeString))
077          return INSTANCE;
078        if ("capability".equals(codeString))
079          return CAPABILITY;
080        if ("requirements".equals(codeString))
081          return REQUIREMENTS;
082        if (Configuration.isAcceptInvalidEnums())
083          return null;
084        else
085          throw new FHIRException("Unknown CapabilityStatementKind code '"+codeString+"'");
086        }
087        public String toCode() {
088          switch (this) {
089            case INSTANCE: return "instance";
090            case CAPABILITY: return "capability";
091            case REQUIREMENTS: return "requirements";
092            case NULL: return null;
093            default: return "?";
094          }
095        }
096        public String getSystem() {
097          switch (this) {
098            case INSTANCE: return "http://hl7.org/fhir/capability-statement-kind";
099            case CAPABILITY: return "http://hl7.org/fhir/capability-statement-kind";
100            case REQUIREMENTS: return "http://hl7.org/fhir/capability-statement-kind";
101            case NULL: return null;
102            default: return "?";
103          }
104        }
105        public String getDefinition() {
106          switch (this) {
107            case INSTANCE: return "The CapabilityStatement instance represents the present capabilities of a specific system instance.  This is the kind returned by /metadata for a FHIR server end-point.";
108            case CAPABILITY: return "The CapabilityStatement instance represents the capabilities of a system or piece of software, independent of a particular installation.";
109            case REQUIREMENTS: return "The CapabilityStatement instance represents a set of requirements for other systems to meet; e.g. as part of an implementation guide or 'request for proposal'.";
110            case NULL: return null;
111            default: return "?";
112          }
113        }
114        public String getDisplay() {
115          switch (this) {
116            case INSTANCE: return "Instance";
117            case CAPABILITY: return "Capability";
118            case REQUIREMENTS: return "Requirements";
119            case NULL: return null;
120            default: return "?";
121          }
122        }
123    }
124
125  public static class CapabilityStatementKindEnumFactory implements EnumFactory<CapabilityStatementKind> {
126    public CapabilityStatementKind fromCode(String codeString) throws IllegalArgumentException {
127      if (codeString == null || "".equals(codeString))
128            if (codeString == null || "".equals(codeString))
129                return null;
130        if ("instance".equals(codeString))
131          return CapabilityStatementKind.INSTANCE;
132        if ("capability".equals(codeString))
133          return CapabilityStatementKind.CAPABILITY;
134        if ("requirements".equals(codeString))
135          return CapabilityStatementKind.REQUIREMENTS;
136        throw new IllegalArgumentException("Unknown CapabilityStatementKind code '"+codeString+"'");
137        }
138        public Enumeration<CapabilityStatementKind> fromType(Base code) throws FHIRException {
139          if (code == null)
140            return null;
141          if (code.isEmpty())
142            return new Enumeration<CapabilityStatementKind>(this);
143          String codeString = ((PrimitiveType) code).asStringValue();
144          if (codeString == null || "".equals(codeString))
145            return null;
146        if ("instance".equals(codeString))
147          return new Enumeration<CapabilityStatementKind>(this, CapabilityStatementKind.INSTANCE);
148        if ("capability".equals(codeString))
149          return new Enumeration<CapabilityStatementKind>(this, CapabilityStatementKind.CAPABILITY);
150        if ("requirements".equals(codeString))
151          return new Enumeration<CapabilityStatementKind>(this, CapabilityStatementKind.REQUIREMENTS);
152        throw new FHIRException("Unknown CapabilityStatementKind code '"+codeString+"'");
153        }
154    public String toCode(CapabilityStatementKind code) {
155      if (code == CapabilityStatementKind.INSTANCE)
156        return "instance";
157      if (code == CapabilityStatementKind.CAPABILITY)
158        return "capability";
159      if (code == CapabilityStatementKind.REQUIREMENTS)
160        return "requirements";
161      return "?";
162      }
163    public String toSystem(CapabilityStatementKind code) {
164      return code.getSystem();
165      }
166    }
167
168    public enum CodeSearchSupport {
169        /**
170         * The search for code on ValueSet only includes codes explicitly detailed on includes or expansions.
171         */
172        EXPLICIT, 
173        /**
174         * The search for code on ValueSet only includes all codes based on the expansion of the value set.
175         */
176        ALL, 
177        /**
178         * added to help the parsers with the generic types
179         */
180        NULL;
181        public static CodeSearchSupport fromCode(String codeString) throws FHIRException {
182            if (codeString == null || "".equals(codeString))
183                return null;
184        if ("explicit".equals(codeString))
185          return EXPLICIT;
186        if ("all".equals(codeString))
187          return ALL;
188        if (Configuration.isAcceptInvalidEnums())
189          return null;
190        else
191          throw new FHIRException("Unknown CodeSearchSupport code '"+codeString+"'");
192        }
193        public String toCode() {
194          switch (this) {
195            case EXPLICIT: return "explicit";
196            case ALL: return "all";
197            case NULL: return null;
198            default: return "?";
199          }
200        }
201        public String getSystem() {
202          switch (this) {
203            case EXPLICIT: return "http://hl7.org/fhir/code-search-support";
204            case ALL: return "http://hl7.org/fhir/code-search-support";
205            case NULL: return null;
206            default: return "?";
207          }
208        }
209        public String getDefinition() {
210          switch (this) {
211            case EXPLICIT: return "The search for code on ValueSet only includes codes explicitly detailed on includes or expansions.";
212            case ALL: return "The search for code on ValueSet only includes all codes based on the expansion of the value set.";
213            case NULL: return null;
214            default: return "?";
215          }
216        }
217        public String getDisplay() {
218          switch (this) {
219            case EXPLICIT: return "Explicit Codes";
220            case ALL: return "Implicit Codes";
221            case NULL: return null;
222            default: return "?";
223          }
224        }
225    }
226
227  public static class CodeSearchSupportEnumFactory implements EnumFactory<CodeSearchSupport> {
228    public CodeSearchSupport fromCode(String codeString) throws IllegalArgumentException {
229      if (codeString == null || "".equals(codeString))
230            if (codeString == null || "".equals(codeString))
231                return null;
232        if ("explicit".equals(codeString))
233          return CodeSearchSupport.EXPLICIT;
234        if ("all".equals(codeString))
235          return CodeSearchSupport.ALL;
236        throw new IllegalArgumentException("Unknown CodeSearchSupport code '"+codeString+"'");
237        }
238        public Enumeration<CodeSearchSupport> fromType(Base code) throws FHIRException {
239          if (code == null)
240            return null;
241          if (code.isEmpty())
242            return new Enumeration<CodeSearchSupport>(this);
243          String codeString = ((PrimitiveType) code).asStringValue();
244          if (codeString == null || "".equals(codeString))
245            return null;
246        if ("explicit".equals(codeString))
247          return new Enumeration<CodeSearchSupport>(this, CodeSearchSupport.EXPLICIT);
248        if ("all".equals(codeString))
249          return new Enumeration<CodeSearchSupport>(this, CodeSearchSupport.ALL);
250        throw new FHIRException("Unknown CodeSearchSupport code '"+codeString+"'");
251        }
252    public String toCode(CodeSearchSupport code) {
253      if (code == CodeSearchSupport.EXPLICIT)
254        return "explicit";
255      if (code == CodeSearchSupport.ALL)
256        return "all";
257      return "?";
258      }
259    public String toSystem(CodeSearchSupport code) {
260      return code.getSystem();
261      }
262    }
263
264    @Block()
265    public static class TerminologyCapabilitiesSoftwareComponent extends BackboneElement implements IBaseBackboneElement {
266        /**
267         * Name the software is known by.
268         */
269        @Child(name = "name", type = {StringType.class}, order=1, min=1, max=1, modifier=false, summary=true)
270        @Description(shortDefinition="A name the software is known by", formalDefinition="Name the software is known by." )
271        protected StringType name;
272
273        /**
274         * The version identifier for the software covered by this statement.
275         */
276        @Child(name = "version", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=true)
277        @Description(shortDefinition="Version covered by this statement", formalDefinition="The version identifier for the software covered by this statement." )
278        protected StringType version;
279
280        private static final long serialVersionUID = -790299911L;
281
282    /**
283     * Constructor
284     */
285      public TerminologyCapabilitiesSoftwareComponent() {
286        super();
287      }
288
289    /**
290     * Constructor
291     */
292      public TerminologyCapabilitiesSoftwareComponent(StringType name) {
293        super();
294        this.name = name;
295      }
296
297        /**
298         * @return {@link #name} (Name the software is known by.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
299         */
300        public StringType getNameElement() { 
301          if (this.name == null)
302            if (Configuration.errorOnAutoCreate())
303              throw new Error("Attempt to auto-create TerminologyCapabilitiesSoftwareComponent.name");
304            else if (Configuration.doAutoCreate())
305              this.name = new StringType(); // bb
306          return this.name;
307        }
308
309        public boolean hasNameElement() { 
310          return this.name != null && !this.name.isEmpty();
311        }
312
313        public boolean hasName() { 
314          return this.name != null && !this.name.isEmpty();
315        }
316
317        /**
318         * @param value {@link #name} (Name the software is known by.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
319         */
320        public TerminologyCapabilitiesSoftwareComponent setNameElement(StringType value) { 
321          this.name = value;
322          return this;
323        }
324
325        /**
326         * @return Name the software is known by.
327         */
328        public String getName() { 
329          return this.name == null ? null : this.name.getValue();
330        }
331
332        /**
333         * @param value Name the software is known by.
334         */
335        public TerminologyCapabilitiesSoftwareComponent setName(String value) { 
336            if (this.name == null)
337              this.name = new StringType();
338            this.name.setValue(value);
339          return this;
340        }
341
342        /**
343         * @return {@link #version} (The version identifier for the software covered by this statement.). This is the underlying object with id, value and extensions. The accessor "getVersion" gives direct access to the value
344         */
345        public StringType getVersionElement() { 
346          if (this.version == null)
347            if (Configuration.errorOnAutoCreate())
348              throw new Error("Attempt to auto-create TerminologyCapabilitiesSoftwareComponent.version");
349            else if (Configuration.doAutoCreate())
350              this.version = new StringType(); // bb
351          return this.version;
352        }
353
354        public boolean hasVersionElement() { 
355          return this.version != null && !this.version.isEmpty();
356        }
357
358        public boolean hasVersion() { 
359          return this.version != null && !this.version.isEmpty();
360        }
361
362        /**
363         * @param value {@link #version} (The version identifier for the software covered by this statement.). This is the underlying object with id, value and extensions. The accessor "getVersion" gives direct access to the value
364         */
365        public TerminologyCapabilitiesSoftwareComponent setVersionElement(StringType value) { 
366          this.version = value;
367          return this;
368        }
369
370        /**
371         * @return The version identifier for the software covered by this statement.
372         */
373        public String getVersion() { 
374          return this.version == null ? null : this.version.getValue();
375        }
376
377        /**
378         * @param value The version identifier for the software covered by this statement.
379         */
380        public TerminologyCapabilitiesSoftwareComponent setVersion(String value) { 
381          if (Utilities.noString(value))
382            this.version = null;
383          else {
384            if (this.version == null)
385              this.version = new StringType();
386            this.version.setValue(value);
387          }
388          return this;
389        }
390
391        protected void listChildren(List<Property> children) {
392          super.listChildren(children);
393          children.add(new Property("name", "string", "Name the software is known by.", 0, 1, name));
394          children.add(new Property("version", "string", "The version identifier for the software covered by this statement.", 0, 1, version));
395        }
396
397        @Override
398        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
399          switch (_hash) {
400          case 3373707: /*name*/  return new Property("name", "string", "Name the software is known by.", 0, 1, name);
401          case 351608024: /*version*/  return new Property("version", "string", "The version identifier for the software covered by this statement.", 0, 1, version);
402          default: return super.getNamedProperty(_hash, _name, _checkValid);
403          }
404
405        }
406
407      @Override
408      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
409        switch (hash) {
410        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // StringType
411        case 351608024: /*version*/ return this.version == null ? new Base[0] : new Base[] {this.version}; // StringType
412        default: return super.getProperty(hash, name, checkValid);
413        }
414
415      }
416
417      @Override
418      public Base setProperty(int hash, String name, Base value) throws FHIRException {
419        switch (hash) {
420        case 3373707: // name
421          this.name = castToString(value); // StringType
422          return value;
423        case 351608024: // version
424          this.version = castToString(value); // StringType
425          return value;
426        default: return super.setProperty(hash, name, value);
427        }
428
429      }
430
431      @Override
432      public Base setProperty(String name, Base value) throws FHIRException {
433        if (name.equals("name")) {
434          this.name = castToString(value); // StringType
435        } else if (name.equals("version")) {
436          this.version = castToString(value); // StringType
437        } else
438          return super.setProperty(name, value);
439        return value;
440      }
441
442      @Override
443      public Base makeProperty(int hash, String name) throws FHIRException {
444        switch (hash) {
445        case 3373707:  return getNameElement();
446        case 351608024:  return getVersionElement();
447        default: return super.makeProperty(hash, name);
448        }
449
450      }
451
452      @Override
453      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
454        switch (hash) {
455        case 3373707: /*name*/ return new String[] {"string"};
456        case 351608024: /*version*/ return new String[] {"string"};
457        default: return super.getTypesForProperty(hash, name);
458        }
459
460      }
461
462      @Override
463      public Base addChild(String name) throws FHIRException {
464        if (name.equals("name")) {
465          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.name");
466        }
467        else if (name.equals("version")) {
468          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.version");
469        }
470        else
471          return super.addChild(name);
472      }
473
474      public TerminologyCapabilitiesSoftwareComponent copy() {
475        TerminologyCapabilitiesSoftwareComponent dst = new TerminologyCapabilitiesSoftwareComponent();
476        copyValues(dst);
477        return dst;
478      }
479
480      public void copyValues(TerminologyCapabilitiesSoftwareComponent dst) {
481        super.copyValues(dst);
482        dst.name = name == null ? null : name.copy();
483        dst.version = version == null ? null : version.copy();
484      }
485
486      @Override
487      public boolean equalsDeep(Base other_) {
488        if (!super.equalsDeep(other_))
489          return false;
490        if (!(other_ instanceof TerminologyCapabilitiesSoftwareComponent))
491          return false;
492        TerminologyCapabilitiesSoftwareComponent o = (TerminologyCapabilitiesSoftwareComponent) other_;
493        return compareDeep(name, o.name, true) && compareDeep(version, o.version, true);
494      }
495
496      @Override
497      public boolean equalsShallow(Base other_) {
498        if (!super.equalsShallow(other_))
499          return false;
500        if (!(other_ instanceof TerminologyCapabilitiesSoftwareComponent))
501          return false;
502        TerminologyCapabilitiesSoftwareComponent o = (TerminologyCapabilitiesSoftwareComponent) other_;
503        return compareValues(name, o.name, true) && compareValues(version, o.version, true);
504      }
505
506      public boolean isEmpty() {
507        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(name, version);
508      }
509
510  public String fhirType() {
511    return "TerminologyCapabilities.software";
512
513  }
514
515  }
516
517    @Block()
518    public static class TerminologyCapabilitiesImplementationComponent extends BackboneElement implements IBaseBackboneElement {
519        /**
520         * Information about the specific installation that this terminology capability statement relates to.
521         */
522        @Child(name = "description", type = {StringType.class}, order=1, min=1, max=1, modifier=false, summary=true)
523        @Description(shortDefinition="Describes this specific instance", formalDefinition="Information about the specific installation that this terminology capability statement relates to." )
524        protected StringType description;
525
526        /**
527         * An absolute base URL for the implementation.
528         */
529        @Child(name = "url", type = {UrlType.class}, order=2, min=0, max=1, modifier=false, summary=true)
530        @Description(shortDefinition="Base URL for the implementation", formalDefinition="An absolute base URL for the implementation." )
531        protected UrlType url;
532
533        private static final long serialVersionUID = 98009649L;
534
535    /**
536     * Constructor
537     */
538      public TerminologyCapabilitiesImplementationComponent() {
539        super();
540      }
541
542    /**
543     * Constructor
544     */
545      public TerminologyCapabilitiesImplementationComponent(StringType description) {
546        super();
547        this.description = description;
548      }
549
550        /**
551         * @return {@link #description} (Information about the specific installation that this terminology capability statement relates to.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
552         */
553        public StringType getDescriptionElement() { 
554          if (this.description == null)
555            if (Configuration.errorOnAutoCreate())
556              throw new Error("Attempt to auto-create TerminologyCapabilitiesImplementationComponent.description");
557            else if (Configuration.doAutoCreate())
558              this.description = new StringType(); // bb
559          return this.description;
560        }
561
562        public boolean hasDescriptionElement() { 
563          return this.description != null && !this.description.isEmpty();
564        }
565
566        public boolean hasDescription() { 
567          return this.description != null && !this.description.isEmpty();
568        }
569
570        /**
571         * @param value {@link #description} (Information about the specific installation that this terminology capability statement relates to.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
572         */
573        public TerminologyCapabilitiesImplementationComponent setDescriptionElement(StringType value) { 
574          this.description = value;
575          return this;
576        }
577
578        /**
579         * @return Information about the specific installation that this terminology capability statement relates to.
580         */
581        public String getDescription() { 
582          return this.description == null ? null : this.description.getValue();
583        }
584
585        /**
586         * @param value Information about the specific installation that this terminology capability statement relates to.
587         */
588        public TerminologyCapabilitiesImplementationComponent setDescription(String value) { 
589            if (this.description == null)
590              this.description = new StringType();
591            this.description.setValue(value);
592          return this;
593        }
594
595        /**
596         * @return {@link #url} (An absolute base URL for the implementation.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
597         */
598        public UrlType getUrlElement() { 
599          if (this.url == null)
600            if (Configuration.errorOnAutoCreate())
601              throw new Error("Attempt to auto-create TerminologyCapabilitiesImplementationComponent.url");
602            else if (Configuration.doAutoCreate())
603              this.url = new UrlType(); // bb
604          return this.url;
605        }
606
607        public boolean hasUrlElement() { 
608          return this.url != null && !this.url.isEmpty();
609        }
610
611        public boolean hasUrl() { 
612          return this.url != null && !this.url.isEmpty();
613        }
614
615        /**
616         * @param value {@link #url} (An absolute base URL for the implementation.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
617         */
618        public TerminologyCapabilitiesImplementationComponent setUrlElement(UrlType value) { 
619          this.url = value;
620          return this;
621        }
622
623        /**
624         * @return An absolute base URL for the implementation.
625         */
626        public String getUrl() { 
627          return this.url == null ? null : this.url.getValue();
628        }
629
630        /**
631         * @param value An absolute base URL for the implementation.
632         */
633        public TerminologyCapabilitiesImplementationComponent setUrl(String value) { 
634          if (Utilities.noString(value))
635            this.url = null;
636          else {
637            if (this.url == null)
638              this.url = new UrlType();
639            this.url.setValue(value);
640          }
641          return this;
642        }
643
644        protected void listChildren(List<Property> children) {
645          super.listChildren(children);
646          children.add(new Property("description", "string", "Information about the specific installation that this terminology capability statement relates to.", 0, 1, description));
647          children.add(new Property("url", "url", "An absolute base URL for the implementation.", 0, 1, url));
648        }
649
650        @Override
651        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
652          switch (_hash) {
653          case -1724546052: /*description*/  return new Property("description", "string", "Information about the specific installation that this terminology capability statement relates to.", 0, 1, description);
654          case 116079: /*url*/  return new Property("url", "url", "An absolute base URL for the implementation.", 0, 1, url);
655          default: return super.getNamedProperty(_hash, _name, _checkValid);
656          }
657
658        }
659
660      @Override
661      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
662        switch (hash) {
663        case -1724546052: /*description*/ return this.description == null ? new Base[0] : new Base[] {this.description}; // StringType
664        case 116079: /*url*/ return this.url == null ? new Base[0] : new Base[] {this.url}; // UrlType
665        default: return super.getProperty(hash, name, checkValid);
666        }
667
668      }
669
670      @Override
671      public Base setProperty(int hash, String name, Base value) throws FHIRException {
672        switch (hash) {
673        case -1724546052: // description
674          this.description = castToString(value); // StringType
675          return value;
676        case 116079: // url
677          this.url = castToUrl(value); // UrlType
678          return value;
679        default: return super.setProperty(hash, name, value);
680        }
681
682      }
683
684      @Override
685      public Base setProperty(String name, Base value) throws FHIRException {
686        if (name.equals("description")) {
687          this.description = castToString(value); // StringType
688        } else if (name.equals("url")) {
689          this.url = castToUrl(value); // UrlType
690        } else
691          return super.setProperty(name, value);
692        return value;
693      }
694
695      @Override
696      public Base makeProperty(int hash, String name) throws FHIRException {
697        switch (hash) {
698        case -1724546052:  return getDescriptionElement();
699        case 116079:  return getUrlElement();
700        default: return super.makeProperty(hash, name);
701        }
702
703      }
704
705      @Override
706      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
707        switch (hash) {
708        case -1724546052: /*description*/ return new String[] {"string"};
709        case 116079: /*url*/ return new String[] {"url"};
710        default: return super.getTypesForProperty(hash, name);
711        }
712
713      }
714
715      @Override
716      public Base addChild(String name) throws FHIRException {
717        if (name.equals("description")) {
718          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.description");
719        }
720        else if (name.equals("url")) {
721          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.url");
722        }
723        else
724          return super.addChild(name);
725      }
726
727      public TerminologyCapabilitiesImplementationComponent copy() {
728        TerminologyCapabilitiesImplementationComponent dst = new TerminologyCapabilitiesImplementationComponent();
729        copyValues(dst);
730        return dst;
731      }
732
733      public void copyValues(TerminologyCapabilitiesImplementationComponent dst) {
734        super.copyValues(dst);
735        dst.description = description == null ? null : description.copy();
736        dst.url = url == null ? null : url.copy();
737      }
738
739      @Override
740      public boolean equalsDeep(Base other_) {
741        if (!super.equalsDeep(other_))
742          return false;
743        if (!(other_ instanceof TerminologyCapabilitiesImplementationComponent))
744          return false;
745        TerminologyCapabilitiesImplementationComponent o = (TerminologyCapabilitiesImplementationComponent) other_;
746        return compareDeep(description, o.description, true) && compareDeep(url, o.url, true);
747      }
748
749      @Override
750      public boolean equalsShallow(Base other_) {
751        if (!super.equalsShallow(other_))
752          return false;
753        if (!(other_ instanceof TerminologyCapabilitiesImplementationComponent))
754          return false;
755        TerminologyCapabilitiesImplementationComponent o = (TerminologyCapabilitiesImplementationComponent) other_;
756        return compareValues(description, o.description, true) && compareValues(url, o.url, true);
757      }
758
759      public boolean isEmpty() {
760        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(description, url);
761      }
762
763  public String fhirType() {
764    return "TerminologyCapabilities.implementation";
765
766  }
767
768  }
769
770    @Block()
771    public static class TerminologyCapabilitiesCodeSystemComponent extends BackboneElement implements IBaseBackboneElement {
772        /**
773         * URI for the Code System.
774         */
775        @Child(name = "uri", type = {CanonicalType.class}, order=1, min=0, max=1, modifier=false, summary=false)
776        @Description(shortDefinition="URI for the Code System", formalDefinition="URI for the Code System." )
777        protected CanonicalType uri;
778
779        /**
780         * For the code system, a list of versions that are supported by the server.
781         */
782        @Child(name = "version", type = {}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
783        @Description(shortDefinition="Version of Code System supported", formalDefinition="For the code system, a list of versions that are supported by the server." )
784        protected List<TerminologyCapabilitiesCodeSystemVersionComponent> version;
785
786        /**
787         * True if subsumption is supported for this version of the code system.
788         */
789        @Child(name = "subsumption", type = {BooleanType.class}, order=3, min=0, max=1, modifier=false, summary=false)
790        @Description(shortDefinition="Whether subsumption is supported", formalDefinition="True if subsumption is supported for this version of the code system." )
791        protected BooleanType subsumption;
792
793        private static final long serialVersionUID = -1593622817L;
794
795    /**
796     * Constructor
797     */
798      public TerminologyCapabilitiesCodeSystemComponent() {
799        super();
800      }
801
802        /**
803         * @return {@link #uri} (URI for the Code System.). This is the underlying object with id, value and extensions. The accessor "getUri" gives direct access to the value
804         */
805        public CanonicalType getUriElement() { 
806          if (this.uri == null)
807            if (Configuration.errorOnAutoCreate())
808              throw new Error("Attempt to auto-create TerminologyCapabilitiesCodeSystemComponent.uri");
809            else if (Configuration.doAutoCreate())
810              this.uri = new CanonicalType(); // bb
811          return this.uri;
812        }
813
814        public boolean hasUriElement() { 
815          return this.uri != null && !this.uri.isEmpty();
816        }
817
818        public boolean hasUri() { 
819          return this.uri != null && !this.uri.isEmpty();
820        }
821
822        /**
823         * @param value {@link #uri} (URI for the Code System.). This is the underlying object with id, value and extensions. The accessor "getUri" gives direct access to the value
824         */
825        public TerminologyCapabilitiesCodeSystemComponent setUriElement(CanonicalType value) { 
826          this.uri = value;
827          return this;
828        }
829
830        /**
831         * @return URI for the Code System.
832         */
833        public String getUri() { 
834          return this.uri == null ? null : this.uri.getValue();
835        }
836
837        /**
838         * @param value URI for the Code System.
839         */
840        public TerminologyCapabilitiesCodeSystemComponent setUri(String value) { 
841          if (Utilities.noString(value))
842            this.uri = null;
843          else {
844            if (this.uri == null)
845              this.uri = new CanonicalType();
846            this.uri.setValue(value);
847          }
848          return this;
849        }
850
851        /**
852         * @return {@link #version} (For the code system, a list of versions that are supported by the server.)
853         */
854        public List<TerminologyCapabilitiesCodeSystemVersionComponent> getVersion() { 
855          if (this.version == null)
856            this.version = new ArrayList<TerminologyCapabilitiesCodeSystemVersionComponent>();
857          return this.version;
858        }
859
860        /**
861         * @return Returns a reference to <code>this</code> for easy method chaining
862         */
863        public TerminologyCapabilitiesCodeSystemComponent setVersion(List<TerminologyCapabilitiesCodeSystemVersionComponent> theVersion) { 
864          this.version = theVersion;
865          return this;
866        }
867
868        public boolean hasVersion() { 
869          if (this.version == null)
870            return false;
871          for (TerminologyCapabilitiesCodeSystemVersionComponent item : this.version)
872            if (!item.isEmpty())
873              return true;
874          return false;
875        }
876
877        public TerminologyCapabilitiesCodeSystemVersionComponent addVersion() { //3
878          TerminologyCapabilitiesCodeSystemVersionComponent t = new TerminologyCapabilitiesCodeSystemVersionComponent();
879          if (this.version == null)
880            this.version = new ArrayList<TerminologyCapabilitiesCodeSystemVersionComponent>();
881          this.version.add(t);
882          return t;
883        }
884
885        public TerminologyCapabilitiesCodeSystemComponent addVersion(TerminologyCapabilitiesCodeSystemVersionComponent t) { //3
886          if (t == null)
887            return this;
888          if (this.version == null)
889            this.version = new ArrayList<TerminologyCapabilitiesCodeSystemVersionComponent>();
890          this.version.add(t);
891          return this;
892        }
893
894        /**
895         * @return The first repetition of repeating field {@link #version}, creating it if it does not already exist
896         */
897        public TerminologyCapabilitiesCodeSystemVersionComponent getVersionFirstRep() { 
898          if (getVersion().isEmpty()) {
899            addVersion();
900          }
901          return getVersion().get(0);
902        }
903
904        /**
905         * @return {@link #subsumption} (True if subsumption is supported for this version of the code system.). This is the underlying object with id, value and extensions. The accessor "getSubsumption" gives direct access to the value
906         */
907        public BooleanType getSubsumptionElement() { 
908          if (this.subsumption == null)
909            if (Configuration.errorOnAutoCreate())
910              throw new Error("Attempt to auto-create TerminologyCapabilitiesCodeSystemComponent.subsumption");
911            else if (Configuration.doAutoCreate())
912              this.subsumption = new BooleanType(); // bb
913          return this.subsumption;
914        }
915
916        public boolean hasSubsumptionElement() { 
917          return this.subsumption != null && !this.subsumption.isEmpty();
918        }
919
920        public boolean hasSubsumption() { 
921          return this.subsumption != null && !this.subsumption.isEmpty();
922        }
923
924        /**
925         * @param value {@link #subsumption} (True if subsumption is supported for this version of the code system.). This is the underlying object with id, value and extensions. The accessor "getSubsumption" gives direct access to the value
926         */
927        public TerminologyCapabilitiesCodeSystemComponent setSubsumptionElement(BooleanType value) { 
928          this.subsumption = value;
929          return this;
930        }
931
932        /**
933         * @return True if subsumption is supported for this version of the code system.
934         */
935        public boolean getSubsumption() { 
936          return this.subsumption == null || this.subsumption.isEmpty() ? false : this.subsumption.getValue();
937        }
938
939        /**
940         * @param value True if subsumption is supported for this version of the code system.
941         */
942        public TerminologyCapabilitiesCodeSystemComponent setSubsumption(boolean value) { 
943            if (this.subsumption == null)
944              this.subsumption = new BooleanType();
945            this.subsumption.setValue(value);
946          return this;
947        }
948
949        protected void listChildren(List<Property> children) {
950          super.listChildren(children);
951          children.add(new Property("uri", "canonical(CodeSystem)", "URI for the Code System.", 0, 1, uri));
952          children.add(new Property("version", "", "For the code system, a list of versions that are supported by the server.", 0, java.lang.Integer.MAX_VALUE, version));
953          children.add(new Property("subsumption", "boolean", "True if subsumption is supported for this version of the code system.", 0, 1, subsumption));
954        }
955
956        @Override
957        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
958          switch (_hash) {
959          case 116076: /*uri*/  return new Property("uri", "canonical(CodeSystem)", "URI for the Code System.", 0, 1, uri);
960          case 351608024: /*version*/  return new Property("version", "", "For the code system, a list of versions that are supported by the server.", 0, java.lang.Integer.MAX_VALUE, version);
961          case -499084711: /*subsumption*/  return new Property("subsumption", "boolean", "True if subsumption is supported for this version of the code system.", 0, 1, subsumption);
962          default: return super.getNamedProperty(_hash, _name, _checkValid);
963          }
964
965        }
966
967      @Override
968      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
969        switch (hash) {
970        case 116076: /*uri*/ return this.uri == null ? new Base[0] : new Base[] {this.uri}; // CanonicalType
971        case 351608024: /*version*/ return this.version == null ? new Base[0] : this.version.toArray(new Base[this.version.size()]); // TerminologyCapabilitiesCodeSystemVersionComponent
972        case -499084711: /*subsumption*/ return this.subsumption == null ? new Base[0] : new Base[] {this.subsumption}; // BooleanType
973        default: return super.getProperty(hash, name, checkValid);
974        }
975
976      }
977
978      @Override
979      public Base setProperty(int hash, String name, Base value) throws FHIRException {
980        switch (hash) {
981        case 116076: // uri
982          this.uri = castToCanonical(value); // CanonicalType
983          return value;
984        case 351608024: // version
985          this.getVersion().add((TerminologyCapabilitiesCodeSystemVersionComponent) value); // TerminologyCapabilitiesCodeSystemVersionComponent
986          return value;
987        case -499084711: // subsumption
988          this.subsumption = castToBoolean(value); // BooleanType
989          return value;
990        default: return super.setProperty(hash, name, value);
991        }
992
993      }
994
995      @Override
996      public Base setProperty(String name, Base value) throws FHIRException {
997        if (name.equals("uri")) {
998          this.uri = castToCanonical(value); // CanonicalType
999        } else if (name.equals("version")) {
1000          this.getVersion().add((TerminologyCapabilitiesCodeSystemVersionComponent) value);
1001        } else if (name.equals("subsumption")) {
1002          this.subsumption = castToBoolean(value); // BooleanType
1003        } else
1004          return super.setProperty(name, value);
1005        return value;
1006      }
1007
1008      @Override
1009      public Base makeProperty(int hash, String name) throws FHIRException {
1010        switch (hash) {
1011        case 116076:  return getUriElement();
1012        case 351608024:  return addVersion(); 
1013        case -499084711:  return getSubsumptionElement();
1014        default: return super.makeProperty(hash, name);
1015        }
1016
1017      }
1018
1019      @Override
1020      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1021        switch (hash) {
1022        case 116076: /*uri*/ return new String[] {"canonical"};
1023        case 351608024: /*version*/ return new String[] {};
1024        case -499084711: /*subsumption*/ return new String[] {"boolean"};
1025        default: return super.getTypesForProperty(hash, name);
1026        }
1027
1028      }
1029
1030      @Override
1031      public Base addChild(String name) throws FHIRException {
1032        if (name.equals("uri")) {
1033          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.uri");
1034        }
1035        else if (name.equals("version")) {
1036          return addVersion();
1037        }
1038        else if (name.equals("subsumption")) {
1039          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.subsumption");
1040        }
1041        else
1042          return super.addChild(name);
1043      }
1044
1045      public TerminologyCapabilitiesCodeSystemComponent copy() {
1046        TerminologyCapabilitiesCodeSystemComponent dst = new TerminologyCapabilitiesCodeSystemComponent();
1047        copyValues(dst);
1048        return dst;
1049      }
1050
1051      public void copyValues(TerminologyCapabilitiesCodeSystemComponent dst) {
1052        super.copyValues(dst);
1053        dst.uri = uri == null ? null : uri.copy();
1054        if (version != null) {
1055          dst.version = new ArrayList<TerminologyCapabilitiesCodeSystemVersionComponent>();
1056          for (TerminologyCapabilitiesCodeSystemVersionComponent i : version)
1057            dst.version.add(i.copy());
1058        };
1059        dst.subsumption = subsumption == null ? null : subsumption.copy();
1060      }
1061
1062      @Override
1063      public boolean equalsDeep(Base other_) {
1064        if (!super.equalsDeep(other_))
1065          return false;
1066        if (!(other_ instanceof TerminologyCapabilitiesCodeSystemComponent))
1067          return false;
1068        TerminologyCapabilitiesCodeSystemComponent o = (TerminologyCapabilitiesCodeSystemComponent) other_;
1069        return compareDeep(uri, o.uri, true) && compareDeep(version, o.version, true) && compareDeep(subsumption, o.subsumption, true)
1070          ;
1071      }
1072
1073      @Override
1074      public boolean equalsShallow(Base other_) {
1075        if (!super.equalsShallow(other_))
1076          return false;
1077        if (!(other_ instanceof TerminologyCapabilitiesCodeSystemComponent))
1078          return false;
1079        TerminologyCapabilitiesCodeSystemComponent o = (TerminologyCapabilitiesCodeSystemComponent) other_;
1080        return compareValues(subsumption, o.subsumption, true);
1081      }
1082
1083      public boolean isEmpty() {
1084        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(uri, version, subsumption
1085          );
1086      }
1087
1088  public String fhirType() {
1089    return "TerminologyCapabilities.codeSystem";
1090
1091  }
1092
1093  }
1094
1095    @Block()
1096    public static class TerminologyCapabilitiesCodeSystemVersionComponent extends BackboneElement implements IBaseBackboneElement {
1097        /**
1098         * For version-less code systems, there should be a single version with no identifier.
1099         */
1100        @Child(name = "code", type = {StringType.class}, order=1, min=0, max=1, modifier=false, summary=true)
1101        @Description(shortDefinition="Version identifier for this version", formalDefinition="For version-less code systems, there should be a single version with no identifier." )
1102        protected StringType code;
1103
1104        /**
1105         * If this is the default version for this code system.
1106         */
1107        @Child(name = "isDefault", type = {BooleanType.class}, order=2, min=0, max=1, modifier=false, summary=true)
1108        @Description(shortDefinition="If this is the default version for this code system", formalDefinition="If this is the default version for this code system." )
1109        protected BooleanType isDefault;
1110
1111        /**
1112         * If the compositional grammar defined by the code system is supported.
1113         */
1114        @Child(name = "compositional", type = {BooleanType.class}, order=3, min=0, max=1, modifier=false, summary=false)
1115        @Description(shortDefinition="If compositional grammar is supported", formalDefinition="If the compositional grammar defined by the code system is supported." )
1116        protected BooleanType compositional;
1117
1118        /**
1119         * Language Displays supported.
1120         */
1121        @Child(name = "language", type = {CodeType.class}, order=4, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1122        @Description(shortDefinition="Language Displays supported", formalDefinition="Language Displays supported." )
1123        protected List<CodeType> language;
1124
1125        /**
1126         * Filter Properties supported.
1127         */
1128        @Child(name = "filter", type = {}, order=5, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1129        @Description(shortDefinition="Filter Properties supported", formalDefinition="Filter Properties supported." )
1130        protected List<TerminologyCapabilitiesCodeSystemVersionFilterComponent> filter;
1131
1132        /**
1133         * Properties supported for $lookup.
1134         */
1135        @Child(name = "property", type = {CodeType.class}, order=6, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1136        @Description(shortDefinition="Properties supported for $lookup", formalDefinition="Properties supported for $lookup." )
1137        protected List<CodeType> property;
1138
1139        private static final long serialVersionUID = 1857571343L;
1140
1141    /**
1142     * Constructor
1143     */
1144      public TerminologyCapabilitiesCodeSystemVersionComponent() {
1145        super();
1146      }
1147
1148        /**
1149         * @return {@link #code} (For version-less code systems, there should be a single version with no identifier.). This is the underlying object with id, value and extensions. The accessor "getCode" gives direct access to the value
1150         */
1151        public StringType getCodeElement() { 
1152          if (this.code == null)
1153            if (Configuration.errorOnAutoCreate())
1154              throw new Error("Attempt to auto-create TerminologyCapabilitiesCodeSystemVersionComponent.code");
1155            else if (Configuration.doAutoCreate())
1156              this.code = new StringType(); // bb
1157          return this.code;
1158        }
1159
1160        public boolean hasCodeElement() { 
1161          return this.code != null && !this.code.isEmpty();
1162        }
1163
1164        public boolean hasCode() { 
1165          return this.code != null && !this.code.isEmpty();
1166        }
1167
1168        /**
1169         * @param value {@link #code} (For version-less code systems, there should be a single version with no identifier.). This is the underlying object with id, value and extensions. The accessor "getCode" gives direct access to the value
1170         */
1171        public TerminologyCapabilitiesCodeSystemVersionComponent setCodeElement(StringType value) { 
1172          this.code = value;
1173          return this;
1174        }
1175
1176        /**
1177         * @return For version-less code systems, there should be a single version with no identifier.
1178         */
1179        public String getCode() { 
1180          return this.code == null ? null : this.code.getValue();
1181        }
1182
1183        /**
1184         * @param value For version-less code systems, there should be a single version with no identifier.
1185         */
1186        public TerminologyCapabilitiesCodeSystemVersionComponent setCode(String value) { 
1187          if (Utilities.noString(value))
1188            this.code = null;
1189          else {
1190            if (this.code == null)
1191              this.code = new StringType();
1192            this.code.setValue(value);
1193          }
1194          return this;
1195        }
1196
1197        /**
1198         * @return {@link #isDefault} (If this is the default version for this code system.). This is the underlying object with id, value and extensions. The accessor "getIsDefault" gives direct access to the value
1199         */
1200        public BooleanType getIsDefaultElement() { 
1201          if (this.isDefault == null)
1202            if (Configuration.errorOnAutoCreate())
1203              throw new Error("Attempt to auto-create TerminologyCapabilitiesCodeSystemVersionComponent.isDefault");
1204            else if (Configuration.doAutoCreate())
1205              this.isDefault = new BooleanType(); // bb
1206          return this.isDefault;
1207        }
1208
1209        public boolean hasIsDefaultElement() { 
1210          return this.isDefault != null && !this.isDefault.isEmpty();
1211        }
1212
1213        public boolean hasIsDefault() { 
1214          return this.isDefault != null && !this.isDefault.isEmpty();
1215        }
1216
1217        /**
1218         * @param value {@link #isDefault} (If this is the default version for this code system.). This is the underlying object with id, value and extensions. The accessor "getIsDefault" gives direct access to the value
1219         */
1220        public TerminologyCapabilitiesCodeSystemVersionComponent setIsDefaultElement(BooleanType value) { 
1221          this.isDefault = value;
1222          return this;
1223        }
1224
1225        /**
1226         * @return If this is the default version for this code system.
1227         */
1228        public boolean getIsDefault() { 
1229          return this.isDefault == null || this.isDefault.isEmpty() ? false : this.isDefault.getValue();
1230        }
1231
1232        /**
1233         * @param value If this is the default version for this code system.
1234         */
1235        public TerminologyCapabilitiesCodeSystemVersionComponent setIsDefault(boolean value) { 
1236            if (this.isDefault == null)
1237              this.isDefault = new BooleanType();
1238            this.isDefault.setValue(value);
1239          return this;
1240        }
1241
1242        /**
1243         * @return {@link #compositional} (If the compositional grammar defined by the code system is supported.). This is the underlying object with id, value and extensions. The accessor "getCompositional" gives direct access to the value
1244         */
1245        public BooleanType getCompositionalElement() { 
1246          if (this.compositional == null)
1247            if (Configuration.errorOnAutoCreate())
1248              throw new Error("Attempt to auto-create TerminologyCapabilitiesCodeSystemVersionComponent.compositional");
1249            else if (Configuration.doAutoCreate())
1250              this.compositional = new BooleanType(); // bb
1251          return this.compositional;
1252        }
1253
1254        public boolean hasCompositionalElement() { 
1255          return this.compositional != null && !this.compositional.isEmpty();
1256        }
1257
1258        public boolean hasCompositional() { 
1259          return this.compositional != null && !this.compositional.isEmpty();
1260        }
1261
1262        /**
1263         * @param value {@link #compositional} (If the compositional grammar defined by the code system is supported.). This is the underlying object with id, value and extensions. The accessor "getCompositional" gives direct access to the value
1264         */
1265        public TerminologyCapabilitiesCodeSystemVersionComponent setCompositionalElement(BooleanType value) { 
1266          this.compositional = value;
1267          return this;
1268        }
1269
1270        /**
1271         * @return If the compositional grammar defined by the code system is supported.
1272         */
1273        public boolean getCompositional() { 
1274          return this.compositional == null || this.compositional.isEmpty() ? false : this.compositional.getValue();
1275        }
1276
1277        /**
1278         * @param value If the compositional grammar defined by the code system is supported.
1279         */
1280        public TerminologyCapabilitiesCodeSystemVersionComponent setCompositional(boolean value) { 
1281            if (this.compositional == null)
1282              this.compositional = new BooleanType();
1283            this.compositional.setValue(value);
1284          return this;
1285        }
1286
1287        /**
1288         * @return {@link #language} (Language Displays supported.)
1289         */
1290        public List<CodeType> getLanguage() { 
1291          if (this.language == null)
1292            this.language = new ArrayList<CodeType>();
1293          return this.language;
1294        }
1295
1296        /**
1297         * @return Returns a reference to <code>this</code> for easy method chaining
1298         */
1299        public TerminologyCapabilitiesCodeSystemVersionComponent setLanguage(List<CodeType> theLanguage) { 
1300          this.language = theLanguage;
1301          return this;
1302        }
1303
1304        public boolean hasLanguage() { 
1305          if (this.language == null)
1306            return false;
1307          for (CodeType item : this.language)
1308            if (!item.isEmpty())
1309              return true;
1310          return false;
1311        }
1312
1313        /**
1314         * @return {@link #language} (Language Displays supported.)
1315         */
1316        public CodeType addLanguageElement() {//2 
1317          CodeType t = new CodeType();
1318          if (this.language == null)
1319            this.language = new ArrayList<CodeType>();
1320          this.language.add(t);
1321          return t;
1322        }
1323
1324        /**
1325         * @param value {@link #language} (Language Displays supported.)
1326         */
1327        public TerminologyCapabilitiesCodeSystemVersionComponent addLanguage(String value) { //1
1328          CodeType t = new CodeType();
1329          t.setValue(value);
1330          if (this.language == null)
1331            this.language = new ArrayList<CodeType>();
1332          this.language.add(t);
1333          return this;
1334        }
1335
1336        /**
1337         * @param value {@link #language} (Language Displays supported.)
1338         */
1339        public boolean hasLanguage(String value) { 
1340          if (this.language == null)
1341            return false;
1342          for (CodeType v : this.language)
1343            if (v.getValue().equals(value)) // code
1344              return true;
1345          return false;
1346        }
1347
1348        /**
1349         * @return {@link #filter} (Filter Properties supported.)
1350         */
1351        public List<TerminologyCapabilitiesCodeSystemVersionFilterComponent> getFilter() { 
1352          if (this.filter == null)
1353            this.filter = new ArrayList<TerminologyCapabilitiesCodeSystemVersionFilterComponent>();
1354          return this.filter;
1355        }
1356
1357        /**
1358         * @return Returns a reference to <code>this</code> for easy method chaining
1359         */
1360        public TerminologyCapabilitiesCodeSystemVersionComponent setFilter(List<TerminologyCapabilitiesCodeSystemVersionFilterComponent> theFilter) { 
1361          this.filter = theFilter;
1362          return this;
1363        }
1364
1365        public boolean hasFilter() { 
1366          if (this.filter == null)
1367            return false;
1368          for (TerminologyCapabilitiesCodeSystemVersionFilterComponent item : this.filter)
1369            if (!item.isEmpty())
1370              return true;
1371          return false;
1372        }
1373
1374        public TerminologyCapabilitiesCodeSystemVersionFilterComponent addFilter() { //3
1375          TerminologyCapabilitiesCodeSystemVersionFilterComponent t = new TerminologyCapabilitiesCodeSystemVersionFilterComponent();
1376          if (this.filter == null)
1377            this.filter = new ArrayList<TerminologyCapabilitiesCodeSystemVersionFilterComponent>();
1378          this.filter.add(t);
1379          return t;
1380        }
1381
1382        public TerminologyCapabilitiesCodeSystemVersionComponent addFilter(TerminologyCapabilitiesCodeSystemVersionFilterComponent t) { //3
1383          if (t == null)
1384            return this;
1385          if (this.filter == null)
1386            this.filter = new ArrayList<TerminologyCapabilitiesCodeSystemVersionFilterComponent>();
1387          this.filter.add(t);
1388          return this;
1389        }
1390
1391        /**
1392         * @return The first repetition of repeating field {@link #filter}, creating it if it does not already exist
1393         */
1394        public TerminologyCapabilitiesCodeSystemVersionFilterComponent getFilterFirstRep() { 
1395          if (getFilter().isEmpty()) {
1396            addFilter();
1397          }
1398          return getFilter().get(0);
1399        }
1400
1401        /**
1402         * @return {@link #property} (Properties supported for $lookup.)
1403         */
1404        public List<CodeType> getProperty() { 
1405          if (this.property == null)
1406            this.property = new ArrayList<CodeType>();
1407          return this.property;
1408        }
1409
1410        /**
1411         * @return Returns a reference to <code>this</code> for easy method chaining
1412         */
1413        public TerminologyCapabilitiesCodeSystemVersionComponent setProperty(List<CodeType> theProperty) { 
1414          this.property = theProperty;
1415          return this;
1416        }
1417
1418        public boolean hasProperty() { 
1419          if (this.property == null)
1420            return false;
1421          for (CodeType item : this.property)
1422            if (!item.isEmpty())
1423              return true;
1424          return false;
1425        }
1426
1427        /**
1428         * @return {@link #property} (Properties supported for $lookup.)
1429         */
1430        public CodeType addPropertyElement() {//2 
1431          CodeType t = new CodeType();
1432          if (this.property == null)
1433            this.property = new ArrayList<CodeType>();
1434          this.property.add(t);
1435          return t;
1436        }
1437
1438        /**
1439         * @param value {@link #property} (Properties supported for $lookup.)
1440         */
1441        public TerminologyCapabilitiesCodeSystemVersionComponent addProperty(String value) { //1
1442          CodeType t = new CodeType();
1443          t.setValue(value);
1444          if (this.property == null)
1445            this.property = new ArrayList<CodeType>();
1446          this.property.add(t);
1447          return this;
1448        }
1449
1450        /**
1451         * @param value {@link #property} (Properties supported for $lookup.)
1452         */
1453        public boolean hasProperty(String value) { 
1454          if (this.property == null)
1455            return false;
1456          for (CodeType v : this.property)
1457            if (v.getValue().equals(value)) // code
1458              return true;
1459          return false;
1460        }
1461
1462        protected void listChildren(List<Property> children) {
1463          super.listChildren(children);
1464          children.add(new Property("code", "string", "For version-less code systems, there should be a single version with no identifier.", 0, 1, code));
1465          children.add(new Property("isDefault", "boolean", "If this is the default version for this code system.", 0, 1, isDefault));
1466          children.add(new Property("compositional", "boolean", "If the compositional grammar defined by the code system is supported.", 0, 1, compositional));
1467          children.add(new Property("language", "code", "Language Displays supported.", 0, java.lang.Integer.MAX_VALUE, language));
1468          children.add(new Property("filter", "", "Filter Properties supported.", 0, java.lang.Integer.MAX_VALUE, filter));
1469          children.add(new Property("property", "code", "Properties supported for $lookup.", 0, java.lang.Integer.MAX_VALUE, property));
1470        }
1471
1472        @Override
1473        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1474          switch (_hash) {
1475          case 3059181: /*code*/  return new Property("code", "string", "For version-less code systems, there should be a single version with no identifier.", 0, 1, code);
1476          case 965025207: /*isDefault*/  return new Property("isDefault", "boolean", "If this is the default version for this code system.", 0, 1, isDefault);
1477          case 1248023381: /*compositional*/  return new Property("compositional", "boolean", "If the compositional grammar defined by the code system is supported.", 0, 1, compositional);
1478          case -1613589672: /*language*/  return new Property("language", "code", "Language Displays supported.", 0, java.lang.Integer.MAX_VALUE, language);
1479          case -1274492040: /*filter*/  return new Property("filter", "", "Filter Properties supported.", 0, java.lang.Integer.MAX_VALUE, filter);
1480          case -993141291: /*property*/  return new Property("property", "code", "Properties supported for $lookup.", 0, java.lang.Integer.MAX_VALUE, property);
1481          default: return super.getNamedProperty(_hash, _name, _checkValid);
1482          }
1483
1484        }
1485
1486      @Override
1487      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1488        switch (hash) {
1489        case 3059181: /*code*/ return this.code == null ? new Base[0] : new Base[] {this.code}; // StringType
1490        case 965025207: /*isDefault*/ return this.isDefault == null ? new Base[0] : new Base[] {this.isDefault}; // BooleanType
1491        case 1248023381: /*compositional*/ return this.compositional == null ? new Base[0] : new Base[] {this.compositional}; // BooleanType
1492        case -1613589672: /*language*/ return this.language == null ? new Base[0] : this.language.toArray(new Base[this.language.size()]); // CodeType
1493        case -1274492040: /*filter*/ return this.filter == null ? new Base[0] : this.filter.toArray(new Base[this.filter.size()]); // TerminologyCapabilitiesCodeSystemVersionFilterComponent
1494        case -993141291: /*property*/ return this.property == null ? new Base[0] : this.property.toArray(new Base[this.property.size()]); // CodeType
1495        default: return super.getProperty(hash, name, checkValid);
1496        }
1497
1498      }
1499
1500      @Override
1501      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1502        switch (hash) {
1503        case 3059181: // code
1504          this.code = castToString(value); // StringType
1505          return value;
1506        case 965025207: // isDefault
1507          this.isDefault = castToBoolean(value); // BooleanType
1508          return value;
1509        case 1248023381: // compositional
1510          this.compositional = castToBoolean(value); // BooleanType
1511          return value;
1512        case -1613589672: // language
1513          this.getLanguage().add(castToCode(value)); // CodeType
1514          return value;
1515        case -1274492040: // filter
1516          this.getFilter().add((TerminologyCapabilitiesCodeSystemVersionFilterComponent) value); // TerminologyCapabilitiesCodeSystemVersionFilterComponent
1517          return value;
1518        case -993141291: // property
1519          this.getProperty().add(castToCode(value)); // CodeType
1520          return value;
1521        default: return super.setProperty(hash, name, value);
1522        }
1523
1524      }
1525
1526      @Override
1527      public Base setProperty(String name, Base value) throws FHIRException {
1528        if (name.equals("code")) {
1529          this.code = castToString(value); // StringType
1530        } else if (name.equals("isDefault")) {
1531          this.isDefault = castToBoolean(value); // BooleanType
1532        } else if (name.equals("compositional")) {
1533          this.compositional = castToBoolean(value); // BooleanType
1534        } else if (name.equals("language")) {
1535          this.getLanguage().add(castToCode(value));
1536        } else if (name.equals("filter")) {
1537          this.getFilter().add((TerminologyCapabilitiesCodeSystemVersionFilterComponent) value);
1538        } else if (name.equals("property")) {
1539          this.getProperty().add(castToCode(value));
1540        } else
1541          return super.setProperty(name, value);
1542        return value;
1543      }
1544
1545      @Override
1546      public Base makeProperty(int hash, String name) throws FHIRException {
1547        switch (hash) {
1548        case 3059181:  return getCodeElement();
1549        case 965025207:  return getIsDefaultElement();
1550        case 1248023381:  return getCompositionalElement();
1551        case -1613589672:  return addLanguageElement();
1552        case -1274492040:  return addFilter(); 
1553        case -993141291:  return addPropertyElement();
1554        default: return super.makeProperty(hash, name);
1555        }
1556
1557      }
1558
1559      @Override
1560      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1561        switch (hash) {
1562        case 3059181: /*code*/ return new String[] {"string"};
1563        case 965025207: /*isDefault*/ return new String[] {"boolean"};
1564        case 1248023381: /*compositional*/ return new String[] {"boolean"};
1565        case -1613589672: /*language*/ return new String[] {"code"};
1566        case -1274492040: /*filter*/ return new String[] {};
1567        case -993141291: /*property*/ return new String[] {"code"};
1568        default: return super.getTypesForProperty(hash, name);
1569        }
1570
1571      }
1572
1573      @Override
1574      public Base addChild(String name) throws FHIRException {
1575        if (name.equals("code")) {
1576          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.code");
1577        }
1578        else if (name.equals("isDefault")) {
1579          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.isDefault");
1580        }
1581        else if (name.equals("compositional")) {
1582          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.compositional");
1583        }
1584        else if (name.equals("language")) {
1585          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.language");
1586        }
1587        else if (name.equals("filter")) {
1588          return addFilter();
1589        }
1590        else if (name.equals("property")) {
1591          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.property");
1592        }
1593        else
1594          return super.addChild(name);
1595      }
1596
1597      public TerminologyCapabilitiesCodeSystemVersionComponent copy() {
1598        TerminologyCapabilitiesCodeSystemVersionComponent dst = new TerminologyCapabilitiesCodeSystemVersionComponent();
1599        copyValues(dst);
1600        return dst;
1601      }
1602
1603      public void copyValues(TerminologyCapabilitiesCodeSystemVersionComponent dst) {
1604        super.copyValues(dst);
1605        dst.code = code == null ? null : code.copy();
1606        dst.isDefault = isDefault == null ? null : isDefault.copy();
1607        dst.compositional = compositional == null ? null : compositional.copy();
1608        if (language != null) {
1609          dst.language = new ArrayList<CodeType>();
1610          for (CodeType i : language)
1611            dst.language.add(i.copy());
1612        };
1613        if (filter != null) {
1614          dst.filter = new ArrayList<TerminologyCapabilitiesCodeSystemVersionFilterComponent>();
1615          for (TerminologyCapabilitiesCodeSystemVersionFilterComponent i : filter)
1616            dst.filter.add(i.copy());
1617        };
1618        if (property != null) {
1619          dst.property = new ArrayList<CodeType>();
1620          for (CodeType i : property)
1621            dst.property.add(i.copy());
1622        };
1623      }
1624
1625      @Override
1626      public boolean equalsDeep(Base other_) {
1627        if (!super.equalsDeep(other_))
1628          return false;
1629        if (!(other_ instanceof TerminologyCapabilitiesCodeSystemVersionComponent))
1630          return false;
1631        TerminologyCapabilitiesCodeSystemVersionComponent o = (TerminologyCapabilitiesCodeSystemVersionComponent) other_;
1632        return compareDeep(code, o.code, true) && compareDeep(isDefault, o.isDefault, true) && compareDeep(compositional, o.compositional, true)
1633           && compareDeep(language, o.language, true) && compareDeep(filter, o.filter, true) && compareDeep(property, o.property, true)
1634          ;
1635      }
1636
1637      @Override
1638      public boolean equalsShallow(Base other_) {
1639        if (!super.equalsShallow(other_))
1640          return false;
1641        if (!(other_ instanceof TerminologyCapabilitiesCodeSystemVersionComponent))
1642          return false;
1643        TerminologyCapabilitiesCodeSystemVersionComponent o = (TerminologyCapabilitiesCodeSystemVersionComponent) other_;
1644        return compareValues(code, o.code, true) && compareValues(isDefault, o.isDefault, true) && compareValues(compositional, o.compositional, true)
1645           && compareValues(language, o.language, true) && compareValues(property, o.property, true);
1646      }
1647
1648      public boolean isEmpty() {
1649        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(code, isDefault, compositional
1650          , language, filter, property);
1651      }
1652
1653  public String fhirType() {
1654    return "TerminologyCapabilities.codeSystem.version";
1655
1656  }
1657
1658  }
1659
1660    @Block()
1661    public static class TerminologyCapabilitiesCodeSystemVersionFilterComponent extends BackboneElement implements IBaseBackboneElement {
1662        /**
1663         * Code of the property supported.
1664         */
1665        @Child(name = "code", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=false)
1666        @Description(shortDefinition="Code of the property supported", formalDefinition="Code of the property supported." )
1667        protected CodeType code;
1668
1669        /**
1670         * Operations supported for the property.
1671         */
1672        @Child(name = "op", type = {CodeType.class}, order=2, min=1, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1673        @Description(shortDefinition="Operations supported for the property", formalDefinition="Operations supported for the property." )
1674        protected List<CodeType> op;
1675
1676        private static final long serialVersionUID = -489160282L;
1677
1678    /**
1679     * Constructor
1680     */
1681      public TerminologyCapabilitiesCodeSystemVersionFilterComponent() {
1682        super();
1683      }
1684
1685    /**
1686     * Constructor
1687     */
1688      public TerminologyCapabilitiesCodeSystemVersionFilterComponent(CodeType code) {
1689        super();
1690        this.code = code;
1691      }
1692
1693        /**
1694         * @return {@link #code} (Code of the property supported.). This is the underlying object with id, value and extensions. The accessor "getCode" gives direct access to the value
1695         */
1696        public CodeType getCodeElement() { 
1697          if (this.code == null)
1698            if (Configuration.errorOnAutoCreate())
1699              throw new Error("Attempt to auto-create TerminologyCapabilitiesCodeSystemVersionFilterComponent.code");
1700            else if (Configuration.doAutoCreate())
1701              this.code = new CodeType(); // bb
1702          return this.code;
1703        }
1704
1705        public boolean hasCodeElement() { 
1706          return this.code != null && !this.code.isEmpty();
1707        }
1708
1709        public boolean hasCode() { 
1710          return this.code != null && !this.code.isEmpty();
1711        }
1712
1713        /**
1714         * @param value {@link #code} (Code of the property supported.). This is the underlying object with id, value and extensions. The accessor "getCode" gives direct access to the value
1715         */
1716        public TerminologyCapabilitiesCodeSystemVersionFilterComponent setCodeElement(CodeType value) { 
1717          this.code = value;
1718          return this;
1719        }
1720
1721        /**
1722         * @return Code of the property supported.
1723         */
1724        public String getCode() { 
1725          return this.code == null ? null : this.code.getValue();
1726        }
1727
1728        /**
1729         * @param value Code of the property supported.
1730         */
1731        public TerminologyCapabilitiesCodeSystemVersionFilterComponent setCode(String value) { 
1732            if (this.code == null)
1733              this.code = new CodeType();
1734            this.code.setValue(value);
1735          return this;
1736        }
1737
1738        /**
1739         * @return {@link #op} (Operations supported for the property.)
1740         */
1741        public List<CodeType> getOp() { 
1742          if (this.op == null)
1743            this.op = new ArrayList<CodeType>();
1744          return this.op;
1745        }
1746
1747        /**
1748         * @return Returns a reference to <code>this</code> for easy method chaining
1749         */
1750        public TerminologyCapabilitiesCodeSystemVersionFilterComponent setOp(List<CodeType> theOp) { 
1751          this.op = theOp;
1752          return this;
1753        }
1754
1755        public boolean hasOp() { 
1756          if (this.op == null)
1757            return false;
1758          for (CodeType item : this.op)
1759            if (!item.isEmpty())
1760              return true;
1761          return false;
1762        }
1763
1764        /**
1765         * @return {@link #op} (Operations supported for the property.)
1766         */
1767        public CodeType addOpElement() {//2 
1768          CodeType t = new CodeType();
1769          if (this.op == null)
1770            this.op = new ArrayList<CodeType>();
1771          this.op.add(t);
1772          return t;
1773        }
1774
1775        /**
1776         * @param value {@link #op} (Operations supported for the property.)
1777         */
1778        public TerminologyCapabilitiesCodeSystemVersionFilterComponent addOp(String value) { //1
1779          CodeType t = new CodeType();
1780          t.setValue(value);
1781          if (this.op == null)
1782            this.op = new ArrayList<CodeType>();
1783          this.op.add(t);
1784          return this;
1785        }
1786
1787        /**
1788         * @param value {@link #op} (Operations supported for the property.)
1789         */
1790        public boolean hasOp(String value) { 
1791          if (this.op == null)
1792            return false;
1793          for (CodeType v : this.op)
1794            if (v.getValue().equals(value)) // code
1795              return true;
1796          return false;
1797        }
1798
1799        protected void listChildren(List<Property> children) {
1800          super.listChildren(children);
1801          children.add(new Property("code", "code", "Code of the property supported.", 0, 1, code));
1802          children.add(new Property("op", "code", "Operations supported for the property.", 0, java.lang.Integer.MAX_VALUE, op));
1803        }
1804
1805        @Override
1806        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1807          switch (_hash) {
1808          case 3059181: /*code*/  return new Property("code", "code", "Code of the property supported.", 0, 1, code);
1809          case 3553: /*op*/  return new Property("op", "code", "Operations supported for the property.", 0, java.lang.Integer.MAX_VALUE, op);
1810          default: return super.getNamedProperty(_hash, _name, _checkValid);
1811          }
1812
1813        }
1814
1815      @Override
1816      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1817        switch (hash) {
1818        case 3059181: /*code*/ return this.code == null ? new Base[0] : new Base[] {this.code}; // CodeType
1819        case 3553: /*op*/ return this.op == null ? new Base[0] : this.op.toArray(new Base[this.op.size()]); // CodeType
1820        default: return super.getProperty(hash, name, checkValid);
1821        }
1822
1823      }
1824
1825      @Override
1826      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1827        switch (hash) {
1828        case 3059181: // code
1829          this.code = castToCode(value); // CodeType
1830          return value;
1831        case 3553: // op
1832          this.getOp().add(castToCode(value)); // CodeType
1833          return value;
1834        default: return super.setProperty(hash, name, value);
1835        }
1836
1837      }
1838
1839      @Override
1840      public Base setProperty(String name, Base value) throws FHIRException {
1841        if (name.equals("code")) {
1842          this.code = castToCode(value); // CodeType
1843        } else if (name.equals("op")) {
1844          this.getOp().add(castToCode(value));
1845        } else
1846          return super.setProperty(name, value);
1847        return value;
1848      }
1849
1850      @Override
1851      public Base makeProperty(int hash, String name) throws FHIRException {
1852        switch (hash) {
1853        case 3059181:  return getCodeElement();
1854        case 3553:  return addOpElement();
1855        default: return super.makeProperty(hash, name);
1856        }
1857
1858      }
1859
1860      @Override
1861      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1862        switch (hash) {
1863        case 3059181: /*code*/ return new String[] {"code"};
1864        case 3553: /*op*/ return new String[] {"code"};
1865        default: return super.getTypesForProperty(hash, name);
1866        }
1867
1868      }
1869
1870      @Override
1871      public Base addChild(String name) throws FHIRException {
1872        if (name.equals("code")) {
1873          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.code");
1874        }
1875        else if (name.equals("op")) {
1876          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.op");
1877        }
1878        else
1879          return super.addChild(name);
1880      }
1881
1882      public TerminologyCapabilitiesCodeSystemVersionFilterComponent copy() {
1883        TerminologyCapabilitiesCodeSystemVersionFilterComponent dst = new TerminologyCapabilitiesCodeSystemVersionFilterComponent();
1884        copyValues(dst);
1885        return dst;
1886      }
1887
1888      public void copyValues(TerminologyCapabilitiesCodeSystemVersionFilterComponent dst) {
1889        super.copyValues(dst);
1890        dst.code = code == null ? null : code.copy();
1891        if (op != null) {
1892          dst.op = new ArrayList<CodeType>();
1893          for (CodeType i : op)
1894            dst.op.add(i.copy());
1895        };
1896      }
1897
1898      @Override
1899      public boolean equalsDeep(Base other_) {
1900        if (!super.equalsDeep(other_))
1901          return false;
1902        if (!(other_ instanceof TerminologyCapabilitiesCodeSystemVersionFilterComponent))
1903          return false;
1904        TerminologyCapabilitiesCodeSystemVersionFilterComponent o = (TerminologyCapabilitiesCodeSystemVersionFilterComponent) other_;
1905        return compareDeep(code, o.code, true) && compareDeep(op, o.op, true);
1906      }
1907
1908      @Override
1909      public boolean equalsShallow(Base other_) {
1910        if (!super.equalsShallow(other_))
1911          return false;
1912        if (!(other_ instanceof TerminologyCapabilitiesCodeSystemVersionFilterComponent))
1913          return false;
1914        TerminologyCapabilitiesCodeSystemVersionFilterComponent o = (TerminologyCapabilitiesCodeSystemVersionFilterComponent) other_;
1915        return compareValues(code, o.code, true) && compareValues(op, o.op, true);
1916      }
1917
1918      public boolean isEmpty() {
1919        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(code, op);
1920      }
1921
1922  public String fhirType() {
1923    return "TerminologyCapabilities.codeSystem.version.filter";
1924
1925  }
1926
1927  }
1928
1929    @Block()
1930    public static class TerminologyCapabilitiesExpansionComponent extends BackboneElement implements IBaseBackboneElement {
1931        /**
1932         * Whether the server can return nested value sets.
1933         */
1934        @Child(name = "hierarchical", type = {BooleanType.class}, order=1, min=0, max=1, modifier=false, summary=false)
1935        @Description(shortDefinition="Whether the server can return nested value sets", formalDefinition="Whether the server can return nested value sets." )
1936        protected BooleanType hierarchical;
1937
1938        /**
1939         * Whether the server supports paging on expansion.
1940         */
1941        @Child(name = "paging", type = {BooleanType.class}, order=2, min=0, max=1, modifier=false, summary=false)
1942        @Description(shortDefinition="Whether the server supports paging on expansion", formalDefinition="Whether the server supports paging on expansion." )
1943        protected BooleanType paging;
1944
1945        /**
1946         * Allow request for incomplete expansions?
1947         */
1948        @Child(name = "incomplete", type = {BooleanType.class}, order=3, min=0, max=1, modifier=false, summary=false)
1949        @Description(shortDefinition="Allow request for incomplete expansions?", formalDefinition="Allow request for incomplete expansions?" )
1950        protected BooleanType incomplete;
1951
1952        /**
1953         * Supported expansion parameter.
1954         */
1955        @Child(name = "parameter", type = {}, order=4, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1956        @Description(shortDefinition="Supported expansion parameter", formalDefinition="Supported expansion parameter." )
1957        protected List<TerminologyCapabilitiesExpansionParameterComponent> parameter;
1958
1959        /**
1960         * Documentation about text searching works.
1961         */
1962        @Child(name = "textFilter", type = {MarkdownType.class}, order=5, min=0, max=1, modifier=false, summary=false)
1963        @Description(shortDefinition="Documentation about text searching works", formalDefinition="Documentation about text searching works." )
1964        protected MarkdownType textFilter;
1965
1966        private static final long serialVersionUID = -1011350616L;
1967
1968    /**
1969     * Constructor
1970     */
1971      public TerminologyCapabilitiesExpansionComponent() {
1972        super();
1973      }
1974
1975        /**
1976         * @return {@link #hierarchical} (Whether the server can return nested value sets.). This is the underlying object with id, value and extensions. The accessor "getHierarchical" gives direct access to the value
1977         */
1978        public BooleanType getHierarchicalElement() { 
1979          if (this.hierarchical == null)
1980            if (Configuration.errorOnAutoCreate())
1981              throw new Error("Attempt to auto-create TerminologyCapabilitiesExpansionComponent.hierarchical");
1982            else if (Configuration.doAutoCreate())
1983              this.hierarchical = new BooleanType(); // bb
1984          return this.hierarchical;
1985        }
1986
1987        public boolean hasHierarchicalElement() { 
1988          return this.hierarchical != null && !this.hierarchical.isEmpty();
1989        }
1990
1991        public boolean hasHierarchical() { 
1992          return this.hierarchical != null && !this.hierarchical.isEmpty();
1993        }
1994
1995        /**
1996         * @param value {@link #hierarchical} (Whether the server can return nested value sets.). This is the underlying object with id, value and extensions. The accessor "getHierarchical" gives direct access to the value
1997         */
1998        public TerminologyCapabilitiesExpansionComponent setHierarchicalElement(BooleanType value) { 
1999          this.hierarchical = value;
2000          return this;
2001        }
2002
2003        /**
2004         * @return Whether the server can return nested value sets.
2005         */
2006        public boolean getHierarchical() { 
2007          return this.hierarchical == null || this.hierarchical.isEmpty() ? false : this.hierarchical.getValue();
2008        }
2009
2010        /**
2011         * @param value Whether the server can return nested value sets.
2012         */
2013        public TerminologyCapabilitiesExpansionComponent setHierarchical(boolean value) { 
2014            if (this.hierarchical == null)
2015              this.hierarchical = new BooleanType();
2016            this.hierarchical.setValue(value);
2017          return this;
2018        }
2019
2020        /**
2021         * @return {@link #paging} (Whether the server supports paging on expansion.). This is the underlying object with id, value and extensions. The accessor "getPaging" gives direct access to the value
2022         */
2023        public BooleanType getPagingElement() { 
2024          if (this.paging == null)
2025            if (Configuration.errorOnAutoCreate())
2026              throw new Error("Attempt to auto-create TerminologyCapabilitiesExpansionComponent.paging");
2027            else if (Configuration.doAutoCreate())
2028              this.paging = new BooleanType(); // bb
2029          return this.paging;
2030        }
2031
2032        public boolean hasPagingElement() { 
2033          return this.paging != null && !this.paging.isEmpty();
2034        }
2035
2036        public boolean hasPaging() { 
2037          return this.paging != null && !this.paging.isEmpty();
2038        }
2039
2040        /**
2041         * @param value {@link #paging} (Whether the server supports paging on expansion.). This is the underlying object with id, value and extensions. The accessor "getPaging" gives direct access to the value
2042         */
2043        public TerminologyCapabilitiesExpansionComponent setPagingElement(BooleanType value) { 
2044          this.paging = value;
2045          return this;
2046        }
2047
2048        /**
2049         * @return Whether the server supports paging on expansion.
2050         */
2051        public boolean getPaging() { 
2052          return this.paging == null || this.paging.isEmpty() ? false : this.paging.getValue();
2053        }
2054
2055        /**
2056         * @param value Whether the server supports paging on expansion.
2057         */
2058        public TerminologyCapabilitiesExpansionComponent setPaging(boolean value) { 
2059            if (this.paging == null)
2060              this.paging = new BooleanType();
2061            this.paging.setValue(value);
2062          return this;
2063        }
2064
2065        /**
2066         * @return {@link #incomplete} (Allow request for incomplete expansions?). This is the underlying object with id, value and extensions. The accessor "getIncomplete" gives direct access to the value
2067         */
2068        public BooleanType getIncompleteElement() { 
2069          if (this.incomplete == null)
2070            if (Configuration.errorOnAutoCreate())
2071              throw new Error("Attempt to auto-create TerminologyCapabilitiesExpansionComponent.incomplete");
2072            else if (Configuration.doAutoCreate())
2073              this.incomplete = new BooleanType(); // bb
2074          return this.incomplete;
2075        }
2076
2077        public boolean hasIncompleteElement() { 
2078          return this.incomplete != null && !this.incomplete.isEmpty();
2079        }
2080
2081        public boolean hasIncomplete() { 
2082          return this.incomplete != null && !this.incomplete.isEmpty();
2083        }
2084
2085        /**
2086         * @param value {@link #incomplete} (Allow request for incomplete expansions?). This is the underlying object with id, value and extensions. The accessor "getIncomplete" gives direct access to the value
2087         */
2088        public TerminologyCapabilitiesExpansionComponent setIncompleteElement(BooleanType value) { 
2089          this.incomplete = value;
2090          return this;
2091        }
2092
2093        /**
2094         * @return Allow request for incomplete expansions?
2095         */
2096        public boolean getIncomplete() { 
2097          return this.incomplete == null || this.incomplete.isEmpty() ? false : this.incomplete.getValue();
2098        }
2099
2100        /**
2101         * @param value Allow request for incomplete expansions?
2102         */
2103        public TerminologyCapabilitiesExpansionComponent setIncomplete(boolean value) { 
2104            if (this.incomplete == null)
2105              this.incomplete = new BooleanType();
2106            this.incomplete.setValue(value);
2107          return this;
2108        }
2109
2110        /**
2111         * @return {@link #parameter} (Supported expansion parameter.)
2112         */
2113        public List<TerminologyCapabilitiesExpansionParameterComponent> getParameter() { 
2114          if (this.parameter == null)
2115            this.parameter = new ArrayList<TerminologyCapabilitiesExpansionParameterComponent>();
2116          return this.parameter;
2117        }
2118
2119        /**
2120         * @return Returns a reference to <code>this</code> for easy method chaining
2121         */
2122        public TerminologyCapabilitiesExpansionComponent setParameter(List<TerminologyCapabilitiesExpansionParameterComponent> theParameter) { 
2123          this.parameter = theParameter;
2124          return this;
2125        }
2126
2127        public boolean hasParameter() { 
2128          if (this.parameter == null)
2129            return false;
2130          for (TerminologyCapabilitiesExpansionParameterComponent item : this.parameter)
2131            if (!item.isEmpty())
2132              return true;
2133          return false;
2134        }
2135
2136        public TerminologyCapabilitiesExpansionParameterComponent addParameter() { //3
2137          TerminologyCapabilitiesExpansionParameterComponent t = new TerminologyCapabilitiesExpansionParameterComponent();
2138          if (this.parameter == null)
2139            this.parameter = new ArrayList<TerminologyCapabilitiesExpansionParameterComponent>();
2140          this.parameter.add(t);
2141          return t;
2142        }
2143
2144        public TerminologyCapabilitiesExpansionComponent addParameter(TerminologyCapabilitiesExpansionParameterComponent t) { //3
2145          if (t == null)
2146            return this;
2147          if (this.parameter == null)
2148            this.parameter = new ArrayList<TerminologyCapabilitiesExpansionParameterComponent>();
2149          this.parameter.add(t);
2150          return this;
2151        }
2152
2153        /**
2154         * @return The first repetition of repeating field {@link #parameter}, creating it if it does not already exist
2155         */
2156        public TerminologyCapabilitiesExpansionParameterComponent getParameterFirstRep() { 
2157          if (getParameter().isEmpty()) {
2158            addParameter();
2159          }
2160          return getParameter().get(0);
2161        }
2162
2163        /**
2164         * @return {@link #textFilter} (Documentation about text searching works.). This is the underlying object with id, value and extensions. The accessor "getTextFilter" gives direct access to the value
2165         */
2166        public MarkdownType getTextFilterElement() { 
2167          if (this.textFilter == null)
2168            if (Configuration.errorOnAutoCreate())
2169              throw new Error("Attempt to auto-create TerminologyCapabilitiesExpansionComponent.textFilter");
2170            else if (Configuration.doAutoCreate())
2171              this.textFilter = new MarkdownType(); // bb
2172          return this.textFilter;
2173        }
2174
2175        public boolean hasTextFilterElement() { 
2176          return this.textFilter != null && !this.textFilter.isEmpty();
2177        }
2178
2179        public boolean hasTextFilter() { 
2180          return this.textFilter != null && !this.textFilter.isEmpty();
2181        }
2182
2183        /**
2184         * @param value {@link #textFilter} (Documentation about text searching works.). This is the underlying object with id, value and extensions. The accessor "getTextFilter" gives direct access to the value
2185         */
2186        public TerminologyCapabilitiesExpansionComponent setTextFilterElement(MarkdownType value) { 
2187          this.textFilter = value;
2188          return this;
2189        }
2190
2191        /**
2192         * @return Documentation about text searching works.
2193         */
2194        public String getTextFilter() { 
2195          return this.textFilter == null ? null : this.textFilter.getValue();
2196        }
2197
2198        /**
2199         * @param value Documentation about text searching works.
2200         */
2201        public TerminologyCapabilitiesExpansionComponent setTextFilter(String value) { 
2202          if (value == null)
2203            this.textFilter = null;
2204          else {
2205            if (this.textFilter == null)
2206              this.textFilter = new MarkdownType();
2207            this.textFilter.setValue(value);
2208          }
2209          return this;
2210        }
2211
2212        protected void listChildren(List<Property> children) {
2213          super.listChildren(children);
2214          children.add(new Property("hierarchical", "boolean", "Whether the server can return nested value sets.", 0, 1, hierarchical));
2215          children.add(new Property("paging", "boolean", "Whether the server supports paging on expansion.", 0, 1, paging));
2216          children.add(new Property("incomplete", "boolean", "Allow request for incomplete expansions?", 0, 1, incomplete));
2217          children.add(new Property("parameter", "", "Supported expansion parameter.", 0, java.lang.Integer.MAX_VALUE, parameter));
2218          children.add(new Property("textFilter", "markdown", "Documentation about text searching works.", 0, 1, textFilter));
2219        }
2220
2221        @Override
2222        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2223          switch (_hash) {
2224          case 857636745: /*hierarchical*/  return new Property("hierarchical", "boolean", "Whether the server can return nested value sets.", 0, 1, hierarchical);
2225          case -995747956: /*paging*/  return new Property("paging", "boolean", "Whether the server supports paging on expansion.", 0, 1, paging);
2226          case -1010022050: /*incomplete*/  return new Property("incomplete", "boolean", "Allow request for incomplete expansions?", 0, 1, incomplete);
2227          case 1954460585: /*parameter*/  return new Property("parameter", "", "Supported expansion parameter.", 0, java.lang.Integer.MAX_VALUE, parameter);
2228          case 1469359877: /*textFilter*/  return new Property("textFilter", "markdown", "Documentation about text searching works.", 0, 1, textFilter);
2229          default: return super.getNamedProperty(_hash, _name, _checkValid);
2230          }
2231
2232        }
2233
2234      @Override
2235      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2236        switch (hash) {
2237        case 857636745: /*hierarchical*/ return this.hierarchical == null ? new Base[0] : new Base[] {this.hierarchical}; // BooleanType
2238        case -995747956: /*paging*/ return this.paging == null ? new Base[0] : new Base[] {this.paging}; // BooleanType
2239        case -1010022050: /*incomplete*/ return this.incomplete == null ? new Base[0] : new Base[] {this.incomplete}; // BooleanType
2240        case 1954460585: /*parameter*/ return this.parameter == null ? new Base[0] : this.parameter.toArray(new Base[this.parameter.size()]); // TerminologyCapabilitiesExpansionParameterComponent
2241        case 1469359877: /*textFilter*/ return this.textFilter == null ? new Base[0] : new Base[] {this.textFilter}; // MarkdownType
2242        default: return super.getProperty(hash, name, checkValid);
2243        }
2244
2245      }
2246
2247      @Override
2248      public Base setProperty(int hash, String name, Base value) throws FHIRException {
2249        switch (hash) {
2250        case 857636745: // hierarchical
2251          this.hierarchical = castToBoolean(value); // BooleanType
2252          return value;
2253        case -995747956: // paging
2254          this.paging = castToBoolean(value); // BooleanType
2255          return value;
2256        case -1010022050: // incomplete
2257          this.incomplete = castToBoolean(value); // BooleanType
2258          return value;
2259        case 1954460585: // parameter
2260          this.getParameter().add((TerminologyCapabilitiesExpansionParameterComponent) value); // TerminologyCapabilitiesExpansionParameterComponent
2261          return value;
2262        case 1469359877: // textFilter
2263          this.textFilter = castToMarkdown(value); // MarkdownType
2264          return value;
2265        default: return super.setProperty(hash, name, value);
2266        }
2267
2268      }
2269
2270      @Override
2271      public Base setProperty(String name, Base value) throws FHIRException {
2272        if (name.equals("hierarchical")) {
2273          this.hierarchical = castToBoolean(value); // BooleanType
2274        } else if (name.equals("paging")) {
2275          this.paging = castToBoolean(value); // BooleanType
2276        } else if (name.equals("incomplete")) {
2277          this.incomplete = castToBoolean(value); // BooleanType
2278        } else if (name.equals("parameter")) {
2279          this.getParameter().add((TerminologyCapabilitiesExpansionParameterComponent) value);
2280        } else if (name.equals("textFilter")) {
2281          this.textFilter = castToMarkdown(value); // MarkdownType
2282        } else
2283          return super.setProperty(name, value);
2284        return value;
2285      }
2286
2287      @Override
2288      public Base makeProperty(int hash, String name) throws FHIRException {
2289        switch (hash) {
2290        case 857636745:  return getHierarchicalElement();
2291        case -995747956:  return getPagingElement();
2292        case -1010022050:  return getIncompleteElement();
2293        case 1954460585:  return addParameter(); 
2294        case 1469359877:  return getTextFilterElement();
2295        default: return super.makeProperty(hash, name);
2296        }
2297
2298      }
2299
2300      @Override
2301      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2302        switch (hash) {
2303        case 857636745: /*hierarchical*/ return new String[] {"boolean"};
2304        case -995747956: /*paging*/ return new String[] {"boolean"};
2305        case -1010022050: /*incomplete*/ return new String[] {"boolean"};
2306        case 1954460585: /*parameter*/ return new String[] {};
2307        case 1469359877: /*textFilter*/ return new String[] {"markdown"};
2308        default: return super.getTypesForProperty(hash, name);
2309        }
2310
2311      }
2312
2313      @Override
2314      public Base addChild(String name) throws FHIRException {
2315        if (name.equals("hierarchical")) {
2316          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.hierarchical");
2317        }
2318        else if (name.equals("paging")) {
2319          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.paging");
2320        }
2321        else if (name.equals("incomplete")) {
2322          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.incomplete");
2323        }
2324        else if (name.equals("parameter")) {
2325          return addParameter();
2326        }
2327        else if (name.equals("textFilter")) {
2328          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.textFilter");
2329        }
2330        else
2331          return super.addChild(name);
2332      }
2333
2334      public TerminologyCapabilitiesExpansionComponent copy() {
2335        TerminologyCapabilitiesExpansionComponent dst = new TerminologyCapabilitiesExpansionComponent();
2336        copyValues(dst);
2337        return dst;
2338      }
2339
2340      public void copyValues(TerminologyCapabilitiesExpansionComponent dst) {
2341        super.copyValues(dst);
2342        dst.hierarchical = hierarchical == null ? null : hierarchical.copy();
2343        dst.paging = paging == null ? null : paging.copy();
2344        dst.incomplete = incomplete == null ? null : incomplete.copy();
2345        if (parameter != null) {
2346          dst.parameter = new ArrayList<TerminologyCapabilitiesExpansionParameterComponent>();
2347          for (TerminologyCapabilitiesExpansionParameterComponent i : parameter)
2348            dst.parameter.add(i.copy());
2349        };
2350        dst.textFilter = textFilter == null ? null : textFilter.copy();
2351      }
2352
2353      @Override
2354      public boolean equalsDeep(Base other_) {
2355        if (!super.equalsDeep(other_))
2356          return false;
2357        if (!(other_ instanceof TerminologyCapabilitiesExpansionComponent))
2358          return false;
2359        TerminologyCapabilitiesExpansionComponent o = (TerminologyCapabilitiesExpansionComponent) other_;
2360        return compareDeep(hierarchical, o.hierarchical, true) && compareDeep(paging, o.paging, true) && compareDeep(incomplete, o.incomplete, true)
2361           && compareDeep(parameter, o.parameter, true) && compareDeep(textFilter, o.textFilter, true);
2362      }
2363
2364      @Override
2365      public boolean equalsShallow(Base other_) {
2366        if (!super.equalsShallow(other_))
2367          return false;
2368        if (!(other_ instanceof TerminologyCapabilitiesExpansionComponent))
2369          return false;
2370        TerminologyCapabilitiesExpansionComponent o = (TerminologyCapabilitiesExpansionComponent) other_;
2371        return compareValues(hierarchical, o.hierarchical, true) && compareValues(paging, o.paging, true) && compareValues(incomplete, o.incomplete, true)
2372           && compareValues(textFilter, o.textFilter, true);
2373      }
2374
2375      public boolean isEmpty() {
2376        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(hierarchical, paging, incomplete
2377          , parameter, textFilter);
2378      }
2379
2380  public String fhirType() {
2381    return "TerminologyCapabilities.expansion";
2382
2383  }
2384
2385  }
2386
2387    @Block()
2388    public static class TerminologyCapabilitiesExpansionParameterComponent extends BackboneElement implements IBaseBackboneElement {
2389        /**
2390         * Expansion Parameter name.
2391         */
2392        @Child(name = "name", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=false)
2393        @Description(shortDefinition="Expansion Parameter name", formalDefinition="Expansion Parameter name." )
2394        protected CodeType name;
2395
2396        /**
2397         * Description of support for parameter.
2398         */
2399        @Child(name = "documentation", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=false)
2400        @Description(shortDefinition="Description of support for parameter", formalDefinition="Description of support for parameter." )
2401        protected StringType documentation;
2402
2403        private static final long serialVersionUID = -1703372741L;
2404
2405    /**
2406     * Constructor
2407     */
2408      public TerminologyCapabilitiesExpansionParameterComponent() {
2409        super();
2410      }
2411
2412    /**
2413     * Constructor
2414     */
2415      public TerminologyCapabilitiesExpansionParameterComponent(CodeType name) {
2416        super();
2417        this.name = name;
2418      }
2419
2420        /**
2421         * @return {@link #name} (Expansion Parameter name.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
2422         */
2423        public CodeType getNameElement() { 
2424          if (this.name == null)
2425            if (Configuration.errorOnAutoCreate())
2426              throw new Error("Attempt to auto-create TerminologyCapabilitiesExpansionParameterComponent.name");
2427            else if (Configuration.doAutoCreate())
2428              this.name = new CodeType(); // bb
2429          return this.name;
2430        }
2431
2432        public boolean hasNameElement() { 
2433          return this.name != null && !this.name.isEmpty();
2434        }
2435
2436        public boolean hasName() { 
2437          return this.name != null && !this.name.isEmpty();
2438        }
2439
2440        /**
2441         * @param value {@link #name} (Expansion Parameter name.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
2442         */
2443        public TerminologyCapabilitiesExpansionParameterComponent setNameElement(CodeType value) { 
2444          this.name = value;
2445          return this;
2446        }
2447
2448        /**
2449         * @return Expansion Parameter name.
2450         */
2451        public String getName() { 
2452          return this.name == null ? null : this.name.getValue();
2453        }
2454
2455        /**
2456         * @param value Expansion Parameter name.
2457         */
2458        public TerminologyCapabilitiesExpansionParameterComponent setName(String value) { 
2459            if (this.name == null)
2460              this.name = new CodeType();
2461            this.name.setValue(value);
2462          return this;
2463        }
2464
2465        /**
2466         * @return {@link #documentation} (Description of support for parameter.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
2467         */
2468        public StringType getDocumentationElement() { 
2469          if (this.documentation == null)
2470            if (Configuration.errorOnAutoCreate())
2471              throw new Error("Attempt to auto-create TerminologyCapabilitiesExpansionParameterComponent.documentation");
2472            else if (Configuration.doAutoCreate())
2473              this.documentation = new StringType(); // bb
2474          return this.documentation;
2475        }
2476
2477        public boolean hasDocumentationElement() { 
2478          return this.documentation != null && !this.documentation.isEmpty();
2479        }
2480
2481        public boolean hasDocumentation() { 
2482          return this.documentation != null && !this.documentation.isEmpty();
2483        }
2484
2485        /**
2486         * @param value {@link #documentation} (Description of support for parameter.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
2487         */
2488        public TerminologyCapabilitiesExpansionParameterComponent setDocumentationElement(StringType value) { 
2489          this.documentation = value;
2490          return this;
2491        }
2492
2493        /**
2494         * @return Description of support for parameter.
2495         */
2496        public String getDocumentation() { 
2497          return this.documentation == null ? null : this.documentation.getValue();
2498        }
2499
2500        /**
2501         * @param value Description of support for parameter.
2502         */
2503        public TerminologyCapabilitiesExpansionParameterComponent setDocumentation(String value) { 
2504          if (Utilities.noString(value))
2505            this.documentation = null;
2506          else {
2507            if (this.documentation == null)
2508              this.documentation = new StringType();
2509            this.documentation.setValue(value);
2510          }
2511          return this;
2512        }
2513
2514        protected void listChildren(List<Property> children) {
2515          super.listChildren(children);
2516          children.add(new Property("name", "code", "Expansion Parameter name.", 0, 1, name));
2517          children.add(new Property("documentation", "string", "Description of support for parameter.", 0, 1, documentation));
2518        }
2519
2520        @Override
2521        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2522          switch (_hash) {
2523          case 3373707: /*name*/  return new Property("name", "code", "Expansion Parameter name.", 0, 1, name);
2524          case 1587405498: /*documentation*/  return new Property("documentation", "string", "Description of support for parameter.", 0, 1, documentation);
2525          default: return super.getNamedProperty(_hash, _name, _checkValid);
2526          }
2527
2528        }
2529
2530      @Override
2531      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2532        switch (hash) {
2533        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // CodeType
2534        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : new Base[] {this.documentation}; // StringType
2535        default: return super.getProperty(hash, name, checkValid);
2536        }
2537
2538      }
2539
2540      @Override
2541      public Base setProperty(int hash, String name, Base value) throws FHIRException {
2542        switch (hash) {
2543        case 3373707: // name
2544          this.name = castToCode(value); // CodeType
2545          return value;
2546        case 1587405498: // documentation
2547          this.documentation = castToString(value); // StringType
2548          return value;
2549        default: return super.setProperty(hash, name, value);
2550        }
2551
2552      }
2553
2554      @Override
2555      public Base setProperty(String name, Base value) throws FHIRException {
2556        if (name.equals("name")) {
2557          this.name = castToCode(value); // CodeType
2558        } else if (name.equals("documentation")) {
2559          this.documentation = castToString(value); // StringType
2560        } else
2561          return super.setProperty(name, value);
2562        return value;
2563      }
2564
2565      @Override
2566      public Base makeProperty(int hash, String name) throws FHIRException {
2567        switch (hash) {
2568        case 3373707:  return getNameElement();
2569        case 1587405498:  return getDocumentationElement();
2570        default: return super.makeProperty(hash, name);
2571        }
2572
2573      }
2574
2575      @Override
2576      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2577        switch (hash) {
2578        case 3373707: /*name*/ return new String[] {"code"};
2579        case 1587405498: /*documentation*/ return new String[] {"string"};
2580        default: return super.getTypesForProperty(hash, name);
2581        }
2582
2583      }
2584
2585      @Override
2586      public Base addChild(String name) throws FHIRException {
2587        if (name.equals("name")) {
2588          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.name");
2589        }
2590        else if (name.equals("documentation")) {
2591          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.documentation");
2592        }
2593        else
2594          return super.addChild(name);
2595      }
2596
2597      public TerminologyCapabilitiesExpansionParameterComponent copy() {
2598        TerminologyCapabilitiesExpansionParameterComponent dst = new TerminologyCapabilitiesExpansionParameterComponent();
2599        copyValues(dst);
2600        return dst;
2601      }
2602
2603      public void copyValues(TerminologyCapabilitiesExpansionParameterComponent dst) {
2604        super.copyValues(dst);
2605        dst.name = name == null ? null : name.copy();
2606        dst.documentation = documentation == null ? null : documentation.copy();
2607      }
2608
2609      @Override
2610      public boolean equalsDeep(Base other_) {
2611        if (!super.equalsDeep(other_))
2612          return false;
2613        if (!(other_ instanceof TerminologyCapabilitiesExpansionParameterComponent))
2614          return false;
2615        TerminologyCapabilitiesExpansionParameterComponent o = (TerminologyCapabilitiesExpansionParameterComponent) other_;
2616        return compareDeep(name, o.name, true) && compareDeep(documentation, o.documentation, true);
2617      }
2618
2619      @Override
2620      public boolean equalsShallow(Base other_) {
2621        if (!super.equalsShallow(other_))
2622          return false;
2623        if (!(other_ instanceof TerminologyCapabilitiesExpansionParameterComponent))
2624          return false;
2625        TerminologyCapabilitiesExpansionParameterComponent o = (TerminologyCapabilitiesExpansionParameterComponent) other_;
2626        return compareValues(name, o.name, true) && compareValues(documentation, o.documentation, true);
2627      }
2628
2629      public boolean isEmpty() {
2630        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(name, documentation);
2631      }
2632
2633  public String fhirType() {
2634    return "TerminologyCapabilities.expansion.parameter";
2635
2636  }
2637
2638  }
2639
2640    @Block()
2641    public static class TerminologyCapabilitiesValidateCodeComponent extends BackboneElement implements IBaseBackboneElement {
2642        /**
2643         * Whether translations are validated.
2644         */
2645        @Child(name = "translations", type = {BooleanType.class}, order=1, min=1, max=1, modifier=false, summary=false)
2646        @Description(shortDefinition="Whether translations are validated", formalDefinition="Whether translations are validated." )
2647        protected BooleanType translations;
2648
2649        private static final long serialVersionUID = -1212814906L;
2650
2651    /**
2652     * Constructor
2653     */
2654      public TerminologyCapabilitiesValidateCodeComponent() {
2655        super();
2656      }
2657
2658    /**
2659     * Constructor
2660     */
2661      public TerminologyCapabilitiesValidateCodeComponent(BooleanType translations) {
2662        super();
2663        this.translations = translations;
2664      }
2665
2666        /**
2667         * @return {@link #translations} (Whether translations are validated.). This is the underlying object with id, value and extensions. The accessor "getTranslations" gives direct access to the value
2668         */
2669        public BooleanType getTranslationsElement() { 
2670          if (this.translations == null)
2671            if (Configuration.errorOnAutoCreate())
2672              throw new Error("Attempt to auto-create TerminologyCapabilitiesValidateCodeComponent.translations");
2673            else if (Configuration.doAutoCreate())
2674              this.translations = new BooleanType(); // bb
2675          return this.translations;
2676        }
2677
2678        public boolean hasTranslationsElement() { 
2679          return this.translations != null && !this.translations.isEmpty();
2680        }
2681
2682        public boolean hasTranslations() { 
2683          return this.translations != null && !this.translations.isEmpty();
2684        }
2685
2686        /**
2687         * @param value {@link #translations} (Whether translations are validated.). This is the underlying object with id, value and extensions. The accessor "getTranslations" gives direct access to the value
2688         */
2689        public TerminologyCapabilitiesValidateCodeComponent setTranslationsElement(BooleanType value) { 
2690          this.translations = value;
2691          return this;
2692        }
2693
2694        /**
2695         * @return Whether translations are validated.
2696         */
2697        public boolean getTranslations() { 
2698          return this.translations == null || this.translations.isEmpty() ? false : this.translations.getValue();
2699        }
2700
2701        /**
2702         * @param value Whether translations are validated.
2703         */
2704        public TerminologyCapabilitiesValidateCodeComponent setTranslations(boolean value) { 
2705            if (this.translations == null)
2706              this.translations = new BooleanType();
2707            this.translations.setValue(value);
2708          return this;
2709        }
2710
2711        protected void listChildren(List<Property> children) {
2712          super.listChildren(children);
2713          children.add(new Property("translations", "boolean", "Whether translations are validated.", 0, 1, translations));
2714        }
2715
2716        @Override
2717        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2718          switch (_hash) {
2719          case -1225497630: /*translations*/  return new Property("translations", "boolean", "Whether translations are validated.", 0, 1, translations);
2720          default: return super.getNamedProperty(_hash, _name, _checkValid);
2721          }
2722
2723        }
2724
2725      @Override
2726      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2727        switch (hash) {
2728        case -1225497630: /*translations*/ return this.translations == null ? new Base[0] : new Base[] {this.translations}; // BooleanType
2729        default: return super.getProperty(hash, name, checkValid);
2730        }
2731
2732      }
2733
2734      @Override
2735      public Base setProperty(int hash, String name, Base value) throws FHIRException {
2736        switch (hash) {
2737        case -1225497630: // translations
2738          this.translations = castToBoolean(value); // BooleanType
2739          return value;
2740        default: return super.setProperty(hash, name, value);
2741        }
2742
2743      }
2744
2745      @Override
2746      public Base setProperty(String name, Base value) throws FHIRException {
2747        if (name.equals("translations")) {
2748          this.translations = castToBoolean(value); // BooleanType
2749        } else
2750          return super.setProperty(name, value);
2751        return value;
2752      }
2753
2754      @Override
2755      public Base makeProperty(int hash, String name) throws FHIRException {
2756        switch (hash) {
2757        case -1225497630:  return getTranslationsElement();
2758        default: return super.makeProperty(hash, name);
2759        }
2760
2761      }
2762
2763      @Override
2764      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2765        switch (hash) {
2766        case -1225497630: /*translations*/ return new String[] {"boolean"};
2767        default: return super.getTypesForProperty(hash, name);
2768        }
2769
2770      }
2771
2772      @Override
2773      public Base addChild(String name) throws FHIRException {
2774        if (name.equals("translations")) {
2775          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.translations");
2776        }
2777        else
2778          return super.addChild(name);
2779      }
2780
2781      public TerminologyCapabilitiesValidateCodeComponent copy() {
2782        TerminologyCapabilitiesValidateCodeComponent dst = new TerminologyCapabilitiesValidateCodeComponent();
2783        copyValues(dst);
2784        return dst;
2785      }
2786
2787      public void copyValues(TerminologyCapabilitiesValidateCodeComponent dst) {
2788        super.copyValues(dst);
2789        dst.translations = translations == null ? null : translations.copy();
2790      }
2791
2792      @Override
2793      public boolean equalsDeep(Base other_) {
2794        if (!super.equalsDeep(other_))
2795          return false;
2796        if (!(other_ instanceof TerminologyCapabilitiesValidateCodeComponent))
2797          return false;
2798        TerminologyCapabilitiesValidateCodeComponent o = (TerminologyCapabilitiesValidateCodeComponent) other_;
2799        return compareDeep(translations, o.translations, true);
2800      }
2801
2802      @Override
2803      public boolean equalsShallow(Base other_) {
2804        if (!super.equalsShallow(other_))
2805          return false;
2806        if (!(other_ instanceof TerminologyCapabilitiesValidateCodeComponent))
2807          return false;
2808        TerminologyCapabilitiesValidateCodeComponent o = (TerminologyCapabilitiesValidateCodeComponent) other_;
2809        return compareValues(translations, o.translations, true);
2810      }
2811
2812      public boolean isEmpty() {
2813        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(translations);
2814      }
2815
2816  public String fhirType() {
2817    return "TerminologyCapabilities.validateCode";
2818
2819  }
2820
2821  }
2822
2823    @Block()
2824    public static class TerminologyCapabilitiesTranslationComponent extends BackboneElement implements IBaseBackboneElement {
2825        /**
2826         * Whether the client must identify the map.
2827         */
2828        @Child(name = "needsMap", type = {BooleanType.class}, order=1, min=1, max=1, modifier=false, summary=false)
2829        @Description(shortDefinition="Whether the client must identify the map", formalDefinition="Whether the client must identify the map." )
2830        protected BooleanType needsMap;
2831
2832        private static final long serialVersionUID = -1727843575L;
2833
2834    /**
2835     * Constructor
2836     */
2837      public TerminologyCapabilitiesTranslationComponent() {
2838        super();
2839      }
2840
2841    /**
2842     * Constructor
2843     */
2844      public TerminologyCapabilitiesTranslationComponent(BooleanType needsMap) {
2845        super();
2846        this.needsMap = needsMap;
2847      }
2848
2849        /**
2850         * @return {@link #needsMap} (Whether the client must identify the map.). This is the underlying object with id, value and extensions. The accessor "getNeedsMap" gives direct access to the value
2851         */
2852        public BooleanType getNeedsMapElement() { 
2853          if (this.needsMap == null)
2854            if (Configuration.errorOnAutoCreate())
2855              throw new Error("Attempt to auto-create TerminologyCapabilitiesTranslationComponent.needsMap");
2856            else if (Configuration.doAutoCreate())
2857              this.needsMap = new BooleanType(); // bb
2858          return this.needsMap;
2859        }
2860
2861        public boolean hasNeedsMapElement() { 
2862          return this.needsMap != null && !this.needsMap.isEmpty();
2863        }
2864
2865        public boolean hasNeedsMap() { 
2866          return this.needsMap != null && !this.needsMap.isEmpty();
2867        }
2868
2869        /**
2870         * @param value {@link #needsMap} (Whether the client must identify the map.). This is the underlying object with id, value and extensions. The accessor "getNeedsMap" gives direct access to the value
2871         */
2872        public TerminologyCapabilitiesTranslationComponent setNeedsMapElement(BooleanType value) { 
2873          this.needsMap = value;
2874          return this;
2875        }
2876
2877        /**
2878         * @return Whether the client must identify the map.
2879         */
2880        public boolean getNeedsMap() { 
2881          return this.needsMap == null || this.needsMap.isEmpty() ? false : this.needsMap.getValue();
2882        }
2883
2884        /**
2885         * @param value Whether the client must identify the map.
2886         */
2887        public TerminologyCapabilitiesTranslationComponent setNeedsMap(boolean value) { 
2888            if (this.needsMap == null)
2889              this.needsMap = new BooleanType();
2890            this.needsMap.setValue(value);
2891          return this;
2892        }
2893
2894        protected void listChildren(List<Property> children) {
2895          super.listChildren(children);
2896          children.add(new Property("needsMap", "boolean", "Whether the client must identify the map.", 0, 1, needsMap));
2897        }
2898
2899        @Override
2900        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2901          switch (_hash) {
2902          case 866566527: /*needsMap*/  return new Property("needsMap", "boolean", "Whether the client must identify the map.", 0, 1, needsMap);
2903          default: return super.getNamedProperty(_hash, _name, _checkValid);
2904          }
2905
2906        }
2907
2908      @Override
2909      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2910        switch (hash) {
2911        case 866566527: /*needsMap*/ return this.needsMap == null ? new Base[0] : new Base[] {this.needsMap}; // BooleanType
2912        default: return super.getProperty(hash, name, checkValid);
2913        }
2914
2915      }
2916
2917      @Override
2918      public Base setProperty(int hash, String name, Base value) throws FHIRException {
2919        switch (hash) {
2920        case 866566527: // needsMap
2921          this.needsMap = castToBoolean(value); // BooleanType
2922          return value;
2923        default: return super.setProperty(hash, name, value);
2924        }
2925
2926      }
2927
2928      @Override
2929      public Base setProperty(String name, Base value) throws FHIRException {
2930        if (name.equals("needsMap")) {
2931          this.needsMap = castToBoolean(value); // BooleanType
2932        } else
2933          return super.setProperty(name, value);
2934        return value;
2935      }
2936
2937      @Override
2938      public Base makeProperty(int hash, String name) throws FHIRException {
2939        switch (hash) {
2940        case 866566527:  return getNeedsMapElement();
2941        default: return super.makeProperty(hash, name);
2942        }
2943
2944      }
2945
2946      @Override
2947      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2948        switch (hash) {
2949        case 866566527: /*needsMap*/ return new String[] {"boolean"};
2950        default: return super.getTypesForProperty(hash, name);
2951        }
2952
2953      }
2954
2955      @Override
2956      public Base addChild(String name) throws FHIRException {
2957        if (name.equals("needsMap")) {
2958          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.needsMap");
2959        }
2960        else
2961          return super.addChild(name);
2962      }
2963
2964      public TerminologyCapabilitiesTranslationComponent copy() {
2965        TerminologyCapabilitiesTranslationComponent dst = new TerminologyCapabilitiesTranslationComponent();
2966        copyValues(dst);
2967        return dst;
2968      }
2969
2970      public void copyValues(TerminologyCapabilitiesTranslationComponent dst) {
2971        super.copyValues(dst);
2972        dst.needsMap = needsMap == null ? null : needsMap.copy();
2973      }
2974
2975      @Override
2976      public boolean equalsDeep(Base other_) {
2977        if (!super.equalsDeep(other_))
2978          return false;
2979        if (!(other_ instanceof TerminologyCapabilitiesTranslationComponent))
2980          return false;
2981        TerminologyCapabilitiesTranslationComponent o = (TerminologyCapabilitiesTranslationComponent) other_;
2982        return compareDeep(needsMap, o.needsMap, true);
2983      }
2984
2985      @Override
2986      public boolean equalsShallow(Base other_) {
2987        if (!super.equalsShallow(other_))
2988          return false;
2989        if (!(other_ instanceof TerminologyCapabilitiesTranslationComponent))
2990          return false;
2991        TerminologyCapabilitiesTranslationComponent o = (TerminologyCapabilitiesTranslationComponent) other_;
2992        return compareValues(needsMap, o.needsMap, true);
2993      }
2994
2995      public boolean isEmpty() {
2996        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(needsMap);
2997      }
2998
2999  public String fhirType() {
3000    return "TerminologyCapabilities.translation";
3001
3002  }
3003
3004  }
3005
3006    @Block()
3007    public static class TerminologyCapabilitiesClosureComponent extends BackboneElement implements IBaseBackboneElement {
3008        /**
3009         * If cross-system closure is supported.
3010         */
3011        @Child(name = "translation", type = {BooleanType.class}, order=1, min=0, max=1, modifier=false, summary=false)
3012        @Description(shortDefinition="If cross-system closure is supported", formalDefinition="If cross-system closure is supported." )
3013        protected BooleanType translation;
3014
3015        private static final long serialVersionUID = 1900484343L;
3016
3017    /**
3018     * Constructor
3019     */
3020      public TerminologyCapabilitiesClosureComponent() {
3021        super();
3022      }
3023
3024        /**
3025         * @return {@link #translation} (If cross-system closure is supported.). This is the underlying object with id, value and extensions. The accessor "getTranslation" gives direct access to the value
3026         */
3027        public BooleanType getTranslationElement() { 
3028          if (this.translation == null)
3029            if (Configuration.errorOnAutoCreate())
3030              throw new Error("Attempt to auto-create TerminologyCapabilitiesClosureComponent.translation");
3031            else if (Configuration.doAutoCreate())
3032              this.translation = new BooleanType(); // bb
3033          return this.translation;
3034        }
3035
3036        public boolean hasTranslationElement() { 
3037          return this.translation != null && !this.translation.isEmpty();
3038        }
3039
3040        public boolean hasTranslation() { 
3041          return this.translation != null && !this.translation.isEmpty();
3042        }
3043
3044        /**
3045         * @param value {@link #translation} (If cross-system closure is supported.). This is the underlying object with id, value and extensions. The accessor "getTranslation" gives direct access to the value
3046         */
3047        public TerminologyCapabilitiesClosureComponent setTranslationElement(BooleanType value) { 
3048          this.translation = value;
3049          return this;
3050        }
3051
3052        /**
3053         * @return If cross-system closure is supported.
3054         */
3055        public boolean getTranslation() { 
3056          return this.translation == null || this.translation.isEmpty() ? false : this.translation.getValue();
3057        }
3058
3059        /**
3060         * @param value If cross-system closure is supported.
3061         */
3062        public TerminologyCapabilitiesClosureComponent setTranslation(boolean value) { 
3063            if (this.translation == null)
3064              this.translation = new BooleanType();
3065            this.translation.setValue(value);
3066          return this;
3067        }
3068
3069        protected void listChildren(List<Property> children) {
3070          super.listChildren(children);
3071          children.add(new Property("translation", "boolean", "If cross-system closure is supported.", 0, 1, translation));
3072        }
3073
3074        @Override
3075        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
3076          switch (_hash) {
3077          case -1840647503: /*translation*/  return new Property("translation", "boolean", "If cross-system closure is supported.", 0, 1, translation);
3078          default: return super.getNamedProperty(_hash, _name, _checkValid);
3079          }
3080
3081        }
3082
3083      @Override
3084      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
3085        switch (hash) {
3086        case -1840647503: /*translation*/ return this.translation == null ? new Base[0] : new Base[] {this.translation}; // BooleanType
3087        default: return super.getProperty(hash, name, checkValid);
3088        }
3089
3090      }
3091
3092      @Override
3093      public Base setProperty(int hash, String name, Base value) throws FHIRException {
3094        switch (hash) {
3095        case -1840647503: // translation
3096          this.translation = castToBoolean(value); // BooleanType
3097          return value;
3098        default: return super.setProperty(hash, name, value);
3099        }
3100
3101      }
3102
3103      @Override
3104      public Base setProperty(String name, Base value) throws FHIRException {
3105        if (name.equals("translation")) {
3106          this.translation = castToBoolean(value); // BooleanType
3107        } else
3108          return super.setProperty(name, value);
3109        return value;
3110      }
3111
3112      @Override
3113      public Base makeProperty(int hash, String name) throws FHIRException {
3114        switch (hash) {
3115        case -1840647503:  return getTranslationElement();
3116        default: return super.makeProperty(hash, name);
3117        }
3118
3119      }
3120
3121      @Override
3122      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
3123        switch (hash) {
3124        case -1840647503: /*translation*/ return new String[] {"boolean"};
3125        default: return super.getTypesForProperty(hash, name);
3126        }
3127
3128      }
3129
3130      @Override
3131      public Base addChild(String name) throws FHIRException {
3132        if (name.equals("translation")) {
3133          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.translation");
3134        }
3135        else
3136          return super.addChild(name);
3137      }
3138
3139      public TerminologyCapabilitiesClosureComponent copy() {
3140        TerminologyCapabilitiesClosureComponent dst = new TerminologyCapabilitiesClosureComponent();
3141        copyValues(dst);
3142        return dst;
3143      }
3144
3145      public void copyValues(TerminologyCapabilitiesClosureComponent dst) {
3146        super.copyValues(dst);
3147        dst.translation = translation == null ? null : translation.copy();
3148      }
3149
3150      @Override
3151      public boolean equalsDeep(Base other_) {
3152        if (!super.equalsDeep(other_))
3153          return false;
3154        if (!(other_ instanceof TerminologyCapabilitiesClosureComponent))
3155          return false;
3156        TerminologyCapabilitiesClosureComponent o = (TerminologyCapabilitiesClosureComponent) other_;
3157        return compareDeep(translation, o.translation, true);
3158      }
3159
3160      @Override
3161      public boolean equalsShallow(Base other_) {
3162        if (!super.equalsShallow(other_))
3163          return false;
3164        if (!(other_ instanceof TerminologyCapabilitiesClosureComponent))
3165          return false;
3166        TerminologyCapabilitiesClosureComponent o = (TerminologyCapabilitiesClosureComponent) other_;
3167        return compareValues(translation, o.translation, true);
3168      }
3169
3170      public boolean isEmpty() {
3171        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(translation);
3172      }
3173
3174  public String fhirType() {
3175    return "TerminologyCapabilities.closure";
3176
3177  }
3178
3179  }
3180
3181    /**
3182     * Explanation of why this terminology capabilities is needed and why it has been designed as it has.
3183     */
3184    @Child(name = "purpose", type = {MarkdownType.class}, order=0, min=0, max=1, modifier=false, summary=false)
3185    @Description(shortDefinition="Why this terminology capabilities is defined", formalDefinition="Explanation of why this terminology capabilities is needed and why it has been designed as it has." )
3186    protected MarkdownType purpose;
3187
3188    /**
3189     * A copyright statement relating to the terminology capabilities and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the terminology capabilities.
3190     */
3191    @Child(name = "copyright", type = {MarkdownType.class}, order=1, min=0, max=1, modifier=false, summary=true)
3192    @Description(shortDefinition="Use and/or publishing restrictions", formalDefinition="A copyright statement relating to the terminology capabilities and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the terminology capabilities." )
3193    protected MarkdownType copyright;
3194
3195    /**
3196     * The way that this statement is intended to be used, to describe an actual running instance of software, a particular product (kind, not instance of software) or a class of implementation (e.g. a desired purchase).
3197     */
3198    @Child(name = "kind", type = {CodeType.class}, order=2, min=1, max=1, modifier=false, summary=true)
3199    @Description(shortDefinition="instance | capability | requirements", formalDefinition="The way that this statement is intended to be used, to describe an actual running instance of software, a particular product (kind, not instance of software) or a class of implementation (e.g. a desired purchase)." )
3200    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/capability-statement-kind")
3201    protected Enumeration<CapabilityStatementKind> kind;
3202
3203    /**
3204     * Software that is covered by this terminology capability statement.  It is used when the statement describes the capabilities of a particular software version, independent of an installation.
3205     */
3206    @Child(name = "software", type = {}, order=3, min=0, max=1, modifier=false, summary=true)
3207    @Description(shortDefinition="Software that is covered by this terminology capability statement", formalDefinition="Software that is covered by this terminology capability statement.  It is used when the statement describes the capabilities of a particular software version, independent of an installation." )
3208    protected TerminologyCapabilitiesSoftwareComponent software;
3209
3210    /**
3211     * Identifies a specific implementation instance that is described by the terminology capability statement - i.e. a particular installation, rather than the capabilities of a software program.
3212     */
3213    @Child(name = "implementation", type = {}, order=4, min=0, max=1, modifier=false, summary=true)
3214    @Description(shortDefinition="If this describes a specific instance", formalDefinition="Identifies a specific implementation instance that is described by the terminology capability statement - i.e. a particular installation, rather than the capabilities of a software program." )
3215    protected TerminologyCapabilitiesImplementationComponent implementation;
3216
3217    /**
3218     * Whether the server supports lockedDate.
3219     */
3220    @Child(name = "lockedDate", type = {BooleanType.class}, order=5, min=0, max=1, modifier=false, summary=true)
3221    @Description(shortDefinition="Whether lockedDate is supported", formalDefinition="Whether the server supports lockedDate." )
3222    protected BooleanType lockedDate;
3223
3224    /**
3225     * Identifies a code system that is supported by the server. If there is a no code system URL, then this declares the general assumptions a client can make about support for any CodeSystem resource.
3226     */
3227    @Child(name = "codeSystem", type = {}, order=6, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3228    @Description(shortDefinition="A code system supported by the server", formalDefinition="Identifies a code system that is supported by the server. If there is a no code system URL, then this declares the general assumptions a client can make about support for any CodeSystem resource." )
3229    protected List<TerminologyCapabilitiesCodeSystemComponent> codeSystem;
3230
3231    /**
3232     * Information about the [ValueSet/$expand](valueset-operation-expand.html) operation.
3233     */
3234    @Child(name = "expansion", type = {}, order=7, min=0, max=1, modifier=false, summary=false)
3235    @Description(shortDefinition="Information about the [ValueSet/$expand](valueset-operation-expand.html) operation", formalDefinition="Information about the [ValueSet/$expand](valueset-operation-expand.html) operation." )
3236    protected TerminologyCapabilitiesExpansionComponent expansion;
3237
3238    /**
3239     * The degree to which the server supports the code search parameter on ValueSet, if it is supported.
3240     */
3241    @Child(name = "codeSearch", type = {CodeType.class}, order=8, min=0, max=1, modifier=false, summary=false)
3242    @Description(shortDefinition="explicit | all", formalDefinition="The degree to which the server supports the code search parameter on ValueSet, if it is supported." )
3243    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/code-search-support")
3244    protected Enumeration<CodeSearchSupport> codeSearch;
3245
3246    /**
3247     * Information about the [ValueSet/$validate-code](valueset-operation-validate-code.html) operation.
3248     */
3249    @Child(name = "validateCode", type = {}, order=9, min=0, max=1, modifier=false, summary=false)
3250    @Description(shortDefinition="Information about the [ValueSet/$validate-code](valueset-operation-validate-code.html) operation", formalDefinition="Information about the [ValueSet/$validate-code](valueset-operation-validate-code.html) operation." )
3251    protected TerminologyCapabilitiesValidateCodeComponent validateCode;
3252
3253    /**
3254     * Information about the [ConceptMap/$translate](conceptmap-operation-translate.html) operation.
3255     */
3256    @Child(name = "translation", type = {}, order=10, min=0, max=1, modifier=false, summary=false)
3257    @Description(shortDefinition="Information about the [ConceptMap/$translate](conceptmap-operation-translate.html) operation", formalDefinition="Information about the [ConceptMap/$translate](conceptmap-operation-translate.html) operation." )
3258    protected TerminologyCapabilitiesTranslationComponent translation;
3259
3260    /**
3261     * Whether the $closure operation is supported.
3262     */
3263    @Child(name = "closure", type = {}, order=11, min=0, max=1, modifier=false, summary=false)
3264    @Description(shortDefinition="Information about the [ConceptMap/$closure](conceptmap-operation-closure.html) operation", formalDefinition="Whether the $closure operation is supported." )
3265    protected TerminologyCapabilitiesClosureComponent closure;
3266
3267    private static final long serialVersionUID = -1899106119L;
3268
3269  /**
3270   * Constructor
3271   */
3272    public TerminologyCapabilities() {
3273      super();
3274    }
3275
3276  /**
3277   * Constructor
3278   */
3279    public TerminologyCapabilities(Enumeration<PublicationStatus> status, DateTimeType date, Enumeration<CapabilityStatementKind> kind) {
3280      super();
3281      this.status = status;
3282      this.date = date;
3283      this.kind = kind;
3284    }
3285
3286    /**
3287     * @return {@link #url} (An absolute URI that is used to identify this terminology capabilities when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which at which an authoritative instance of this terminology capabilities is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the terminology capabilities is stored on different servers.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
3288     */
3289    public UriType getUrlElement() { 
3290      if (this.url == null)
3291        if (Configuration.errorOnAutoCreate())
3292          throw new Error("Attempt to auto-create TerminologyCapabilities.url");
3293        else if (Configuration.doAutoCreate())
3294          this.url = new UriType(); // bb
3295      return this.url;
3296    }
3297
3298    public boolean hasUrlElement() { 
3299      return this.url != null && !this.url.isEmpty();
3300    }
3301
3302    public boolean hasUrl() { 
3303      return this.url != null && !this.url.isEmpty();
3304    }
3305
3306    /**
3307     * @param value {@link #url} (An absolute URI that is used to identify this terminology capabilities when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which at which an authoritative instance of this terminology capabilities is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the terminology capabilities is stored on different servers.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
3308     */
3309    public TerminologyCapabilities setUrlElement(UriType value) { 
3310      this.url = value;
3311      return this;
3312    }
3313
3314    /**
3315     * @return An absolute URI that is used to identify this terminology capabilities when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which at which an authoritative instance of this terminology capabilities is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the terminology capabilities is stored on different servers.
3316     */
3317    public String getUrl() { 
3318      return this.url == null ? null : this.url.getValue();
3319    }
3320
3321    /**
3322     * @param value An absolute URI that is used to identify this terminology capabilities when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which at which an authoritative instance of this terminology capabilities is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the terminology capabilities is stored on different servers.
3323     */
3324    public TerminologyCapabilities setUrl(String value) { 
3325      if (Utilities.noString(value))
3326        this.url = null;
3327      else {
3328        if (this.url == null)
3329          this.url = new UriType();
3330        this.url.setValue(value);
3331      }
3332      return this;
3333    }
3334
3335    /**
3336     * @return {@link #version} (The identifier that is used to identify this version of the terminology capabilities when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the terminology capabilities 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
3337     */
3338    public StringType getVersionElement() { 
3339      if (this.version == null)
3340        if (Configuration.errorOnAutoCreate())
3341          throw new Error("Attempt to auto-create TerminologyCapabilities.version");
3342        else if (Configuration.doAutoCreate())
3343          this.version = new StringType(); // bb
3344      return this.version;
3345    }
3346
3347    public boolean hasVersionElement() { 
3348      return this.version != null && !this.version.isEmpty();
3349    }
3350
3351    public boolean hasVersion() { 
3352      return this.version != null && !this.version.isEmpty();
3353    }
3354
3355    /**
3356     * @param value {@link #version} (The identifier that is used to identify this version of the terminology capabilities when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the terminology capabilities 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
3357     */
3358    public TerminologyCapabilities setVersionElement(StringType value) { 
3359      this.version = value;
3360      return this;
3361    }
3362
3363    /**
3364     * @return The identifier that is used to identify this version of the terminology capabilities when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the terminology capabilities 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.
3365     */
3366    public String getVersion() { 
3367      return this.version == null ? null : this.version.getValue();
3368    }
3369
3370    /**
3371     * @param value The identifier that is used to identify this version of the terminology capabilities when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the terminology capabilities 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.
3372     */
3373    public TerminologyCapabilities setVersion(String value) { 
3374      if (Utilities.noString(value))
3375        this.version = null;
3376      else {
3377        if (this.version == null)
3378          this.version = new StringType();
3379        this.version.setValue(value);
3380      }
3381      return this;
3382    }
3383
3384    /**
3385     * @return {@link #name} (A natural language name identifying the terminology capabilities. 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
3386     */
3387    public StringType getNameElement() { 
3388      if (this.name == null)
3389        if (Configuration.errorOnAutoCreate())
3390          throw new Error("Attempt to auto-create TerminologyCapabilities.name");
3391        else if (Configuration.doAutoCreate())
3392          this.name = new StringType(); // bb
3393      return this.name;
3394    }
3395
3396    public boolean hasNameElement() { 
3397      return this.name != null && !this.name.isEmpty();
3398    }
3399
3400    public boolean hasName() { 
3401      return this.name != null && !this.name.isEmpty();
3402    }
3403
3404    /**
3405     * @param value {@link #name} (A natural language name identifying the terminology capabilities. 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
3406     */
3407    public TerminologyCapabilities setNameElement(StringType value) { 
3408      this.name = value;
3409      return this;
3410    }
3411
3412    /**
3413     * @return A natural language name identifying the terminology capabilities. This name should be usable as an identifier for the module by machine processing applications such as code generation.
3414     */
3415    public String getName() { 
3416      return this.name == null ? null : this.name.getValue();
3417    }
3418
3419    /**
3420     * @param value A natural language name identifying the terminology capabilities. This name should be usable as an identifier for the module by machine processing applications such as code generation.
3421     */
3422    public TerminologyCapabilities setName(String value) { 
3423      if (Utilities.noString(value))
3424        this.name = null;
3425      else {
3426        if (this.name == null)
3427          this.name = new StringType();
3428        this.name.setValue(value);
3429      }
3430      return this;
3431    }
3432
3433    /**
3434     * @return {@link #title} (A short, descriptive, user-friendly title for the terminology capabilities.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
3435     */
3436    public StringType getTitleElement() { 
3437      if (this.title == null)
3438        if (Configuration.errorOnAutoCreate())
3439          throw new Error("Attempt to auto-create TerminologyCapabilities.title");
3440        else if (Configuration.doAutoCreate())
3441          this.title = new StringType(); // bb
3442      return this.title;
3443    }
3444
3445    public boolean hasTitleElement() { 
3446      return this.title != null && !this.title.isEmpty();
3447    }
3448
3449    public boolean hasTitle() { 
3450      return this.title != null && !this.title.isEmpty();
3451    }
3452
3453    /**
3454     * @param value {@link #title} (A short, descriptive, user-friendly title for the terminology capabilities.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
3455     */
3456    public TerminologyCapabilities setTitleElement(StringType value) { 
3457      this.title = value;
3458      return this;
3459    }
3460
3461    /**
3462     * @return A short, descriptive, user-friendly title for the terminology capabilities.
3463     */
3464    public String getTitle() { 
3465      return this.title == null ? null : this.title.getValue();
3466    }
3467
3468    /**
3469     * @param value A short, descriptive, user-friendly title for the terminology capabilities.
3470     */
3471    public TerminologyCapabilities setTitle(String value) { 
3472      if (Utilities.noString(value))
3473        this.title = null;
3474      else {
3475        if (this.title == null)
3476          this.title = new StringType();
3477        this.title.setValue(value);
3478      }
3479      return this;
3480    }
3481
3482    /**
3483     * @return {@link #status} (The status of this terminology capabilities. 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
3484     */
3485    public Enumeration<PublicationStatus> getStatusElement() { 
3486      if (this.status == null)
3487        if (Configuration.errorOnAutoCreate())
3488          throw new Error("Attempt to auto-create TerminologyCapabilities.status");
3489        else if (Configuration.doAutoCreate())
3490          this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory()); // bb
3491      return this.status;
3492    }
3493
3494    public boolean hasStatusElement() { 
3495      return this.status != null && !this.status.isEmpty();
3496    }
3497
3498    public boolean hasStatus() { 
3499      return this.status != null && !this.status.isEmpty();
3500    }
3501
3502    /**
3503     * @param value {@link #status} (The status of this terminology capabilities. 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
3504     */
3505    public TerminologyCapabilities setStatusElement(Enumeration<PublicationStatus> value) { 
3506      this.status = value;
3507      return this;
3508    }
3509
3510    /**
3511     * @return The status of this terminology capabilities. Enables tracking the life-cycle of the content.
3512     */
3513    public PublicationStatus getStatus() { 
3514      return this.status == null ? null : this.status.getValue();
3515    }
3516
3517    /**
3518     * @param value The status of this terminology capabilities. Enables tracking the life-cycle of the content.
3519     */
3520    public TerminologyCapabilities setStatus(PublicationStatus value) { 
3521        if (this.status == null)
3522          this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory());
3523        this.status.setValue(value);
3524      return this;
3525    }
3526
3527    /**
3528     * @return {@link #experimental} (A Boolean value to indicate that this terminology capabilities 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
3529     */
3530    public BooleanType getExperimentalElement() { 
3531      if (this.experimental == null)
3532        if (Configuration.errorOnAutoCreate())
3533          throw new Error("Attempt to auto-create TerminologyCapabilities.experimental");
3534        else if (Configuration.doAutoCreate())
3535          this.experimental = new BooleanType(); // bb
3536      return this.experimental;
3537    }
3538
3539    public boolean hasExperimentalElement() { 
3540      return this.experimental != null && !this.experimental.isEmpty();
3541    }
3542
3543    public boolean hasExperimental() { 
3544      return this.experimental != null && !this.experimental.isEmpty();
3545    }
3546
3547    /**
3548     * @param value {@link #experimental} (A Boolean value to indicate that this terminology capabilities 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
3549     */
3550    public TerminologyCapabilities setExperimentalElement(BooleanType value) { 
3551      this.experimental = value;
3552      return this;
3553    }
3554
3555    /**
3556     * @return A Boolean value to indicate that this terminology capabilities is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.
3557     */
3558    public boolean getExperimental() { 
3559      return this.experimental == null || this.experimental.isEmpty() ? false : this.experimental.getValue();
3560    }
3561
3562    /**
3563     * @param value A Boolean value to indicate that this terminology capabilities is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.
3564     */
3565    public TerminologyCapabilities setExperimental(boolean value) { 
3566        if (this.experimental == null)
3567          this.experimental = new BooleanType();
3568        this.experimental.setValue(value);
3569      return this;
3570    }
3571
3572    /**
3573     * @return {@link #date} (The date  (and optionally time) when the terminology capabilities was published. The date must change 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 terminology capabilities changes.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
3574     */
3575    public DateTimeType getDateElement() { 
3576      if (this.date == null)
3577        if (Configuration.errorOnAutoCreate())
3578          throw new Error("Attempt to auto-create TerminologyCapabilities.date");
3579        else if (Configuration.doAutoCreate())
3580          this.date = new DateTimeType(); // bb
3581      return this.date;
3582    }
3583
3584    public boolean hasDateElement() { 
3585      return this.date != null && !this.date.isEmpty();
3586    }
3587
3588    public boolean hasDate() { 
3589      return this.date != null && !this.date.isEmpty();
3590    }
3591
3592    /**
3593     * @param value {@link #date} (The date  (and optionally time) when the terminology capabilities was published. The date must change 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 terminology capabilities changes.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
3594     */
3595    public TerminologyCapabilities setDateElement(DateTimeType value) { 
3596      this.date = value;
3597      return this;
3598    }
3599
3600    /**
3601     * @return The date  (and optionally time) when the terminology capabilities was published. The date must change 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 terminology capabilities changes.
3602     */
3603    public Date getDate() { 
3604      return this.date == null ? null : this.date.getValue();
3605    }
3606
3607    /**
3608     * @param value The date  (and optionally time) when the terminology capabilities was published. The date must change 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 terminology capabilities changes.
3609     */
3610    public TerminologyCapabilities setDate(Date value) { 
3611        if (this.date == null)
3612          this.date = new DateTimeType();
3613        this.date.setValue(value);
3614      return this;
3615    }
3616
3617    /**
3618     * @return {@link #publisher} (The name of the organization or individual that published the terminology capabilities.). This is the underlying object with id, value and extensions. The accessor "getPublisher" gives direct access to the value
3619     */
3620    public StringType getPublisherElement() { 
3621      if (this.publisher == null)
3622        if (Configuration.errorOnAutoCreate())
3623          throw new Error("Attempt to auto-create TerminologyCapabilities.publisher");
3624        else if (Configuration.doAutoCreate())
3625          this.publisher = new StringType(); // bb
3626      return this.publisher;
3627    }
3628
3629    public boolean hasPublisherElement() { 
3630      return this.publisher != null && !this.publisher.isEmpty();
3631    }
3632
3633    public boolean hasPublisher() { 
3634      return this.publisher != null && !this.publisher.isEmpty();
3635    }
3636
3637    /**
3638     * @param value {@link #publisher} (The name of the organization or individual that published the terminology capabilities.). This is the underlying object with id, value and extensions. The accessor "getPublisher" gives direct access to the value
3639     */
3640    public TerminologyCapabilities setPublisherElement(StringType value) { 
3641      this.publisher = value;
3642      return this;
3643    }
3644
3645    /**
3646     * @return The name of the organization or individual that published the terminology capabilities.
3647     */
3648    public String getPublisher() { 
3649      return this.publisher == null ? null : this.publisher.getValue();
3650    }
3651
3652    /**
3653     * @param value The name of the organization or individual that published the terminology capabilities.
3654     */
3655    public TerminologyCapabilities setPublisher(String value) { 
3656      if (Utilities.noString(value))
3657        this.publisher = null;
3658      else {
3659        if (this.publisher == null)
3660          this.publisher = new StringType();
3661        this.publisher.setValue(value);
3662      }
3663      return this;
3664    }
3665
3666    /**
3667     * @return {@link #contact} (Contact details to assist a user in finding and communicating with the publisher.)
3668     */
3669    public List<ContactDetail> getContact() { 
3670      if (this.contact == null)
3671        this.contact = new ArrayList<ContactDetail>();
3672      return this.contact;
3673    }
3674
3675    /**
3676     * @return Returns a reference to <code>this</code> for easy method chaining
3677     */
3678    public TerminologyCapabilities setContact(List<ContactDetail> theContact) { 
3679      this.contact = theContact;
3680      return this;
3681    }
3682
3683    public boolean hasContact() { 
3684      if (this.contact == null)
3685        return false;
3686      for (ContactDetail item : this.contact)
3687        if (!item.isEmpty())
3688          return true;
3689      return false;
3690    }
3691
3692    public ContactDetail addContact() { //3
3693      ContactDetail t = new ContactDetail();
3694      if (this.contact == null)
3695        this.contact = new ArrayList<ContactDetail>();
3696      this.contact.add(t);
3697      return t;
3698    }
3699
3700    public TerminologyCapabilities addContact(ContactDetail t) { //3
3701      if (t == null)
3702        return this;
3703      if (this.contact == null)
3704        this.contact = new ArrayList<ContactDetail>();
3705      this.contact.add(t);
3706      return this;
3707    }
3708
3709    /**
3710     * @return The first repetition of repeating field {@link #contact}, creating it if it does not already exist
3711     */
3712    public ContactDetail getContactFirstRep() { 
3713      if (getContact().isEmpty()) {
3714        addContact();
3715      }
3716      return getContact().get(0);
3717    }
3718
3719    /**
3720     * @return {@link #description} (A free text natural language description of the terminology capabilities from a consumer's perspective. Typically, this is used when the capability statement describes a desired rather than an actual solution, for example as a formal expression of requirements as part of an RFP.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
3721     */
3722    public MarkdownType getDescriptionElement() { 
3723      if (this.description == null)
3724        if (Configuration.errorOnAutoCreate())
3725          throw new Error("Attempt to auto-create TerminologyCapabilities.description");
3726        else if (Configuration.doAutoCreate())
3727          this.description = new MarkdownType(); // bb
3728      return this.description;
3729    }
3730
3731    public boolean hasDescriptionElement() { 
3732      return this.description != null && !this.description.isEmpty();
3733    }
3734
3735    public boolean hasDescription() { 
3736      return this.description != null && !this.description.isEmpty();
3737    }
3738
3739    /**
3740     * @param value {@link #description} (A free text natural language description of the terminology capabilities from a consumer's perspective. Typically, this is used when the capability statement describes a desired rather than an actual solution, for example as a formal expression of requirements as part of an RFP.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
3741     */
3742    public TerminologyCapabilities setDescriptionElement(MarkdownType value) { 
3743      this.description = value;
3744      return this;
3745    }
3746
3747    /**
3748     * @return A free text natural language description of the terminology capabilities from a consumer's perspective. Typically, this is used when the capability statement describes a desired rather than an actual solution, for example as a formal expression of requirements as part of an RFP.
3749     */
3750    public String getDescription() { 
3751      return this.description == null ? null : this.description.getValue();
3752    }
3753
3754    /**
3755     * @param value A free text natural language description of the terminology capabilities from a consumer's perspective. Typically, this is used when the capability statement describes a desired rather than an actual solution, for example as a formal expression of requirements as part of an RFP.
3756     */
3757    public TerminologyCapabilities setDescription(String value) { 
3758      if (value == null)
3759        this.description = null;
3760      else {
3761        if (this.description == null)
3762          this.description = new MarkdownType();
3763        this.description.setValue(value);
3764      }
3765      return this;
3766    }
3767
3768    /**
3769     * @return {@link #useContext} (The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate terminology capabilities instances.)
3770     */
3771    public List<UsageContext> getUseContext() { 
3772      if (this.useContext == null)
3773        this.useContext = new ArrayList<UsageContext>();
3774      return this.useContext;
3775    }
3776
3777    /**
3778     * @return Returns a reference to <code>this</code> for easy method chaining
3779     */
3780    public TerminologyCapabilities setUseContext(List<UsageContext> theUseContext) { 
3781      this.useContext = theUseContext;
3782      return this;
3783    }
3784
3785    public boolean hasUseContext() { 
3786      if (this.useContext == null)
3787        return false;
3788      for (UsageContext item : this.useContext)
3789        if (!item.isEmpty())
3790          return true;
3791      return false;
3792    }
3793
3794    public UsageContext addUseContext() { //3
3795      UsageContext t = new UsageContext();
3796      if (this.useContext == null)
3797        this.useContext = new ArrayList<UsageContext>();
3798      this.useContext.add(t);
3799      return t;
3800    }
3801
3802    public TerminologyCapabilities addUseContext(UsageContext t) { //3
3803      if (t == null)
3804        return this;
3805      if (this.useContext == null)
3806        this.useContext = new ArrayList<UsageContext>();
3807      this.useContext.add(t);
3808      return this;
3809    }
3810
3811    /**
3812     * @return The first repetition of repeating field {@link #useContext}, creating it if it does not already exist
3813     */
3814    public UsageContext getUseContextFirstRep() { 
3815      if (getUseContext().isEmpty()) {
3816        addUseContext();
3817      }
3818      return getUseContext().get(0);
3819    }
3820
3821    /**
3822     * @return {@link #jurisdiction} (A legal or geographic region in which the terminology capabilities is intended to be used.)
3823     */
3824    public List<CodeableConcept> getJurisdiction() { 
3825      if (this.jurisdiction == null)
3826        this.jurisdiction = new ArrayList<CodeableConcept>();
3827      return this.jurisdiction;
3828    }
3829
3830    /**
3831     * @return Returns a reference to <code>this</code> for easy method chaining
3832     */
3833    public TerminologyCapabilities setJurisdiction(List<CodeableConcept> theJurisdiction) { 
3834      this.jurisdiction = theJurisdiction;
3835      return this;
3836    }
3837
3838    public boolean hasJurisdiction() { 
3839      if (this.jurisdiction == null)
3840        return false;
3841      for (CodeableConcept item : this.jurisdiction)
3842        if (!item.isEmpty())
3843          return true;
3844      return false;
3845    }
3846
3847    public CodeableConcept addJurisdiction() { //3
3848      CodeableConcept t = new CodeableConcept();
3849      if (this.jurisdiction == null)
3850        this.jurisdiction = new ArrayList<CodeableConcept>();
3851      this.jurisdiction.add(t);
3852      return t;
3853    }
3854
3855    public TerminologyCapabilities addJurisdiction(CodeableConcept t) { //3
3856      if (t == null)
3857        return this;
3858      if (this.jurisdiction == null)
3859        this.jurisdiction = new ArrayList<CodeableConcept>();
3860      this.jurisdiction.add(t);
3861      return this;
3862    }
3863
3864    /**
3865     * @return The first repetition of repeating field {@link #jurisdiction}, creating it if it does not already exist
3866     */
3867    public CodeableConcept getJurisdictionFirstRep() { 
3868      if (getJurisdiction().isEmpty()) {
3869        addJurisdiction();
3870      }
3871      return getJurisdiction().get(0);
3872    }
3873
3874    /**
3875     * @return {@link #purpose} (Explanation of why this terminology capabilities 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
3876     */
3877    public MarkdownType getPurposeElement() { 
3878      if (this.purpose == null)
3879        if (Configuration.errorOnAutoCreate())
3880          throw new Error("Attempt to auto-create TerminologyCapabilities.purpose");
3881        else if (Configuration.doAutoCreate())
3882          this.purpose = new MarkdownType(); // bb
3883      return this.purpose;
3884    }
3885
3886    public boolean hasPurposeElement() { 
3887      return this.purpose != null && !this.purpose.isEmpty();
3888    }
3889
3890    public boolean hasPurpose() { 
3891      return this.purpose != null && !this.purpose.isEmpty();
3892    }
3893
3894    /**
3895     * @param value {@link #purpose} (Explanation of why this terminology capabilities 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
3896     */
3897    public TerminologyCapabilities setPurposeElement(MarkdownType value) { 
3898      this.purpose = value;
3899      return this;
3900    }
3901
3902    /**
3903     * @return Explanation of why this terminology capabilities is needed and why it has been designed as it has.
3904     */
3905    public String getPurpose() { 
3906      return this.purpose == null ? null : this.purpose.getValue();
3907    }
3908
3909    /**
3910     * @param value Explanation of why this terminology capabilities is needed and why it has been designed as it has.
3911     */
3912    public TerminologyCapabilities setPurpose(String value) { 
3913      if (value == null)
3914        this.purpose = null;
3915      else {
3916        if (this.purpose == null)
3917          this.purpose = new MarkdownType();
3918        this.purpose.setValue(value);
3919      }
3920      return this;
3921    }
3922
3923    /**
3924     * @return {@link #copyright} (A copyright statement relating to the terminology capabilities and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the terminology capabilities.). This is the underlying object with id, value and extensions. The accessor "getCopyright" gives direct access to the value
3925     */
3926    public MarkdownType getCopyrightElement() { 
3927      if (this.copyright == null)
3928        if (Configuration.errorOnAutoCreate())
3929          throw new Error("Attempt to auto-create TerminologyCapabilities.copyright");
3930        else if (Configuration.doAutoCreate())
3931          this.copyright = new MarkdownType(); // bb
3932      return this.copyright;
3933    }
3934
3935    public boolean hasCopyrightElement() { 
3936      return this.copyright != null && !this.copyright.isEmpty();
3937    }
3938
3939    public boolean hasCopyright() { 
3940      return this.copyright != null && !this.copyright.isEmpty();
3941    }
3942
3943    /**
3944     * @param value {@link #copyright} (A copyright statement relating to the terminology capabilities and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the terminology capabilities.). This is the underlying object with id, value and extensions. The accessor "getCopyright" gives direct access to the value
3945     */
3946    public TerminologyCapabilities setCopyrightElement(MarkdownType value) { 
3947      this.copyright = value;
3948      return this;
3949    }
3950
3951    /**
3952     * @return A copyright statement relating to the terminology capabilities and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the terminology capabilities.
3953     */
3954    public String getCopyright() { 
3955      return this.copyright == null ? null : this.copyright.getValue();
3956    }
3957
3958    /**
3959     * @param value A copyright statement relating to the terminology capabilities and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the terminology capabilities.
3960     */
3961    public TerminologyCapabilities setCopyright(String value) { 
3962      if (value == null)
3963        this.copyright = null;
3964      else {
3965        if (this.copyright == null)
3966          this.copyright = new MarkdownType();
3967        this.copyright.setValue(value);
3968      }
3969      return this;
3970    }
3971
3972    /**
3973     * @return {@link #kind} (The way that this statement is intended to be used, to describe an actual running instance of software, a particular product (kind, not instance of software) or a class of implementation (e.g. a desired purchase).). This is the underlying object with id, value and extensions. The accessor "getKind" gives direct access to the value
3974     */
3975    public Enumeration<CapabilityStatementKind> getKindElement() { 
3976      if (this.kind == null)
3977        if (Configuration.errorOnAutoCreate())
3978          throw new Error("Attempt to auto-create TerminologyCapabilities.kind");
3979        else if (Configuration.doAutoCreate())
3980          this.kind = new Enumeration<CapabilityStatementKind>(new CapabilityStatementKindEnumFactory()); // bb
3981      return this.kind;
3982    }
3983
3984    public boolean hasKindElement() { 
3985      return this.kind != null && !this.kind.isEmpty();
3986    }
3987
3988    public boolean hasKind() { 
3989      return this.kind != null && !this.kind.isEmpty();
3990    }
3991
3992    /**
3993     * @param value {@link #kind} (The way that this statement is intended to be used, to describe an actual running instance of software, a particular product (kind, not instance of software) or a class of implementation (e.g. a desired purchase).). This is the underlying object with id, value and extensions. The accessor "getKind" gives direct access to the value
3994     */
3995    public TerminologyCapabilities setKindElement(Enumeration<CapabilityStatementKind> value) { 
3996      this.kind = value;
3997      return this;
3998    }
3999
4000    /**
4001     * @return The way that this statement is intended to be used, to describe an actual running instance of software, a particular product (kind, not instance of software) or a class of implementation (e.g. a desired purchase).
4002     */
4003    public CapabilityStatementKind getKind() { 
4004      return this.kind == null ? null : this.kind.getValue();
4005    }
4006
4007    /**
4008     * @param value The way that this statement is intended to be used, to describe an actual running instance of software, a particular product (kind, not instance of software) or a class of implementation (e.g. a desired purchase).
4009     */
4010    public TerminologyCapabilities setKind(CapabilityStatementKind value) { 
4011        if (this.kind == null)
4012          this.kind = new Enumeration<CapabilityStatementKind>(new CapabilityStatementKindEnumFactory());
4013        this.kind.setValue(value);
4014      return this;
4015    }
4016
4017    /**
4018     * @return {@link #software} (Software that is covered by this terminology capability statement.  It is used when the statement describes the capabilities of a particular software version, independent of an installation.)
4019     */
4020    public TerminologyCapabilitiesSoftwareComponent getSoftware() { 
4021      if (this.software == null)
4022        if (Configuration.errorOnAutoCreate())
4023          throw new Error("Attempt to auto-create TerminologyCapabilities.software");
4024        else if (Configuration.doAutoCreate())
4025          this.software = new TerminologyCapabilitiesSoftwareComponent(); // cc
4026      return this.software;
4027    }
4028
4029    public boolean hasSoftware() { 
4030      return this.software != null && !this.software.isEmpty();
4031    }
4032
4033    /**
4034     * @param value {@link #software} (Software that is covered by this terminology capability statement.  It is used when the statement describes the capabilities of a particular software version, independent of an installation.)
4035     */
4036    public TerminologyCapabilities setSoftware(TerminologyCapabilitiesSoftwareComponent value) { 
4037      this.software = value;
4038      return this;
4039    }
4040
4041    /**
4042     * @return {@link #implementation} (Identifies a specific implementation instance that is described by the terminology capability statement - i.e. a particular installation, rather than the capabilities of a software program.)
4043     */
4044    public TerminologyCapabilitiesImplementationComponent getImplementation() { 
4045      if (this.implementation == null)
4046        if (Configuration.errorOnAutoCreate())
4047          throw new Error("Attempt to auto-create TerminologyCapabilities.implementation");
4048        else if (Configuration.doAutoCreate())
4049          this.implementation = new TerminologyCapabilitiesImplementationComponent(); // cc
4050      return this.implementation;
4051    }
4052
4053    public boolean hasImplementation() { 
4054      return this.implementation != null && !this.implementation.isEmpty();
4055    }
4056
4057    /**
4058     * @param value {@link #implementation} (Identifies a specific implementation instance that is described by the terminology capability statement - i.e. a particular installation, rather than the capabilities of a software program.)
4059     */
4060    public TerminologyCapabilities setImplementation(TerminologyCapabilitiesImplementationComponent value) { 
4061      this.implementation = value;
4062      return this;
4063    }
4064
4065    /**
4066     * @return {@link #lockedDate} (Whether the server supports lockedDate.). This is the underlying object with id, value and extensions. The accessor "getLockedDate" gives direct access to the value
4067     */
4068    public BooleanType getLockedDateElement() { 
4069      if (this.lockedDate == null)
4070        if (Configuration.errorOnAutoCreate())
4071          throw new Error("Attempt to auto-create TerminologyCapabilities.lockedDate");
4072        else if (Configuration.doAutoCreate())
4073          this.lockedDate = new BooleanType(); // bb
4074      return this.lockedDate;
4075    }
4076
4077    public boolean hasLockedDateElement() { 
4078      return this.lockedDate != null && !this.lockedDate.isEmpty();
4079    }
4080
4081    public boolean hasLockedDate() { 
4082      return this.lockedDate != null && !this.lockedDate.isEmpty();
4083    }
4084
4085    /**
4086     * @param value {@link #lockedDate} (Whether the server supports lockedDate.). This is the underlying object with id, value and extensions. The accessor "getLockedDate" gives direct access to the value
4087     */
4088    public TerminologyCapabilities setLockedDateElement(BooleanType value) { 
4089      this.lockedDate = value;
4090      return this;
4091    }
4092
4093    /**
4094     * @return Whether the server supports lockedDate.
4095     */
4096    public boolean getLockedDate() { 
4097      return this.lockedDate == null || this.lockedDate.isEmpty() ? false : this.lockedDate.getValue();
4098    }
4099
4100    /**
4101     * @param value Whether the server supports lockedDate.
4102     */
4103    public TerminologyCapabilities setLockedDate(boolean value) { 
4104        if (this.lockedDate == null)
4105          this.lockedDate = new BooleanType();
4106        this.lockedDate.setValue(value);
4107      return this;
4108    }
4109
4110    /**
4111     * @return {@link #codeSystem} (Identifies a code system that is supported by the server. If there is a no code system URL, then this declares the general assumptions a client can make about support for any CodeSystem resource.)
4112     */
4113    public List<TerminologyCapabilitiesCodeSystemComponent> getCodeSystem() { 
4114      if (this.codeSystem == null)
4115        this.codeSystem = new ArrayList<TerminologyCapabilitiesCodeSystemComponent>();
4116      return this.codeSystem;
4117    }
4118
4119    /**
4120     * @return Returns a reference to <code>this</code> for easy method chaining
4121     */
4122    public TerminologyCapabilities setCodeSystem(List<TerminologyCapabilitiesCodeSystemComponent> theCodeSystem) { 
4123      this.codeSystem = theCodeSystem;
4124      return this;
4125    }
4126
4127    public boolean hasCodeSystem() { 
4128      if (this.codeSystem == null)
4129        return false;
4130      for (TerminologyCapabilitiesCodeSystemComponent item : this.codeSystem)
4131        if (!item.isEmpty())
4132          return true;
4133      return false;
4134    }
4135
4136    public TerminologyCapabilitiesCodeSystemComponent addCodeSystem() { //3
4137      TerminologyCapabilitiesCodeSystemComponent t = new TerminologyCapabilitiesCodeSystemComponent();
4138      if (this.codeSystem == null)
4139        this.codeSystem = new ArrayList<TerminologyCapabilitiesCodeSystemComponent>();
4140      this.codeSystem.add(t);
4141      return t;
4142    }
4143
4144    public TerminologyCapabilities addCodeSystem(TerminologyCapabilitiesCodeSystemComponent t) { //3
4145      if (t == null)
4146        return this;
4147      if (this.codeSystem == null)
4148        this.codeSystem = new ArrayList<TerminologyCapabilitiesCodeSystemComponent>();
4149      this.codeSystem.add(t);
4150      return this;
4151    }
4152
4153    /**
4154     * @return The first repetition of repeating field {@link #codeSystem}, creating it if it does not already exist
4155     */
4156    public TerminologyCapabilitiesCodeSystemComponent getCodeSystemFirstRep() { 
4157      if (getCodeSystem().isEmpty()) {
4158        addCodeSystem();
4159      }
4160      return getCodeSystem().get(0);
4161    }
4162
4163    /**
4164     * @return {@link #expansion} (Information about the [ValueSet/$expand](valueset-operation-expand.html) operation.)
4165     */
4166    public TerminologyCapabilitiesExpansionComponent getExpansion() { 
4167      if (this.expansion == null)
4168        if (Configuration.errorOnAutoCreate())
4169          throw new Error("Attempt to auto-create TerminologyCapabilities.expansion");
4170        else if (Configuration.doAutoCreate())
4171          this.expansion = new TerminologyCapabilitiesExpansionComponent(); // cc
4172      return this.expansion;
4173    }
4174
4175    public boolean hasExpansion() { 
4176      return this.expansion != null && !this.expansion.isEmpty();
4177    }
4178
4179    /**
4180     * @param value {@link #expansion} (Information about the [ValueSet/$expand](valueset-operation-expand.html) operation.)
4181     */
4182    public TerminologyCapabilities setExpansion(TerminologyCapabilitiesExpansionComponent value) { 
4183      this.expansion = value;
4184      return this;
4185    }
4186
4187    /**
4188     * @return {@link #codeSearch} (The degree to which the server supports the code search parameter on ValueSet, if it is supported.). This is the underlying object with id, value and extensions. The accessor "getCodeSearch" gives direct access to the value
4189     */
4190    public Enumeration<CodeSearchSupport> getCodeSearchElement() { 
4191      if (this.codeSearch == null)
4192        if (Configuration.errorOnAutoCreate())
4193          throw new Error("Attempt to auto-create TerminologyCapabilities.codeSearch");
4194        else if (Configuration.doAutoCreate())
4195          this.codeSearch = new Enumeration<CodeSearchSupport>(new CodeSearchSupportEnumFactory()); // bb
4196      return this.codeSearch;
4197    }
4198
4199    public boolean hasCodeSearchElement() { 
4200      return this.codeSearch != null && !this.codeSearch.isEmpty();
4201    }
4202
4203    public boolean hasCodeSearch() { 
4204      return this.codeSearch != null && !this.codeSearch.isEmpty();
4205    }
4206
4207    /**
4208     * @param value {@link #codeSearch} (The degree to which the server supports the code search parameter on ValueSet, if it is supported.). This is the underlying object with id, value and extensions. The accessor "getCodeSearch" gives direct access to the value
4209     */
4210    public TerminologyCapabilities setCodeSearchElement(Enumeration<CodeSearchSupport> value) { 
4211      this.codeSearch = value;
4212      return this;
4213    }
4214
4215    /**
4216     * @return The degree to which the server supports the code search parameter on ValueSet, if it is supported.
4217     */
4218    public CodeSearchSupport getCodeSearch() { 
4219      return this.codeSearch == null ? null : this.codeSearch.getValue();
4220    }
4221
4222    /**
4223     * @param value The degree to which the server supports the code search parameter on ValueSet, if it is supported.
4224     */
4225    public TerminologyCapabilities setCodeSearch(CodeSearchSupport value) { 
4226      if (value == null)
4227        this.codeSearch = null;
4228      else {
4229        if (this.codeSearch == null)
4230          this.codeSearch = new Enumeration<CodeSearchSupport>(new CodeSearchSupportEnumFactory());
4231        this.codeSearch.setValue(value);
4232      }
4233      return this;
4234    }
4235
4236    /**
4237     * @return {@link #validateCode} (Information about the [ValueSet/$validate-code](valueset-operation-validate-code.html) operation.)
4238     */
4239    public TerminologyCapabilitiesValidateCodeComponent getValidateCode() { 
4240      if (this.validateCode == null)
4241        if (Configuration.errorOnAutoCreate())
4242          throw new Error("Attempt to auto-create TerminologyCapabilities.validateCode");
4243        else if (Configuration.doAutoCreate())
4244          this.validateCode = new TerminologyCapabilitiesValidateCodeComponent(); // cc
4245      return this.validateCode;
4246    }
4247
4248    public boolean hasValidateCode() { 
4249      return this.validateCode != null && !this.validateCode.isEmpty();
4250    }
4251
4252    /**
4253     * @param value {@link #validateCode} (Information about the [ValueSet/$validate-code](valueset-operation-validate-code.html) operation.)
4254     */
4255    public TerminologyCapabilities setValidateCode(TerminologyCapabilitiesValidateCodeComponent value) { 
4256      this.validateCode = value;
4257      return this;
4258    }
4259
4260    /**
4261     * @return {@link #translation} (Information about the [ConceptMap/$translate](conceptmap-operation-translate.html) operation.)
4262     */
4263    public TerminologyCapabilitiesTranslationComponent getTranslation() { 
4264      if (this.translation == null)
4265        if (Configuration.errorOnAutoCreate())
4266          throw new Error("Attempt to auto-create TerminologyCapabilities.translation");
4267        else if (Configuration.doAutoCreate())
4268          this.translation = new TerminologyCapabilitiesTranslationComponent(); // cc
4269      return this.translation;
4270    }
4271
4272    public boolean hasTranslation() { 
4273      return this.translation != null && !this.translation.isEmpty();
4274    }
4275
4276    /**
4277     * @param value {@link #translation} (Information about the [ConceptMap/$translate](conceptmap-operation-translate.html) operation.)
4278     */
4279    public TerminologyCapabilities setTranslation(TerminologyCapabilitiesTranslationComponent value) { 
4280      this.translation = value;
4281      return this;
4282    }
4283
4284    /**
4285     * @return {@link #closure} (Whether the $closure operation is supported.)
4286     */
4287    public TerminologyCapabilitiesClosureComponent getClosure() { 
4288      if (this.closure == null)
4289        if (Configuration.errorOnAutoCreate())
4290          throw new Error("Attempt to auto-create TerminologyCapabilities.closure");
4291        else if (Configuration.doAutoCreate())
4292          this.closure = new TerminologyCapabilitiesClosureComponent(); // cc
4293      return this.closure;
4294    }
4295
4296    public boolean hasClosure() { 
4297      return this.closure != null && !this.closure.isEmpty();
4298    }
4299
4300    /**
4301     * @param value {@link #closure} (Whether the $closure operation is supported.)
4302     */
4303    public TerminologyCapabilities setClosure(TerminologyCapabilitiesClosureComponent value) { 
4304      this.closure = value;
4305      return this;
4306    }
4307
4308      protected void listChildren(List<Property> children) {
4309        super.listChildren(children);
4310        children.add(new Property("url", "uri", "An absolute URI that is used to identify this terminology capabilities when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which at which an authoritative instance of this terminology capabilities is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the terminology capabilities is stored on different servers.", 0, 1, url));
4311        children.add(new Property("version", "string", "The identifier that is used to identify this version of the terminology capabilities when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the terminology capabilities 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));
4312        children.add(new Property("name", "string", "A natural language name identifying the terminology capabilities. This name should be usable as an identifier for the module by machine processing applications such as code generation.", 0, 1, name));
4313        children.add(new Property("title", "string", "A short, descriptive, user-friendly title for the terminology capabilities.", 0, 1, title));
4314        children.add(new Property("status", "code", "The status of this terminology capabilities. Enables tracking the life-cycle of the content.", 0, 1, status));
4315        children.add(new Property("experimental", "boolean", "A Boolean value to indicate that this terminology capabilities is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.", 0, 1, experimental));
4316        children.add(new Property("date", "dateTime", "The date  (and optionally time) when the terminology capabilities was published. The date must change 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 terminology capabilities changes.", 0, 1, date));
4317        children.add(new Property("publisher", "string", "The name of the organization or individual that published the terminology capabilities.", 0, 1, publisher));
4318        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));
4319        children.add(new Property("description", "markdown", "A free text natural language description of the terminology capabilities from a consumer's perspective. Typically, this is used when the capability statement describes a desired rather than an actual solution, for example as a formal expression of requirements as part of an RFP.", 0, 1, description));
4320        children.add(new Property("useContext", "UsageContext", "The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate terminology capabilities instances.", 0, java.lang.Integer.MAX_VALUE, useContext));
4321        children.add(new Property("jurisdiction", "CodeableConcept", "A legal or geographic region in which the terminology capabilities is intended to be used.", 0, java.lang.Integer.MAX_VALUE, jurisdiction));
4322        children.add(new Property("purpose", "markdown", "Explanation of why this terminology capabilities is needed and why it has been designed as it has.", 0, 1, purpose));
4323        children.add(new Property("copyright", "markdown", "A copyright statement relating to the terminology capabilities and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the terminology capabilities.", 0, 1, copyright));
4324        children.add(new Property("kind", "code", "The way that this statement is intended to be used, to describe an actual running instance of software, a particular product (kind, not instance of software) or a class of implementation (e.g. a desired purchase).", 0, 1, kind));
4325        children.add(new Property("software", "", "Software that is covered by this terminology capability statement.  It is used when the statement describes the capabilities of a particular software version, independent of an installation.", 0, 1, software));
4326        children.add(new Property("implementation", "", "Identifies a specific implementation instance that is described by the terminology capability statement - i.e. a particular installation, rather than the capabilities of a software program.", 0, 1, implementation));
4327        children.add(new Property("lockedDate", "boolean", "Whether the server supports lockedDate.", 0, 1, lockedDate));
4328        children.add(new Property("codeSystem", "", "Identifies a code system that is supported by the server. If there is a no code system URL, then this declares the general assumptions a client can make about support for any CodeSystem resource.", 0, java.lang.Integer.MAX_VALUE, codeSystem));
4329        children.add(new Property("expansion", "", "Information about the [ValueSet/$expand](valueset-operation-expand.html) operation.", 0, 1, expansion));
4330        children.add(new Property("codeSearch", "code", "The degree to which the server supports the code search parameter on ValueSet, if it is supported.", 0, 1, codeSearch));
4331        children.add(new Property("validateCode", "", "Information about the [ValueSet/$validate-code](valueset-operation-validate-code.html) operation.", 0, 1, validateCode));
4332        children.add(new Property("translation", "", "Information about the [ConceptMap/$translate](conceptmap-operation-translate.html) operation.", 0, 1, translation));
4333        children.add(new Property("closure", "", "Whether the $closure operation is supported.", 0, 1, closure));
4334      }
4335
4336      @Override
4337      public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
4338        switch (_hash) {
4339        case 116079: /*url*/  return new Property("url", "uri", "An absolute URI that is used to identify this terminology capabilities when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which at which an authoritative instance of this terminology capabilities is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the terminology capabilities is stored on different servers.", 0, 1, url);
4340        case 351608024: /*version*/  return new Property("version", "string", "The identifier that is used to identify this version of the terminology capabilities when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the terminology capabilities 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);
4341        case 3373707: /*name*/  return new Property("name", "string", "A natural language name identifying the terminology capabilities. This name should be usable as an identifier for the module by machine processing applications such as code generation.", 0, 1, name);
4342        case 110371416: /*title*/  return new Property("title", "string", "A short, descriptive, user-friendly title for the terminology capabilities.", 0, 1, title);
4343        case -892481550: /*status*/  return new Property("status", "code", "The status of this terminology capabilities. Enables tracking the life-cycle of the content.", 0, 1, status);
4344        case -404562712: /*experimental*/  return new Property("experimental", "boolean", "A Boolean value to indicate that this terminology capabilities is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.", 0, 1, experimental);
4345        case 3076014: /*date*/  return new Property("date", "dateTime", "The date  (and optionally time) when the terminology capabilities was published. The date must change 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 terminology capabilities changes.", 0, 1, date);
4346        case 1447404028: /*publisher*/  return new Property("publisher", "string", "The name of the organization or individual that published the terminology capabilities.", 0, 1, publisher);
4347        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);
4348        case -1724546052: /*description*/  return new Property("description", "markdown", "A free text natural language description of the terminology capabilities from a consumer's perspective. Typically, this is used when the capability statement describes a desired rather than an actual solution, for example as a formal expression of requirements as part of an RFP.", 0, 1, description);
4349        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 contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate terminology capabilities instances.", 0, java.lang.Integer.MAX_VALUE, useContext);
4350        case -507075711: /*jurisdiction*/  return new Property("jurisdiction", "CodeableConcept", "A legal or geographic region in which the terminology capabilities is intended to be used.", 0, java.lang.Integer.MAX_VALUE, jurisdiction);
4351        case -220463842: /*purpose*/  return new Property("purpose", "markdown", "Explanation of why this terminology capabilities is needed and why it has been designed as it has.", 0, 1, purpose);
4352        case 1522889671: /*copyright*/  return new Property("copyright", "markdown", "A copyright statement relating to the terminology capabilities and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the terminology capabilities.", 0, 1, copyright);
4353        case 3292052: /*kind*/  return new Property("kind", "code", "The way that this statement is intended to be used, to describe an actual running instance of software, a particular product (kind, not instance of software) or a class of implementation (e.g. a desired purchase).", 0, 1, kind);
4354        case 1319330215: /*software*/  return new Property("software", "", "Software that is covered by this terminology capability statement.  It is used when the statement describes the capabilities of a particular software version, independent of an installation.", 0, 1, software);
4355        case 1683336114: /*implementation*/  return new Property("implementation", "", "Identifies a specific implementation instance that is described by the terminology capability statement - i.e. a particular installation, rather than the capabilities of a software program.", 0, 1, implementation);
4356        case 1391591896: /*lockedDate*/  return new Property("lockedDate", "boolean", "Whether the server supports lockedDate.", 0, 1, lockedDate);
4357        case -916511108: /*codeSystem*/  return new Property("codeSystem", "", "Identifies a code system that is supported by the server. If there is a no code system URL, then this declares the general assumptions a client can make about support for any CodeSystem resource.", 0, java.lang.Integer.MAX_VALUE, codeSystem);
4358        case 17878207: /*expansion*/  return new Property("expansion", "", "Information about the [ValueSet/$expand](valueset-operation-expand.html) operation.", 0, 1, expansion);
4359        case -935519755: /*codeSearch*/  return new Property("codeSearch", "code", "The degree to which the server supports the code search parameter on ValueSet, if it is supported.", 0, 1, codeSearch);
4360        case 1080737827: /*validateCode*/  return new Property("validateCode", "", "Information about the [ValueSet/$validate-code](valueset-operation-validate-code.html) operation.", 0, 1, validateCode);
4361        case -1840647503: /*translation*/  return new Property("translation", "", "Information about the [ConceptMap/$translate](conceptmap-operation-translate.html) operation.", 0, 1, translation);
4362        case 866552379: /*closure*/  return new Property("closure", "", "Whether the $closure operation is supported.", 0, 1, closure);
4363        default: return super.getNamedProperty(_hash, _name, _checkValid);
4364        }
4365
4366      }
4367
4368      @Override
4369      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
4370        switch (hash) {
4371        case 116079: /*url*/ return this.url == null ? new Base[0] : new Base[] {this.url}; // UriType
4372        case 351608024: /*version*/ return this.version == null ? new Base[0] : new Base[] {this.version}; // StringType
4373        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // StringType
4374        case 110371416: /*title*/ return this.title == null ? new Base[0] : new Base[] {this.title}; // StringType
4375        case -892481550: /*status*/ return this.status == null ? new Base[0] : new Base[] {this.status}; // Enumeration<PublicationStatus>
4376        case -404562712: /*experimental*/ return this.experimental == null ? new Base[0] : new Base[] {this.experimental}; // BooleanType
4377        case 3076014: /*date*/ return this.date == null ? new Base[0] : new Base[] {this.date}; // DateTimeType
4378        case 1447404028: /*publisher*/ return this.publisher == null ? new Base[0] : new Base[] {this.publisher}; // StringType
4379        case 951526432: /*contact*/ return this.contact == null ? new Base[0] : this.contact.toArray(new Base[this.contact.size()]); // ContactDetail
4380        case -1724546052: /*description*/ return this.description == null ? new Base[0] : new Base[] {this.description}; // MarkdownType
4381        case -669707736: /*useContext*/ return this.useContext == null ? new Base[0] : this.useContext.toArray(new Base[this.useContext.size()]); // UsageContext
4382        case -507075711: /*jurisdiction*/ return this.jurisdiction == null ? new Base[0] : this.jurisdiction.toArray(new Base[this.jurisdiction.size()]); // CodeableConcept
4383        case -220463842: /*purpose*/ return this.purpose == null ? new Base[0] : new Base[] {this.purpose}; // MarkdownType
4384        case 1522889671: /*copyright*/ return this.copyright == null ? new Base[0] : new Base[] {this.copyright}; // MarkdownType
4385        case 3292052: /*kind*/ return this.kind == null ? new Base[0] : new Base[] {this.kind}; // Enumeration<CapabilityStatementKind>
4386        case 1319330215: /*software*/ return this.software == null ? new Base[0] : new Base[] {this.software}; // TerminologyCapabilitiesSoftwareComponent
4387        case 1683336114: /*implementation*/ return this.implementation == null ? new Base[0] : new Base[] {this.implementation}; // TerminologyCapabilitiesImplementationComponent
4388        case 1391591896: /*lockedDate*/ return this.lockedDate == null ? new Base[0] : new Base[] {this.lockedDate}; // BooleanType
4389        case -916511108: /*codeSystem*/ return this.codeSystem == null ? new Base[0] : this.codeSystem.toArray(new Base[this.codeSystem.size()]); // TerminologyCapabilitiesCodeSystemComponent
4390        case 17878207: /*expansion*/ return this.expansion == null ? new Base[0] : new Base[] {this.expansion}; // TerminologyCapabilitiesExpansionComponent
4391        case -935519755: /*codeSearch*/ return this.codeSearch == null ? new Base[0] : new Base[] {this.codeSearch}; // Enumeration<CodeSearchSupport>
4392        case 1080737827: /*validateCode*/ return this.validateCode == null ? new Base[0] : new Base[] {this.validateCode}; // TerminologyCapabilitiesValidateCodeComponent
4393        case -1840647503: /*translation*/ return this.translation == null ? new Base[0] : new Base[] {this.translation}; // TerminologyCapabilitiesTranslationComponent
4394        case 866552379: /*closure*/ return this.closure == null ? new Base[0] : new Base[] {this.closure}; // TerminologyCapabilitiesClosureComponent
4395        default: return super.getProperty(hash, name, checkValid);
4396        }
4397
4398      }
4399
4400      @Override
4401      public Base setProperty(int hash, String name, Base value) throws FHIRException {
4402        switch (hash) {
4403        case 116079: // url
4404          this.url = castToUri(value); // UriType
4405          return value;
4406        case 351608024: // version
4407          this.version = castToString(value); // StringType
4408          return value;
4409        case 3373707: // name
4410          this.name = castToString(value); // StringType
4411          return value;
4412        case 110371416: // title
4413          this.title = castToString(value); // StringType
4414          return value;
4415        case -892481550: // status
4416          value = new PublicationStatusEnumFactory().fromType(castToCode(value));
4417          this.status = (Enumeration) value; // Enumeration<PublicationStatus>
4418          return value;
4419        case -404562712: // experimental
4420          this.experimental = castToBoolean(value); // BooleanType
4421          return value;
4422        case 3076014: // date
4423          this.date = castToDateTime(value); // DateTimeType
4424          return value;
4425        case 1447404028: // publisher
4426          this.publisher = castToString(value); // StringType
4427          return value;
4428        case 951526432: // contact
4429          this.getContact().add(castToContactDetail(value)); // ContactDetail
4430          return value;
4431        case -1724546052: // description
4432          this.description = castToMarkdown(value); // MarkdownType
4433          return value;
4434        case -669707736: // useContext
4435          this.getUseContext().add(castToUsageContext(value)); // UsageContext
4436          return value;
4437        case -507075711: // jurisdiction
4438          this.getJurisdiction().add(castToCodeableConcept(value)); // CodeableConcept
4439          return value;
4440        case -220463842: // purpose
4441          this.purpose = castToMarkdown(value); // MarkdownType
4442          return value;
4443        case 1522889671: // copyright
4444          this.copyright = castToMarkdown(value); // MarkdownType
4445          return value;
4446        case 3292052: // kind
4447          value = new CapabilityStatementKindEnumFactory().fromType(castToCode(value));
4448          this.kind = (Enumeration) value; // Enumeration<CapabilityStatementKind>
4449          return value;
4450        case 1319330215: // software
4451          this.software = (TerminologyCapabilitiesSoftwareComponent) value; // TerminologyCapabilitiesSoftwareComponent
4452          return value;
4453        case 1683336114: // implementation
4454          this.implementation = (TerminologyCapabilitiesImplementationComponent) value; // TerminologyCapabilitiesImplementationComponent
4455          return value;
4456        case 1391591896: // lockedDate
4457          this.lockedDate = castToBoolean(value); // BooleanType
4458          return value;
4459        case -916511108: // codeSystem
4460          this.getCodeSystem().add((TerminologyCapabilitiesCodeSystemComponent) value); // TerminologyCapabilitiesCodeSystemComponent
4461          return value;
4462        case 17878207: // expansion
4463          this.expansion = (TerminologyCapabilitiesExpansionComponent) value; // TerminologyCapabilitiesExpansionComponent
4464          return value;
4465        case -935519755: // codeSearch
4466          value = new CodeSearchSupportEnumFactory().fromType(castToCode(value));
4467          this.codeSearch = (Enumeration) value; // Enumeration<CodeSearchSupport>
4468          return value;
4469        case 1080737827: // validateCode
4470          this.validateCode = (TerminologyCapabilitiesValidateCodeComponent) value; // TerminologyCapabilitiesValidateCodeComponent
4471          return value;
4472        case -1840647503: // translation
4473          this.translation = (TerminologyCapabilitiesTranslationComponent) value; // TerminologyCapabilitiesTranslationComponent
4474          return value;
4475        case 866552379: // closure
4476          this.closure = (TerminologyCapabilitiesClosureComponent) value; // TerminologyCapabilitiesClosureComponent
4477          return value;
4478        default: return super.setProperty(hash, name, value);
4479        }
4480
4481      }
4482
4483      @Override
4484      public Base setProperty(String name, Base value) throws FHIRException {
4485        if (name.equals("url")) {
4486          this.url = castToUri(value); // UriType
4487        } else if (name.equals("version")) {
4488          this.version = castToString(value); // StringType
4489        } else if (name.equals("name")) {
4490          this.name = castToString(value); // StringType
4491        } else if (name.equals("title")) {
4492          this.title = castToString(value); // StringType
4493        } else if (name.equals("status")) {
4494          value = new PublicationStatusEnumFactory().fromType(castToCode(value));
4495          this.status = (Enumeration) value; // Enumeration<PublicationStatus>
4496        } else if (name.equals("experimental")) {
4497          this.experimental = castToBoolean(value); // BooleanType
4498        } else if (name.equals("date")) {
4499          this.date = castToDateTime(value); // DateTimeType
4500        } else if (name.equals("publisher")) {
4501          this.publisher = castToString(value); // StringType
4502        } else if (name.equals("contact")) {
4503          this.getContact().add(castToContactDetail(value));
4504        } else if (name.equals("description")) {
4505          this.description = castToMarkdown(value); // MarkdownType
4506        } else if (name.equals("useContext")) {
4507          this.getUseContext().add(castToUsageContext(value));
4508        } else if (name.equals("jurisdiction")) {
4509          this.getJurisdiction().add(castToCodeableConcept(value));
4510        } else if (name.equals("purpose")) {
4511          this.purpose = castToMarkdown(value); // MarkdownType
4512        } else if (name.equals("copyright")) {
4513          this.copyright = castToMarkdown(value); // MarkdownType
4514        } else if (name.equals("kind")) {
4515          value = new CapabilityStatementKindEnumFactory().fromType(castToCode(value));
4516          this.kind = (Enumeration) value; // Enumeration<CapabilityStatementKind>
4517        } else if (name.equals("software")) {
4518          this.software = (TerminologyCapabilitiesSoftwareComponent) value; // TerminologyCapabilitiesSoftwareComponent
4519        } else if (name.equals("implementation")) {
4520          this.implementation = (TerminologyCapabilitiesImplementationComponent) value; // TerminologyCapabilitiesImplementationComponent
4521        } else if (name.equals("lockedDate")) {
4522          this.lockedDate = castToBoolean(value); // BooleanType
4523        } else if (name.equals("codeSystem")) {
4524          this.getCodeSystem().add((TerminologyCapabilitiesCodeSystemComponent) value);
4525        } else if (name.equals("expansion")) {
4526          this.expansion = (TerminologyCapabilitiesExpansionComponent) value; // TerminologyCapabilitiesExpansionComponent
4527        } else if (name.equals("codeSearch")) {
4528          value = new CodeSearchSupportEnumFactory().fromType(castToCode(value));
4529          this.codeSearch = (Enumeration) value; // Enumeration<CodeSearchSupport>
4530        } else if (name.equals("validateCode")) {
4531          this.validateCode = (TerminologyCapabilitiesValidateCodeComponent) value; // TerminologyCapabilitiesValidateCodeComponent
4532        } else if (name.equals("translation")) {
4533          this.translation = (TerminologyCapabilitiesTranslationComponent) value; // TerminologyCapabilitiesTranslationComponent
4534        } else if (name.equals("closure")) {
4535          this.closure = (TerminologyCapabilitiesClosureComponent) value; // TerminologyCapabilitiesClosureComponent
4536        } else
4537          return super.setProperty(name, value);
4538        return value;
4539      }
4540
4541      @Override
4542      public Base makeProperty(int hash, String name) throws FHIRException {
4543        switch (hash) {
4544        case 116079:  return getUrlElement();
4545        case 351608024:  return getVersionElement();
4546        case 3373707:  return getNameElement();
4547        case 110371416:  return getTitleElement();
4548        case -892481550:  return getStatusElement();
4549        case -404562712:  return getExperimentalElement();
4550        case 3076014:  return getDateElement();
4551        case 1447404028:  return getPublisherElement();
4552        case 951526432:  return addContact(); 
4553        case -1724546052:  return getDescriptionElement();
4554        case -669707736:  return addUseContext(); 
4555        case -507075711:  return addJurisdiction(); 
4556        case -220463842:  return getPurposeElement();
4557        case 1522889671:  return getCopyrightElement();
4558        case 3292052:  return getKindElement();
4559        case 1319330215:  return getSoftware(); 
4560        case 1683336114:  return getImplementation(); 
4561        case 1391591896:  return getLockedDateElement();
4562        case -916511108:  return addCodeSystem(); 
4563        case 17878207:  return getExpansion(); 
4564        case -935519755:  return getCodeSearchElement();
4565        case 1080737827:  return getValidateCode(); 
4566        case -1840647503:  return getTranslation(); 
4567        case 866552379:  return getClosure(); 
4568        default: return super.makeProperty(hash, name);
4569        }
4570
4571      }
4572
4573      @Override
4574      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
4575        switch (hash) {
4576        case 116079: /*url*/ return new String[] {"uri"};
4577        case 351608024: /*version*/ return new String[] {"string"};
4578        case 3373707: /*name*/ return new String[] {"string"};
4579        case 110371416: /*title*/ return new String[] {"string"};
4580        case -892481550: /*status*/ return new String[] {"code"};
4581        case -404562712: /*experimental*/ return new String[] {"boolean"};
4582        case 3076014: /*date*/ return new String[] {"dateTime"};
4583        case 1447404028: /*publisher*/ return new String[] {"string"};
4584        case 951526432: /*contact*/ return new String[] {"ContactDetail"};
4585        case -1724546052: /*description*/ return new String[] {"markdown"};
4586        case -669707736: /*useContext*/ return new String[] {"UsageContext"};
4587        case -507075711: /*jurisdiction*/ return new String[] {"CodeableConcept"};
4588        case -220463842: /*purpose*/ return new String[] {"markdown"};
4589        case 1522889671: /*copyright*/ return new String[] {"markdown"};
4590        case 3292052: /*kind*/ return new String[] {"code"};
4591        case 1319330215: /*software*/ return new String[] {};
4592        case 1683336114: /*implementation*/ return new String[] {};
4593        case 1391591896: /*lockedDate*/ return new String[] {"boolean"};
4594        case -916511108: /*codeSystem*/ return new String[] {};
4595        case 17878207: /*expansion*/ return new String[] {};
4596        case -935519755: /*codeSearch*/ return new String[] {"code"};
4597        case 1080737827: /*validateCode*/ return new String[] {};
4598        case -1840647503: /*translation*/ return new String[] {};
4599        case 866552379: /*closure*/ return new String[] {};
4600        default: return super.getTypesForProperty(hash, name);
4601        }
4602
4603      }
4604
4605      @Override
4606      public Base addChild(String name) throws FHIRException {
4607        if (name.equals("url")) {
4608          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.url");
4609        }
4610        else if (name.equals("version")) {
4611          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.version");
4612        }
4613        else if (name.equals("name")) {
4614          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.name");
4615        }
4616        else if (name.equals("title")) {
4617          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.title");
4618        }
4619        else if (name.equals("status")) {
4620          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.status");
4621        }
4622        else if (name.equals("experimental")) {
4623          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.experimental");
4624        }
4625        else if (name.equals("date")) {
4626          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.date");
4627        }
4628        else if (name.equals("publisher")) {
4629          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.publisher");
4630        }
4631        else if (name.equals("contact")) {
4632          return addContact();
4633        }
4634        else if (name.equals("description")) {
4635          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.description");
4636        }
4637        else if (name.equals("useContext")) {
4638          return addUseContext();
4639        }
4640        else if (name.equals("jurisdiction")) {
4641          return addJurisdiction();
4642        }
4643        else if (name.equals("purpose")) {
4644          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.purpose");
4645        }
4646        else if (name.equals("copyright")) {
4647          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.copyright");
4648        }
4649        else if (name.equals("kind")) {
4650          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.kind");
4651        }
4652        else if (name.equals("software")) {
4653          this.software = new TerminologyCapabilitiesSoftwareComponent();
4654          return this.software;
4655        }
4656        else if (name.equals("implementation")) {
4657          this.implementation = new TerminologyCapabilitiesImplementationComponent();
4658          return this.implementation;
4659        }
4660        else if (name.equals("lockedDate")) {
4661          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.lockedDate");
4662        }
4663        else if (name.equals("codeSystem")) {
4664          return addCodeSystem();
4665        }
4666        else if (name.equals("expansion")) {
4667          this.expansion = new TerminologyCapabilitiesExpansionComponent();
4668          return this.expansion;
4669        }
4670        else if (name.equals("codeSearch")) {
4671          throw new FHIRException("Cannot call addChild on a primitive type TerminologyCapabilities.codeSearch");
4672        }
4673        else if (name.equals("validateCode")) {
4674          this.validateCode = new TerminologyCapabilitiesValidateCodeComponent();
4675          return this.validateCode;
4676        }
4677        else if (name.equals("translation")) {
4678          this.translation = new TerminologyCapabilitiesTranslationComponent();
4679          return this.translation;
4680        }
4681        else if (name.equals("closure")) {
4682          this.closure = new TerminologyCapabilitiesClosureComponent();
4683          return this.closure;
4684        }
4685        else
4686          return super.addChild(name);
4687      }
4688
4689  public String fhirType() {
4690    return "TerminologyCapabilities";
4691
4692  }
4693
4694      public TerminologyCapabilities copy() {
4695        TerminologyCapabilities dst = new TerminologyCapabilities();
4696        copyValues(dst);
4697        return dst;
4698      }
4699
4700      public void copyValues(TerminologyCapabilities dst) {
4701        super.copyValues(dst);
4702        dst.url = url == null ? null : url.copy();
4703        dst.version = version == null ? null : version.copy();
4704        dst.name = name == null ? null : name.copy();
4705        dst.title = title == null ? null : title.copy();
4706        dst.status = status == null ? null : status.copy();
4707        dst.experimental = experimental == null ? null : experimental.copy();
4708        dst.date = date == null ? null : date.copy();
4709        dst.publisher = publisher == null ? null : publisher.copy();
4710        if (contact != null) {
4711          dst.contact = new ArrayList<ContactDetail>();
4712          for (ContactDetail i : contact)
4713            dst.contact.add(i.copy());
4714        };
4715        dst.description = description == null ? null : description.copy();
4716        if (useContext != null) {
4717          dst.useContext = new ArrayList<UsageContext>();
4718          for (UsageContext i : useContext)
4719            dst.useContext.add(i.copy());
4720        };
4721        if (jurisdiction != null) {
4722          dst.jurisdiction = new ArrayList<CodeableConcept>();
4723          for (CodeableConcept i : jurisdiction)
4724            dst.jurisdiction.add(i.copy());
4725        };
4726        dst.purpose = purpose == null ? null : purpose.copy();
4727        dst.copyright = copyright == null ? null : copyright.copy();
4728        dst.kind = kind == null ? null : kind.copy();
4729        dst.software = software == null ? null : software.copy();
4730        dst.implementation = implementation == null ? null : implementation.copy();
4731        dst.lockedDate = lockedDate == null ? null : lockedDate.copy();
4732        if (codeSystem != null) {
4733          dst.codeSystem = new ArrayList<TerminologyCapabilitiesCodeSystemComponent>();
4734          for (TerminologyCapabilitiesCodeSystemComponent i : codeSystem)
4735            dst.codeSystem.add(i.copy());
4736        };
4737        dst.expansion = expansion == null ? null : expansion.copy();
4738        dst.codeSearch = codeSearch == null ? null : codeSearch.copy();
4739        dst.validateCode = validateCode == null ? null : validateCode.copy();
4740        dst.translation = translation == null ? null : translation.copy();
4741        dst.closure = closure == null ? null : closure.copy();
4742      }
4743
4744      protected TerminologyCapabilities typedCopy() {
4745        return copy();
4746      }
4747
4748      @Override
4749      public boolean equalsDeep(Base other_) {
4750        if (!super.equalsDeep(other_))
4751          return false;
4752        if (!(other_ instanceof TerminologyCapabilities))
4753          return false;
4754        TerminologyCapabilities o = (TerminologyCapabilities) other_;
4755        return compareDeep(purpose, o.purpose, true) && compareDeep(copyright, o.copyright, true) && compareDeep(kind, o.kind, true)
4756           && compareDeep(software, o.software, true) && compareDeep(implementation, o.implementation, true)
4757           && compareDeep(lockedDate, o.lockedDate, true) && compareDeep(codeSystem, o.codeSystem, true) && compareDeep(expansion, o.expansion, true)
4758           && compareDeep(codeSearch, o.codeSearch, true) && compareDeep(validateCode, o.validateCode, true)
4759           && compareDeep(translation, o.translation, true) && compareDeep(closure, o.closure, true);
4760      }
4761
4762      @Override
4763      public boolean equalsShallow(Base other_) {
4764        if (!super.equalsShallow(other_))
4765          return false;
4766        if (!(other_ instanceof TerminologyCapabilities))
4767          return false;
4768        TerminologyCapabilities o = (TerminologyCapabilities) other_;
4769        return compareValues(purpose, o.purpose, true) && compareValues(copyright, o.copyright, true) && compareValues(kind, o.kind, true)
4770           && compareValues(lockedDate, o.lockedDate, true) && compareValues(codeSearch, o.codeSearch, true);
4771      }
4772
4773      public boolean isEmpty() {
4774        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(purpose, copyright, kind
4775          , software, implementation, lockedDate, codeSystem, expansion, codeSearch, validateCode
4776          , translation, closure);
4777      }
4778
4779  @Override
4780  public ResourceType getResourceType() {
4781    return ResourceType.TerminologyCapabilities;
4782   }
4783
4784 /**
4785   * Search parameter: <b>date</b>
4786   * <p>
4787   * Description: <b>The terminology capabilities publication date</b><br>
4788   * Type: <b>date</b><br>
4789   * Path: <b>TerminologyCapabilities.date</b><br>
4790   * </p>
4791   */
4792  @SearchParamDefinition(name="date", path="TerminologyCapabilities.date", description="The terminology capabilities publication date", type="date" )
4793  public static final String SP_DATE = "date";
4794 /**
4795   * <b>Fluent Client</b> search parameter constant for <b>date</b>
4796   * <p>
4797   * Description: <b>The terminology capabilities publication date</b><br>
4798   * Type: <b>date</b><br>
4799   * Path: <b>TerminologyCapabilities.date</b><br>
4800   * </p>
4801   */
4802  public static final ca.uhn.fhir.rest.gclient.DateClientParam DATE = new ca.uhn.fhir.rest.gclient.DateClientParam(SP_DATE);
4803
4804 /**
4805   * Search parameter: <b>context-type-value</b>
4806   * <p>
4807   * Description: <b>A use context type and value assigned to the terminology capabilities</b><br>
4808   * Type: <b>composite</b><br>
4809   * Path: <b></b><br>
4810   * </p>
4811   */
4812  @SearchParamDefinition(name="context-type-value", path="TerminologyCapabilities.useContext", description="A use context type and value assigned to the terminology capabilities", type="composite", compositeOf={"context-type", "context"} )
4813  public static final String SP_CONTEXT_TYPE_VALUE = "context-type-value";
4814 /**
4815   * <b>Fluent Client</b> search parameter constant for <b>context-type-value</b>
4816   * <p>
4817   * Description: <b>A use context type and value assigned to the terminology capabilities</b><br>
4818   * Type: <b>composite</b><br>
4819   * Path: <b></b><br>
4820   * </p>
4821   */
4822  public static final ca.uhn.fhir.rest.gclient.CompositeClientParam<ca.uhn.fhir.rest.gclient.TokenClientParam, ca.uhn.fhir.rest.gclient.TokenClientParam> CONTEXT_TYPE_VALUE = new ca.uhn.fhir.rest.gclient.CompositeClientParam<ca.uhn.fhir.rest.gclient.TokenClientParam, ca.uhn.fhir.rest.gclient.TokenClientParam>(SP_CONTEXT_TYPE_VALUE);
4823
4824 /**
4825   * Search parameter: <b>jurisdiction</b>
4826   * <p>
4827   * Description: <b>Intended jurisdiction for the terminology capabilities</b><br>
4828   * Type: <b>token</b><br>
4829   * Path: <b>TerminologyCapabilities.jurisdiction</b><br>
4830   * </p>
4831   */
4832  @SearchParamDefinition(name="jurisdiction", path="TerminologyCapabilities.jurisdiction", description="Intended jurisdiction for the terminology capabilities", type="token" )
4833  public static final String SP_JURISDICTION = "jurisdiction";
4834 /**
4835   * <b>Fluent Client</b> search parameter constant for <b>jurisdiction</b>
4836   * <p>
4837   * Description: <b>Intended jurisdiction for the terminology capabilities</b><br>
4838   * Type: <b>token</b><br>
4839   * Path: <b>TerminologyCapabilities.jurisdiction</b><br>
4840   * </p>
4841   */
4842  public static final ca.uhn.fhir.rest.gclient.TokenClientParam JURISDICTION = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_JURISDICTION);
4843
4844 /**
4845   * Search parameter: <b>description</b>
4846   * <p>
4847   * Description: <b>The description of the terminology capabilities</b><br>
4848   * Type: <b>string</b><br>
4849   * Path: <b>TerminologyCapabilities.description</b><br>
4850   * </p>
4851   */
4852  @SearchParamDefinition(name="description", path="TerminologyCapabilities.description", description="The description of the terminology capabilities", type="string" )
4853  public static final String SP_DESCRIPTION = "description";
4854 /**
4855   * <b>Fluent Client</b> search parameter constant for <b>description</b>
4856   * <p>
4857   * Description: <b>The description of the terminology capabilities</b><br>
4858   * Type: <b>string</b><br>
4859   * Path: <b>TerminologyCapabilities.description</b><br>
4860   * </p>
4861   */
4862  public static final ca.uhn.fhir.rest.gclient.StringClientParam DESCRIPTION = new ca.uhn.fhir.rest.gclient.StringClientParam(SP_DESCRIPTION);
4863
4864 /**
4865   * Search parameter: <b>context-type</b>
4866   * <p>
4867   * Description: <b>A type of use context assigned to the terminology capabilities</b><br>
4868   * Type: <b>token</b><br>
4869   * Path: <b>TerminologyCapabilities.useContext.code</b><br>
4870   * </p>
4871   */
4872  @SearchParamDefinition(name="context-type", path="TerminologyCapabilities.useContext.code", description="A type of use context assigned to the terminology capabilities", type="token" )
4873  public static final String SP_CONTEXT_TYPE = "context-type";
4874 /**
4875   * <b>Fluent Client</b> search parameter constant for <b>context-type</b>
4876   * <p>
4877   * Description: <b>A type of use context assigned to the terminology capabilities</b><br>
4878   * Type: <b>token</b><br>
4879   * Path: <b>TerminologyCapabilities.useContext.code</b><br>
4880   * </p>
4881   */
4882  public static final ca.uhn.fhir.rest.gclient.TokenClientParam CONTEXT_TYPE = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_CONTEXT_TYPE);
4883
4884 /**
4885   * Search parameter: <b>title</b>
4886   * <p>
4887   * Description: <b>The human-friendly name of the terminology capabilities</b><br>
4888   * Type: <b>string</b><br>
4889   * Path: <b>TerminologyCapabilities.title</b><br>
4890   * </p>
4891   */
4892  @SearchParamDefinition(name="title", path="TerminologyCapabilities.title", description="The human-friendly name of the terminology capabilities", type="string" )
4893  public static final String SP_TITLE = "title";
4894 /**
4895   * <b>Fluent Client</b> search parameter constant for <b>title</b>
4896   * <p>
4897   * Description: <b>The human-friendly name of the terminology capabilities</b><br>
4898   * Type: <b>string</b><br>
4899   * Path: <b>TerminologyCapabilities.title</b><br>
4900   * </p>
4901   */
4902  public static final ca.uhn.fhir.rest.gclient.StringClientParam TITLE = new ca.uhn.fhir.rest.gclient.StringClientParam(SP_TITLE);
4903
4904 /**
4905   * Search parameter: <b>version</b>
4906   * <p>
4907   * Description: <b>The business version of the terminology capabilities</b><br>
4908   * Type: <b>token</b><br>
4909   * Path: <b>TerminologyCapabilities.version</b><br>
4910   * </p>
4911   */
4912  @SearchParamDefinition(name="version", path="TerminologyCapabilities.version", description="The business version of the terminology capabilities", type="token" )
4913  public static final String SP_VERSION = "version";
4914 /**
4915   * <b>Fluent Client</b> search parameter constant for <b>version</b>
4916   * <p>
4917   * Description: <b>The business version of the terminology capabilities</b><br>
4918   * Type: <b>token</b><br>
4919   * Path: <b>TerminologyCapabilities.version</b><br>
4920   * </p>
4921   */
4922  public static final ca.uhn.fhir.rest.gclient.TokenClientParam VERSION = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_VERSION);
4923
4924 /**
4925   * Search parameter: <b>url</b>
4926   * <p>
4927   * Description: <b>The uri that identifies the terminology capabilities</b><br>
4928   * Type: <b>uri</b><br>
4929   * Path: <b>TerminologyCapabilities.url</b><br>
4930   * </p>
4931   */
4932  @SearchParamDefinition(name="url", path="TerminologyCapabilities.url", description="The uri that identifies the terminology capabilities", type="uri" )
4933  public static final String SP_URL = "url";
4934 /**
4935   * <b>Fluent Client</b> search parameter constant for <b>url</b>
4936   * <p>
4937   * Description: <b>The uri that identifies the terminology capabilities</b><br>
4938   * Type: <b>uri</b><br>
4939   * Path: <b>TerminologyCapabilities.url</b><br>
4940   * </p>
4941   */
4942  public static final ca.uhn.fhir.rest.gclient.UriClientParam URL = new ca.uhn.fhir.rest.gclient.UriClientParam(SP_URL);
4943
4944 /**
4945   * Search parameter: <b>context-quantity</b>
4946   * <p>
4947   * Description: <b>A quantity- or range-valued use context assigned to the terminology capabilities</b><br>
4948   * Type: <b>quantity</b><br>
4949   * Path: <b>TerminologyCapabilities.useContext.valueQuantity, TerminologyCapabilities.useContext.valueRange</b><br>
4950   * </p>
4951   */
4952  @SearchParamDefinition(name="context-quantity", path="(TerminologyCapabilities.useContext.value as Quantity) | (TerminologyCapabilities.useContext.value as Range)", description="A quantity- or range-valued use context assigned to the terminology capabilities", type="quantity" )
4953  public static final String SP_CONTEXT_QUANTITY = "context-quantity";
4954 /**
4955   * <b>Fluent Client</b> search parameter constant for <b>context-quantity</b>
4956   * <p>
4957   * Description: <b>A quantity- or range-valued use context assigned to the terminology capabilities</b><br>
4958   * Type: <b>quantity</b><br>
4959   * Path: <b>TerminologyCapabilities.useContext.valueQuantity, TerminologyCapabilities.useContext.valueRange</b><br>
4960   * </p>
4961   */
4962  public static final ca.uhn.fhir.rest.gclient.QuantityClientParam CONTEXT_QUANTITY = new ca.uhn.fhir.rest.gclient.QuantityClientParam(SP_CONTEXT_QUANTITY);
4963
4964 /**
4965   * Search parameter: <b>name</b>
4966   * <p>
4967   * Description: <b>Computationally friendly name of the terminology capabilities</b><br>
4968   * Type: <b>string</b><br>
4969   * Path: <b>TerminologyCapabilities.name</b><br>
4970   * </p>
4971   */
4972  @SearchParamDefinition(name="name", path="TerminologyCapabilities.name", description="Computationally friendly name of the terminology capabilities", type="string" )
4973  public static final String SP_NAME = "name";
4974 /**
4975   * <b>Fluent Client</b> search parameter constant for <b>name</b>
4976   * <p>
4977   * Description: <b>Computationally friendly name of the terminology capabilities</b><br>
4978   * Type: <b>string</b><br>
4979   * Path: <b>TerminologyCapabilities.name</b><br>
4980   * </p>
4981   */
4982  public static final ca.uhn.fhir.rest.gclient.StringClientParam NAME = new ca.uhn.fhir.rest.gclient.StringClientParam(SP_NAME);
4983
4984 /**
4985   * Search parameter: <b>context</b>
4986   * <p>
4987   * Description: <b>A use context assigned to the terminology capabilities</b><br>
4988   * Type: <b>token</b><br>
4989   * Path: <b>TerminologyCapabilities.useContext.valueCodeableConcept</b><br>
4990   * </p>
4991   */
4992  @SearchParamDefinition(name="context", path="(TerminologyCapabilities.useContext.value as CodeableConcept)", description="A use context assigned to the terminology capabilities", type="token" )
4993  public static final String SP_CONTEXT = "context";
4994 /**
4995   * <b>Fluent Client</b> search parameter constant for <b>context</b>
4996   * <p>
4997   * Description: <b>A use context assigned to the terminology capabilities</b><br>
4998   * Type: <b>token</b><br>
4999   * Path: <b>TerminologyCapabilities.useContext.valueCodeableConcept</b><br>
5000   * </p>
5001   */
5002  public static final ca.uhn.fhir.rest.gclient.TokenClientParam CONTEXT = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_CONTEXT);
5003
5004 /**
5005   * Search parameter: <b>publisher</b>
5006   * <p>
5007   * Description: <b>Name of the publisher of the terminology capabilities</b><br>
5008   * Type: <b>string</b><br>
5009   * Path: <b>TerminologyCapabilities.publisher</b><br>
5010   * </p>
5011   */
5012  @SearchParamDefinition(name="publisher", path="TerminologyCapabilities.publisher", description="Name of the publisher of the terminology capabilities", type="string" )
5013  public static final String SP_PUBLISHER = "publisher";
5014 /**
5015   * <b>Fluent Client</b> search parameter constant for <b>publisher</b>
5016   * <p>
5017   * Description: <b>Name of the publisher of the terminology capabilities</b><br>
5018   * Type: <b>string</b><br>
5019   * Path: <b>TerminologyCapabilities.publisher</b><br>
5020   * </p>
5021   */
5022  public static final ca.uhn.fhir.rest.gclient.StringClientParam PUBLISHER = new ca.uhn.fhir.rest.gclient.StringClientParam(SP_PUBLISHER);
5023
5024 /**
5025   * Search parameter: <b>context-type-quantity</b>
5026   * <p>
5027   * Description: <b>A use context type and quantity- or range-based value assigned to the terminology capabilities</b><br>
5028   * Type: <b>composite</b><br>
5029   * Path: <b></b><br>
5030   * </p>
5031   */
5032  @SearchParamDefinition(name="context-type-quantity", path="TerminologyCapabilities.useContext", description="A use context type and quantity- or range-based value assigned to the terminology capabilities", type="composite", compositeOf={"context-type", "context-quantity"} )
5033  public static final String SP_CONTEXT_TYPE_QUANTITY = "context-type-quantity";
5034 /**
5035   * <b>Fluent Client</b> search parameter constant for <b>context-type-quantity</b>
5036   * <p>
5037   * Description: <b>A use context type and quantity- or range-based value assigned to the terminology capabilities</b><br>
5038   * Type: <b>composite</b><br>
5039   * Path: <b></b><br>
5040   * </p>
5041   */
5042  public static final ca.uhn.fhir.rest.gclient.CompositeClientParam<ca.uhn.fhir.rest.gclient.TokenClientParam, ca.uhn.fhir.rest.gclient.QuantityClientParam> CONTEXT_TYPE_QUANTITY = new ca.uhn.fhir.rest.gclient.CompositeClientParam<ca.uhn.fhir.rest.gclient.TokenClientParam, ca.uhn.fhir.rest.gclient.QuantityClientParam>(SP_CONTEXT_TYPE_QUANTITY);
5043
5044 /**
5045   * Search parameter: <b>status</b>
5046   * <p>
5047   * Description: <b>The current status of the terminology capabilities</b><br>
5048   * Type: <b>token</b><br>
5049   * Path: <b>TerminologyCapabilities.status</b><br>
5050   * </p>
5051   */
5052  @SearchParamDefinition(name="status", path="TerminologyCapabilities.status", description="The current status of the terminology capabilities", type="token" )
5053  public static final String SP_STATUS = "status";
5054 /**
5055   * <b>Fluent Client</b> search parameter constant for <b>status</b>
5056   * <p>
5057   * Description: <b>The current status of the terminology capabilities</b><br>
5058   * Type: <b>token</b><br>
5059   * Path: <b>TerminologyCapabilities.status</b><br>
5060   * </p>
5061   */
5062  public static final ca.uhn.fhir.rest.gclient.TokenClientParam STATUS = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_STATUS);
5063
5064
5065}