001package org.hl7.fhir.r5.model;
002
003
004/*
005  Copyright (c) 2011+, HL7, Inc.
006  All rights reserved.
007  
008  Redistribution and use in source and binary forms, with or without modification, \
009  are permitted provided that the following conditions are met:
010  
011   * Redistributions of source code must retain the above copyright notice, this \
012     list of conditions and the following disclaimer.
013   * Redistributions in binary form must reproduce the above copyright notice, \
014     this list of conditions and the following disclaimer in the documentation \
015     and/or other materials provided with the distribution.
016   * Neither the name of HL7 nor the names of its contributors may be used to 
017     endorse or promote products derived from this software without specific 
018     prior written permission.
019  
020  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \
021  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \
022  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \
023  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \
024  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT \
025  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR \
026  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \
027  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \
028  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \
029  POSSIBILITY OF SUCH DAMAGE.
030  */
031
032// Generated on Thu, Mar 23, 2023 19:59+1100 for FHIR v5.0.0
033
034import java.util.ArrayList;
035import java.util.Date;
036import java.util.List;
037import org.hl7.fhir.utilities.Utilities;
038import org.hl7.fhir.r5.model.Enumerations.*;
039import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
040import org.hl7.fhir.exceptions.FHIRException;
041import org.hl7.fhir.instance.model.api.ICompositeType;
042import ca.uhn.fhir.model.api.annotation.ResourceDef;
043import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
044import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
045import ca.uhn.fhir.model.api.annotation.Child;
046import ca.uhn.fhir.model.api.annotation.ChildOrder;
047import ca.uhn.fhir.model.api.annotation.Description;
048import ca.uhn.fhir.model.api.annotation.Block;
049
050import org.hl7.fhir.instance.model.api.IBaseConformance;
051/**
052 * A Capability Statement documents a set of capabilities (behaviors) of a FHIR Server or Client for a particular version of FHIR that may be used as a statement of actual server functionality or a statement of required or desired server implementation.
053 */
054@ResourceDef(name="CapabilityStatement", profile="http://hl7.org/fhir/StructureDefinition/CapabilityStatement")
055public class CapabilityStatement extends CanonicalResource implements IBaseConformance {
056
057    public enum ConditionalDeleteStatus {
058        /**
059         * No support for conditional deletes.
060         */
061        NOTSUPPORTED, 
062        /**
063         * Conditional deletes are supported, but only single resources at a time.
064         */
065        SINGLE, 
066        /**
067         * Conditional deletes are supported, and multiple resources can be deleted in a single interaction.
068         */
069        MULTIPLE, 
070        /**
071         * added to help the parsers with the generic types
072         */
073        NULL;
074        public static ConditionalDeleteStatus fromCode(String codeString) throws FHIRException {
075            if (codeString == null || "".equals(codeString))
076                return null;
077        if ("not-supported".equals(codeString))
078          return NOTSUPPORTED;
079        if ("single".equals(codeString))
080          return SINGLE;
081        if ("multiple".equals(codeString))
082          return MULTIPLE;
083        if (Configuration.isAcceptInvalidEnums())
084          return null;
085        else
086          throw new FHIRException("Unknown ConditionalDeleteStatus code '"+codeString+"'");
087        }
088        public String toCode() {
089          switch (this) {
090            case NOTSUPPORTED: return "not-supported";
091            case SINGLE: return "single";
092            case MULTIPLE: return "multiple";
093            case NULL: return null;
094            default: return "?";
095          }
096        }
097        public String getSystem() {
098          switch (this) {
099            case NOTSUPPORTED: return "http://hl7.org/fhir/conditional-delete-status";
100            case SINGLE: return "http://hl7.org/fhir/conditional-delete-status";
101            case MULTIPLE: return "http://hl7.org/fhir/conditional-delete-status";
102            case NULL: return null;
103            default: return "?";
104          }
105        }
106        public String getDefinition() {
107          switch (this) {
108            case NOTSUPPORTED: return "No support for conditional deletes.";
109            case SINGLE: return "Conditional deletes are supported, but only single resources at a time.";
110            case MULTIPLE: return "Conditional deletes are supported, and multiple resources can be deleted in a single interaction.";
111            case NULL: return null;
112            default: return "?";
113          }
114        }
115        public String getDisplay() {
116          switch (this) {
117            case NOTSUPPORTED: return "Not Supported";
118            case SINGLE: return "Single Deletes Supported";
119            case MULTIPLE: return "Multiple Deletes Supported";
120            case NULL: return null;
121            default: return "?";
122          }
123        }
124    }
125
126  public static class ConditionalDeleteStatusEnumFactory implements EnumFactory<ConditionalDeleteStatus> {
127    public ConditionalDeleteStatus fromCode(String codeString) throws IllegalArgumentException {
128      if (codeString == null || "".equals(codeString))
129            if (codeString == null || "".equals(codeString))
130                return null;
131        if ("not-supported".equals(codeString))
132          return ConditionalDeleteStatus.NOTSUPPORTED;
133        if ("single".equals(codeString))
134          return ConditionalDeleteStatus.SINGLE;
135        if ("multiple".equals(codeString))
136          return ConditionalDeleteStatus.MULTIPLE;
137        throw new IllegalArgumentException("Unknown ConditionalDeleteStatus code '"+codeString+"'");
138        }
139        public Enumeration<ConditionalDeleteStatus> fromType(PrimitiveType<?> code) throws FHIRException {
140          if (code == null)
141            return null;
142          if (code.isEmpty())
143            return new Enumeration<ConditionalDeleteStatus>(this, ConditionalDeleteStatus.NULL, code);
144          String codeString = ((PrimitiveType) code).asStringValue();
145          if (codeString == null || "".equals(codeString))
146            return new Enumeration<ConditionalDeleteStatus>(this, ConditionalDeleteStatus.NULL, code);
147        if ("not-supported".equals(codeString))
148          return new Enumeration<ConditionalDeleteStatus>(this, ConditionalDeleteStatus.NOTSUPPORTED, code);
149        if ("single".equals(codeString))
150          return new Enumeration<ConditionalDeleteStatus>(this, ConditionalDeleteStatus.SINGLE, code);
151        if ("multiple".equals(codeString))
152          return new Enumeration<ConditionalDeleteStatus>(this, ConditionalDeleteStatus.MULTIPLE, code);
153        throw new FHIRException("Unknown ConditionalDeleteStatus code '"+codeString+"'");
154        }
155    public String toCode(ConditionalDeleteStatus code) {
156       if (code == ConditionalDeleteStatus.NULL)
157           return null;
158       if (code == ConditionalDeleteStatus.NOTSUPPORTED)
159        return "not-supported";
160      if (code == ConditionalDeleteStatus.SINGLE)
161        return "single";
162      if (code == ConditionalDeleteStatus.MULTIPLE)
163        return "multiple";
164      return "?";
165   }
166    public String toSystem(ConditionalDeleteStatus code) {
167      return code.getSystem();
168      }
169    }
170
171    public enum ConditionalReadStatus {
172        /**
173         * No support for conditional reads.
174         */
175        NOTSUPPORTED, 
176        /**
177         * Conditional reads are supported, but only with the If-Modified-Since HTTP Header.
178         */
179        MODIFIEDSINCE, 
180        /**
181         * Conditional reads are supported, but only with the If-None-Match HTTP Header.
182         */
183        NOTMATCH, 
184        /**
185         * Conditional reads are supported, with both If-Modified-Since and If-None-Match HTTP Headers.
186         */
187        FULLSUPPORT, 
188        /**
189         * added to help the parsers with the generic types
190         */
191        NULL;
192        public static ConditionalReadStatus fromCode(String codeString) throws FHIRException {
193            if (codeString == null || "".equals(codeString))
194                return null;
195        if ("not-supported".equals(codeString))
196          return NOTSUPPORTED;
197        if ("modified-since".equals(codeString))
198          return MODIFIEDSINCE;
199        if ("not-match".equals(codeString))
200          return NOTMATCH;
201        if ("full-support".equals(codeString))
202          return FULLSUPPORT;
203        if (Configuration.isAcceptInvalidEnums())
204          return null;
205        else
206          throw new FHIRException("Unknown ConditionalReadStatus code '"+codeString+"'");
207        }
208        public String toCode() {
209          switch (this) {
210            case NOTSUPPORTED: return "not-supported";
211            case MODIFIEDSINCE: return "modified-since";
212            case NOTMATCH: return "not-match";
213            case FULLSUPPORT: return "full-support";
214            case NULL: return null;
215            default: return "?";
216          }
217        }
218        public String getSystem() {
219          switch (this) {
220            case NOTSUPPORTED: return "http://hl7.org/fhir/conditional-read-status";
221            case MODIFIEDSINCE: return "http://hl7.org/fhir/conditional-read-status";
222            case NOTMATCH: return "http://hl7.org/fhir/conditional-read-status";
223            case FULLSUPPORT: return "http://hl7.org/fhir/conditional-read-status";
224            case NULL: return null;
225            default: return "?";
226          }
227        }
228        public String getDefinition() {
229          switch (this) {
230            case NOTSUPPORTED: return "No support for conditional reads.";
231            case MODIFIEDSINCE: return "Conditional reads are supported, but only with the If-Modified-Since HTTP Header.";
232            case NOTMATCH: return "Conditional reads are supported, but only with the If-None-Match HTTP Header.";
233            case FULLSUPPORT: return "Conditional reads are supported, with both If-Modified-Since and If-None-Match HTTP Headers.";
234            case NULL: return null;
235            default: return "?";
236          }
237        }
238        public String getDisplay() {
239          switch (this) {
240            case NOTSUPPORTED: return "Not Supported";
241            case MODIFIEDSINCE: return "If-Modified-Since";
242            case NOTMATCH: return "If-None-Match";
243            case FULLSUPPORT: return "Full Support";
244            case NULL: return null;
245            default: return "?";
246          }
247        }
248    }
249
250  public static class ConditionalReadStatusEnumFactory implements EnumFactory<ConditionalReadStatus> {
251    public ConditionalReadStatus fromCode(String codeString) throws IllegalArgumentException {
252      if (codeString == null || "".equals(codeString))
253            if (codeString == null || "".equals(codeString))
254                return null;
255        if ("not-supported".equals(codeString))
256          return ConditionalReadStatus.NOTSUPPORTED;
257        if ("modified-since".equals(codeString))
258          return ConditionalReadStatus.MODIFIEDSINCE;
259        if ("not-match".equals(codeString))
260          return ConditionalReadStatus.NOTMATCH;
261        if ("full-support".equals(codeString))
262          return ConditionalReadStatus.FULLSUPPORT;
263        throw new IllegalArgumentException("Unknown ConditionalReadStatus code '"+codeString+"'");
264        }
265        public Enumeration<ConditionalReadStatus> fromType(PrimitiveType<?> code) throws FHIRException {
266          if (code == null)
267            return null;
268          if (code.isEmpty())
269            return new Enumeration<ConditionalReadStatus>(this, ConditionalReadStatus.NULL, code);
270          String codeString = ((PrimitiveType) code).asStringValue();
271          if (codeString == null || "".equals(codeString))
272            return new Enumeration<ConditionalReadStatus>(this, ConditionalReadStatus.NULL, code);
273        if ("not-supported".equals(codeString))
274          return new Enumeration<ConditionalReadStatus>(this, ConditionalReadStatus.NOTSUPPORTED, code);
275        if ("modified-since".equals(codeString))
276          return new Enumeration<ConditionalReadStatus>(this, ConditionalReadStatus.MODIFIEDSINCE, code);
277        if ("not-match".equals(codeString))
278          return new Enumeration<ConditionalReadStatus>(this, ConditionalReadStatus.NOTMATCH, code);
279        if ("full-support".equals(codeString))
280          return new Enumeration<ConditionalReadStatus>(this, ConditionalReadStatus.FULLSUPPORT, code);
281        throw new FHIRException("Unknown ConditionalReadStatus code '"+codeString+"'");
282        }
283    public String toCode(ConditionalReadStatus code) {
284       if (code == ConditionalReadStatus.NULL)
285           return null;
286       if (code == ConditionalReadStatus.NOTSUPPORTED)
287        return "not-supported";
288      if (code == ConditionalReadStatus.MODIFIEDSINCE)
289        return "modified-since";
290      if (code == ConditionalReadStatus.NOTMATCH)
291        return "not-match";
292      if (code == ConditionalReadStatus.FULLSUPPORT)
293        return "full-support";
294      return "?";
295   }
296    public String toSystem(ConditionalReadStatus code) {
297      return code.getSystem();
298      }
299    }
300
301    public enum DocumentMode {
302        /**
303         * The application produces documents of the specified type.
304         */
305        PRODUCER, 
306        /**
307         * The application consumes documents of the specified type.
308         */
309        CONSUMER, 
310        /**
311         * added to help the parsers with the generic types
312         */
313        NULL;
314        public static DocumentMode fromCode(String codeString) throws FHIRException {
315            if (codeString == null || "".equals(codeString))
316                return null;
317        if ("producer".equals(codeString))
318          return PRODUCER;
319        if ("consumer".equals(codeString))
320          return CONSUMER;
321        if (Configuration.isAcceptInvalidEnums())
322          return null;
323        else
324          throw new FHIRException("Unknown DocumentMode code '"+codeString+"'");
325        }
326        public String toCode() {
327          switch (this) {
328            case PRODUCER: return "producer";
329            case CONSUMER: return "consumer";
330            case NULL: return null;
331            default: return "?";
332          }
333        }
334        public String getSystem() {
335          switch (this) {
336            case PRODUCER: return "http://hl7.org/fhir/document-mode";
337            case CONSUMER: return "http://hl7.org/fhir/document-mode";
338            case NULL: return null;
339            default: return "?";
340          }
341        }
342        public String getDefinition() {
343          switch (this) {
344            case PRODUCER: return "The application produces documents of the specified type.";
345            case CONSUMER: return "The application consumes documents of the specified type.";
346            case NULL: return null;
347            default: return "?";
348          }
349        }
350        public String getDisplay() {
351          switch (this) {
352            case PRODUCER: return "Producer";
353            case CONSUMER: return "Consumer";
354            case NULL: return null;
355            default: return "?";
356          }
357        }
358    }
359
360  public static class DocumentModeEnumFactory implements EnumFactory<DocumentMode> {
361    public DocumentMode fromCode(String codeString) throws IllegalArgumentException {
362      if (codeString == null || "".equals(codeString))
363            if (codeString == null || "".equals(codeString))
364                return null;
365        if ("producer".equals(codeString))
366          return DocumentMode.PRODUCER;
367        if ("consumer".equals(codeString))
368          return DocumentMode.CONSUMER;
369        throw new IllegalArgumentException("Unknown DocumentMode code '"+codeString+"'");
370        }
371        public Enumeration<DocumentMode> fromType(PrimitiveType<?> code) throws FHIRException {
372          if (code == null)
373            return null;
374          if (code.isEmpty())
375            return new Enumeration<DocumentMode>(this, DocumentMode.NULL, code);
376          String codeString = ((PrimitiveType) code).asStringValue();
377          if (codeString == null || "".equals(codeString))
378            return new Enumeration<DocumentMode>(this, DocumentMode.NULL, code);
379        if ("producer".equals(codeString))
380          return new Enumeration<DocumentMode>(this, DocumentMode.PRODUCER, code);
381        if ("consumer".equals(codeString))
382          return new Enumeration<DocumentMode>(this, DocumentMode.CONSUMER, code);
383        throw new FHIRException("Unknown DocumentMode code '"+codeString+"'");
384        }
385    public String toCode(DocumentMode code) {
386       if (code == DocumentMode.NULL)
387           return null;
388       if (code == DocumentMode.PRODUCER)
389        return "producer";
390      if (code == DocumentMode.CONSUMER)
391        return "consumer";
392      return "?";
393   }
394    public String toSystem(DocumentMode code) {
395      return code.getSystem();
396      }
397    }
398
399    public enum EventCapabilityMode {
400        /**
401         * The application sends requests and receives responses.
402         */
403        SENDER, 
404        /**
405         * The application receives requests and sends responses.
406         */
407        RECEIVER, 
408        /**
409         * added to help the parsers with the generic types
410         */
411        NULL;
412        public static EventCapabilityMode fromCode(String codeString) throws FHIRException {
413            if (codeString == null || "".equals(codeString))
414                return null;
415        if ("sender".equals(codeString))
416          return SENDER;
417        if ("receiver".equals(codeString))
418          return RECEIVER;
419        if (Configuration.isAcceptInvalidEnums())
420          return null;
421        else
422          throw new FHIRException("Unknown EventCapabilityMode code '"+codeString+"'");
423        }
424        public String toCode() {
425          switch (this) {
426            case SENDER: return "sender";
427            case RECEIVER: return "receiver";
428            case NULL: return null;
429            default: return "?";
430          }
431        }
432        public String getSystem() {
433          switch (this) {
434            case SENDER: return "http://hl7.org/fhir/event-capability-mode";
435            case RECEIVER: return "http://hl7.org/fhir/event-capability-mode";
436            case NULL: return null;
437            default: return "?";
438          }
439        }
440        public String getDefinition() {
441          switch (this) {
442            case SENDER: return "The application sends requests and receives responses.";
443            case RECEIVER: return "The application receives requests and sends responses.";
444            case NULL: return null;
445            default: return "?";
446          }
447        }
448        public String getDisplay() {
449          switch (this) {
450            case SENDER: return "Sender";
451            case RECEIVER: return "Receiver";
452            case NULL: return null;
453            default: return "?";
454          }
455        }
456    }
457
458  public static class EventCapabilityModeEnumFactory implements EnumFactory<EventCapabilityMode> {
459    public EventCapabilityMode fromCode(String codeString) throws IllegalArgumentException {
460      if (codeString == null || "".equals(codeString))
461            if (codeString == null || "".equals(codeString))
462                return null;
463        if ("sender".equals(codeString))
464          return EventCapabilityMode.SENDER;
465        if ("receiver".equals(codeString))
466          return EventCapabilityMode.RECEIVER;
467        throw new IllegalArgumentException("Unknown EventCapabilityMode code '"+codeString+"'");
468        }
469        public Enumeration<EventCapabilityMode> fromType(PrimitiveType<?> code) throws FHIRException {
470          if (code == null)
471            return null;
472          if (code.isEmpty())
473            return new Enumeration<EventCapabilityMode>(this, EventCapabilityMode.NULL, code);
474          String codeString = ((PrimitiveType) code).asStringValue();
475          if (codeString == null || "".equals(codeString))
476            return new Enumeration<EventCapabilityMode>(this, EventCapabilityMode.NULL, code);
477        if ("sender".equals(codeString))
478          return new Enumeration<EventCapabilityMode>(this, EventCapabilityMode.SENDER, code);
479        if ("receiver".equals(codeString))
480          return new Enumeration<EventCapabilityMode>(this, EventCapabilityMode.RECEIVER, code);
481        throw new FHIRException("Unknown EventCapabilityMode code '"+codeString+"'");
482        }
483    public String toCode(EventCapabilityMode code) {
484       if (code == EventCapabilityMode.NULL)
485           return null;
486       if (code == EventCapabilityMode.SENDER)
487        return "sender";
488      if (code == EventCapabilityMode.RECEIVER)
489        return "receiver";
490      return "?";
491   }
492    public String toSystem(EventCapabilityMode code) {
493      return code.getSystem();
494      }
495    }
496
497    public enum ReferenceHandlingPolicy {
498        /**
499         * The server supports and populates Literal references (i.e. using Reference.reference) where they are known (this code does not guarantee that all references are literal; see 'enforced').
500         */
501        LITERAL, 
502        /**
503         * The server allows logical references (i.e. using Reference.identifier).
504         */
505        LOGICAL, 
506        /**
507         * The server will attempt to resolve logical references to literal references - i.e. converting Reference.identifier to Reference.reference (if resolution fails, the server may still accept resources; see logical).
508         */
509        RESOLVES, 
510        /**
511         * The server enforces that references have integrity - e.g. it ensures that references can always be resolved. This is typically the case for clinical record systems, but often not the case for middleware/proxy systems.
512         */
513        ENFORCED, 
514        /**
515         * The server does not support references that point to other servers.
516         */
517        LOCAL, 
518        /**
519         * added to help the parsers with the generic types
520         */
521        NULL;
522        public static ReferenceHandlingPolicy fromCode(String codeString) throws FHIRException {
523            if (codeString == null || "".equals(codeString))
524                return null;
525        if ("literal".equals(codeString))
526          return LITERAL;
527        if ("logical".equals(codeString))
528          return LOGICAL;
529        if ("resolves".equals(codeString))
530          return RESOLVES;
531        if ("enforced".equals(codeString))
532          return ENFORCED;
533        if ("local".equals(codeString))
534          return LOCAL;
535        if (Configuration.isAcceptInvalidEnums())
536          return null;
537        else
538          throw new FHIRException("Unknown ReferenceHandlingPolicy code '"+codeString+"'");
539        }
540        public String toCode() {
541          switch (this) {
542            case LITERAL: return "literal";
543            case LOGICAL: return "logical";
544            case RESOLVES: return "resolves";
545            case ENFORCED: return "enforced";
546            case LOCAL: return "local";
547            case NULL: return null;
548            default: return "?";
549          }
550        }
551        public String getSystem() {
552          switch (this) {
553            case LITERAL: return "http://hl7.org/fhir/reference-handling-policy";
554            case LOGICAL: return "http://hl7.org/fhir/reference-handling-policy";
555            case RESOLVES: return "http://hl7.org/fhir/reference-handling-policy";
556            case ENFORCED: return "http://hl7.org/fhir/reference-handling-policy";
557            case LOCAL: return "http://hl7.org/fhir/reference-handling-policy";
558            case NULL: return null;
559            default: return "?";
560          }
561        }
562        public String getDefinition() {
563          switch (this) {
564            case LITERAL: return "The server supports and populates Literal references (i.e. using Reference.reference) where they are known (this code does not guarantee that all references are literal; see 'enforced').";
565            case LOGICAL: return "The server allows logical references (i.e. using Reference.identifier).";
566            case RESOLVES: return "The server will attempt to resolve logical references to literal references - i.e. converting Reference.identifier to Reference.reference (if resolution fails, the server may still accept resources; see logical).";
567            case ENFORCED: return "The server enforces that references have integrity - e.g. it ensures that references can always be resolved. This is typically the case for clinical record systems, but often not the case for middleware/proxy systems.";
568            case LOCAL: return "The server does not support references that point to other servers.";
569            case NULL: return null;
570            default: return "?";
571          }
572        }
573        public String getDisplay() {
574          switch (this) {
575            case LITERAL: return "Literal References";
576            case LOGICAL: return "Logical References";
577            case RESOLVES: return "Resolves References";
578            case ENFORCED: return "Reference Integrity Enforced";
579            case LOCAL: return "Local References Only";
580            case NULL: return null;
581            default: return "?";
582          }
583        }
584    }
585
586  public static class ReferenceHandlingPolicyEnumFactory implements EnumFactory<ReferenceHandlingPolicy> {
587    public ReferenceHandlingPolicy fromCode(String codeString) throws IllegalArgumentException {
588      if (codeString == null || "".equals(codeString))
589            if (codeString == null || "".equals(codeString))
590                return null;
591        if ("literal".equals(codeString))
592          return ReferenceHandlingPolicy.LITERAL;
593        if ("logical".equals(codeString))
594          return ReferenceHandlingPolicy.LOGICAL;
595        if ("resolves".equals(codeString))
596          return ReferenceHandlingPolicy.RESOLVES;
597        if ("enforced".equals(codeString))
598          return ReferenceHandlingPolicy.ENFORCED;
599        if ("local".equals(codeString))
600          return ReferenceHandlingPolicy.LOCAL;
601        throw new IllegalArgumentException("Unknown ReferenceHandlingPolicy code '"+codeString+"'");
602        }
603        public Enumeration<ReferenceHandlingPolicy> fromType(PrimitiveType<?> code) throws FHIRException {
604          if (code == null)
605            return null;
606          if (code.isEmpty())
607            return new Enumeration<ReferenceHandlingPolicy>(this, ReferenceHandlingPolicy.NULL, code);
608          String codeString = ((PrimitiveType) code).asStringValue();
609          if (codeString == null || "".equals(codeString))
610            return new Enumeration<ReferenceHandlingPolicy>(this, ReferenceHandlingPolicy.NULL, code);
611        if ("literal".equals(codeString))
612          return new Enumeration<ReferenceHandlingPolicy>(this, ReferenceHandlingPolicy.LITERAL, code);
613        if ("logical".equals(codeString))
614          return new Enumeration<ReferenceHandlingPolicy>(this, ReferenceHandlingPolicy.LOGICAL, code);
615        if ("resolves".equals(codeString))
616          return new Enumeration<ReferenceHandlingPolicy>(this, ReferenceHandlingPolicy.RESOLVES, code);
617        if ("enforced".equals(codeString))
618          return new Enumeration<ReferenceHandlingPolicy>(this, ReferenceHandlingPolicy.ENFORCED, code);
619        if ("local".equals(codeString))
620          return new Enumeration<ReferenceHandlingPolicy>(this, ReferenceHandlingPolicy.LOCAL, code);
621        throw new FHIRException("Unknown ReferenceHandlingPolicy code '"+codeString+"'");
622        }
623    public String toCode(ReferenceHandlingPolicy code) {
624       if (code == ReferenceHandlingPolicy.NULL)
625           return null;
626       if (code == ReferenceHandlingPolicy.LITERAL)
627        return "literal";
628      if (code == ReferenceHandlingPolicy.LOGICAL)
629        return "logical";
630      if (code == ReferenceHandlingPolicy.RESOLVES)
631        return "resolves";
632      if (code == ReferenceHandlingPolicy.ENFORCED)
633        return "enforced";
634      if (code == ReferenceHandlingPolicy.LOCAL)
635        return "local";
636      return "?";
637   }
638    public String toSystem(ReferenceHandlingPolicy code) {
639      return code.getSystem();
640      }
641    }
642
643    public enum ResourceVersionPolicy {
644        /**
645         * VersionId meta-property is not supported (server) or used (client).
646         */
647        NOVERSION, 
648        /**
649         * VersionId meta-property is supported (server) or used (client).
650         */
651        VERSIONED, 
652        /**
653         * Supports version-aware updates (server) or will be specified (If-match header) for updates (client).
654         */
655        VERSIONEDUPDATE, 
656        /**
657         * added to help the parsers with the generic types
658         */
659        NULL;
660        public static ResourceVersionPolicy fromCode(String codeString) throws FHIRException {
661            if (codeString == null || "".equals(codeString))
662                return null;
663        if ("no-version".equals(codeString))
664          return NOVERSION;
665        if ("versioned".equals(codeString))
666          return VERSIONED;
667        if ("versioned-update".equals(codeString))
668          return VERSIONEDUPDATE;
669        if (Configuration.isAcceptInvalidEnums())
670          return null;
671        else
672          throw new FHIRException("Unknown ResourceVersionPolicy code '"+codeString+"'");
673        }
674        public String toCode() {
675          switch (this) {
676            case NOVERSION: return "no-version";
677            case VERSIONED: return "versioned";
678            case VERSIONEDUPDATE: return "versioned-update";
679            case NULL: return null;
680            default: return "?";
681          }
682        }
683        public String getSystem() {
684          switch (this) {
685            case NOVERSION: return "http://hl7.org/fhir/versioning-policy";
686            case VERSIONED: return "http://hl7.org/fhir/versioning-policy";
687            case VERSIONEDUPDATE: return "http://hl7.org/fhir/versioning-policy";
688            case NULL: return null;
689            default: return "?";
690          }
691        }
692        public String getDefinition() {
693          switch (this) {
694            case NOVERSION: return "VersionId meta-property is not supported (server) or used (client).";
695            case VERSIONED: return "VersionId meta-property is supported (server) or used (client).";
696            case VERSIONEDUPDATE: return "Supports version-aware updates (server) or will be specified (If-match header) for updates (client).";
697            case NULL: return null;
698            default: return "?";
699          }
700        }
701        public String getDisplay() {
702          switch (this) {
703            case NOVERSION: return "No VersionId Support";
704            case VERSIONED: return "Versioned";
705            case VERSIONEDUPDATE: return "VersionId tracked fully";
706            case NULL: return null;
707            default: return "?";
708          }
709        }
710    }
711
712  public static class ResourceVersionPolicyEnumFactory implements EnumFactory<ResourceVersionPolicy> {
713    public ResourceVersionPolicy fromCode(String codeString) throws IllegalArgumentException {
714      if (codeString == null || "".equals(codeString))
715            if (codeString == null || "".equals(codeString))
716                return null;
717        if ("no-version".equals(codeString))
718          return ResourceVersionPolicy.NOVERSION;
719        if ("versioned".equals(codeString))
720          return ResourceVersionPolicy.VERSIONED;
721        if ("versioned-update".equals(codeString))
722          return ResourceVersionPolicy.VERSIONEDUPDATE;
723        throw new IllegalArgumentException("Unknown ResourceVersionPolicy code '"+codeString+"'");
724        }
725        public Enumeration<ResourceVersionPolicy> fromType(PrimitiveType<?> code) throws FHIRException {
726          if (code == null)
727            return null;
728          if (code.isEmpty())
729            return new Enumeration<ResourceVersionPolicy>(this, ResourceVersionPolicy.NULL, code);
730          String codeString = ((PrimitiveType) code).asStringValue();
731          if (codeString == null || "".equals(codeString))
732            return new Enumeration<ResourceVersionPolicy>(this, ResourceVersionPolicy.NULL, code);
733        if ("no-version".equals(codeString))
734          return new Enumeration<ResourceVersionPolicy>(this, ResourceVersionPolicy.NOVERSION, code);
735        if ("versioned".equals(codeString))
736          return new Enumeration<ResourceVersionPolicy>(this, ResourceVersionPolicy.VERSIONED, code);
737        if ("versioned-update".equals(codeString))
738          return new Enumeration<ResourceVersionPolicy>(this, ResourceVersionPolicy.VERSIONEDUPDATE, code);
739        throw new FHIRException("Unknown ResourceVersionPolicy code '"+codeString+"'");
740        }
741    public String toCode(ResourceVersionPolicy code) {
742       if (code == ResourceVersionPolicy.NULL)
743           return null;
744       if (code == ResourceVersionPolicy.NOVERSION)
745        return "no-version";
746      if (code == ResourceVersionPolicy.VERSIONED)
747        return "versioned";
748      if (code == ResourceVersionPolicy.VERSIONEDUPDATE)
749        return "versioned-update";
750      return "?";
751   }
752    public String toSystem(ResourceVersionPolicy code) {
753      return code.getSystem();
754      }
755    }
756
757    public enum RestfulCapabilityMode {
758        /**
759         * The application acts as a client for this resource.
760         */
761        CLIENT, 
762        /**
763         * The application acts as a server for this resource.
764         */
765        SERVER, 
766        /**
767         * added to help the parsers with the generic types
768         */
769        NULL;
770        public static RestfulCapabilityMode fromCode(String codeString) throws FHIRException {
771            if (codeString == null || "".equals(codeString))
772                return null;
773        if ("client".equals(codeString))
774          return CLIENT;
775        if ("server".equals(codeString))
776          return SERVER;
777        if (Configuration.isAcceptInvalidEnums())
778          return null;
779        else
780          throw new FHIRException("Unknown RestfulCapabilityMode code '"+codeString+"'");
781        }
782        public String toCode() {
783          switch (this) {
784            case CLIENT: return "client";
785            case SERVER: return "server";
786            case NULL: return null;
787            default: return "?";
788          }
789        }
790        public String getSystem() {
791          switch (this) {
792            case CLIENT: return "http://hl7.org/fhir/restful-capability-mode";
793            case SERVER: return "http://hl7.org/fhir/restful-capability-mode";
794            case NULL: return null;
795            default: return "?";
796          }
797        }
798        public String getDefinition() {
799          switch (this) {
800            case CLIENT: return "The application acts as a client for this resource.";
801            case SERVER: return "The application acts as a server for this resource.";
802            case NULL: return null;
803            default: return "?";
804          }
805        }
806        public String getDisplay() {
807          switch (this) {
808            case CLIENT: return "Client";
809            case SERVER: return "Server";
810            case NULL: return null;
811            default: return "?";
812          }
813        }
814    }
815
816  public static class RestfulCapabilityModeEnumFactory implements EnumFactory<RestfulCapabilityMode> {
817    public RestfulCapabilityMode fromCode(String codeString) throws IllegalArgumentException {
818      if (codeString == null || "".equals(codeString))
819            if (codeString == null || "".equals(codeString))
820                return null;
821        if ("client".equals(codeString))
822          return RestfulCapabilityMode.CLIENT;
823        if ("server".equals(codeString))
824          return RestfulCapabilityMode.SERVER;
825        throw new IllegalArgumentException("Unknown RestfulCapabilityMode code '"+codeString+"'");
826        }
827        public Enumeration<RestfulCapabilityMode> fromType(PrimitiveType<?> code) throws FHIRException {
828          if (code == null)
829            return null;
830          if (code.isEmpty())
831            return new Enumeration<RestfulCapabilityMode>(this, RestfulCapabilityMode.NULL, code);
832          String codeString = ((PrimitiveType) code).asStringValue();
833          if (codeString == null || "".equals(codeString))
834            return new Enumeration<RestfulCapabilityMode>(this, RestfulCapabilityMode.NULL, code);
835        if ("client".equals(codeString))
836          return new Enumeration<RestfulCapabilityMode>(this, RestfulCapabilityMode.CLIENT, code);
837        if ("server".equals(codeString))
838          return new Enumeration<RestfulCapabilityMode>(this, RestfulCapabilityMode.SERVER, code);
839        throw new FHIRException("Unknown RestfulCapabilityMode code '"+codeString+"'");
840        }
841    public String toCode(RestfulCapabilityMode code) {
842       if (code == RestfulCapabilityMode.NULL)
843           return null;
844       if (code == RestfulCapabilityMode.CLIENT)
845        return "client";
846      if (code == RestfulCapabilityMode.SERVER)
847        return "server";
848      return "?";
849   }
850    public String toSystem(RestfulCapabilityMode code) {
851      return code.getSystem();
852      }
853    }
854
855    public enum SystemRestfulInteraction {
856        /**
857         * Update, create or delete a set of resources as a single transaction.
858         */
859        TRANSACTION, 
860        /**
861         * perform a set of a separate interactions in a single http operation
862         */
863        BATCH, 
864        /**
865         * Search all resources based on some filter criteria.
866         */
867        SEARCHSYSTEM, 
868        /**
869         * Retrieve the change history for all resources on a system.
870         */
871        HISTORYSYSTEM, 
872        /**
873         * added to help the parsers with the generic types
874         */
875        NULL;
876        public static SystemRestfulInteraction fromCode(String codeString) throws FHIRException {
877            if (codeString == null || "".equals(codeString))
878                return null;
879        if ("transaction".equals(codeString))
880          return TRANSACTION;
881        if ("batch".equals(codeString))
882          return BATCH;
883        if ("search-system".equals(codeString))
884          return SEARCHSYSTEM;
885        if ("history-system".equals(codeString))
886          return HISTORYSYSTEM;
887        if (Configuration.isAcceptInvalidEnums())
888          return null;
889        else
890          throw new FHIRException("Unknown SystemRestfulInteraction code '"+codeString+"'");
891        }
892        public String toCode() {
893          switch (this) {
894            case TRANSACTION: return "transaction";
895            case BATCH: return "batch";
896            case SEARCHSYSTEM: return "search-system";
897            case HISTORYSYSTEM: return "history-system";
898            case NULL: return null;
899            default: return "?";
900          }
901        }
902        public String getSystem() {
903          switch (this) {
904            case TRANSACTION: return "http://hl7.org/fhir/restful-interaction";
905            case BATCH: return "http://hl7.org/fhir/restful-interaction";
906            case SEARCHSYSTEM: return "http://hl7.org/fhir/restful-interaction";
907            case HISTORYSYSTEM: return "http://hl7.org/fhir/restful-interaction";
908            case NULL: return null;
909            default: return "?";
910          }
911        }
912        public String getDefinition() {
913          switch (this) {
914            case TRANSACTION: return "Update, create or delete a set of resources as a single transaction.";
915            case BATCH: return "perform a set of a separate interactions in a single http operation";
916            case SEARCHSYSTEM: return "Search all resources based on some filter criteria.";
917            case HISTORYSYSTEM: return "Retrieve the change history for all resources on a system.";
918            case NULL: return null;
919            default: return "?";
920          }
921        }
922        public String getDisplay() {
923          switch (this) {
924            case TRANSACTION: return "transaction";
925            case BATCH: return "batch";
926            case SEARCHSYSTEM: return "search-system";
927            case HISTORYSYSTEM: return "history-system";
928            case NULL: return null;
929            default: return "?";
930          }
931        }
932    }
933
934  public static class SystemRestfulInteractionEnumFactory implements EnumFactory<SystemRestfulInteraction> {
935    public SystemRestfulInteraction fromCode(String codeString) throws IllegalArgumentException {
936      if (codeString == null || "".equals(codeString))
937            if (codeString == null || "".equals(codeString))
938                return null;
939        if ("transaction".equals(codeString))
940          return SystemRestfulInteraction.TRANSACTION;
941        if ("batch".equals(codeString))
942          return SystemRestfulInteraction.BATCH;
943        if ("search-system".equals(codeString))
944          return SystemRestfulInteraction.SEARCHSYSTEM;
945        if ("history-system".equals(codeString))
946          return SystemRestfulInteraction.HISTORYSYSTEM;
947        throw new IllegalArgumentException("Unknown SystemRestfulInteraction code '"+codeString+"'");
948        }
949        public Enumeration<SystemRestfulInteraction> fromType(PrimitiveType<?> code) throws FHIRException {
950          if (code == null)
951            return null;
952          if (code.isEmpty())
953            return new Enumeration<SystemRestfulInteraction>(this, SystemRestfulInteraction.NULL, code);
954          String codeString = ((PrimitiveType) code).asStringValue();
955          if (codeString == null || "".equals(codeString))
956            return new Enumeration<SystemRestfulInteraction>(this, SystemRestfulInteraction.NULL, code);
957        if ("transaction".equals(codeString))
958          return new Enumeration<SystemRestfulInteraction>(this, SystemRestfulInteraction.TRANSACTION, code);
959        if ("batch".equals(codeString))
960          return new Enumeration<SystemRestfulInteraction>(this, SystemRestfulInteraction.BATCH, code);
961        if ("search-system".equals(codeString))
962          return new Enumeration<SystemRestfulInteraction>(this, SystemRestfulInteraction.SEARCHSYSTEM, code);
963        if ("history-system".equals(codeString))
964          return new Enumeration<SystemRestfulInteraction>(this, SystemRestfulInteraction.HISTORYSYSTEM, code);
965        throw new FHIRException("Unknown SystemRestfulInteraction code '"+codeString+"'");
966        }
967    public String toCode(SystemRestfulInteraction code) {
968       if (code == SystemRestfulInteraction.NULL)
969           return null;
970       if (code == SystemRestfulInteraction.TRANSACTION)
971        return "transaction";
972      if (code == SystemRestfulInteraction.BATCH)
973        return "batch";
974      if (code == SystemRestfulInteraction.SEARCHSYSTEM)
975        return "search-system";
976      if (code == SystemRestfulInteraction.HISTORYSYSTEM)
977        return "history-system";
978      return "?";
979   }
980    public String toSystem(SystemRestfulInteraction code) {
981      return code.getSystem();
982      }
983    }
984
985    public enum TypeRestfulInteraction {
986        /**
987         * Read the current state of the resource.
988         */
989        READ, 
990        /**
991         * Read the state of a specific version of the resource.
992         */
993        VREAD, 
994        /**
995         * Update an existing resource by its id (or create it if it is new).
996         */
997        UPDATE, 
998        /**
999         * Update an existing resource by posting a set of changes to it.
1000         */
1001        PATCH, 
1002        /**
1003         * Delete a resource.
1004         */
1005        DELETE, 
1006        /**
1007         * Retrieve the change history for a particular resource.
1008         */
1009        HISTORYINSTANCE, 
1010        /**
1011         * Retrieve the change history for all resources of a particular type.
1012         */
1013        HISTORYTYPE, 
1014        /**
1015         * Create a new resource with a server assigned id.
1016         */
1017        CREATE, 
1018        /**
1019         * Search all resources of the specified type based on some filter criteria.
1020         */
1021        SEARCHTYPE, 
1022        /**
1023         * added to help the parsers with the generic types
1024         */
1025        NULL;
1026        public static TypeRestfulInteraction fromCode(String codeString) throws FHIRException {
1027            if (codeString == null || "".equals(codeString))
1028                return null;
1029        if ("read".equals(codeString))
1030          return READ;
1031        if ("vread".equals(codeString))
1032          return VREAD;
1033        if ("update".equals(codeString))
1034          return UPDATE;
1035        if ("patch".equals(codeString))
1036          return PATCH;
1037        if ("delete".equals(codeString))
1038          return DELETE;
1039        if ("history-instance".equals(codeString))
1040          return HISTORYINSTANCE;
1041        if ("history-type".equals(codeString))
1042          return HISTORYTYPE;
1043        if ("create".equals(codeString))
1044          return CREATE;
1045        if ("search-type".equals(codeString))
1046          return SEARCHTYPE;
1047        if (Configuration.isAcceptInvalidEnums())
1048          return null;
1049        else
1050          throw new FHIRException("Unknown TypeRestfulInteraction code '"+codeString+"'");
1051        }
1052        public String toCode() {
1053          switch (this) {
1054            case READ: return "read";
1055            case VREAD: return "vread";
1056            case UPDATE: return "update";
1057            case PATCH: return "patch";
1058            case DELETE: return "delete";
1059            case HISTORYINSTANCE: return "history-instance";
1060            case HISTORYTYPE: return "history-type";
1061            case CREATE: return "create";
1062            case SEARCHTYPE: return "search-type";
1063            case NULL: return null;
1064            default: return "?";
1065          }
1066        }
1067        public String getSystem() {
1068          switch (this) {
1069            case READ: return "http://hl7.org/fhir/restful-interaction";
1070            case VREAD: return "http://hl7.org/fhir/restful-interaction";
1071            case UPDATE: return "http://hl7.org/fhir/restful-interaction";
1072            case PATCH: return "http://hl7.org/fhir/restful-interaction";
1073            case DELETE: return "http://hl7.org/fhir/restful-interaction";
1074            case HISTORYINSTANCE: return "http://hl7.org/fhir/restful-interaction";
1075            case HISTORYTYPE: return "http://hl7.org/fhir/restful-interaction";
1076            case CREATE: return "http://hl7.org/fhir/restful-interaction";
1077            case SEARCHTYPE: return "http://hl7.org/fhir/restful-interaction";
1078            case NULL: return null;
1079            default: return "?";
1080          }
1081        }
1082        public String getDefinition() {
1083          switch (this) {
1084            case READ: return "Read the current state of the resource.";
1085            case VREAD: return "Read the state of a specific version of the resource.";
1086            case UPDATE: return "Update an existing resource by its id (or create it if it is new).";
1087            case PATCH: return "Update an existing resource by posting a set of changes to it.";
1088            case DELETE: return "Delete a resource.";
1089            case HISTORYINSTANCE: return "Retrieve the change history for a particular resource.";
1090            case HISTORYTYPE: return "Retrieve the change history for all resources of a particular type.";
1091            case CREATE: return "Create a new resource with a server assigned id.";
1092            case SEARCHTYPE: return "Search all resources of the specified type based on some filter criteria.";
1093            case NULL: return null;
1094            default: return "?";
1095          }
1096        }
1097        public String getDisplay() {
1098          switch (this) {
1099            case READ: return "read";
1100            case VREAD: return "vread";
1101            case UPDATE: return "update";
1102            case PATCH: return "patch";
1103            case DELETE: return "delete";
1104            case HISTORYINSTANCE: return "history-instance";
1105            case HISTORYTYPE: return "history-type";
1106            case CREATE: return "create";
1107            case SEARCHTYPE: return "search-type";
1108            case NULL: return null;
1109            default: return "?";
1110          }
1111        }
1112    }
1113
1114  public static class TypeRestfulInteractionEnumFactory implements EnumFactory<TypeRestfulInteraction> {
1115    public TypeRestfulInteraction fromCode(String codeString) throws IllegalArgumentException {
1116      if (codeString == null || "".equals(codeString))
1117            if (codeString == null || "".equals(codeString))
1118                return null;
1119        if ("read".equals(codeString))
1120          return TypeRestfulInteraction.READ;
1121        if ("vread".equals(codeString))
1122          return TypeRestfulInteraction.VREAD;
1123        if ("update".equals(codeString))
1124          return TypeRestfulInteraction.UPDATE;
1125        if ("patch".equals(codeString))
1126          return TypeRestfulInteraction.PATCH;
1127        if ("delete".equals(codeString))
1128          return TypeRestfulInteraction.DELETE;
1129        if ("history-instance".equals(codeString))
1130          return TypeRestfulInteraction.HISTORYINSTANCE;
1131        if ("history-type".equals(codeString))
1132          return TypeRestfulInteraction.HISTORYTYPE;
1133        if ("create".equals(codeString))
1134          return TypeRestfulInteraction.CREATE;
1135        if ("search-type".equals(codeString))
1136          return TypeRestfulInteraction.SEARCHTYPE;
1137        throw new IllegalArgumentException("Unknown TypeRestfulInteraction code '"+codeString+"'");
1138        }
1139        public Enumeration<TypeRestfulInteraction> fromType(PrimitiveType<?> code) throws FHIRException {
1140          if (code == null)
1141            return null;
1142          if (code.isEmpty())
1143            return new Enumeration<TypeRestfulInteraction>(this, TypeRestfulInteraction.NULL, code);
1144          String codeString = ((PrimitiveType) code).asStringValue();
1145          if (codeString == null || "".equals(codeString))
1146            return new Enumeration<TypeRestfulInteraction>(this, TypeRestfulInteraction.NULL, code);
1147        if ("read".equals(codeString))
1148          return new Enumeration<TypeRestfulInteraction>(this, TypeRestfulInteraction.READ, code);
1149        if ("vread".equals(codeString))
1150          return new Enumeration<TypeRestfulInteraction>(this, TypeRestfulInteraction.VREAD, code);
1151        if ("update".equals(codeString))
1152          return new Enumeration<TypeRestfulInteraction>(this, TypeRestfulInteraction.UPDATE, code);
1153        if ("patch".equals(codeString))
1154          return new Enumeration<TypeRestfulInteraction>(this, TypeRestfulInteraction.PATCH, code);
1155        if ("delete".equals(codeString))
1156          return new Enumeration<TypeRestfulInteraction>(this, TypeRestfulInteraction.DELETE, code);
1157        if ("history-instance".equals(codeString))
1158          return new Enumeration<TypeRestfulInteraction>(this, TypeRestfulInteraction.HISTORYINSTANCE, code);
1159        if ("history-type".equals(codeString))
1160          return new Enumeration<TypeRestfulInteraction>(this, TypeRestfulInteraction.HISTORYTYPE, code);
1161        if ("create".equals(codeString))
1162          return new Enumeration<TypeRestfulInteraction>(this, TypeRestfulInteraction.CREATE, code);
1163        if ("search-type".equals(codeString))
1164          return new Enumeration<TypeRestfulInteraction>(this, TypeRestfulInteraction.SEARCHTYPE, code);
1165        throw new FHIRException("Unknown TypeRestfulInteraction code '"+codeString+"'");
1166        }
1167    public String toCode(TypeRestfulInteraction code) {
1168       if (code == TypeRestfulInteraction.NULL)
1169           return null;
1170       if (code == TypeRestfulInteraction.READ)
1171        return "read";
1172      if (code == TypeRestfulInteraction.VREAD)
1173        return "vread";
1174      if (code == TypeRestfulInteraction.UPDATE)
1175        return "update";
1176      if (code == TypeRestfulInteraction.PATCH)
1177        return "patch";
1178      if (code == TypeRestfulInteraction.DELETE)
1179        return "delete";
1180      if (code == TypeRestfulInteraction.HISTORYINSTANCE)
1181        return "history-instance";
1182      if (code == TypeRestfulInteraction.HISTORYTYPE)
1183        return "history-type";
1184      if (code == TypeRestfulInteraction.CREATE)
1185        return "create";
1186      if (code == TypeRestfulInteraction.SEARCHTYPE)
1187        return "search-type";
1188      return "?";
1189   }
1190    public String toSystem(TypeRestfulInteraction code) {
1191      return code.getSystem();
1192      }
1193    }
1194
1195    @Block()
1196    public static class CapabilityStatementSoftwareComponent extends BackboneElement implements IBaseBackboneElement {
1197        /**
1198         * Name the software is known by.
1199         */
1200        @Child(name = "name", type = {StringType.class}, order=1, min=1, max=1, modifier=false, summary=true)
1201        @Description(shortDefinition="A name the software is known by", formalDefinition="Name the software is known by." )
1202        protected StringType name;
1203
1204        /**
1205         * The version identifier for the software covered by this statement.
1206         */
1207        @Child(name = "version", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=true)
1208        @Description(shortDefinition="Version covered by this statement", formalDefinition="The version identifier for the software covered by this statement." )
1209        protected StringType version;
1210
1211        /**
1212         * Date this version of the software was released.
1213         */
1214        @Child(name = "releaseDate", type = {DateTimeType.class}, order=3, min=0, max=1, modifier=false, summary=true)
1215        @Description(shortDefinition="Date this version was released", formalDefinition="Date this version of the software was released." )
1216        protected DateTimeType releaseDate;
1217
1218        private static final long serialVersionUID = 1819769027L;
1219
1220    /**
1221     * Constructor
1222     */
1223      public CapabilityStatementSoftwareComponent() {
1224        super();
1225      }
1226
1227    /**
1228     * Constructor
1229     */
1230      public CapabilityStatementSoftwareComponent(String name) {
1231        super();
1232        this.setName(name);
1233      }
1234
1235        /**
1236         * @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
1237         */
1238        public StringType getNameElement() { 
1239          if (this.name == null)
1240            if (Configuration.errorOnAutoCreate())
1241              throw new Error("Attempt to auto-create CapabilityStatementSoftwareComponent.name");
1242            else if (Configuration.doAutoCreate())
1243              this.name = new StringType(); // bb
1244          return this.name;
1245        }
1246
1247        public boolean hasNameElement() { 
1248          return this.name != null && !this.name.isEmpty();
1249        }
1250
1251        public boolean hasName() { 
1252          return this.name != null && !this.name.isEmpty();
1253        }
1254
1255        /**
1256         * @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
1257         */
1258        public CapabilityStatementSoftwareComponent setNameElement(StringType value) { 
1259          this.name = value;
1260          return this;
1261        }
1262
1263        /**
1264         * @return Name the software is known by.
1265         */
1266        public String getName() { 
1267          return this.name == null ? null : this.name.getValue();
1268        }
1269
1270        /**
1271         * @param value Name the software is known by.
1272         */
1273        public CapabilityStatementSoftwareComponent setName(String value) { 
1274            if (this.name == null)
1275              this.name = new StringType();
1276            this.name.setValue(value);
1277          return this;
1278        }
1279
1280        /**
1281         * @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
1282         */
1283        public StringType getVersionElement() { 
1284          if (this.version == null)
1285            if (Configuration.errorOnAutoCreate())
1286              throw new Error("Attempt to auto-create CapabilityStatementSoftwareComponent.version");
1287            else if (Configuration.doAutoCreate())
1288              this.version = new StringType(); // bb
1289          return this.version;
1290        }
1291
1292        public boolean hasVersionElement() { 
1293          return this.version != null && !this.version.isEmpty();
1294        }
1295
1296        public boolean hasVersion() { 
1297          return this.version != null && !this.version.isEmpty();
1298        }
1299
1300        /**
1301         * @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
1302         */
1303        public CapabilityStatementSoftwareComponent setVersionElement(StringType value) { 
1304          this.version = value;
1305          return this;
1306        }
1307
1308        /**
1309         * @return The version identifier for the software covered by this statement.
1310         */
1311        public String getVersion() { 
1312          return this.version == null ? null : this.version.getValue();
1313        }
1314
1315        /**
1316         * @param value The version identifier for the software covered by this statement.
1317         */
1318        public CapabilityStatementSoftwareComponent setVersion(String value) { 
1319          if (Utilities.noString(value))
1320            this.version = null;
1321          else {
1322            if (this.version == null)
1323              this.version = new StringType();
1324            this.version.setValue(value);
1325          }
1326          return this;
1327        }
1328
1329        /**
1330         * @return {@link #releaseDate} (Date this version of the software was released.). This is the underlying object with id, value and extensions. The accessor "getReleaseDate" gives direct access to the value
1331         */
1332        public DateTimeType getReleaseDateElement() { 
1333          if (this.releaseDate == null)
1334            if (Configuration.errorOnAutoCreate())
1335              throw new Error("Attempt to auto-create CapabilityStatementSoftwareComponent.releaseDate");
1336            else if (Configuration.doAutoCreate())
1337              this.releaseDate = new DateTimeType(); // bb
1338          return this.releaseDate;
1339        }
1340
1341        public boolean hasReleaseDateElement() { 
1342          return this.releaseDate != null && !this.releaseDate.isEmpty();
1343        }
1344
1345        public boolean hasReleaseDate() { 
1346          return this.releaseDate != null && !this.releaseDate.isEmpty();
1347        }
1348
1349        /**
1350         * @param value {@link #releaseDate} (Date this version of the software was released.). This is the underlying object with id, value and extensions. The accessor "getReleaseDate" gives direct access to the value
1351         */
1352        public CapabilityStatementSoftwareComponent setReleaseDateElement(DateTimeType value) { 
1353          this.releaseDate = value;
1354          return this;
1355        }
1356
1357        /**
1358         * @return Date this version of the software was released.
1359         */
1360        public Date getReleaseDate() { 
1361          return this.releaseDate == null ? null : this.releaseDate.getValue();
1362        }
1363
1364        /**
1365         * @param value Date this version of the software was released.
1366         */
1367        public CapabilityStatementSoftwareComponent setReleaseDate(Date value) { 
1368          if (value == null)
1369            this.releaseDate = null;
1370          else {
1371            if (this.releaseDate == null)
1372              this.releaseDate = new DateTimeType();
1373            this.releaseDate.setValue(value);
1374          }
1375          return this;
1376        }
1377
1378        protected void listChildren(List<Property> children) {
1379          super.listChildren(children);
1380          children.add(new Property("name", "string", "Name the software is known by.", 0, 1, name));
1381          children.add(new Property("version", "string", "The version identifier for the software covered by this statement.", 0, 1, version));
1382          children.add(new Property("releaseDate", "dateTime", "Date this version of the software was released.", 0, 1, releaseDate));
1383        }
1384
1385        @Override
1386        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1387          switch (_hash) {
1388          case 3373707: /*name*/  return new Property("name", "string", "Name the software is known by.", 0, 1, name);
1389          case 351608024: /*version*/  return new Property("version", "string", "The version identifier for the software covered by this statement.", 0, 1, version);
1390          case 212873301: /*releaseDate*/  return new Property("releaseDate", "dateTime", "Date this version of the software was released.", 0, 1, releaseDate);
1391          default: return super.getNamedProperty(_hash, _name, _checkValid);
1392          }
1393
1394        }
1395
1396      @Override
1397      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1398        switch (hash) {
1399        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // StringType
1400        case 351608024: /*version*/ return this.version == null ? new Base[0] : new Base[] {this.version}; // StringType
1401        case 212873301: /*releaseDate*/ return this.releaseDate == null ? new Base[0] : new Base[] {this.releaseDate}; // DateTimeType
1402        default: return super.getProperty(hash, name, checkValid);
1403        }
1404
1405      }
1406
1407      @Override
1408      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1409        switch (hash) {
1410        case 3373707: // name
1411          this.name = TypeConvertor.castToString(value); // StringType
1412          return value;
1413        case 351608024: // version
1414          this.version = TypeConvertor.castToString(value); // StringType
1415          return value;
1416        case 212873301: // releaseDate
1417          this.releaseDate = TypeConvertor.castToDateTime(value); // DateTimeType
1418          return value;
1419        default: return super.setProperty(hash, name, value);
1420        }
1421
1422      }
1423
1424      @Override
1425      public Base setProperty(String name, Base value) throws FHIRException {
1426        if (name.equals("name")) {
1427          this.name = TypeConvertor.castToString(value); // StringType
1428        } else if (name.equals("version")) {
1429          this.version = TypeConvertor.castToString(value); // StringType
1430        } else if (name.equals("releaseDate")) {
1431          this.releaseDate = TypeConvertor.castToDateTime(value); // DateTimeType
1432        } else
1433          return super.setProperty(name, value);
1434        return value;
1435      }
1436
1437  @Override
1438  public void removeChild(String name, Base value) throws FHIRException {
1439        if (name.equals("name")) {
1440          this.name = null;
1441        } else if (name.equals("version")) {
1442          this.version = null;
1443        } else if (name.equals("releaseDate")) {
1444          this.releaseDate = null;
1445        } else
1446          super.removeChild(name, value);
1447        
1448      }
1449
1450      @Override
1451      public Base makeProperty(int hash, String name) throws FHIRException {
1452        switch (hash) {
1453        case 3373707:  return getNameElement();
1454        case 351608024:  return getVersionElement();
1455        case 212873301:  return getReleaseDateElement();
1456        default: return super.makeProperty(hash, name);
1457        }
1458
1459      }
1460
1461      @Override
1462      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1463        switch (hash) {
1464        case 3373707: /*name*/ return new String[] {"string"};
1465        case 351608024: /*version*/ return new String[] {"string"};
1466        case 212873301: /*releaseDate*/ return new String[] {"dateTime"};
1467        default: return super.getTypesForProperty(hash, name);
1468        }
1469
1470      }
1471
1472      @Override
1473      public Base addChild(String name) throws FHIRException {
1474        if (name.equals("name")) {
1475          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.software.name");
1476        }
1477        else if (name.equals("version")) {
1478          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.software.version");
1479        }
1480        else if (name.equals("releaseDate")) {
1481          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.software.releaseDate");
1482        }
1483        else
1484          return super.addChild(name);
1485      }
1486
1487      public CapabilityStatementSoftwareComponent copy() {
1488        CapabilityStatementSoftwareComponent dst = new CapabilityStatementSoftwareComponent();
1489        copyValues(dst);
1490        return dst;
1491      }
1492
1493      public void copyValues(CapabilityStatementSoftwareComponent dst) {
1494        super.copyValues(dst);
1495        dst.name = name == null ? null : name.copy();
1496        dst.version = version == null ? null : version.copy();
1497        dst.releaseDate = releaseDate == null ? null : releaseDate.copy();
1498      }
1499
1500      @Override
1501      public boolean equalsDeep(Base other_) {
1502        if (!super.equalsDeep(other_))
1503          return false;
1504        if (!(other_ instanceof CapabilityStatementSoftwareComponent))
1505          return false;
1506        CapabilityStatementSoftwareComponent o = (CapabilityStatementSoftwareComponent) other_;
1507        return compareDeep(name, o.name, true) && compareDeep(version, o.version, true) && compareDeep(releaseDate, o.releaseDate, true)
1508          ;
1509      }
1510
1511      @Override
1512      public boolean equalsShallow(Base other_) {
1513        if (!super.equalsShallow(other_))
1514          return false;
1515        if (!(other_ instanceof CapabilityStatementSoftwareComponent))
1516          return false;
1517        CapabilityStatementSoftwareComponent o = (CapabilityStatementSoftwareComponent) other_;
1518        return compareValues(name, o.name, true) && compareValues(version, o.version, true) && compareValues(releaseDate, o.releaseDate, true)
1519          ;
1520      }
1521
1522      public boolean isEmpty() {
1523        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(name, version, releaseDate
1524          );
1525      }
1526
1527  public String fhirType() {
1528    return "CapabilityStatement.software";
1529
1530  }
1531
1532  }
1533
1534    @Block()
1535    public static class CapabilityStatementImplementationComponent extends BackboneElement implements IBaseBackboneElement {
1536        /**
1537         * Information about the specific installation that this capability statement relates to.
1538         */
1539        @Child(name = "description", type = {MarkdownType.class}, order=1, min=1, max=1, modifier=false, summary=true)
1540        @Description(shortDefinition="Describes this specific instance", formalDefinition="Information about the specific installation that this capability statement relates to." )
1541        protected MarkdownType description;
1542
1543        /**
1544         * An absolute base URL for the implementation.  This forms the base for REST interfaces as well as the mailbox and document interfaces.
1545         */
1546        @Child(name = "url", type = {UrlType.class}, order=2, min=0, max=1, modifier=false, summary=true)
1547        @Description(shortDefinition="Base URL for the installation", formalDefinition="An absolute base URL for the implementation.  This forms the base for REST interfaces as well as the mailbox and document interfaces." )
1548        protected UrlType url;
1549
1550        /**
1551         * The organization responsible for the management of the instance and oversight of the data on the server at the specified URL.
1552         */
1553        @Child(name = "custodian", type = {Organization.class}, order=3, min=0, max=1, modifier=false, summary=true)
1554        @Description(shortDefinition="Organization that manages the data", formalDefinition="The organization responsible for the management of the instance and oversight of the data on the server at the specified URL." )
1555        protected Reference custodian;
1556
1557        private static final long serialVersionUID = -1848514556L;
1558
1559    /**
1560     * Constructor
1561     */
1562      public CapabilityStatementImplementationComponent() {
1563        super();
1564      }
1565
1566    /**
1567     * Constructor
1568     */
1569      public CapabilityStatementImplementationComponent(String description) {
1570        super();
1571        this.setDescription(description);
1572      }
1573
1574        /**
1575         * @return {@link #description} (Information about the specific installation that this capability statement relates to.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
1576         */
1577        public MarkdownType getDescriptionElement() { 
1578          if (this.description == null)
1579            if (Configuration.errorOnAutoCreate())
1580              throw new Error("Attempt to auto-create CapabilityStatementImplementationComponent.description");
1581            else if (Configuration.doAutoCreate())
1582              this.description = new MarkdownType(); // bb
1583          return this.description;
1584        }
1585
1586        public boolean hasDescriptionElement() { 
1587          return this.description != null && !this.description.isEmpty();
1588        }
1589
1590        public boolean hasDescription() { 
1591          return this.description != null && !this.description.isEmpty();
1592        }
1593
1594        /**
1595         * @param value {@link #description} (Information about the specific installation that this capability statement relates to.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
1596         */
1597        public CapabilityStatementImplementationComponent setDescriptionElement(MarkdownType value) { 
1598          this.description = value;
1599          return this;
1600        }
1601
1602        /**
1603         * @return Information about the specific installation that this capability statement relates to.
1604         */
1605        public String getDescription() { 
1606          return this.description == null ? null : this.description.getValue();
1607        }
1608
1609        /**
1610         * @param value Information about the specific installation that this capability statement relates to.
1611         */
1612        public CapabilityStatementImplementationComponent setDescription(String value) { 
1613            if (this.description == null)
1614              this.description = new MarkdownType();
1615            this.description.setValue(value);
1616          return this;
1617        }
1618
1619        /**
1620         * @return {@link #url} (An absolute base URL for the implementation.  This forms the base for REST interfaces as well as the mailbox and document interfaces.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
1621         */
1622        public UrlType getUrlElement() { 
1623          if (this.url == null)
1624            if (Configuration.errorOnAutoCreate())
1625              throw new Error("Attempt to auto-create CapabilityStatementImplementationComponent.url");
1626            else if (Configuration.doAutoCreate())
1627              this.url = new UrlType(); // bb
1628          return this.url;
1629        }
1630
1631        public boolean hasUrlElement() { 
1632          return this.url != null && !this.url.isEmpty();
1633        }
1634
1635        public boolean hasUrl() { 
1636          return this.url != null && !this.url.isEmpty();
1637        }
1638
1639        /**
1640         * @param value {@link #url} (An absolute base URL for the implementation.  This forms the base for REST interfaces as well as the mailbox and document interfaces.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
1641         */
1642        public CapabilityStatementImplementationComponent setUrlElement(UrlType value) { 
1643          this.url = value;
1644          return this;
1645        }
1646
1647        /**
1648         * @return An absolute base URL for the implementation.  This forms the base for REST interfaces as well as the mailbox and document interfaces.
1649         */
1650        public String getUrl() { 
1651          return this.url == null ? null : this.url.getValue();
1652        }
1653
1654        /**
1655         * @param value An absolute base URL for the implementation.  This forms the base for REST interfaces as well as the mailbox and document interfaces.
1656         */
1657        public CapabilityStatementImplementationComponent setUrl(String value) { 
1658          if (Utilities.noString(value))
1659            this.url = null;
1660          else {
1661            if (this.url == null)
1662              this.url = new UrlType();
1663            this.url.setValue(value);
1664          }
1665          return this;
1666        }
1667
1668        /**
1669         * @return {@link #custodian} (The organization responsible for the management of the instance and oversight of the data on the server at the specified URL.)
1670         */
1671        public Reference getCustodian() { 
1672          if (this.custodian == null)
1673            if (Configuration.errorOnAutoCreate())
1674              throw new Error("Attempt to auto-create CapabilityStatementImplementationComponent.custodian");
1675            else if (Configuration.doAutoCreate())
1676              this.custodian = new Reference(); // cc
1677          return this.custodian;
1678        }
1679
1680        public boolean hasCustodian() { 
1681          return this.custodian != null && !this.custodian.isEmpty();
1682        }
1683
1684        /**
1685         * @param value {@link #custodian} (The organization responsible for the management of the instance and oversight of the data on the server at the specified URL.)
1686         */
1687        public CapabilityStatementImplementationComponent setCustodian(Reference value) { 
1688          this.custodian = value;
1689          return this;
1690        }
1691
1692        protected void listChildren(List<Property> children) {
1693          super.listChildren(children);
1694          children.add(new Property("description", "markdown", "Information about the specific installation that this capability statement relates to.", 0, 1, description));
1695          children.add(new Property("url", "url", "An absolute base URL for the implementation.  This forms the base for REST interfaces as well as the mailbox and document interfaces.", 0, 1, url));
1696          children.add(new Property("custodian", "Reference(Organization)", "The organization responsible for the management of the instance and oversight of the data on the server at the specified URL.", 0, 1, custodian));
1697        }
1698
1699        @Override
1700        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1701          switch (_hash) {
1702          case -1724546052: /*description*/  return new Property("description", "markdown", "Information about the specific installation that this capability statement relates to.", 0, 1, description);
1703          case 116079: /*url*/  return new Property("url", "url", "An absolute base URL for the implementation.  This forms the base for REST interfaces as well as the mailbox and document interfaces.", 0, 1, url);
1704          case 1611297262: /*custodian*/  return new Property("custodian", "Reference(Organization)", "The organization responsible for the management of the instance and oversight of the data on the server at the specified URL.", 0, 1, custodian);
1705          default: return super.getNamedProperty(_hash, _name, _checkValid);
1706          }
1707
1708        }
1709
1710      @Override
1711      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1712        switch (hash) {
1713        case -1724546052: /*description*/ return this.description == null ? new Base[0] : new Base[] {this.description}; // MarkdownType
1714        case 116079: /*url*/ return this.url == null ? new Base[0] : new Base[] {this.url}; // UrlType
1715        case 1611297262: /*custodian*/ return this.custodian == null ? new Base[0] : new Base[] {this.custodian}; // Reference
1716        default: return super.getProperty(hash, name, checkValid);
1717        }
1718
1719      }
1720
1721      @Override
1722      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1723        switch (hash) {
1724        case -1724546052: // description
1725          this.description = TypeConvertor.castToMarkdown(value); // MarkdownType
1726          return value;
1727        case 116079: // url
1728          this.url = TypeConvertor.castToUrl(value); // UrlType
1729          return value;
1730        case 1611297262: // custodian
1731          this.custodian = TypeConvertor.castToReference(value); // Reference
1732          return value;
1733        default: return super.setProperty(hash, name, value);
1734        }
1735
1736      }
1737
1738      @Override
1739      public Base setProperty(String name, Base value) throws FHIRException {
1740        if (name.equals("description")) {
1741          this.description = TypeConvertor.castToMarkdown(value); // MarkdownType
1742        } else if (name.equals("url")) {
1743          this.url = TypeConvertor.castToUrl(value); // UrlType
1744        } else if (name.equals("custodian")) {
1745          this.custodian = TypeConvertor.castToReference(value); // Reference
1746        } else
1747          return super.setProperty(name, value);
1748        return value;
1749      }
1750
1751  @Override
1752  public void removeChild(String name, Base value) throws FHIRException {
1753        if (name.equals("description")) {
1754          this.description = null;
1755        } else if (name.equals("url")) {
1756          this.url = null;
1757        } else if (name.equals("custodian")) {
1758          this.custodian = null;
1759        } else
1760          super.removeChild(name, value);
1761        
1762      }
1763
1764      @Override
1765      public Base makeProperty(int hash, String name) throws FHIRException {
1766        switch (hash) {
1767        case -1724546052:  return getDescriptionElement();
1768        case 116079:  return getUrlElement();
1769        case 1611297262:  return getCustodian();
1770        default: return super.makeProperty(hash, name);
1771        }
1772
1773      }
1774
1775      @Override
1776      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1777        switch (hash) {
1778        case -1724546052: /*description*/ return new String[] {"markdown"};
1779        case 116079: /*url*/ return new String[] {"url"};
1780        case 1611297262: /*custodian*/ return new String[] {"Reference"};
1781        default: return super.getTypesForProperty(hash, name);
1782        }
1783
1784      }
1785
1786      @Override
1787      public Base addChild(String name) throws FHIRException {
1788        if (name.equals("description")) {
1789          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.implementation.description");
1790        }
1791        else if (name.equals("url")) {
1792          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.implementation.url");
1793        }
1794        else if (name.equals("custodian")) {
1795          this.custodian = new Reference();
1796          return this.custodian;
1797        }
1798        else
1799          return super.addChild(name);
1800      }
1801
1802      public CapabilityStatementImplementationComponent copy() {
1803        CapabilityStatementImplementationComponent dst = new CapabilityStatementImplementationComponent();
1804        copyValues(dst);
1805        return dst;
1806      }
1807
1808      public void copyValues(CapabilityStatementImplementationComponent dst) {
1809        super.copyValues(dst);
1810        dst.description = description == null ? null : description.copy();
1811        dst.url = url == null ? null : url.copy();
1812        dst.custodian = custodian == null ? null : custodian.copy();
1813      }
1814
1815      @Override
1816      public boolean equalsDeep(Base other_) {
1817        if (!super.equalsDeep(other_))
1818          return false;
1819        if (!(other_ instanceof CapabilityStatementImplementationComponent))
1820          return false;
1821        CapabilityStatementImplementationComponent o = (CapabilityStatementImplementationComponent) other_;
1822        return compareDeep(description, o.description, true) && compareDeep(url, o.url, true) && compareDeep(custodian, o.custodian, true)
1823          ;
1824      }
1825
1826      @Override
1827      public boolean equalsShallow(Base other_) {
1828        if (!super.equalsShallow(other_))
1829          return false;
1830        if (!(other_ instanceof CapabilityStatementImplementationComponent))
1831          return false;
1832        CapabilityStatementImplementationComponent o = (CapabilityStatementImplementationComponent) other_;
1833        return compareValues(description, o.description, true) && compareValues(url, o.url, true);
1834      }
1835
1836      public boolean isEmpty() {
1837        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(description, url, custodian
1838          );
1839      }
1840
1841  public String fhirType() {
1842    return "CapabilityStatement.implementation";
1843
1844  }
1845
1846  }
1847
1848    @Block()
1849    public static class CapabilityStatementRestComponent extends BackboneElement implements IBaseBackboneElement {
1850        /**
1851         * Identifies whether this portion of the statement is describing the ability to initiate or receive restful operations.
1852         */
1853        @Child(name = "mode", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=true)
1854        @Description(shortDefinition="client | server", formalDefinition="Identifies whether this portion of the statement is describing the ability to initiate or receive restful operations." )
1855        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/restful-capability-mode")
1856        protected Enumeration<RestfulCapabilityMode> mode;
1857
1858        /**
1859         * Information about the system's restful capabilities that apply across all applications, such as security.
1860         */
1861        @Child(name = "documentation", type = {MarkdownType.class}, order=2, min=0, max=1, modifier=false, summary=false)
1862        @Description(shortDefinition="General description of implementation", formalDefinition="Information about the system's restful capabilities that apply across all applications, such as security." )
1863        protected MarkdownType documentation;
1864
1865        /**
1866         * Information about security implementation from an interface perspective - what a client needs to know.
1867         */
1868        @Child(name = "security", type = {}, order=3, min=0, max=1, modifier=false, summary=true)
1869        @Description(shortDefinition="Information about security of implementation", formalDefinition="Information about security implementation from an interface perspective - what a client needs to know." )
1870        protected CapabilityStatementRestSecurityComponent security;
1871
1872        /**
1873         * A specification of the restful capabilities of the solution for a specific resource type.
1874         */
1875        @Child(name = "resource", type = {}, order=4, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
1876        @Description(shortDefinition="Resource served on the REST interface", formalDefinition="A specification of the restful capabilities of the solution for a specific resource type." )
1877        protected List<CapabilityStatementRestResourceComponent> resource;
1878
1879        /**
1880         * A specification of restful operations supported by the system.
1881         */
1882        @Child(name = "interaction", type = {}, order=5, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1883        @Description(shortDefinition="What operations are supported?", formalDefinition="A specification of restful operations supported by the system." )
1884        protected List<SystemInteractionComponent> interaction;
1885
1886        /**
1887         * Search parameters that are supported for searching all resources for implementations to support and/or make use of - either references to ones defined in the specification, or additional ones defined for/by the implementation. This is only for searches executed against the system-level endpoint.
1888         */
1889        @Child(name = "searchParam", type = {CapabilityStatementRestResourceSearchParamComponent.class}, order=6, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1890        @Description(shortDefinition="Search parameters for searching all resources", formalDefinition="Search parameters that are supported for searching all resources for implementations to support and/or make use of - either references to ones defined in the specification, or additional ones defined for/by the implementation. This is only for searches executed against the system-level endpoint." )
1891        protected List<CapabilityStatementRestResourceSearchParamComponent> searchParam;
1892
1893        /**
1894         * Definition of an operation or a named query together with its parameters and their meaning and type.
1895         */
1896        @Child(name = "operation", type = {CapabilityStatementRestResourceOperationComponent.class}, order=7, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
1897        @Description(shortDefinition="Definition of a system level operation", formalDefinition="Definition of an operation or a named query together with its parameters and their meaning and type." )
1898        protected List<CapabilityStatementRestResourceOperationComponent> operation;
1899
1900        /**
1901         * An absolute URI which is a reference to the definition of a compartment that the system supports. The reference is to a CompartmentDefinition resource by its canonical URL .
1902         */
1903        @Child(name = "compartment", type = {CanonicalType.class}, order=8, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1904        @Description(shortDefinition="Compartments served/used by system", formalDefinition="An absolute URI which is a reference to the definition of a compartment that the system supports. The reference is to a CompartmentDefinition resource by its canonical URL ." )
1905        protected List<CanonicalType> compartment;
1906
1907        private static final long serialVersionUID = -1442029817L;
1908
1909    /**
1910     * Constructor
1911     */
1912      public CapabilityStatementRestComponent() {
1913        super();
1914      }
1915
1916    /**
1917     * Constructor
1918     */
1919      public CapabilityStatementRestComponent(RestfulCapabilityMode mode) {
1920        super();
1921        this.setMode(mode);
1922      }
1923
1924        /**
1925         * @return {@link #mode} (Identifies whether this portion of the statement is describing the ability to initiate or receive restful operations.). This is the underlying object with id, value and extensions. The accessor "getMode" gives direct access to the value
1926         */
1927        public Enumeration<RestfulCapabilityMode> getModeElement() { 
1928          if (this.mode == null)
1929            if (Configuration.errorOnAutoCreate())
1930              throw new Error("Attempt to auto-create CapabilityStatementRestComponent.mode");
1931            else if (Configuration.doAutoCreate())
1932              this.mode = new Enumeration<RestfulCapabilityMode>(new RestfulCapabilityModeEnumFactory()); // bb
1933          return this.mode;
1934        }
1935
1936        public boolean hasModeElement() { 
1937          return this.mode != null && !this.mode.isEmpty();
1938        }
1939
1940        public boolean hasMode() { 
1941          return this.mode != null && !this.mode.isEmpty();
1942        }
1943
1944        /**
1945         * @param value {@link #mode} (Identifies whether this portion of the statement is describing the ability to initiate or receive restful operations.). This is the underlying object with id, value and extensions. The accessor "getMode" gives direct access to the value
1946         */
1947        public CapabilityStatementRestComponent setModeElement(Enumeration<RestfulCapabilityMode> value) { 
1948          this.mode = value;
1949          return this;
1950        }
1951
1952        /**
1953         * @return Identifies whether this portion of the statement is describing the ability to initiate or receive restful operations.
1954         */
1955        public RestfulCapabilityMode getMode() { 
1956          return this.mode == null ? null : this.mode.getValue();
1957        }
1958
1959        /**
1960         * @param value Identifies whether this portion of the statement is describing the ability to initiate or receive restful operations.
1961         */
1962        public CapabilityStatementRestComponent setMode(RestfulCapabilityMode value) { 
1963            if (this.mode == null)
1964              this.mode = new Enumeration<RestfulCapabilityMode>(new RestfulCapabilityModeEnumFactory());
1965            this.mode.setValue(value);
1966          return this;
1967        }
1968
1969        /**
1970         * @return {@link #documentation} (Information about the system's restful capabilities that apply across all applications, such as security.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
1971         */
1972        public MarkdownType getDocumentationElement() { 
1973          if (this.documentation == null)
1974            if (Configuration.errorOnAutoCreate())
1975              throw new Error("Attempt to auto-create CapabilityStatementRestComponent.documentation");
1976            else if (Configuration.doAutoCreate())
1977              this.documentation = new MarkdownType(); // bb
1978          return this.documentation;
1979        }
1980
1981        public boolean hasDocumentationElement() { 
1982          return this.documentation != null && !this.documentation.isEmpty();
1983        }
1984
1985        public boolean hasDocumentation() { 
1986          return this.documentation != null && !this.documentation.isEmpty();
1987        }
1988
1989        /**
1990         * @param value {@link #documentation} (Information about the system's restful capabilities that apply across all applications, such as security.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
1991         */
1992        public CapabilityStatementRestComponent setDocumentationElement(MarkdownType value) { 
1993          this.documentation = value;
1994          return this;
1995        }
1996
1997        /**
1998         * @return Information about the system's restful capabilities that apply across all applications, such as security.
1999         */
2000        public String getDocumentation() { 
2001          return this.documentation == null ? null : this.documentation.getValue();
2002        }
2003
2004        /**
2005         * @param value Information about the system's restful capabilities that apply across all applications, such as security.
2006         */
2007        public CapabilityStatementRestComponent setDocumentation(String value) { 
2008          if (Utilities.noString(value))
2009            this.documentation = null;
2010          else {
2011            if (this.documentation == null)
2012              this.documentation = new MarkdownType();
2013            this.documentation.setValue(value);
2014          }
2015          return this;
2016        }
2017
2018        /**
2019         * @return {@link #security} (Information about security implementation from an interface perspective - what a client needs to know.)
2020         */
2021        public CapabilityStatementRestSecurityComponent getSecurity() { 
2022          if (this.security == null)
2023            if (Configuration.errorOnAutoCreate())
2024              throw new Error("Attempt to auto-create CapabilityStatementRestComponent.security");
2025            else if (Configuration.doAutoCreate())
2026              this.security = new CapabilityStatementRestSecurityComponent(); // cc
2027          return this.security;
2028        }
2029
2030        public boolean hasSecurity() { 
2031          return this.security != null && !this.security.isEmpty();
2032        }
2033
2034        /**
2035         * @param value {@link #security} (Information about security implementation from an interface perspective - what a client needs to know.)
2036         */
2037        public CapabilityStatementRestComponent setSecurity(CapabilityStatementRestSecurityComponent value) { 
2038          this.security = value;
2039          return this;
2040        }
2041
2042        /**
2043         * @return {@link #resource} (A specification of the restful capabilities of the solution for a specific resource type.)
2044         */
2045        public List<CapabilityStatementRestResourceComponent> getResource() { 
2046          if (this.resource == null)
2047            this.resource = new ArrayList<CapabilityStatementRestResourceComponent>();
2048          return this.resource;
2049        }
2050
2051        /**
2052         * @return Returns a reference to <code>this</code> for easy method chaining
2053         */
2054        public CapabilityStatementRestComponent setResource(List<CapabilityStatementRestResourceComponent> theResource) { 
2055          this.resource = theResource;
2056          return this;
2057        }
2058
2059        public boolean hasResource() { 
2060          if (this.resource == null)
2061            return false;
2062          for (CapabilityStatementRestResourceComponent item : this.resource)
2063            if (!item.isEmpty())
2064              return true;
2065          return false;
2066        }
2067
2068        public CapabilityStatementRestResourceComponent addResource() { //3
2069          CapabilityStatementRestResourceComponent t = new CapabilityStatementRestResourceComponent();
2070          if (this.resource == null)
2071            this.resource = new ArrayList<CapabilityStatementRestResourceComponent>();
2072          this.resource.add(t);
2073          return t;
2074        }
2075
2076        public CapabilityStatementRestComponent addResource(CapabilityStatementRestResourceComponent t) { //3
2077          if (t == null)
2078            return this;
2079          if (this.resource == null)
2080            this.resource = new ArrayList<CapabilityStatementRestResourceComponent>();
2081          this.resource.add(t);
2082          return this;
2083        }
2084
2085        /**
2086         * @return The first repetition of repeating field {@link #resource}, creating it if it does not already exist {3}
2087         */
2088        public CapabilityStatementRestResourceComponent getResourceFirstRep() { 
2089          if (getResource().isEmpty()) {
2090            addResource();
2091          }
2092          return getResource().get(0);
2093        }
2094
2095        /**
2096         * @return {@link #interaction} (A specification of restful operations supported by the system.)
2097         */
2098        public List<SystemInteractionComponent> getInteraction() { 
2099          if (this.interaction == null)
2100            this.interaction = new ArrayList<SystemInteractionComponent>();
2101          return this.interaction;
2102        }
2103
2104        /**
2105         * @return Returns a reference to <code>this</code> for easy method chaining
2106         */
2107        public CapabilityStatementRestComponent setInteraction(List<SystemInteractionComponent> theInteraction) { 
2108          this.interaction = theInteraction;
2109          return this;
2110        }
2111
2112        public boolean hasInteraction() { 
2113          if (this.interaction == null)
2114            return false;
2115          for (SystemInteractionComponent item : this.interaction)
2116            if (!item.isEmpty())
2117              return true;
2118          return false;
2119        }
2120
2121        public SystemInteractionComponent addInteraction() { //3
2122          SystemInteractionComponent t = new SystemInteractionComponent();
2123          if (this.interaction == null)
2124            this.interaction = new ArrayList<SystemInteractionComponent>();
2125          this.interaction.add(t);
2126          return t;
2127        }
2128
2129        public CapabilityStatementRestComponent addInteraction(SystemInteractionComponent t) { //3
2130          if (t == null)
2131            return this;
2132          if (this.interaction == null)
2133            this.interaction = new ArrayList<SystemInteractionComponent>();
2134          this.interaction.add(t);
2135          return this;
2136        }
2137
2138        /**
2139         * @return The first repetition of repeating field {@link #interaction}, creating it if it does not already exist {3}
2140         */
2141        public SystemInteractionComponent getInteractionFirstRep() { 
2142          if (getInteraction().isEmpty()) {
2143            addInteraction();
2144          }
2145          return getInteraction().get(0);
2146        }
2147
2148        /**
2149         * @return {@link #searchParam} (Search parameters that are supported for searching all resources for implementations to support and/or make use of - either references to ones defined in the specification, or additional ones defined for/by the implementation. This is only for searches executed against the system-level endpoint.)
2150         */
2151        public List<CapabilityStatementRestResourceSearchParamComponent> getSearchParam() { 
2152          if (this.searchParam == null)
2153            this.searchParam = new ArrayList<CapabilityStatementRestResourceSearchParamComponent>();
2154          return this.searchParam;
2155        }
2156
2157        /**
2158         * @return Returns a reference to <code>this</code> for easy method chaining
2159         */
2160        public CapabilityStatementRestComponent setSearchParam(List<CapabilityStatementRestResourceSearchParamComponent> theSearchParam) { 
2161          this.searchParam = theSearchParam;
2162          return this;
2163        }
2164
2165        public boolean hasSearchParam() { 
2166          if (this.searchParam == null)
2167            return false;
2168          for (CapabilityStatementRestResourceSearchParamComponent item : this.searchParam)
2169            if (!item.isEmpty())
2170              return true;
2171          return false;
2172        }
2173
2174        public CapabilityStatementRestResourceSearchParamComponent addSearchParam() { //3
2175          CapabilityStatementRestResourceSearchParamComponent t = new CapabilityStatementRestResourceSearchParamComponent();
2176          if (this.searchParam == null)
2177            this.searchParam = new ArrayList<CapabilityStatementRestResourceSearchParamComponent>();
2178          this.searchParam.add(t);
2179          return t;
2180        }
2181
2182        public CapabilityStatementRestComponent addSearchParam(CapabilityStatementRestResourceSearchParamComponent t) { //3
2183          if (t == null)
2184            return this;
2185          if (this.searchParam == null)
2186            this.searchParam = new ArrayList<CapabilityStatementRestResourceSearchParamComponent>();
2187          this.searchParam.add(t);
2188          return this;
2189        }
2190
2191        /**
2192         * @return The first repetition of repeating field {@link #searchParam}, creating it if it does not already exist {3}
2193         */
2194        public CapabilityStatementRestResourceSearchParamComponent getSearchParamFirstRep() { 
2195          if (getSearchParam().isEmpty()) {
2196            addSearchParam();
2197          }
2198          return getSearchParam().get(0);
2199        }
2200
2201        /**
2202         * @return {@link #operation} (Definition of an operation or a named query together with its parameters and their meaning and type.)
2203         */
2204        public List<CapabilityStatementRestResourceOperationComponent> getOperation() { 
2205          if (this.operation == null)
2206            this.operation = new ArrayList<CapabilityStatementRestResourceOperationComponent>();
2207          return this.operation;
2208        }
2209
2210        /**
2211         * @return Returns a reference to <code>this</code> for easy method chaining
2212         */
2213        public CapabilityStatementRestComponent setOperation(List<CapabilityStatementRestResourceOperationComponent> theOperation) { 
2214          this.operation = theOperation;
2215          return this;
2216        }
2217
2218        public boolean hasOperation() { 
2219          if (this.operation == null)
2220            return false;
2221          for (CapabilityStatementRestResourceOperationComponent item : this.operation)
2222            if (!item.isEmpty())
2223              return true;
2224          return false;
2225        }
2226
2227        public CapabilityStatementRestResourceOperationComponent addOperation() { //3
2228          CapabilityStatementRestResourceOperationComponent t = new CapabilityStatementRestResourceOperationComponent();
2229          if (this.operation == null)
2230            this.operation = new ArrayList<CapabilityStatementRestResourceOperationComponent>();
2231          this.operation.add(t);
2232          return t;
2233        }
2234
2235        public CapabilityStatementRestComponent addOperation(CapabilityStatementRestResourceOperationComponent t) { //3
2236          if (t == null)
2237            return this;
2238          if (this.operation == null)
2239            this.operation = new ArrayList<CapabilityStatementRestResourceOperationComponent>();
2240          this.operation.add(t);
2241          return this;
2242        }
2243
2244        /**
2245         * @return The first repetition of repeating field {@link #operation}, creating it if it does not already exist {3}
2246         */
2247        public CapabilityStatementRestResourceOperationComponent getOperationFirstRep() { 
2248          if (getOperation().isEmpty()) {
2249            addOperation();
2250          }
2251          return getOperation().get(0);
2252        }
2253
2254        /**
2255         * @return {@link #compartment} (An absolute URI which is a reference to the definition of a compartment that the system supports. The reference is to a CompartmentDefinition resource by its canonical URL .)
2256         */
2257        public List<CanonicalType> getCompartment() { 
2258          if (this.compartment == null)
2259            this.compartment = new ArrayList<CanonicalType>();
2260          return this.compartment;
2261        }
2262
2263        /**
2264         * @return Returns a reference to <code>this</code> for easy method chaining
2265         */
2266        public CapabilityStatementRestComponent setCompartment(List<CanonicalType> theCompartment) { 
2267          this.compartment = theCompartment;
2268          return this;
2269        }
2270
2271        public boolean hasCompartment() { 
2272          if (this.compartment == null)
2273            return false;
2274          for (CanonicalType item : this.compartment)
2275            if (!item.isEmpty())
2276              return true;
2277          return false;
2278        }
2279
2280        /**
2281         * @return {@link #compartment} (An absolute URI which is a reference to the definition of a compartment that the system supports. The reference is to a CompartmentDefinition resource by its canonical URL .)
2282         */
2283        public CanonicalType addCompartmentElement() {//2 
2284          CanonicalType t = new CanonicalType();
2285          if (this.compartment == null)
2286            this.compartment = new ArrayList<CanonicalType>();
2287          this.compartment.add(t);
2288          return t;
2289        }
2290
2291        /**
2292         * @param value {@link #compartment} (An absolute URI which is a reference to the definition of a compartment that the system supports. The reference is to a CompartmentDefinition resource by its canonical URL .)
2293         */
2294        public CapabilityStatementRestComponent addCompartment(String value) { //1
2295          CanonicalType t = new CanonicalType();
2296          t.setValue(value);
2297          if (this.compartment == null)
2298            this.compartment = new ArrayList<CanonicalType>();
2299          this.compartment.add(t);
2300          return this;
2301        }
2302
2303        /**
2304         * @param value {@link #compartment} (An absolute URI which is a reference to the definition of a compartment that the system supports. The reference is to a CompartmentDefinition resource by its canonical URL .)
2305         */
2306        public boolean hasCompartment(String value) { 
2307          if (this.compartment == null)
2308            return false;
2309          for (CanonicalType v : this.compartment)
2310            if (v.getValue().equals(value)) // canonical
2311              return true;
2312          return false;
2313        }
2314
2315        protected void listChildren(List<Property> children) {
2316          super.listChildren(children);
2317          children.add(new Property("mode", "code", "Identifies whether this portion of the statement is describing the ability to initiate or receive restful operations.", 0, 1, mode));
2318          children.add(new Property("documentation", "markdown", "Information about the system's restful capabilities that apply across all applications, such as security.", 0, 1, documentation));
2319          children.add(new Property("security", "", "Information about security implementation from an interface perspective - what a client needs to know.", 0, 1, security));
2320          children.add(new Property("resource", "", "A specification of the restful capabilities of the solution for a specific resource type.", 0, java.lang.Integer.MAX_VALUE, resource));
2321          children.add(new Property("interaction", "", "A specification of restful operations supported by the system.", 0, java.lang.Integer.MAX_VALUE, interaction));
2322          children.add(new Property("searchParam", "@CapabilityStatement.rest.resource.searchParam", "Search parameters that are supported for searching all resources for implementations to support and/or make use of - either references to ones defined in the specification, or additional ones defined for/by the implementation. This is only for searches executed against the system-level endpoint.", 0, java.lang.Integer.MAX_VALUE, searchParam));
2323          children.add(new Property("operation", "@CapabilityStatement.rest.resource.operation", "Definition of an operation or a named query together with its parameters and their meaning and type.", 0, java.lang.Integer.MAX_VALUE, operation));
2324          children.add(new Property("compartment", "canonical(CompartmentDefinition)", "An absolute URI which is a reference to the definition of a compartment that the system supports. The reference is to a CompartmentDefinition resource by its canonical URL .", 0, java.lang.Integer.MAX_VALUE, compartment));
2325        }
2326
2327        @Override
2328        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2329          switch (_hash) {
2330          case 3357091: /*mode*/  return new Property("mode", "code", "Identifies whether this portion of the statement is describing the ability to initiate or receive restful operations.", 0, 1, mode);
2331          case 1587405498: /*documentation*/  return new Property("documentation", "markdown", "Information about the system's restful capabilities that apply across all applications, such as security.", 0, 1, documentation);
2332          case 949122880: /*security*/  return new Property("security", "", "Information about security implementation from an interface perspective - what a client needs to know.", 0, 1, security);
2333          case -341064690: /*resource*/  return new Property("resource", "", "A specification of the restful capabilities of the solution for a specific resource type.", 0, java.lang.Integer.MAX_VALUE, resource);
2334          case 1844104722: /*interaction*/  return new Property("interaction", "", "A specification of restful operations supported by the system.", 0, java.lang.Integer.MAX_VALUE, interaction);
2335          case -553645115: /*searchParam*/  return new Property("searchParam", "@CapabilityStatement.rest.resource.searchParam", "Search parameters that are supported for searching all resources for implementations to support and/or make use of - either references to ones defined in the specification, or additional ones defined for/by the implementation. This is only for searches executed against the system-level endpoint.", 0, java.lang.Integer.MAX_VALUE, searchParam);
2336          case 1662702951: /*operation*/  return new Property("operation", "@CapabilityStatement.rest.resource.operation", "Definition of an operation or a named query together with its parameters and their meaning and type.", 0, java.lang.Integer.MAX_VALUE, operation);
2337          case -397756334: /*compartment*/  return new Property("compartment", "canonical(CompartmentDefinition)", "An absolute URI which is a reference to the definition of a compartment that the system supports. The reference is to a CompartmentDefinition resource by its canonical URL .", 0, java.lang.Integer.MAX_VALUE, compartment);
2338          default: return super.getNamedProperty(_hash, _name, _checkValid);
2339          }
2340
2341        }
2342
2343      @Override
2344      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2345        switch (hash) {
2346        case 3357091: /*mode*/ return this.mode == null ? new Base[0] : new Base[] {this.mode}; // Enumeration<RestfulCapabilityMode>
2347        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : new Base[] {this.documentation}; // MarkdownType
2348        case 949122880: /*security*/ return this.security == null ? new Base[0] : new Base[] {this.security}; // CapabilityStatementRestSecurityComponent
2349        case -341064690: /*resource*/ return this.resource == null ? new Base[0] : this.resource.toArray(new Base[this.resource.size()]); // CapabilityStatementRestResourceComponent
2350        case 1844104722: /*interaction*/ return this.interaction == null ? new Base[0] : this.interaction.toArray(new Base[this.interaction.size()]); // SystemInteractionComponent
2351        case -553645115: /*searchParam*/ return this.searchParam == null ? new Base[0] : this.searchParam.toArray(new Base[this.searchParam.size()]); // CapabilityStatementRestResourceSearchParamComponent
2352        case 1662702951: /*operation*/ return this.operation == null ? new Base[0] : this.operation.toArray(new Base[this.operation.size()]); // CapabilityStatementRestResourceOperationComponent
2353        case -397756334: /*compartment*/ return this.compartment == null ? new Base[0] : this.compartment.toArray(new Base[this.compartment.size()]); // CanonicalType
2354        default: return super.getProperty(hash, name, checkValid);
2355        }
2356
2357      }
2358
2359      @Override
2360      public Base setProperty(int hash, String name, Base value) throws FHIRException {
2361        switch (hash) {
2362        case 3357091: // mode
2363          value = new RestfulCapabilityModeEnumFactory().fromType(TypeConvertor.castToCode(value));
2364          this.mode = (Enumeration) value; // Enumeration<RestfulCapabilityMode>
2365          return value;
2366        case 1587405498: // documentation
2367          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
2368          return value;
2369        case 949122880: // security
2370          this.security = (CapabilityStatementRestSecurityComponent) value; // CapabilityStatementRestSecurityComponent
2371          return value;
2372        case -341064690: // resource
2373          this.getResource().add((CapabilityStatementRestResourceComponent) value); // CapabilityStatementRestResourceComponent
2374          return value;
2375        case 1844104722: // interaction
2376          this.getInteraction().add((SystemInteractionComponent) value); // SystemInteractionComponent
2377          return value;
2378        case -553645115: // searchParam
2379          this.getSearchParam().add((CapabilityStatementRestResourceSearchParamComponent) value); // CapabilityStatementRestResourceSearchParamComponent
2380          return value;
2381        case 1662702951: // operation
2382          this.getOperation().add((CapabilityStatementRestResourceOperationComponent) value); // CapabilityStatementRestResourceOperationComponent
2383          return value;
2384        case -397756334: // compartment
2385          this.getCompartment().add(TypeConvertor.castToCanonical(value)); // CanonicalType
2386          return value;
2387        default: return super.setProperty(hash, name, value);
2388        }
2389
2390      }
2391
2392      @Override
2393      public Base setProperty(String name, Base value) throws FHIRException {
2394        if (name.equals("mode")) {
2395          value = new RestfulCapabilityModeEnumFactory().fromType(TypeConvertor.castToCode(value));
2396          this.mode = (Enumeration) value; // Enumeration<RestfulCapabilityMode>
2397        } else if (name.equals("documentation")) {
2398          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
2399        } else if (name.equals("security")) {
2400          this.security = (CapabilityStatementRestSecurityComponent) value; // CapabilityStatementRestSecurityComponent
2401        } else if (name.equals("resource")) {
2402          this.getResource().add((CapabilityStatementRestResourceComponent) value);
2403        } else if (name.equals("interaction")) {
2404          this.getInteraction().add((SystemInteractionComponent) value);
2405        } else if (name.equals("searchParam")) {
2406          this.getSearchParam().add((CapabilityStatementRestResourceSearchParamComponent) value);
2407        } else if (name.equals("operation")) {
2408          this.getOperation().add((CapabilityStatementRestResourceOperationComponent) value);
2409        } else if (name.equals("compartment")) {
2410          this.getCompartment().add(TypeConvertor.castToCanonical(value));
2411        } else
2412          return super.setProperty(name, value);
2413        return value;
2414      }
2415
2416  @Override
2417  public void removeChild(String name, Base value) throws FHIRException {
2418        if (name.equals("mode")) {
2419          value = new RestfulCapabilityModeEnumFactory().fromType(TypeConvertor.castToCode(value));
2420          this.mode = (Enumeration) value; // Enumeration<RestfulCapabilityMode>
2421        } else if (name.equals("documentation")) {
2422          this.documentation = null;
2423        } else if (name.equals("security")) {
2424          this.security = (CapabilityStatementRestSecurityComponent) value; // CapabilityStatementRestSecurityComponent
2425        } else if (name.equals("resource")) {
2426          this.getResource().remove((CapabilityStatementRestResourceComponent) value);
2427        } else if (name.equals("interaction")) {
2428          this.getInteraction().remove((SystemInteractionComponent) value);
2429        } else if (name.equals("searchParam")) {
2430          this.getSearchParam().remove((CapabilityStatementRestResourceSearchParamComponent) value);
2431        } else if (name.equals("operation")) {
2432          this.getOperation().remove((CapabilityStatementRestResourceOperationComponent) value);
2433        } else if (name.equals("compartment")) {
2434          this.getCompartment().remove(value);
2435        } else
2436          super.removeChild(name, value);
2437        
2438      }
2439
2440      @Override
2441      public Base makeProperty(int hash, String name) throws FHIRException {
2442        switch (hash) {
2443        case 3357091:  return getModeElement();
2444        case 1587405498:  return getDocumentationElement();
2445        case 949122880:  return getSecurity();
2446        case -341064690:  return addResource(); 
2447        case 1844104722:  return addInteraction(); 
2448        case -553645115:  return addSearchParam(); 
2449        case 1662702951:  return addOperation(); 
2450        case -397756334:  return addCompartmentElement();
2451        default: return super.makeProperty(hash, name);
2452        }
2453
2454      }
2455
2456      @Override
2457      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2458        switch (hash) {
2459        case 3357091: /*mode*/ return new String[] {"code"};
2460        case 1587405498: /*documentation*/ return new String[] {"markdown"};
2461        case 949122880: /*security*/ return new String[] {};
2462        case -341064690: /*resource*/ return new String[] {};
2463        case 1844104722: /*interaction*/ return new String[] {};
2464        case -553645115: /*searchParam*/ return new String[] {"@CapabilityStatement.rest.resource.searchParam"};
2465        case 1662702951: /*operation*/ return new String[] {"@CapabilityStatement.rest.resource.operation"};
2466        case -397756334: /*compartment*/ return new String[] {"canonical"};
2467        default: return super.getTypesForProperty(hash, name);
2468        }
2469
2470      }
2471
2472      @Override
2473      public Base addChild(String name) throws FHIRException {
2474        if (name.equals("mode")) {
2475          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.mode");
2476        }
2477        else if (name.equals("documentation")) {
2478          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.documentation");
2479        }
2480        else if (name.equals("security")) {
2481          this.security = new CapabilityStatementRestSecurityComponent();
2482          return this.security;
2483        }
2484        else if (name.equals("resource")) {
2485          return addResource();
2486        }
2487        else if (name.equals("interaction")) {
2488          return addInteraction();
2489        }
2490        else if (name.equals("searchParam")) {
2491          return addSearchParam();
2492        }
2493        else if (name.equals("operation")) {
2494          return addOperation();
2495        }
2496        else if (name.equals("compartment")) {
2497          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.compartment");
2498        }
2499        else
2500          return super.addChild(name);
2501      }
2502
2503      public CapabilityStatementRestComponent copy() {
2504        CapabilityStatementRestComponent dst = new CapabilityStatementRestComponent();
2505        copyValues(dst);
2506        return dst;
2507      }
2508
2509      public void copyValues(CapabilityStatementRestComponent dst) {
2510        super.copyValues(dst);
2511        dst.mode = mode == null ? null : mode.copy();
2512        dst.documentation = documentation == null ? null : documentation.copy();
2513        dst.security = security == null ? null : security.copy();
2514        if (resource != null) {
2515          dst.resource = new ArrayList<CapabilityStatementRestResourceComponent>();
2516          for (CapabilityStatementRestResourceComponent i : resource)
2517            dst.resource.add(i.copy());
2518        };
2519        if (interaction != null) {
2520          dst.interaction = new ArrayList<SystemInteractionComponent>();
2521          for (SystemInteractionComponent i : interaction)
2522            dst.interaction.add(i.copy());
2523        };
2524        if (searchParam != null) {
2525          dst.searchParam = new ArrayList<CapabilityStatementRestResourceSearchParamComponent>();
2526          for (CapabilityStatementRestResourceSearchParamComponent i : searchParam)
2527            dst.searchParam.add(i.copy());
2528        };
2529        if (operation != null) {
2530          dst.operation = new ArrayList<CapabilityStatementRestResourceOperationComponent>();
2531          for (CapabilityStatementRestResourceOperationComponent i : operation)
2532            dst.operation.add(i.copy());
2533        };
2534        if (compartment != null) {
2535          dst.compartment = new ArrayList<CanonicalType>();
2536          for (CanonicalType i : compartment)
2537            dst.compartment.add(i.copy());
2538        };
2539      }
2540
2541      @Override
2542      public boolean equalsDeep(Base other_) {
2543        if (!super.equalsDeep(other_))
2544          return false;
2545        if (!(other_ instanceof CapabilityStatementRestComponent))
2546          return false;
2547        CapabilityStatementRestComponent o = (CapabilityStatementRestComponent) other_;
2548        return compareDeep(mode, o.mode, true) && compareDeep(documentation, o.documentation, true) && compareDeep(security, o.security, true)
2549           && compareDeep(resource, o.resource, true) && compareDeep(interaction, o.interaction, true) && compareDeep(searchParam, o.searchParam, true)
2550           && compareDeep(operation, o.operation, true) && compareDeep(compartment, o.compartment, true);
2551      }
2552
2553      @Override
2554      public boolean equalsShallow(Base other_) {
2555        if (!super.equalsShallow(other_))
2556          return false;
2557        if (!(other_ instanceof CapabilityStatementRestComponent))
2558          return false;
2559        CapabilityStatementRestComponent o = (CapabilityStatementRestComponent) other_;
2560        return compareValues(mode, o.mode, true) && compareValues(documentation, o.documentation, true) && compareValues(compartment, o.compartment, true)
2561          ;
2562      }
2563
2564      public boolean isEmpty() {
2565        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(mode, documentation, security
2566          , resource, interaction, searchParam, operation, compartment);
2567      }
2568
2569  public String fhirType() {
2570    return "CapabilityStatement.rest";
2571
2572  }
2573
2574  }
2575
2576    @Block()
2577    public static class CapabilityStatementRestSecurityComponent extends BackboneElement implements IBaseBackboneElement {
2578        /**
2579         * Server adds CORS headers when responding to requests - this enables Javascript applications to use the server.
2580         */
2581        @Child(name = "cors", type = {BooleanType.class}, order=1, min=0, max=1, modifier=false, summary=true)
2582        @Description(shortDefinition="Adds CORS Headers (http://enable-cors.org/)", formalDefinition="Server adds CORS headers when responding to requests - this enables Javascript applications to use the server." )
2583        protected BooleanType cors;
2584
2585        /**
2586         * Types of security services that are supported/required by the system.
2587         */
2588        @Child(name = "service", type = {CodeableConcept.class}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
2589        @Description(shortDefinition="OAuth | SMART-on-FHIR | NTLM | Basic | Kerberos | Certificates", formalDefinition="Types of security services that are supported/required by the system." )
2590        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/restful-security-service")
2591        protected List<CodeableConcept> service;
2592
2593        /**
2594         * General description of how security works.
2595         */
2596        @Child(name = "description", type = {MarkdownType.class}, order=3, min=0, max=1, modifier=false, summary=false)
2597        @Description(shortDefinition="General description of how security works", formalDefinition="General description of how security works." )
2598        protected MarkdownType description;
2599
2600        private static final long serialVersionUID = -1348900500L;
2601
2602    /**
2603     * Constructor
2604     */
2605      public CapabilityStatementRestSecurityComponent() {
2606        super();
2607      }
2608
2609        /**
2610         * @return {@link #cors} (Server adds CORS headers when responding to requests - this enables Javascript applications to use the server.). This is the underlying object with id, value and extensions. The accessor "getCors" gives direct access to the value
2611         */
2612        public BooleanType getCorsElement() { 
2613          if (this.cors == null)
2614            if (Configuration.errorOnAutoCreate())
2615              throw new Error("Attempt to auto-create CapabilityStatementRestSecurityComponent.cors");
2616            else if (Configuration.doAutoCreate())
2617              this.cors = new BooleanType(); // bb
2618          return this.cors;
2619        }
2620
2621        public boolean hasCorsElement() { 
2622          return this.cors != null && !this.cors.isEmpty();
2623        }
2624
2625        public boolean hasCors() { 
2626          return this.cors != null && !this.cors.isEmpty();
2627        }
2628
2629        /**
2630         * @param value {@link #cors} (Server adds CORS headers when responding to requests - this enables Javascript applications to use the server.). This is the underlying object with id, value and extensions. The accessor "getCors" gives direct access to the value
2631         */
2632        public CapabilityStatementRestSecurityComponent setCorsElement(BooleanType value) { 
2633          this.cors = value;
2634          return this;
2635        }
2636
2637        /**
2638         * @return Server adds CORS headers when responding to requests - this enables Javascript applications to use the server.
2639         */
2640        public boolean getCors() { 
2641          return this.cors == null || this.cors.isEmpty() ? false : this.cors.getValue();
2642        }
2643
2644        /**
2645         * @param value Server adds CORS headers when responding to requests - this enables Javascript applications to use the server.
2646         */
2647        public CapabilityStatementRestSecurityComponent setCors(boolean value) { 
2648            if (this.cors == null)
2649              this.cors = new BooleanType();
2650            this.cors.setValue(value);
2651          return this;
2652        }
2653
2654        /**
2655         * @return {@link #service} (Types of security services that are supported/required by the system.)
2656         */
2657        public List<CodeableConcept> getService() { 
2658          if (this.service == null)
2659            this.service = new ArrayList<CodeableConcept>();
2660          return this.service;
2661        }
2662
2663        /**
2664         * @return Returns a reference to <code>this</code> for easy method chaining
2665         */
2666        public CapabilityStatementRestSecurityComponent setService(List<CodeableConcept> theService) { 
2667          this.service = theService;
2668          return this;
2669        }
2670
2671        public boolean hasService() { 
2672          if (this.service == null)
2673            return false;
2674          for (CodeableConcept item : this.service)
2675            if (!item.isEmpty())
2676              return true;
2677          return false;
2678        }
2679
2680        public CodeableConcept addService() { //3
2681          CodeableConcept t = new CodeableConcept();
2682          if (this.service == null)
2683            this.service = new ArrayList<CodeableConcept>();
2684          this.service.add(t);
2685          return t;
2686        }
2687
2688        public CapabilityStatementRestSecurityComponent addService(CodeableConcept t) { //3
2689          if (t == null)
2690            return this;
2691          if (this.service == null)
2692            this.service = new ArrayList<CodeableConcept>();
2693          this.service.add(t);
2694          return this;
2695        }
2696
2697        /**
2698         * @return The first repetition of repeating field {@link #service}, creating it if it does not already exist {3}
2699         */
2700        public CodeableConcept getServiceFirstRep() { 
2701          if (getService().isEmpty()) {
2702            addService();
2703          }
2704          return getService().get(0);
2705        }
2706
2707        /**
2708         * @return {@link #description} (General description of how security works.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
2709         */
2710        public MarkdownType getDescriptionElement() { 
2711          if (this.description == null)
2712            if (Configuration.errorOnAutoCreate())
2713              throw new Error("Attempt to auto-create CapabilityStatementRestSecurityComponent.description");
2714            else if (Configuration.doAutoCreate())
2715              this.description = new MarkdownType(); // bb
2716          return this.description;
2717        }
2718
2719        public boolean hasDescriptionElement() { 
2720          return this.description != null && !this.description.isEmpty();
2721        }
2722
2723        public boolean hasDescription() { 
2724          return this.description != null && !this.description.isEmpty();
2725        }
2726
2727        /**
2728         * @param value {@link #description} (General description of how security works.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
2729         */
2730        public CapabilityStatementRestSecurityComponent setDescriptionElement(MarkdownType value) { 
2731          this.description = value;
2732          return this;
2733        }
2734
2735        /**
2736         * @return General description of how security works.
2737         */
2738        public String getDescription() { 
2739          return this.description == null ? null : this.description.getValue();
2740        }
2741
2742        /**
2743         * @param value General description of how security works.
2744         */
2745        public CapabilityStatementRestSecurityComponent setDescription(String value) { 
2746          if (Utilities.noString(value))
2747            this.description = null;
2748          else {
2749            if (this.description == null)
2750              this.description = new MarkdownType();
2751            this.description.setValue(value);
2752          }
2753          return this;
2754        }
2755
2756        protected void listChildren(List<Property> children) {
2757          super.listChildren(children);
2758          children.add(new Property("cors", "boolean", "Server adds CORS headers when responding to requests - this enables Javascript applications to use the server.", 0, 1, cors));
2759          children.add(new Property("service", "CodeableConcept", "Types of security services that are supported/required by the system.", 0, java.lang.Integer.MAX_VALUE, service));
2760          children.add(new Property("description", "markdown", "General description of how security works.", 0, 1, description));
2761        }
2762
2763        @Override
2764        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2765          switch (_hash) {
2766          case 3059629: /*cors*/  return new Property("cors", "boolean", "Server adds CORS headers when responding to requests - this enables Javascript applications to use the server.", 0, 1, cors);
2767          case 1984153269: /*service*/  return new Property("service", "CodeableConcept", "Types of security services that are supported/required by the system.", 0, java.lang.Integer.MAX_VALUE, service);
2768          case -1724546052: /*description*/  return new Property("description", "markdown", "General description of how security works.", 0, 1, description);
2769          default: return super.getNamedProperty(_hash, _name, _checkValid);
2770          }
2771
2772        }
2773
2774      @Override
2775      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2776        switch (hash) {
2777        case 3059629: /*cors*/ return this.cors == null ? new Base[0] : new Base[] {this.cors}; // BooleanType
2778        case 1984153269: /*service*/ return this.service == null ? new Base[0] : this.service.toArray(new Base[this.service.size()]); // CodeableConcept
2779        case -1724546052: /*description*/ return this.description == null ? new Base[0] : new Base[] {this.description}; // MarkdownType
2780        default: return super.getProperty(hash, name, checkValid);
2781        }
2782
2783      }
2784
2785      @Override
2786      public Base setProperty(int hash, String name, Base value) throws FHIRException {
2787        switch (hash) {
2788        case 3059629: // cors
2789          this.cors = TypeConvertor.castToBoolean(value); // BooleanType
2790          return value;
2791        case 1984153269: // service
2792          this.getService().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
2793          return value;
2794        case -1724546052: // description
2795          this.description = TypeConvertor.castToMarkdown(value); // MarkdownType
2796          return value;
2797        default: return super.setProperty(hash, name, value);
2798        }
2799
2800      }
2801
2802      @Override
2803      public Base setProperty(String name, Base value) throws FHIRException {
2804        if (name.equals("cors")) {
2805          this.cors = TypeConvertor.castToBoolean(value); // BooleanType
2806        } else if (name.equals("service")) {
2807          this.getService().add(TypeConvertor.castToCodeableConcept(value));
2808        } else if (name.equals("description")) {
2809          this.description = TypeConvertor.castToMarkdown(value); // MarkdownType
2810        } else
2811          return super.setProperty(name, value);
2812        return value;
2813      }
2814
2815  @Override
2816  public void removeChild(String name, Base value) throws FHIRException {
2817        if (name.equals("cors")) {
2818          this.cors = null;
2819        } else if (name.equals("service")) {
2820          this.getService().remove(value);
2821        } else if (name.equals("description")) {
2822          this.description = null;
2823        } else
2824          super.removeChild(name, value);
2825        
2826      }
2827
2828      @Override
2829      public Base makeProperty(int hash, String name) throws FHIRException {
2830        switch (hash) {
2831        case 3059629:  return getCorsElement();
2832        case 1984153269:  return addService(); 
2833        case -1724546052:  return getDescriptionElement();
2834        default: return super.makeProperty(hash, name);
2835        }
2836
2837      }
2838
2839      @Override
2840      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2841        switch (hash) {
2842        case 3059629: /*cors*/ return new String[] {"boolean"};
2843        case 1984153269: /*service*/ return new String[] {"CodeableConcept"};
2844        case -1724546052: /*description*/ return new String[] {"markdown"};
2845        default: return super.getTypesForProperty(hash, name);
2846        }
2847
2848      }
2849
2850      @Override
2851      public Base addChild(String name) throws FHIRException {
2852        if (name.equals("cors")) {
2853          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.security.cors");
2854        }
2855        else if (name.equals("service")) {
2856          return addService();
2857        }
2858        else if (name.equals("description")) {
2859          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.security.description");
2860        }
2861        else
2862          return super.addChild(name);
2863      }
2864
2865      public CapabilityStatementRestSecurityComponent copy() {
2866        CapabilityStatementRestSecurityComponent dst = new CapabilityStatementRestSecurityComponent();
2867        copyValues(dst);
2868        return dst;
2869      }
2870
2871      public void copyValues(CapabilityStatementRestSecurityComponent dst) {
2872        super.copyValues(dst);
2873        dst.cors = cors == null ? null : cors.copy();
2874        if (service != null) {
2875          dst.service = new ArrayList<CodeableConcept>();
2876          for (CodeableConcept i : service)
2877            dst.service.add(i.copy());
2878        };
2879        dst.description = description == null ? null : description.copy();
2880      }
2881
2882      @Override
2883      public boolean equalsDeep(Base other_) {
2884        if (!super.equalsDeep(other_))
2885          return false;
2886        if (!(other_ instanceof CapabilityStatementRestSecurityComponent))
2887          return false;
2888        CapabilityStatementRestSecurityComponent o = (CapabilityStatementRestSecurityComponent) other_;
2889        return compareDeep(cors, o.cors, true) && compareDeep(service, o.service, true) && compareDeep(description, o.description, true)
2890          ;
2891      }
2892
2893      @Override
2894      public boolean equalsShallow(Base other_) {
2895        if (!super.equalsShallow(other_))
2896          return false;
2897        if (!(other_ instanceof CapabilityStatementRestSecurityComponent))
2898          return false;
2899        CapabilityStatementRestSecurityComponent o = (CapabilityStatementRestSecurityComponent) other_;
2900        return compareValues(cors, o.cors, true) && compareValues(description, o.description, true);
2901      }
2902
2903      public boolean isEmpty() {
2904        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(cors, service, description
2905          );
2906      }
2907
2908  public String fhirType() {
2909    return "CapabilityStatement.rest.security";
2910
2911  }
2912
2913  }
2914
2915    @Block()
2916    public static class CapabilityStatementRestResourceComponent extends BackboneElement implements IBaseBackboneElement {
2917        /**
2918         * A type of resource exposed via the restful interface.
2919         */
2920        @Child(name = "type", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=true)
2921        @Description(shortDefinition="A resource type that is supported", formalDefinition="A type of resource exposed via the restful interface." )
2922        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/resource-types")
2923        protected CodeType type;
2924
2925        /**
2926         * A system-wide profile that is applied across *all* instances of the resource supported by the system. For example, if declared on Observation, this profile is the "superset" of capabilities for laboratory *and* vitals *and* other domains. See further discussion in [Using Profiles](profiling.html#profile-uses).
2927         */
2928        @Child(name = "profile", type = {CanonicalType.class}, order=2, min=0, max=1, modifier=false, summary=true)
2929        @Description(shortDefinition="System-wide profile", formalDefinition="A system-wide profile that is applied across *all* instances of the resource supported by the system. For example, if declared on Observation, this profile is the \"superset\" of capabilities for laboratory *and* vitals *and* other domains. See further discussion in [Using Profiles](profiling.html#profile-uses)." )
2930        protected CanonicalType profile;
2931
2932        /**
2933         * A list of profiles representing different use cases the system hosts/produces. A supported profile is a statement about the functionality of the data and services provided by the server (or the client) for supported use cases. For example, a system can define and declare multiple Observation profiles for laboratory observations, vital sign observations, etc. By declaring supported profiles, systems provide a way to determine whether individual resources are conformant. See further discussion in [Using Profiles](profiling.html#profile-uses).
2934         */
2935        @Child(name = "supportedProfile", type = {CanonicalType.class}, order=3, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
2936        @Description(shortDefinition="Use-case specific profiles", formalDefinition="A list of profiles representing different use cases the system hosts/produces. A supported profile is a statement about the functionality of the data and services provided by the server (or the client) for supported use cases. For example, a system can define and declare multiple Observation profiles for laboratory observations, vital sign observations, etc. By declaring supported profiles, systems provide a way to determine whether individual resources are conformant. See further discussion in [Using Profiles](profiling.html#profile-uses)." )
2937        protected List<CanonicalType> supportedProfile;
2938
2939        /**
2940         * Additional information about the resource type used by the system.
2941         */
2942        @Child(name = "documentation", type = {MarkdownType.class}, order=4, min=0, max=1, modifier=false, summary=false)
2943        @Description(shortDefinition="Additional information about the use of the resource type", formalDefinition="Additional information about the resource type used by the system." )
2944        protected MarkdownType documentation;
2945
2946        /**
2947         * Identifies a restful operation supported by the solution.
2948         */
2949        @Child(name = "interaction", type = {}, order=5, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
2950        @Description(shortDefinition="What operations are supported?", formalDefinition="Identifies a restful operation supported by the solution." )
2951        protected List<ResourceInteractionComponent> interaction;
2952
2953        /**
2954         * This field is set to no-version to specify that the system does not support (server) or use (client) versioning for this resource type. If this has some other value, the server must at least correctly track and populate the versionId meta-property on resources. If the value is 'versioned-update', then the server supports all the versioning features, including using e-tags for version integrity in the API.
2955         */
2956        @Child(name = "versioning", type = {CodeType.class}, order=6, min=0, max=1, modifier=false, summary=false)
2957        @Description(shortDefinition="no-version | versioned | versioned-update", formalDefinition="This field is set to no-version to specify that the system does not support (server) or use (client) versioning for this resource type. If this has some other value, the server must at least correctly track and populate the versionId meta-property on resources. If the value is 'versioned-update', then the server supports all the versioning features, including using e-tags for version integrity in the API." )
2958        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/versioning-policy")
2959        protected Enumeration<ResourceVersionPolicy> versioning;
2960
2961        /**
2962         * A flag for whether the server is able to return past versions as part of the vRead operation.
2963         */
2964        @Child(name = "readHistory", type = {BooleanType.class}, order=7, min=0, max=1, modifier=false, summary=false)
2965        @Description(shortDefinition="Whether vRead can return past versions", formalDefinition="A flag for whether the server is able to return past versions as part of the vRead operation." )
2966        protected BooleanType readHistory;
2967
2968        /**
2969         * A flag to indicate that the server allows or needs to allow the client to create new identities on the server (that is, the client PUTs to a location where there is no existing resource). Allowing this operation means that the server allows the client to create new identities on the server.
2970         */
2971        @Child(name = "updateCreate", type = {BooleanType.class}, order=8, min=0, max=1, modifier=false, summary=false)
2972        @Description(shortDefinition="If update can commit to a new identity", formalDefinition="A flag to indicate that the server allows or needs to allow the client to create new identities on the server (that is, the client PUTs to a location where there is no existing resource). Allowing this operation means that the server allows the client to create new identities on the server." )
2973        protected BooleanType updateCreate;
2974
2975        /**
2976         * A flag that indicates that the server supports conditional create.
2977         */
2978        @Child(name = "conditionalCreate", type = {BooleanType.class}, order=9, min=0, max=1, modifier=false, summary=false)
2979        @Description(shortDefinition="If allows/uses conditional create", formalDefinition="A flag that indicates that the server supports conditional create." )
2980        protected BooleanType conditionalCreate;
2981
2982        /**
2983         * A code that indicates how the server supports conditional read.
2984         */
2985        @Child(name = "conditionalRead", type = {CodeType.class}, order=10, min=0, max=1, modifier=false, summary=false)
2986        @Description(shortDefinition="not-supported | modified-since | not-match | full-support", formalDefinition="A code that indicates how the server supports conditional read." )
2987        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/conditional-read-status")
2988        protected Enumeration<ConditionalReadStatus> conditionalRead;
2989
2990        /**
2991         * A flag that indicates that the server supports conditional update.
2992         */
2993        @Child(name = "conditionalUpdate", type = {BooleanType.class}, order=11, min=0, max=1, modifier=false, summary=false)
2994        @Description(shortDefinition="If allows/uses conditional update", formalDefinition="A flag that indicates that the server supports conditional update." )
2995        protected BooleanType conditionalUpdate;
2996
2997        /**
2998         * A flag that indicates that the server supports conditional patch.
2999         */
3000        @Child(name = "conditionalPatch", type = {BooleanType.class}, order=12, min=0, max=1, modifier=false, summary=false)
3001        @Description(shortDefinition="If allows/uses conditional patch", formalDefinition="A flag that indicates that the server supports conditional patch." )
3002        protected BooleanType conditionalPatch;
3003
3004        /**
3005         * A code that indicates how the server supports conditional delete.
3006         */
3007        @Child(name = "conditionalDelete", type = {CodeType.class}, order=13, min=0, max=1, modifier=false, summary=false)
3008        @Description(shortDefinition="not-supported | single | multiple - how conditional delete is supported", formalDefinition="A code that indicates how the server supports conditional delete." )
3009        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/conditional-delete-status")
3010        protected Enumeration<ConditionalDeleteStatus> conditionalDelete;
3011
3012        /**
3013         * A set of flags that defines how references are supported.
3014         */
3015        @Child(name = "referencePolicy", type = {CodeType.class}, order=14, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3016        @Description(shortDefinition="literal | logical | resolves | enforced | local", formalDefinition="A set of flags that defines how references are supported." )
3017        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/reference-handling-policy")
3018        protected List<Enumeration<ReferenceHandlingPolicy>> referencePolicy;
3019
3020        /**
3021         * A list of _include values supported by the server.
3022         */
3023        @Child(name = "searchInclude", type = {StringType.class}, order=15, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3024        @Description(shortDefinition="_include values supported by the server", formalDefinition="A list of _include values supported by the server." )
3025        protected List<StringType> searchInclude;
3026
3027        /**
3028         * A list of _revinclude (reverse include) values supported by the server.
3029         */
3030        @Child(name = "searchRevInclude", type = {StringType.class}, order=16, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3031        @Description(shortDefinition="_revinclude values supported by the server", formalDefinition="A list of _revinclude (reverse include) values supported by the server." )
3032        protected List<StringType> searchRevInclude;
3033
3034        /**
3035         * Search parameters for implementations to support and/or make use of - either references to ones defined in the specification, or additional ones defined for/by the implementation.
3036         */
3037        @Child(name = "searchParam", type = {}, order=17, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3038        @Description(shortDefinition="Search parameters supported by implementation", formalDefinition="Search parameters for implementations to support and/or make use of - either references to ones defined in the specification, or additional ones defined for/by the implementation." )
3039        protected List<CapabilityStatementRestResourceSearchParamComponent> searchParam;
3040
3041        /**
3042         * Definition of an operation or a named query together with its parameters and their meaning and type. Consult the definition of the operation for details about how to invoke the operation, and the parameters.
3043         */
3044        @Child(name = "operation", type = {}, order=18, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
3045        @Description(shortDefinition="Definition of a resource operation", formalDefinition="Definition of an operation or a named query together with its parameters and their meaning and type. Consult the definition of the operation for details about how to invoke the operation, and the parameters." )
3046        protected List<CapabilityStatementRestResourceOperationComponent> operation;
3047
3048        private static final long serialVersionUID = -1565226425L;
3049
3050    /**
3051     * Constructor
3052     */
3053      public CapabilityStatementRestResourceComponent() {
3054        super();
3055      }
3056
3057    /**
3058     * Constructor
3059     */
3060      public CapabilityStatementRestResourceComponent(String type) {
3061        super();
3062        this.setType(type);
3063      }
3064
3065        /**
3066         * @return {@link #type} (A type of resource exposed via the restful interface.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
3067         */
3068        public CodeType getTypeElement() { 
3069          if (this.type == null)
3070            if (Configuration.errorOnAutoCreate())
3071              throw new Error("Attempt to auto-create CapabilityStatementRestResourceComponent.type");
3072            else if (Configuration.doAutoCreate())
3073              this.type = new CodeType(); // bb
3074          return this.type;
3075        }
3076
3077        public boolean hasTypeElement() { 
3078          return this.type != null && !this.type.isEmpty();
3079        }
3080
3081        public boolean hasType() { 
3082          return this.type != null && !this.type.isEmpty();
3083        }
3084
3085        /**
3086         * @param value {@link #type} (A type of resource exposed via the restful interface.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
3087         */
3088        public CapabilityStatementRestResourceComponent setTypeElement(CodeType value) { 
3089          this.type = value;
3090          return this;
3091        }
3092
3093        /**
3094         * @return A type of resource exposed via the restful interface.
3095         */
3096        public String getType() { 
3097          return this.type == null ? null : this.type.getValue();
3098        }
3099
3100        /**
3101         * @param value A type of resource exposed via the restful interface.
3102         */
3103        public CapabilityStatementRestResourceComponent setType(String value) { 
3104            if (this.type == null)
3105              this.type = new CodeType();
3106            this.type.setValue(value);
3107          return this;
3108        }
3109
3110        /**
3111         * @return {@link #profile} (A system-wide profile that is applied across *all* instances of the resource supported by the system. For example, if declared on Observation, this profile is the "superset" of capabilities for laboratory *and* vitals *and* other domains. See further discussion in [Using Profiles](profiling.html#profile-uses).). This is the underlying object with id, value and extensions. The accessor "getProfile" gives direct access to the value
3112         */
3113        public CanonicalType getProfileElement() { 
3114          if (this.profile == null)
3115            if (Configuration.errorOnAutoCreate())
3116              throw new Error("Attempt to auto-create CapabilityStatementRestResourceComponent.profile");
3117            else if (Configuration.doAutoCreate())
3118              this.profile = new CanonicalType(); // bb
3119          return this.profile;
3120        }
3121
3122        public boolean hasProfileElement() { 
3123          return this.profile != null && !this.profile.isEmpty();
3124        }
3125
3126        public boolean hasProfile() { 
3127          return this.profile != null && !this.profile.isEmpty();
3128        }
3129
3130        /**
3131         * @param value {@link #profile} (A system-wide profile that is applied across *all* instances of the resource supported by the system. For example, if declared on Observation, this profile is the "superset" of capabilities for laboratory *and* vitals *and* other domains. See further discussion in [Using Profiles](profiling.html#profile-uses).). This is the underlying object with id, value and extensions. The accessor "getProfile" gives direct access to the value
3132         */
3133        public CapabilityStatementRestResourceComponent setProfileElement(CanonicalType value) { 
3134          this.profile = value;
3135          return this;
3136        }
3137
3138        /**
3139         * @return A system-wide profile that is applied across *all* instances of the resource supported by the system. For example, if declared on Observation, this profile is the "superset" of capabilities for laboratory *and* vitals *and* other domains. See further discussion in [Using Profiles](profiling.html#profile-uses).
3140         */
3141        public String getProfile() { 
3142          return this.profile == null ? null : this.profile.getValue();
3143        }
3144
3145        /**
3146         * @param value A system-wide profile that is applied across *all* instances of the resource supported by the system. For example, if declared on Observation, this profile is the "superset" of capabilities for laboratory *and* vitals *and* other domains. See further discussion in [Using Profiles](profiling.html#profile-uses).
3147         */
3148        public CapabilityStatementRestResourceComponent setProfile(String value) { 
3149          if (Utilities.noString(value))
3150            this.profile = null;
3151          else {
3152            if (this.profile == null)
3153              this.profile = new CanonicalType();
3154            this.profile.setValue(value);
3155          }
3156          return this;
3157        }
3158
3159        /**
3160         * @return {@link #supportedProfile} (A list of profiles representing different use cases the system hosts/produces. A supported profile is a statement about the functionality of the data and services provided by the server (or the client) for supported use cases. For example, a system can define and declare multiple Observation profiles for laboratory observations, vital sign observations, etc. By declaring supported profiles, systems provide a way to determine whether individual resources are conformant. See further discussion in [Using Profiles](profiling.html#profile-uses).)
3161         */
3162        public List<CanonicalType> getSupportedProfile() { 
3163          if (this.supportedProfile == null)
3164            this.supportedProfile = new ArrayList<CanonicalType>();
3165          return this.supportedProfile;
3166        }
3167
3168        /**
3169         * @return Returns a reference to <code>this</code> for easy method chaining
3170         */
3171        public CapabilityStatementRestResourceComponent setSupportedProfile(List<CanonicalType> theSupportedProfile) { 
3172          this.supportedProfile = theSupportedProfile;
3173          return this;
3174        }
3175
3176        public boolean hasSupportedProfile() { 
3177          if (this.supportedProfile == null)
3178            return false;
3179          for (CanonicalType item : this.supportedProfile)
3180            if (!item.isEmpty())
3181              return true;
3182          return false;
3183        }
3184
3185        /**
3186         * @return {@link #supportedProfile} (A list of profiles representing different use cases the system hosts/produces. A supported profile is a statement about the functionality of the data and services provided by the server (or the client) for supported use cases. For example, a system can define and declare multiple Observation profiles for laboratory observations, vital sign observations, etc. By declaring supported profiles, systems provide a way to determine whether individual resources are conformant. See further discussion in [Using Profiles](profiling.html#profile-uses).)
3187         */
3188        public CanonicalType addSupportedProfileElement() {//2 
3189          CanonicalType t = new CanonicalType();
3190          if (this.supportedProfile == null)
3191            this.supportedProfile = new ArrayList<CanonicalType>();
3192          this.supportedProfile.add(t);
3193          return t;
3194        }
3195
3196        /**
3197         * @param value {@link #supportedProfile} (A list of profiles representing different use cases the system hosts/produces. A supported profile is a statement about the functionality of the data and services provided by the server (or the client) for supported use cases. For example, a system can define and declare multiple Observation profiles for laboratory observations, vital sign observations, etc. By declaring supported profiles, systems provide a way to determine whether individual resources are conformant. See further discussion in [Using Profiles](profiling.html#profile-uses).)
3198         */
3199        public CapabilityStatementRestResourceComponent addSupportedProfile(String value) { //1
3200          CanonicalType t = new CanonicalType();
3201          t.setValue(value);
3202          if (this.supportedProfile == null)
3203            this.supportedProfile = new ArrayList<CanonicalType>();
3204          this.supportedProfile.add(t);
3205          return this;
3206        }
3207
3208        /**
3209         * @param value {@link #supportedProfile} (A list of profiles representing different use cases the system hosts/produces. A supported profile is a statement about the functionality of the data and services provided by the server (or the client) for supported use cases. For example, a system can define and declare multiple Observation profiles for laboratory observations, vital sign observations, etc. By declaring supported profiles, systems provide a way to determine whether individual resources are conformant. See further discussion in [Using Profiles](profiling.html#profile-uses).)
3210         */
3211        public boolean hasSupportedProfile(String value) { 
3212          if (this.supportedProfile == null)
3213            return false;
3214          for (CanonicalType v : this.supportedProfile)
3215            if (v.getValue().equals(value)) // canonical
3216              return true;
3217          return false;
3218        }
3219
3220        /**
3221         * @return {@link #documentation} (Additional information about the resource type used by the system.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
3222         */
3223        public MarkdownType getDocumentationElement() { 
3224          if (this.documentation == null)
3225            if (Configuration.errorOnAutoCreate())
3226              throw new Error("Attempt to auto-create CapabilityStatementRestResourceComponent.documentation");
3227            else if (Configuration.doAutoCreate())
3228              this.documentation = new MarkdownType(); // bb
3229          return this.documentation;
3230        }
3231
3232        public boolean hasDocumentationElement() { 
3233          return this.documentation != null && !this.documentation.isEmpty();
3234        }
3235
3236        public boolean hasDocumentation() { 
3237          return this.documentation != null && !this.documentation.isEmpty();
3238        }
3239
3240        /**
3241         * @param value {@link #documentation} (Additional information about the resource type used by the system.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
3242         */
3243        public CapabilityStatementRestResourceComponent setDocumentationElement(MarkdownType value) { 
3244          this.documentation = value;
3245          return this;
3246        }
3247
3248        /**
3249         * @return Additional information about the resource type used by the system.
3250         */
3251        public String getDocumentation() { 
3252          return this.documentation == null ? null : this.documentation.getValue();
3253        }
3254
3255        /**
3256         * @param value Additional information about the resource type used by the system.
3257         */
3258        public CapabilityStatementRestResourceComponent setDocumentation(String value) { 
3259          if (Utilities.noString(value))
3260            this.documentation = null;
3261          else {
3262            if (this.documentation == null)
3263              this.documentation = new MarkdownType();
3264            this.documentation.setValue(value);
3265          }
3266          return this;
3267        }
3268
3269        /**
3270         * @return {@link #interaction} (Identifies a restful operation supported by the solution.)
3271         */
3272        public List<ResourceInteractionComponent> getInteraction() { 
3273          if (this.interaction == null)
3274            this.interaction = new ArrayList<ResourceInteractionComponent>();
3275          return this.interaction;
3276        }
3277
3278        /**
3279         * @return Returns a reference to <code>this</code> for easy method chaining
3280         */
3281        public CapabilityStatementRestResourceComponent setInteraction(List<ResourceInteractionComponent> theInteraction) { 
3282          this.interaction = theInteraction;
3283          return this;
3284        }
3285
3286        public boolean hasInteraction() { 
3287          if (this.interaction == null)
3288            return false;
3289          for (ResourceInteractionComponent item : this.interaction)
3290            if (!item.isEmpty())
3291              return true;
3292          return false;
3293        }
3294
3295        public ResourceInteractionComponent addInteraction() { //3
3296          ResourceInteractionComponent t = new ResourceInteractionComponent();
3297          if (this.interaction == null)
3298            this.interaction = new ArrayList<ResourceInteractionComponent>();
3299          this.interaction.add(t);
3300          return t;
3301        }
3302
3303        public CapabilityStatementRestResourceComponent addInteraction(ResourceInteractionComponent t) { //3
3304          if (t == null)
3305            return this;
3306          if (this.interaction == null)
3307            this.interaction = new ArrayList<ResourceInteractionComponent>();
3308          this.interaction.add(t);
3309          return this;
3310        }
3311
3312        /**
3313         * @return The first repetition of repeating field {@link #interaction}, creating it if it does not already exist {3}
3314         */
3315        public ResourceInteractionComponent getInteractionFirstRep() { 
3316          if (getInteraction().isEmpty()) {
3317            addInteraction();
3318          }
3319          return getInteraction().get(0);
3320        }
3321
3322        /**
3323         * @return {@link #versioning} (This field is set to no-version to specify that the system does not support (server) or use (client) versioning for this resource type. If this has some other value, the server must at least correctly track and populate the versionId meta-property on resources. If the value is 'versioned-update', then the server supports all the versioning features, including using e-tags for version integrity in the API.). This is the underlying object with id, value and extensions. The accessor "getVersioning" gives direct access to the value
3324         */
3325        public Enumeration<ResourceVersionPolicy> getVersioningElement() { 
3326          if (this.versioning == null)
3327            if (Configuration.errorOnAutoCreate())
3328              throw new Error("Attempt to auto-create CapabilityStatementRestResourceComponent.versioning");
3329            else if (Configuration.doAutoCreate())
3330              this.versioning = new Enumeration<ResourceVersionPolicy>(new ResourceVersionPolicyEnumFactory()); // bb
3331          return this.versioning;
3332        }
3333
3334        public boolean hasVersioningElement() { 
3335          return this.versioning != null && !this.versioning.isEmpty();
3336        }
3337
3338        public boolean hasVersioning() { 
3339          return this.versioning != null && !this.versioning.isEmpty();
3340        }
3341
3342        /**
3343         * @param value {@link #versioning} (This field is set to no-version to specify that the system does not support (server) or use (client) versioning for this resource type. If this has some other value, the server must at least correctly track and populate the versionId meta-property on resources. If the value is 'versioned-update', then the server supports all the versioning features, including using e-tags for version integrity in the API.). This is the underlying object with id, value and extensions. The accessor "getVersioning" gives direct access to the value
3344         */
3345        public CapabilityStatementRestResourceComponent setVersioningElement(Enumeration<ResourceVersionPolicy> value) { 
3346          this.versioning = value;
3347          return this;
3348        }
3349
3350        /**
3351         * @return This field is set to no-version to specify that the system does not support (server) or use (client) versioning for this resource type. If this has some other value, the server must at least correctly track and populate the versionId meta-property on resources. If the value is 'versioned-update', then the server supports all the versioning features, including using e-tags for version integrity in the API.
3352         */
3353        public ResourceVersionPolicy getVersioning() { 
3354          return this.versioning == null ? null : this.versioning.getValue();
3355        }
3356
3357        /**
3358         * @param value This field is set to no-version to specify that the system does not support (server) or use (client) versioning for this resource type. If this has some other value, the server must at least correctly track and populate the versionId meta-property on resources. If the value is 'versioned-update', then the server supports all the versioning features, including using e-tags for version integrity in the API.
3359         */
3360        public CapabilityStatementRestResourceComponent setVersioning(ResourceVersionPolicy value) { 
3361          if (value == null)
3362            this.versioning = null;
3363          else {
3364            if (this.versioning == null)
3365              this.versioning = new Enumeration<ResourceVersionPolicy>(new ResourceVersionPolicyEnumFactory());
3366            this.versioning.setValue(value);
3367          }
3368          return this;
3369        }
3370
3371        /**
3372         * @return {@link #readHistory} (A flag for whether the server is able to return past versions as part of the vRead operation.). This is the underlying object with id, value and extensions. The accessor "getReadHistory" gives direct access to the value
3373         */
3374        public BooleanType getReadHistoryElement() { 
3375          if (this.readHistory == null)
3376            if (Configuration.errorOnAutoCreate())
3377              throw new Error("Attempt to auto-create CapabilityStatementRestResourceComponent.readHistory");
3378            else if (Configuration.doAutoCreate())
3379              this.readHistory = new BooleanType(); // bb
3380          return this.readHistory;
3381        }
3382
3383        public boolean hasReadHistoryElement() { 
3384          return this.readHistory != null && !this.readHistory.isEmpty();
3385        }
3386
3387        public boolean hasReadHistory() { 
3388          return this.readHistory != null && !this.readHistory.isEmpty();
3389        }
3390
3391        /**
3392         * @param value {@link #readHistory} (A flag for whether the server is able to return past versions as part of the vRead operation.). This is the underlying object with id, value and extensions. The accessor "getReadHistory" gives direct access to the value
3393         */
3394        public CapabilityStatementRestResourceComponent setReadHistoryElement(BooleanType value) { 
3395          this.readHistory = value;
3396          return this;
3397        }
3398
3399        /**
3400         * @return A flag for whether the server is able to return past versions as part of the vRead operation.
3401         */
3402        public boolean getReadHistory() { 
3403          return this.readHistory == null || this.readHistory.isEmpty() ? false : this.readHistory.getValue();
3404        }
3405
3406        /**
3407         * @param value A flag for whether the server is able to return past versions as part of the vRead operation.
3408         */
3409        public CapabilityStatementRestResourceComponent setReadHistory(boolean value) { 
3410            if (this.readHistory == null)
3411              this.readHistory = new BooleanType();
3412            this.readHistory.setValue(value);
3413          return this;
3414        }
3415
3416        /**
3417         * @return {@link #updateCreate} (A flag to indicate that the server allows or needs to allow the client to create new identities on the server (that is, the client PUTs to a location where there is no existing resource). Allowing this operation means that the server allows the client to create new identities on the server.). This is the underlying object with id, value and extensions. The accessor "getUpdateCreate" gives direct access to the value
3418         */
3419        public BooleanType getUpdateCreateElement() { 
3420          if (this.updateCreate == null)
3421            if (Configuration.errorOnAutoCreate())
3422              throw new Error("Attempt to auto-create CapabilityStatementRestResourceComponent.updateCreate");
3423            else if (Configuration.doAutoCreate())
3424              this.updateCreate = new BooleanType(); // bb
3425          return this.updateCreate;
3426        }
3427
3428        public boolean hasUpdateCreateElement() { 
3429          return this.updateCreate != null && !this.updateCreate.isEmpty();
3430        }
3431
3432        public boolean hasUpdateCreate() { 
3433          return this.updateCreate != null && !this.updateCreate.isEmpty();
3434        }
3435
3436        /**
3437         * @param value {@link #updateCreate} (A flag to indicate that the server allows or needs to allow the client to create new identities on the server (that is, the client PUTs to a location where there is no existing resource). Allowing this operation means that the server allows the client to create new identities on the server.). This is the underlying object with id, value and extensions. The accessor "getUpdateCreate" gives direct access to the value
3438         */
3439        public CapabilityStatementRestResourceComponent setUpdateCreateElement(BooleanType value) { 
3440          this.updateCreate = value;
3441          return this;
3442        }
3443
3444        /**
3445         * @return A flag to indicate that the server allows or needs to allow the client to create new identities on the server (that is, the client PUTs to a location where there is no existing resource). Allowing this operation means that the server allows the client to create new identities on the server.
3446         */
3447        public boolean getUpdateCreate() { 
3448          return this.updateCreate == null || this.updateCreate.isEmpty() ? false : this.updateCreate.getValue();
3449        }
3450
3451        /**
3452         * @param value A flag to indicate that the server allows or needs to allow the client to create new identities on the server (that is, the client PUTs to a location where there is no existing resource). Allowing this operation means that the server allows the client to create new identities on the server.
3453         */
3454        public CapabilityStatementRestResourceComponent setUpdateCreate(boolean value) { 
3455            if (this.updateCreate == null)
3456              this.updateCreate = new BooleanType();
3457            this.updateCreate.setValue(value);
3458          return this;
3459        }
3460
3461        /**
3462         * @return {@link #conditionalCreate} (A flag that indicates that the server supports conditional create.). This is the underlying object with id, value and extensions. The accessor "getConditionalCreate" gives direct access to the value
3463         */
3464        public BooleanType getConditionalCreateElement() { 
3465          if (this.conditionalCreate == null)
3466            if (Configuration.errorOnAutoCreate())
3467              throw new Error("Attempt to auto-create CapabilityStatementRestResourceComponent.conditionalCreate");
3468            else if (Configuration.doAutoCreate())
3469              this.conditionalCreate = new BooleanType(); // bb
3470          return this.conditionalCreate;
3471        }
3472
3473        public boolean hasConditionalCreateElement() { 
3474          return this.conditionalCreate != null && !this.conditionalCreate.isEmpty();
3475        }
3476
3477        public boolean hasConditionalCreate() { 
3478          return this.conditionalCreate != null && !this.conditionalCreate.isEmpty();
3479        }
3480
3481        /**
3482         * @param value {@link #conditionalCreate} (A flag that indicates that the server supports conditional create.). This is the underlying object with id, value and extensions. The accessor "getConditionalCreate" gives direct access to the value
3483         */
3484        public CapabilityStatementRestResourceComponent setConditionalCreateElement(BooleanType value) { 
3485          this.conditionalCreate = value;
3486          return this;
3487        }
3488
3489        /**
3490         * @return A flag that indicates that the server supports conditional create.
3491         */
3492        public boolean getConditionalCreate() { 
3493          return this.conditionalCreate == null || this.conditionalCreate.isEmpty() ? false : this.conditionalCreate.getValue();
3494        }
3495
3496        /**
3497         * @param value A flag that indicates that the server supports conditional create.
3498         */
3499        public CapabilityStatementRestResourceComponent setConditionalCreate(boolean value) { 
3500            if (this.conditionalCreate == null)
3501              this.conditionalCreate = new BooleanType();
3502            this.conditionalCreate.setValue(value);
3503          return this;
3504        }
3505
3506        /**
3507         * @return {@link #conditionalRead} (A code that indicates how the server supports conditional read.). This is the underlying object with id, value and extensions. The accessor "getConditionalRead" gives direct access to the value
3508         */
3509        public Enumeration<ConditionalReadStatus> getConditionalReadElement() { 
3510          if (this.conditionalRead == null)
3511            if (Configuration.errorOnAutoCreate())
3512              throw new Error("Attempt to auto-create CapabilityStatementRestResourceComponent.conditionalRead");
3513            else if (Configuration.doAutoCreate())
3514              this.conditionalRead = new Enumeration<ConditionalReadStatus>(new ConditionalReadStatusEnumFactory()); // bb
3515          return this.conditionalRead;
3516        }
3517
3518        public boolean hasConditionalReadElement() { 
3519          return this.conditionalRead != null && !this.conditionalRead.isEmpty();
3520        }
3521
3522        public boolean hasConditionalRead() { 
3523          return this.conditionalRead != null && !this.conditionalRead.isEmpty();
3524        }
3525
3526        /**
3527         * @param value {@link #conditionalRead} (A code that indicates how the server supports conditional read.). This is the underlying object with id, value and extensions. The accessor "getConditionalRead" gives direct access to the value
3528         */
3529        public CapabilityStatementRestResourceComponent setConditionalReadElement(Enumeration<ConditionalReadStatus> value) { 
3530          this.conditionalRead = value;
3531          return this;
3532        }
3533
3534        /**
3535         * @return A code that indicates how the server supports conditional read.
3536         */
3537        public ConditionalReadStatus getConditionalRead() { 
3538          return this.conditionalRead == null ? null : this.conditionalRead.getValue();
3539        }
3540
3541        /**
3542         * @param value A code that indicates how the server supports conditional read.
3543         */
3544        public CapabilityStatementRestResourceComponent setConditionalRead(ConditionalReadStatus value) { 
3545          if (value == null)
3546            this.conditionalRead = null;
3547          else {
3548            if (this.conditionalRead == null)
3549              this.conditionalRead = new Enumeration<ConditionalReadStatus>(new ConditionalReadStatusEnumFactory());
3550            this.conditionalRead.setValue(value);
3551          }
3552          return this;
3553        }
3554
3555        /**
3556         * @return {@link #conditionalUpdate} (A flag that indicates that the server supports conditional update.). This is the underlying object with id, value and extensions. The accessor "getConditionalUpdate" gives direct access to the value
3557         */
3558        public BooleanType getConditionalUpdateElement() { 
3559          if (this.conditionalUpdate == null)
3560            if (Configuration.errorOnAutoCreate())
3561              throw new Error("Attempt to auto-create CapabilityStatementRestResourceComponent.conditionalUpdate");
3562            else if (Configuration.doAutoCreate())
3563              this.conditionalUpdate = new BooleanType(); // bb
3564          return this.conditionalUpdate;
3565        }
3566
3567        public boolean hasConditionalUpdateElement() { 
3568          return this.conditionalUpdate != null && !this.conditionalUpdate.isEmpty();
3569        }
3570
3571        public boolean hasConditionalUpdate() { 
3572          return this.conditionalUpdate != null && !this.conditionalUpdate.isEmpty();
3573        }
3574
3575        /**
3576         * @param value {@link #conditionalUpdate} (A flag that indicates that the server supports conditional update.). This is the underlying object with id, value and extensions. The accessor "getConditionalUpdate" gives direct access to the value
3577         */
3578        public CapabilityStatementRestResourceComponent setConditionalUpdateElement(BooleanType value) { 
3579          this.conditionalUpdate = value;
3580          return this;
3581        }
3582
3583        /**
3584         * @return A flag that indicates that the server supports conditional update.
3585         */
3586        public boolean getConditionalUpdate() { 
3587          return this.conditionalUpdate == null || this.conditionalUpdate.isEmpty() ? false : this.conditionalUpdate.getValue();
3588        }
3589
3590        /**
3591         * @param value A flag that indicates that the server supports conditional update.
3592         */
3593        public CapabilityStatementRestResourceComponent setConditionalUpdate(boolean value) { 
3594            if (this.conditionalUpdate == null)
3595              this.conditionalUpdate = new BooleanType();
3596            this.conditionalUpdate.setValue(value);
3597          return this;
3598        }
3599
3600        /**
3601         * @return {@link #conditionalPatch} (A flag that indicates that the server supports conditional patch.). This is the underlying object with id, value and extensions. The accessor "getConditionalPatch" gives direct access to the value
3602         */
3603        public BooleanType getConditionalPatchElement() { 
3604          if (this.conditionalPatch == null)
3605            if (Configuration.errorOnAutoCreate())
3606              throw new Error("Attempt to auto-create CapabilityStatementRestResourceComponent.conditionalPatch");
3607            else if (Configuration.doAutoCreate())
3608              this.conditionalPatch = new BooleanType(); // bb
3609          return this.conditionalPatch;
3610        }
3611
3612        public boolean hasConditionalPatchElement() { 
3613          return this.conditionalPatch != null && !this.conditionalPatch.isEmpty();
3614        }
3615
3616        public boolean hasConditionalPatch() { 
3617          return this.conditionalPatch != null && !this.conditionalPatch.isEmpty();
3618        }
3619
3620        /**
3621         * @param value {@link #conditionalPatch} (A flag that indicates that the server supports conditional patch.). This is the underlying object with id, value and extensions. The accessor "getConditionalPatch" gives direct access to the value
3622         */
3623        public CapabilityStatementRestResourceComponent setConditionalPatchElement(BooleanType value) { 
3624          this.conditionalPatch = value;
3625          return this;
3626        }
3627
3628        /**
3629         * @return A flag that indicates that the server supports conditional patch.
3630         */
3631        public boolean getConditionalPatch() { 
3632          return this.conditionalPatch == null || this.conditionalPatch.isEmpty() ? false : this.conditionalPatch.getValue();
3633        }
3634
3635        /**
3636         * @param value A flag that indicates that the server supports conditional patch.
3637         */
3638        public CapabilityStatementRestResourceComponent setConditionalPatch(boolean value) { 
3639            if (this.conditionalPatch == null)
3640              this.conditionalPatch = new BooleanType();
3641            this.conditionalPatch.setValue(value);
3642          return this;
3643        }
3644
3645        /**
3646         * @return {@link #conditionalDelete} (A code that indicates how the server supports conditional delete.). This is the underlying object with id, value and extensions. The accessor "getConditionalDelete" gives direct access to the value
3647         */
3648        public Enumeration<ConditionalDeleteStatus> getConditionalDeleteElement() { 
3649          if (this.conditionalDelete == null)
3650            if (Configuration.errorOnAutoCreate())
3651              throw new Error("Attempt to auto-create CapabilityStatementRestResourceComponent.conditionalDelete");
3652            else if (Configuration.doAutoCreate())
3653              this.conditionalDelete = new Enumeration<ConditionalDeleteStatus>(new ConditionalDeleteStatusEnumFactory()); // bb
3654          return this.conditionalDelete;
3655        }
3656
3657        public boolean hasConditionalDeleteElement() { 
3658          return this.conditionalDelete != null && !this.conditionalDelete.isEmpty();
3659        }
3660
3661        public boolean hasConditionalDelete() { 
3662          return this.conditionalDelete != null && !this.conditionalDelete.isEmpty();
3663        }
3664
3665        /**
3666         * @param value {@link #conditionalDelete} (A code that indicates how the server supports conditional delete.). This is the underlying object with id, value and extensions. The accessor "getConditionalDelete" gives direct access to the value
3667         */
3668        public CapabilityStatementRestResourceComponent setConditionalDeleteElement(Enumeration<ConditionalDeleteStatus> value) { 
3669          this.conditionalDelete = value;
3670          return this;
3671        }
3672
3673        /**
3674         * @return A code that indicates how the server supports conditional delete.
3675         */
3676        public ConditionalDeleteStatus getConditionalDelete() { 
3677          return this.conditionalDelete == null ? null : this.conditionalDelete.getValue();
3678        }
3679
3680        /**
3681         * @param value A code that indicates how the server supports conditional delete.
3682         */
3683        public CapabilityStatementRestResourceComponent setConditionalDelete(ConditionalDeleteStatus value) { 
3684          if (value == null)
3685            this.conditionalDelete = null;
3686          else {
3687            if (this.conditionalDelete == null)
3688              this.conditionalDelete = new Enumeration<ConditionalDeleteStatus>(new ConditionalDeleteStatusEnumFactory());
3689            this.conditionalDelete.setValue(value);
3690          }
3691          return this;
3692        }
3693
3694        /**
3695         * @return {@link #referencePolicy} (A set of flags that defines how references are supported.)
3696         */
3697        public List<Enumeration<ReferenceHandlingPolicy>> getReferencePolicy() { 
3698          if (this.referencePolicy == null)
3699            this.referencePolicy = new ArrayList<Enumeration<ReferenceHandlingPolicy>>();
3700          return this.referencePolicy;
3701        }
3702
3703        /**
3704         * @return Returns a reference to <code>this</code> for easy method chaining
3705         */
3706        public CapabilityStatementRestResourceComponent setReferencePolicy(List<Enumeration<ReferenceHandlingPolicy>> theReferencePolicy) { 
3707          this.referencePolicy = theReferencePolicy;
3708          return this;
3709        }
3710
3711        public boolean hasReferencePolicy() { 
3712          if (this.referencePolicy == null)
3713            return false;
3714          for (Enumeration<ReferenceHandlingPolicy> item : this.referencePolicy)
3715            if (!item.isEmpty())
3716              return true;
3717          return false;
3718        }
3719
3720        /**
3721         * @return {@link #referencePolicy} (A set of flags that defines how references are supported.)
3722         */
3723        public Enumeration<ReferenceHandlingPolicy> addReferencePolicyElement() {//2 
3724          Enumeration<ReferenceHandlingPolicy> t = new Enumeration<ReferenceHandlingPolicy>(new ReferenceHandlingPolicyEnumFactory());
3725          if (this.referencePolicy == null)
3726            this.referencePolicy = new ArrayList<Enumeration<ReferenceHandlingPolicy>>();
3727          this.referencePolicy.add(t);
3728          return t;
3729        }
3730
3731        /**
3732         * @param value {@link #referencePolicy} (A set of flags that defines how references are supported.)
3733         */
3734        public CapabilityStatementRestResourceComponent addReferencePolicy(ReferenceHandlingPolicy value) { //1
3735          Enumeration<ReferenceHandlingPolicy> t = new Enumeration<ReferenceHandlingPolicy>(new ReferenceHandlingPolicyEnumFactory());
3736          t.setValue(value);
3737          if (this.referencePolicy == null)
3738            this.referencePolicy = new ArrayList<Enumeration<ReferenceHandlingPolicy>>();
3739          this.referencePolicy.add(t);
3740          return this;
3741        }
3742
3743        /**
3744         * @param value {@link #referencePolicy} (A set of flags that defines how references are supported.)
3745         */
3746        public boolean hasReferencePolicy(ReferenceHandlingPolicy value) { 
3747          if (this.referencePolicy == null)
3748            return false;
3749          for (Enumeration<ReferenceHandlingPolicy> v : this.referencePolicy)
3750            if (v.getValue().equals(value)) // code
3751              return true;
3752          return false;
3753        }
3754
3755        /**
3756         * @return {@link #searchInclude} (A list of _include values supported by the server.)
3757         */
3758        public List<StringType> getSearchInclude() { 
3759          if (this.searchInclude == null)
3760            this.searchInclude = new ArrayList<StringType>();
3761          return this.searchInclude;
3762        }
3763
3764        /**
3765         * @return Returns a reference to <code>this</code> for easy method chaining
3766         */
3767        public CapabilityStatementRestResourceComponent setSearchInclude(List<StringType> theSearchInclude) { 
3768          this.searchInclude = theSearchInclude;
3769          return this;
3770        }
3771
3772        public boolean hasSearchInclude() { 
3773          if (this.searchInclude == null)
3774            return false;
3775          for (StringType item : this.searchInclude)
3776            if (!item.isEmpty())
3777              return true;
3778          return false;
3779        }
3780
3781        /**
3782         * @return {@link #searchInclude} (A list of _include values supported by the server.)
3783         */
3784        public StringType addSearchIncludeElement() {//2 
3785          StringType t = new StringType();
3786          if (this.searchInclude == null)
3787            this.searchInclude = new ArrayList<StringType>();
3788          this.searchInclude.add(t);
3789          return t;
3790        }
3791
3792        /**
3793         * @param value {@link #searchInclude} (A list of _include values supported by the server.)
3794         */
3795        public CapabilityStatementRestResourceComponent addSearchInclude(String value) { //1
3796          StringType t = new StringType();
3797          t.setValue(value);
3798          if (this.searchInclude == null)
3799            this.searchInclude = new ArrayList<StringType>();
3800          this.searchInclude.add(t);
3801          return this;
3802        }
3803
3804        /**
3805         * @param value {@link #searchInclude} (A list of _include values supported by the server.)
3806         */
3807        public boolean hasSearchInclude(String value) { 
3808          if (this.searchInclude == null)
3809            return false;
3810          for (StringType v : this.searchInclude)
3811            if (v.getValue().equals(value)) // string
3812              return true;
3813          return false;
3814        }
3815
3816        /**
3817         * @return {@link #searchRevInclude} (A list of _revinclude (reverse include) values supported by the server.)
3818         */
3819        public List<StringType> getSearchRevInclude() { 
3820          if (this.searchRevInclude == null)
3821            this.searchRevInclude = new ArrayList<StringType>();
3822          return this.searchRevInclude;
3823        }
3824
3825        /**
3826         * @return Returns a reference to <code>this</code> for easy method chaining
3827         */
3828        public CapabilityStatementRestResourceComponent setSearchRevInclude(List<StringType> theSearchRevInclude) { 
3829          this.searchRevInclude = theSearchRevInclude;
3830          return this;
3831        }
3832
3833        public boolean hasSearchRevInclude() { 
3834          if (this.searchRevInclude == null)
3835            return false;
3836          for (StringType item : this.searchRevInclude)
3837            if (!item.isEmpty())
3838              return true;
3839          return false;
3840        }
3841
3842        /**
3843         * @return {@link #searchRevInclude} (A list of _revinclude (reverse include) values supported by the server.)
3844         */
3845        public StringType addSearchRevIncludeElement() {//2 
3846          StringType t = new StringType();
3847          if (this.searchRevInclude == null)
3848            this.searchRevInclude = new ArrayList<StringType>();
3849          this.searchRevInclude.add(t);
3850          return t;
3851        }
3852
3853        /**
3854         * @param value {@link #searchRevInclude} (A list of _revinclude (reverse include) values supported by the server.)
3855         */
3856        public CapabilityStatementRestResourceComponent addSearchRevInclude(String value) { //1
3857          StringType t = new StringType();
3858          t.setValue(value);
3859          if (this.searchRevInclude == null)
3860            this.searchRevInclude = new ArrayList<StringType>();
3861          this.searchRevInclude.add(t);
3862          return this;
3863        }
3864
3865        /**
3866         * @param value {@link #searchRevInclude} (A list of _revinclude (reverse include) values supported by the server.)
3867         */
3868        public boolean hasSearchRevInclude(String value) { 
3869          if (this.searchRevInclude == null)
3870            return false;
3871          for (StringType v : this.searchRevInclude)
3872            if (v.getValue().equals(value)) // string
3873              return true;
3874          return false;
3875        }
3876
3877        /**
3878         * @return {@link #searchParam} (Search parameters for implementations to support and/or make use of - either references to ones defined in the specification, or additional ones defined for/by the implementation.)
3879         */
3880        public List<CapabilityStatementRestResourceSearchParamComponent> getSearchParam() { 
3881          if (this.searchParam == null)
3882            this.searchParam = new ArrayList<CapabilityStatementRestResourceSearchParamComponent>();
3883          return this.searchParam;
3884        }
3885
3886        /**
3887         * @return Returns a reference to <code>this</code> for easy method chaining
3888         */
3889        public CapabilityStatementRestResourceComponent setSearchParam(List<CapabilityStatementRestResourceSearchParamComponent> theSearchParam) { 
3890          this.searchParam = theSearchParam;
3891          return this;
3892        }
3893
3894        public boolean hasSearchParam() { 
3895          if (this.searchParam == null)
3896            return false;
3897          for (CapabilityStatementRestResourceSearchParamComponent item : this.searchParam)
3898            if (!item.isEmpty())
3899              return true;
3900          return false;
3901        }
3902
3903        public CapabilityStatementRestResourceSearchParamComponent addSearchParam() { //3
3904          CapabilityStatementRestResourceSearchParamComponent t = new CapabilityStatementRestResourceSearchParamComponent();
3905          if (this.searchParam == null)
3906            this.searchParam = new ArrayList<CapabilityStatementRestResourceSearchParamComponent>();
3907          this.searchParam.add(t);
3908          return t;
3909        }
3910
3911        public CapabilityStatementRestResourceComponent addSearchParam(CapabilityStatementRestResourceSearchParamComponent t) { //3
3912          if (t == null)
3913            return this;
3914          if (this.searchParam == null)
3915            this.searchParam = new ArrayList<CapabilityStatementRestResourceSearchParamComponent>();
3916          this.searchParam.add(t);
3917          return this;
3918        }
3919
3920        /**
3921         * @return The first repetition of repeating field {@link #searchParam}, creating it if it does not already exist {3}
3922         */
3923        public CapabilityStatementRestResourceSearchParamComponent getSearchParamFirstRep() { 
3924          if (getSearchParam().isEmpty()) {
3925            addSearchParam();
3926          }
3927          return getSearchParam().get(0);
3928        }
3929
3930        /**
3931         * @return {@link #operation} (Definition of an operation or a named query together with its parameters and their meaning and type. Consult the definition of the operation for details about how to invoke the operation, and the parameters.)
3932         */
3933        public List<CapabilityStatementRestResourceOperationComponent> getOperation() { 
3934          if (this.operation == null)
3935            this.operation = new ArrayList<CapabilityStatementRestResourceOperationComponent>();
3936          return this.operation;
3937        }
3938
3939        /**
3940         * @return Returns a reference to <code>this</code> for easy method chaining
3941         */
3942        public CapabilityStatementRestResourceComponent setOperation(List<CapabilityStatementRestResourceOperationComponent> theOperation) { 
3943          this.operation = theOperation;
3944          return this;
3945        }
3946
3947        public boolean hasOperation() { 
3948          if (this.operation == null)
3949            return false;
3950          for (CapabilityStatementRestResourceOperationComponent item : this.operation)
3951            if (!item.isEmpty())
3952              return true;
3953          return false;
3954        }
3955
3956        public CapabilityStatementRestResourceOperationComponent addOperation() { //3
3957          CapabilityStatementRestResourceOperationComponent t = new CapabilityStatementRestResourceOperationComponent();
3958          if (this.operation == null)
3959            this.operation = new ArrayList<CapabilityStatementRestResourceOperationComponent>();
3960          this.operation.add(t);
3961          return t;
3962        }
3963
3964        public CapabilityStatementRestResourceComponent addOperation(CapabilityStatementRestResourceOperationComponent t) { //3
3965          if (t == null)
3966            return this;
3967          if (this.operation == null)
3968            this.operation = new ArrayList<CapabilityStatementRestResourceOperationComponent>();
3969          this.operation.add(t);
3970          return this;
3971        }
3972
3973        /**
3974         * @return The first repetition of repeating field {@link #operation}, creating it if it does not already exist {3}
3975         */
3976        public CapabilityStatementRestResourceOperationComponent getOperationFirstRep() { 
3977          if (getOperation().isEmpty()) {
3978            addOperation();
3979          }
3980          return getOperation().get(0);
3981        }
3982
3983        protected void listChildren(List<Property> children) {
3984          super.listChildren(children);
3985          children.add(new Property("type", "code", "A type of resource exposed via the restful interface.", 0, 1, type));
3986          children.add(new Property("profile", "canonical(StructureDefinition)", "A system-wide profile that is applied across *all* instances of the resource supported by the system. For example, if declared on Observation, this profile is the \"superset\" of capabilities for laboratory *and* vitals *and* other domains. See further discussion in [Using Profiles](profiling.html#profile-uses).", 0, 1, profile));
3987          children.add(new Property("supportedProfile", "canonical(StructureDefinition)", "A list of profiles representing different use cases the system hosts/produces. A supported profile is a statement about the functionality of the data and services provided by the server (or the client) for supported use cases. For example, a system can define and declare multiple Observation profiles for laboratory observations, vital sign observations, etc. By declaring supported profiles, systems provide a way to determine whether individual resources are conformant. See further discussion in [Using Profiles](profiling.html#profile-uses).", 0, java.lang.Integer.MAX_VALUE, supportedProfile));
3988          children.add(new Property("documentation", "markdown", "Additional information about the resource type used by the system.", 0, 1, documentation));
3989          children.add(new Property("interaction", "", "Identifies a restful operation supported by the solution.", 0, java.lang.Integer.MAX_VALUE, interaction));
3990          children.add(new Property("versioning", "code", "This field is set to no-version to specify that the system does not support (server) or use (client) versioning for this resource type. If this has some other value, the server must at least correctly track and populate the versionId meta-property on resources. If the value is 'versioned-update', then the server supports all the versioning features, including using e-tags for version integrity in the API.", 0, 1, versioning));
3991          children.add(new Property("readHistory", "boolean", "A flag for whether the server is able to return past versions as part of the vRead operation.", 0, 1, readHistory));
3992          children.add(new Property("updateCreate", "boolean", "A flag to indicate that the server allows or needs to allow the client to create new identities on the server (that is, the client PUTs to a location where there is no existing resource). Allowing this operation means that the server allows the client to create new identities on the server.", 0, 1, updateCreate));
3993          children.add(new Property("conditionalCreate", "boolean", "A flag that indicates that the server supports conditional create.", 0, 1, conditionalCreate));
3994          children.add(new Property("conditionalRead", "code", "A code that indicates how the server supports conditional read.", 0, 1, conditionalRead));
3995          children.add(new Property("conditionalUpdate", "boolean", "A flag that indicates that the server supports conditional update.", 0, 1, conditionalUpdate));
3996          children.add(new Property("conditionalPatch", "boolean", "A flag that indicates that the server supports conditional patch.", 0, 1, conditionalPatch));
3997          children.add(new Property("conditionalDelete", "code", "A code that indicates how the server supports conditional delete.", 0, 1, conditionalDelete));
3998          children.add(new Property("referencePolicy", "code", "A set of flags that defines how references are supported.", 0, java.lang.Integer.MAX_VALUE, referencePolicy));
3999          children.add(new Property("searchInclude", "string", "A list of _include values supported by the server.", 0, java.lang.Integer.MAX_VALUE, searchInclude));
4000          children.add(new Property("searchRevInclude", "string", "A list of _revinclude (reverse include) values supported by the server.", 0, java.lang.Integer.MAX_VALUE, searchRevInclude));
4001          children.add(new Property("searchParam", "", "Search parameters for implementations to support and/or make use of - either references to ones defined in the specification, or additional ones defined for/by the implementation.", 0, java.lang.Integer.MAX_VALUE, searchParam));
4002          children.add(new Property("operation", "", "Definition of an operation or a named query together with its parameters and their meaning and type. Consult the definition of the operation for details about how to invoke the operation, and the parameters.", 0, java.lang.Integer.MAX_VALUE, operation));
4003        }
4004
4005        @Override
4006        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
4007          switch (_hash) {
4008          case 3575610: /*type*/  return new Property("type", "code", "A type of resource exposed via the restful interface.", 0, 1, type);
4009          case -309425751: /*profile*/  return new Property("profile", "canonical(StructureDefinition)", "A system-wide profile that is applied across *all* instances of the resource supported by the system. For example, if declared on Observation, this profile is the \"superset\" of capabilities for laboratory *and* vitals *and* other domains. See further discussion in [Using Profiles](profiling.html#profile-uses).", 0, 1, profile);
4010          case 1225477403: /*supportedProfile*/  return new Property("supportedProfile", "canonical(StructureDefinition)", "A list of profiles representing different use cases the system hosts/produces. A supported profile is a statement about the functionality of the data and services provided by the server (or the client) for supported use cases. For example, a system can define and declare multiple Observation profiles for laboratory observations, vital sign observations, etc. By declaring supported profiles, systems provide a way to determine whether individual resources are conformant. See further discussion in [Using Profiles](profiling.html#profile-uses).", 0, java.lang.Integer.MAX_VALUE, supportedProfile);
4011          case 1587405498: /*documentation*/  return new Property("documentation", "markdown", "Additional information about the resource type used by the system.", 0, 1, documentation);
4012          case 1844104722: /*interaction*/  return new Property("interaction", "", "Identifies a restful operation supported by the solution.", 0, java.lang.Integer.MAX_VALUE, interaction);
4013          case -670487542: /*versioning*/  return new Property("versioning", "code", "This field is set to no-version to specify that the system does not support (server) or use (client) versioning for this resource type. If this has some other value, the server must at least correctly track and populate the versionId meta-property on resources. If the value is 'versioned-update', then the server supports all the versioning features, including using e-tags for version integrity in the API.", 0, 1, versioning);
4014          case 187518494: /*readHistory*/  return new Property("readHistory", "boolean", "A flag for whether the server is able to return past versions as part of the vRead operation.", 0, 1, readHistory);
4015          case -1400550619: /*updateCreate*/  return new Property("updateCreate", "boolean", "A flag to indicate that the server allows or needs to allow the client to create new identities on the server (that is, the client PUTs to a location where there is no existing resource). Allowing this operation means that the server allows the client to create new identities on the server.", 0, 1, updateCreate);
4016          case 6401826: /*conditionalCreate*/  return new Property("conditionalCreate", "boolean", "A flag that indicates that the server supports conditional create.", 0, 1, conditionalCreate);
4017          case 822786364: /*conditionalRead*/  return new Property("conditionalRead", "code", "A code that indicates how the server supports conditional read.", 0, 1, conditionalRead);
4018          case 519849711: /*conditionalUpdate*/  return new Property("conditionalUpdate", "boolean", "A flag that indicates that the server supports conditional update.", 0, 1, conditionalUpdate);
4019          case -265374366: /*conditionalPatch*/  return new Property("conditionalPatch", "boolean", "A flag that indicates that the server supports conditional patch.", 0, 1, conditionalPatch);
4020          case 23237585: /*conditionalDelete*/  return new Property("conditionalDelete", "code", "A code that indicates how the server supports conditional delete.", 0, 1, conditionalDelete);
4021          case 796257373: /*referencePolicy*/  return new Property("referencePolicy", "code", "A set of flags that defines how references are supported.", 0, java.lang.Integer.MAX_VALUE, referencePolicy);
4022          case -1035904544: /*searchInclude*/  return new Property("searchInclude", "string", "A list of _include values supported by the server.", 0, java.lang.Integer.MAX_VALUE, searchInclude);
4023          case -2123884979: /*searchRevInclude*/  return new Property("searchRevInclude", "string", "A list of _revinclude (reverse include) values supported by the server.", 0, java.lang.Integer.MAX_VALUE, searchRevInclude);
4024          case -553645115: /*searchParam*/  return new Property("searchParam", "", "Search parameters for implementations to support and/or make use of - either references to ones defined in the specification, or additional ones defined for/by the implementation.", 0, java.lang.Integer.MAX_VALUE, searchParam);
4025          case 1662702951: /*operation*/  return new Property("operation", "", "Definition of an operation or a named query together with its parameters and their meaning and type. Consult the definition of the operation for details about how to invoke the operation, and the parameters.", 0, java.lang.Integer.MAX_VALUE, operation);
4026          default: return super.getNamedProperty(_hash, _name, _checkValid);
4027          }
4028
4029        }
4030
4031      @Override
4032      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
4033        switch (hash) {
4034        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // CodeType
4035        case -309425751: /*profile*/ return this.profile == null ? new Base[0] : new Base[] {this.profile}; // CanonicalType
4036        case 1225477403: /*supportedProfile*/ return this.supportedProfile == null ? new Base[0] : this.supportedProfile.toArray(new Base[this.supportedProfile.size()]); // CanonicalType
4037        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : new Base[] {this.documentation}; // MarkdownType
4038        case 1844104722: /*interaction*/ return this.interaction == null ? new Base[0] : this.interaction.toArray(new Base[this.interaction.size()]); // ResourceInteractionComponent
4039        case -670487542: /*versioning*/ return this.versioning == null ? new Base[0] : new Base[] {this.versioning}; // Enumeration<ResourceVersionPolicy>
4040        case 187518494: /*readHistory*/ return this.readHistory == null ? new Base[0] : new Base[] {this.readHistory}; // BooleanType
4041        case -1400550619: /*updateCreate*/ return this.updateCreate == null ? new Base[0] : new Base[] {this.updateCreate}; // BooleanType
4042        case 6401826: /*conditionalCreate*/ return this.conditionalCreate == null ? new Base[0] : new Base[] {this.conditionalCreate}; // BooleanType
4043        case 822786364: /*conditionalRead*/ return this.conditionalRead == null ? new Base[0] : new Base[] {this.conditionalRead}; // Enumeration<ConditionalReadStatus>
4044        case 519849711: /*conditionalUpdate*/ return this.conditionalUpdate == null ? new Base[0] : new Base[] {this.conditionalUpdate}; // BooleanType
4045        case -265374366: /*conditionalPatch*/ return this.conditionalPatch == null ? new Base[0] : new Base[] {this.conditionalPatch}; // BooleanType
4046        case 23237585: /*conditionalDelete*/ return this.conditionalDelete == null ? new Base[0] : new Base[] {this.conditionalDelete}; // Enumeration<ConditionalDeleteStatus>
4047        case 796257373: /*referencePolicy*/ return this.referencePolicy == null ? new Base[0] : this.referencePolicy.toArray(new Base[this.referencePolicy.size()]); // Enumeration<ReferenceHandlingPolicy>
4048        case -1035904544: /*searchInclude*/ return this.searchInclude == null ? new Base[0] : this.searchInclude.toArray(new Base[this.searchInclude.size()]); // StringType
4049        case -2123884979: /*searchRevInclude*/ return this.searchRevInclude == null ? new Base[0] : this.searchRevInclude.toArray(new Base[this.searchRevInclude.size()]); // StringType
4050        case -553645115: /*searchParam*/ return this.searchParam == null ? new Base[0] : this.searchParam.toArray(new Base[this.searchParam.size()]); // CapabilityStatementRestResourceSearchParamComponent
4051        case 1662702951: /*operation*/ return this.operation == null ? new Base[0] : this.operation.toArray(new Base[this.operation.size()]); // CapabilityStatementRestResourceOperationComponent
4052        default: return super.getProperty(hash, name, checkValid);
4053        }
4054
4055      }
4056
4057      @Override
4058      public Base setProperty(int hash, String name, Base value) throws FHIRException {
4059        switch (hash) {
4060        case 3575610: // type
4061          this.type = TypeConvertor.castToCode(value); // CodeType
4062          return value;
4063        case -309425751: // profile
4064          this.profile = TypeConvertor.castToCanonical(value); // CanonicalType
4065          return value;
4066        case 1225477403: // supportedProfile
4067          this.getSupportedProfile().add(TypeConvertor.castToCanonical(value)); // CanonicalType
4068          return value;
4069        case 1587405498: // documentation
4070          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
4071          return value;
4072        case 1844104722: // interaction
4073          this.getInteraction().add((ResourceInteractionComponent) value); // ResourceInteractionComponent
4074          return value;
4075        case -670487542: // versioning
4076          value = new ResourceVersionPolicyEnumFactory().fromType(TypeConvertor.castToCode(value));
4077          this.versioning = (Enumeration) value; // Enumeration<ResourceVersionPolicy>
4078          return value;
4079        case 187518494: // readHistory
4080          this.readHistory = TypeConvertor.castToBoolean(value); // BooleanType
4081          return value;
4082        case -1400550619: // updateCreate
4083          this.updateCreate = TypeConvertor.castToBoolean(value); // BooleanType
4084          return value;
4085        case 6401826: // conditionalCreate
4086          this.conditionalCreate = TypeConvertor.castToBoolean(value); // BooleanType
4087          return value;
4088        case 822786364: // conditionalRead
4089          value = new ConditionalReadStatusEnumFactory().fromType(TypeConvertor.castToCode(value));
4090          this.conditionalRead = (Enumeration) value; // Enumeration<ConditionalReadStatus>
4091          return value;
4092        case 519849711: // conditionalUpdate
4093          this.conditionalUpdate = TypeConvertor.castToBoolean(value); // BooleanType
4094          return value;
4095        case -265374366: // conditionalPatch
4096          this.conditionalPatch = TypeConvertor.castToBoolean(value); // BooleanType
4097          return value;
4098        case 23237585: // conditionalDelete
4099          value = new ConditionalDeleteStatusEnumFactory().fromType(TypeConvertor.castToCode(value));
4100          this.conditionalDelete = (Enumeration) value; // Enumeration<ConditionalDeleteStatus>
4101          return value;
4102        case 796257373: // referencePolicy
4103          value = new ReferenceHandlingPolicyEnumFactory().fromType(TypeConvertor.castToCode(value));
4104          this.getReferencePolicy().add((Enumeration) value); // Enumeration<ReferenceHandlingPolicy>
4105          return value;
4106        case -1035904544: // searchInclude
4107          this.getSearchInclude().add(TypeConvertor.castToString(value)); // StringType
4108          return value;
4109        case -2123884979: // searchRevInclude
4110          this.getSearchRevInclude().add(TypeConvertor.castToString(value)); // StringType
4111          return value;
4112        case -553645115: // searchParam
4113          this.getSearchParam().add((CapabilityStatementRestResourceSearchParamComponent) value); // CapabilityStatementRestResourceSearchParamComponent
4114          return value;
4115        case 1662702951: // operation
4116          this.getOperation().add((CapabilityStatementRestResourceOperationComponent) value); // CapabilityStatementRestResourceOperationComponent
4117          return value;
4118        default: return super.setProperty(hash, name, value);
4119        }
4120
4121      }
4122
4123      @Override
4124      public Base setProperty(String name, Base value) throws FHIRException {
4125        if (name.equals("type")) {
4126          this.type = TypeConvertor.castToCode(value); // CodeType
4127        } else if (name.equals("profile")) {
4128          this.profile = TypeConvertor.castToCanonical(value); // CanonicalType
4129        } else if (name.equals("supportedProfile")) {
4130          this.getSupportedProfile().add(TypeConvertor.castToCanonical(value));
4131        } else if (name.equals("documentation")) {
4132          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
4133        } else if (name.equals("interaction")) {
4134          this.getInteraction().add((ResourceInteractionComponent) value);
4135        } else if (name.equals("versioning")) {
4136          value = new ResourceVersionPolicyEnumFactory().fromType(TypeConvertor.castToCode(value));
4137          this.versioning = (Enumeration) value; // Enumeration<ResourceVersionPolicy>
4138        } else if (name.equals("readHistory")) {
4139          this.readHistory = TypeConvertor.castToBoolean(value); // BooleanType
4140        } else if (name.equals("updateCreate")) {
4141          this.updateCreate = TypeConvertor.castToBoolean(value); // BooleanType
4142        } else if (name.equals("conditionalCreate")) {
4143          this.conditionalCreate = TypeConvertor.castToBoolean(value); // BooleanType
4144        } else if (name.equals("conditionalRead")) {
4145          value = new ConditionalReadStatusEnumFactory().fromType(TypeConvertor.castToCode(value));
4146          this.conditionalRead = (Enumeration) value; // Enumeration<ConditionalReadStatus>
4147        } else if (name.equals("conditionalUpdate")) {
4148          this.conditionalUpdate = TypeConvertor.castToBoolean(value); // BooleanType
4149        } else if (name.equals("conditionalPatch")) {
4150          this.conditionalPatch = TypeConvertor.castToBoolean(value); // BooleanType
4151        } else if (name.equals("conditionalDelete")) {
4152          value = new ConditionalDeleteStatusEnumFactory().fromType(TypeConvertor.castToCode(value));
4153          this.conditionalDelete = (Enumeration) value; // Enumeration<ConditionalDeleteStatus>
4154        } else if (name.equals("referencePolicy")) {
4155          value = new ReferenceHandlingPolicyEnumFactory().fromType(TypeConvertor.castToCode(value));
4156          this.getReferencePolicy().add((Enumeration) value);
4157        } else if (name.equals("searchInclude")) {
4158          this.getSearchInclude().add(TypeConvertor.castToString(value));
4159        } else if (name.equals("searchRevInclude")) {
4160          this.getSearchRevInclude().add(TypeConvertor.castToString(value));
4161        } else if (name.equals("searchParam")) {
4162          this.getSearchParam().add((CapabilityStatementRestResourceSearchParamComponent) value);
4163        } else if (name.equals("operation")) {
4164          this.getOperation().add((CapabilityStatementRestResourceOperationComponent) value);
4165        } else
4166          return super.setProperty(name, value);
4167        return value;
4168      }
4169
4170  @Override
4171  public void removeChild(String name, Base value) throws FHIRException {
4172        if (name.equals("type")) {
4173          this.type = null;
4174        } else if (name.equals("profile")) {
4175          this.profile = null;
4176        } else if (name.equals("supportedProfile")) {
4177          this.getSupportedProfile().remove(value);
4178        } else if (name.equals("documentation")) {
4179          this.documentation = null;
4180        } else if (name.equals("interaction")) {
4181          this.getInteraction().remove((ResourceInteractionComponent) value);
4182        } else if (name.equals("versioning")) {
4183          value = new ResourceVersionPolicyEnumFactory().fromType(TypeConvertor.castToCode(value));
4184          this.versioning = (Enumeration) value; // Enumeration<ResourceVersionPolicy>
4185        } else if (name.equals("readHistory")) {
4186          this.readHistory = null;
4187        } else if (name.equals("updateCreate")) {
4188          this.updateCreate = null;
4189        } else if (name.equals("conditionalCreate")) {
4190          this.conditionalCreate = null;
4191        } else if (name.equals("conditionalRead")) {
4192          value = new ConditionalReadStatusEnumFactory().fromType(TypeConvertor.castToCode(value));
4193          this.conditionalRead = (Enumeration) value; // Enumeration<ConditionalReadStatus>
4194        } else if (name.equals("conditionalUpdate")) {
4195          this.conditionalUpdate = null;
4196        } else if (name.equals("conditionalPatch")) {
4197          this.conditionalPatch = null;
4198        } else if (name.equals("conditionalDelete")) {
4199          value = new ConditionalDeleteStatusEnumFactory().fromType(TypeConvertor.castToCode(value));
4200          this.conditionalDelete = (Enumeration) value; // Enumeration<ConditionalDeleteStatus>
4201        } else if (name.equals("referencePolicy")) {
4202          value = new ReferenceHandlingPolicyEnumFactory().fromType(TypeConvertor.castToCode(value));
4203          this.getReferencePolicy().remove((Enumeration) value);
4204        } else if (name.equals("searchInclude")) {
4205          this.getSearchInclude().remove(value);
4206        } else if (name.equals("searchRevInclude")) {
4207          this.getSearchRevInclude().remove(value);
4208        } else if (name.equals("searchParam")) {
4209          this.getSearchParam().remove((CapabilityStatementRestResourceSearchParamComponent) value);
4210        } else if (name.equals("operation")) {
4211          this.getOperation().remove((CapabilityStatementRestResourceOperationComponent) value);
4212        } else
4213          super.removeChild(name, value);
4214        
4215      }
4216
4217      @Override
4218      public Base makeProperty(int hash, String name) throws FHIRException {
4219        switch (hash) {
4220        case 3575610:  return getTypeElement();
4221        case -309425751:  return getProfileElement();
4222        case 1225477403:  return addSupportedProfileElement();
4223        case 1587405498:  return getDocumentationElement();
4224        case 1844104722:  return addInteraction(); 
4225        case -670487542:  return getVersioningElement();
4226        case 187518494:  return getReadHistoryElement();
4227        case -1400550619:  return getUpdateCreateElement();
4228        case 6401826:  return getConditionalCreateElement();
4229        case 822786364:  return getConditionalReadElement();
4230        case 519849711:  return getConditionalUpdateElement();
4231        case -265374366:  return getConditionalPatchElement();
4232        case 23237585:  return getConditionalDeleteElement();
4233        case 796257373:  return addReferencePolicyElement();
4234        case -1035904544:  return addSearchIncludeElement();
4235        case -2123884979:  return addSearchRevIncludeElement();
4236        case -553645115:  return addSearchParam(); 
4237        case 1662702951:  return addOperation(); 
4238        default: return super.makeProperty(hash, name);
4239        }
4240
4241      }
4242
4243      @Override
4244      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
4245        switch (hash) {
4246        case 3575610: /*type*/ return new String[] {"code"};
4247        case -309425751: /*profile*/ return new String[] {"canonical"};
4248        case 1225477403: /*supportedProfile*/ return new String[] {"canonical"};
4249        case 1587405498: /*documentation*/ return new String[] {"markdown"};
4250        case 1844104722: /*interaction*/ return new String[] {};
4251        case -670487542: /*versioning*/ return new String[] {"code"};
4252        case 187518494: /*readHistory*/ return new String[] {"boolean"};
4253        case -1400550619: /*updateCreate*/ return new String[] {"boolean"};
4254        case 6401826: /*conditionalCreate*/ return new String[] {"boolean"};
4255        case 822786364: /*conditionalRead*/ return new String[] {"code"};
4256        case 519849711: /*conditionalUpdate*/ return new String[] {"boolean"};
4257        case -265374366: /*conditionalPatch*/ return new String[] {"boolean"};
4258        case 23237585: /*conditionalDelete*/ return new String[] {"code"};
4259        case 796257373: /*referencePolicy*/ return new String[] {"code"};
4260        case -1035904544: /*searchInclude*/ return new String[] {"string"};
4261        case -2123884979: /*searchRevInclude*/ return new String[] {"string"};
4262        case -553645115: /*searchParam*/ return new String[] {};
4263        case 1662702951: /*operation*/ return new String[] {};
4264        default: return super.getTypesForProperty(hash, name);
4265        }
4266
4267      }
4268
4269      @Override
4270      public Base addChild(String name) throws FHIRException {
4271        if (name.equals("type")) {
4272          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.type");
4273        }
4274        else if (name.equals("profile")) {
4275          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.profile");
4276        }
4277        else if (name.equals("supportedProfile")) {
4278          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.supportedProfile");
4279        }
4280        else if (name.equals("documentation")) {
4281          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.documentation");
4282        }
4283        else if (name.equals("interaction")) {
4284          return addInteraction();
4285        }
4286        else if (name.equals("versioning")) {
4287          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.versioning");
4288        }
4289        else if (name.equals("readHistory")) {
4290          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.readHistory");
4291        }
4292        else if (name.equals("updateCreate")) {
4293          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.updateCreate");
4294        }
4295        else if (name.equals("conditionalCreate")) {
4296          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.conditionalCreate");
4297        }
4298        else if (name.equals("conditionalRead")) {
4299          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.conditionalRead");
4300        }
4301        else if (name.equals("conditionalUpdate")) {
4302          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.conditionalUpdate");
4303        }
4304        else if (name.equals("conditionalPatch")) {
4305          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.conditionalPatch");
4306        }
4307        else if (name.equals("conditionalDelete")) {
4308          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.conditionalDelete");
4309        }
4310        else if (name.equals("referencePolicy")) {
4311          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.referencePolicy");
4312        }
4313        else if (name.equals("searchInclude")) {
4314          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.searchInclude");
4315        }
4316        else if (name.equals("searchRevInclude")) {
4317          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.searchRevInclude");
4318        }
4319        else if (name.equals("searchParam")) {
4320          return addSearchParam();
4321        }
4322        else if (name.equals("operation")) {
4323          return addOperation();
4324        }
4325        else
4326          return super.addChild(name);
4327      }
4328
4329      public CapabilityStatementRestResourceComponent copy() {
4330        CapabilityStatementRestResourceComponent dst = new CapabilityStatementRestResourceComponent();
4331        copyValues(dst);
4332        return dst;
4333      }
4334
4335      public void copyValues(CapabilityStatementRestResourceComponent dst) {
4336        super.copyValues(dst);
4337        dst.type = type == null ? null : type.copy();
4338        dst.profile = profile == null ? null : profile.copy();
4339        if (supportedProfile != null) {
4340          dst.supportedProfile = new ArrayList<CanonicalType>();
4341          for (CanonicalType i : supportedProfile)
4342            dst.supportedProfile.add(i.copy());
4343        };
4344        dst.documentation = documentation == null ? null : documentation.copy();
4345        if (interaction != null) {
4346          dst.interaction = new ArrayList<ResourceInteractionComponent>();
4347          for (ResourceInteractionComponent i : interaction)
4348            dst.interaction.add(i.copy());
4349        };
4350        dst.versioning = versioning == null ? null : versioning.copy();
4351        dst.readHistory = readHistory == null ? null : readHistory.copy();
4352        dst.updateCreate = updateCreate == null ? null : updateCreate.copy();
4353        dst.conditionalCreate = conditionalCreate == null ? null : conditionalCreate.copy();
4354        dst.conditionalRead = conditionalRead == null ? null : conditionalRead.copy();
4355        dst.conditionalUpdate = conditionalUpdate == null ? null : conditionalUpdate.copy();
4356        dst.conditionalPatch = conditionalPatch == null ? null : conditionalPatch.copy();
4357        dst.conditionalDelete = conditionalDelete == null ? null : conditionalDelete.copy();
4358        if (referencePolicy != null) {
4359          dst.referencePolicy = new ArrayList<Enumeration<ReferenceHandlingPolicy>>();
4360          for (Enumeration<ReferenceHandlingPolicy> i : referencePolicy)
4361            dst.referencePolicy.add(i.copy());
4362        };
4363        if (searchInclude != null) {
4364          dst.searchInclude = new ArrayList<StringType>();
4365          for (StringType i : searchInclude)
4366            dst.searchInclude.add(i.copy());
4367        };
4368        if (searchRevInclude != null) {
4369          dst.searchRevInclude = new ArrayList<StringType>();
4370          for (StringType i : searchRevInclude)
4371            dst.searchRevInclude.add(i.copy());
4372        };
4373        if (searchParam != null) {
4374          dst.searchParam = new ArrayList<CapabilityStatementRestResourceSearchParamComponent>();
4375          for (CapabilityStatementRestResourceSearchParamComponent i : searchParam)
4376            dst.searchParam.add(i.copy());
4377        };
4378        if (operation != null) {
4379          dst.operation = new ArrayList<CapabilityStatementRestResourceOperationComponent>();
4380          for (CapabilityStatementRestResourceOperationComponent i : operation)
4381            dst.operation.add(i.copy());
4382        };
4383      }
4384
4385      @Override
4386      public boolean equalsDeep(Base other_) {
4387        if (!super.equalsDeep(other_))
4388          return false;
4389        if (!(other_ instanceof CapabilityStatementRestResourceComponent))
4390          return false;
4391        CapabilityStatementRestResourceComponent o = (CapabilityStatementRestResourceComponent) other_;
4392        return compareDeep(type, o.type, true) && compareDeep(profile, o.profile, true) && compareDeep(supportedProfile, o.supportedProfile, true)
4393           && compareDeep(documentation, o.documentation, true) && compareDeep(interaction, o.interaction, true)
4394           && compareDeep(versioning, o.versioning, true) && compareDeep(readHistory, o.readHistory, true)
4395           && compareDeep(updateCreate, o.updateCreate, true) && compareDeep(conditionalCreate, o.conditionalCreate, true)
4396           && compareDeep(conditionalRead, o.conditionalRead, true) && compareDeep(conditionalUpdate, o.conditionalUpdate, true)
4397           && compareDeep(conditionalPatch, o.conditionalPatch, true) && compareDeep(conditionalDelete, o.conditionalDelete, true)
4398           && compareDeep(referencePolicy, o.referencePolicy, true) && compareDeep(searchInclude, o.searchInclude, true)
4399           && compareDeep(searchRevInclude, o.searchRevInclude, true) && compareDeep(searchParam, o.searchParam, true)
4400           && compareDeep(operation, o.operation, true);
4401      }
4402
4403      @Override
4404      public boolean equalsShallow(Base other_) {
4405        if (!super.equalsShallow(other_))
4406          return false;
4407        if (!(other_ instanceof CapabilityStatementRestResourceComponent))
4408          return false;
4409        CapabilityStatementRestResourceComponent o = (CapabilityStatementRestResourceComponent) other_;
4410        return compareValues(type, o.type, true) && compareValues(profile, o.profile, true) && compareValues(supportedProfile, o.supportedProfile, true)
4411           && compareValues(documentation, o.documentation, true) && compareValues(versioning, o.versioning, true)
4412           && compareValues(readHistory, o.readHistory, true) && compareValues(updateCreate, o.updateCreate, true)
4413           && compareValues(conditionalCreate, o.conditionalCreate, true) && compareValues(conditionalRead, o.conditionalRead, true)
4414           && compareValues(conditionalUpdate, o.conditionalUpdate, true) && compareValues(conditionalPatch, o.conditionalPatch, true)
4415           && compareValues(conditionalDelete, o.conditionalDelete, true) && compareValues(referencePolicy, o.referencePolicy, true)
4416           && compareValues(searchInclude, o.searchInclude, true) && compareValues(searchRevInclude, o.searchRevInclude, true)
4417          ;
4418      }
4419
4420      public boolean isEmpty() {
4421        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(type, profile, supportedProfile
4422          , documentation, interaction, versioning, readHistory, updateCreate, conditionalCreate
4423          , conditionalRead, conditionalUpdate, conditionalPatch, conditionalDelete, referencePolicy
4424          , searchInclude, searchRevInclude, searchParam, operation);
4425      }
4426
4427  public String fhirType() {
4428    return "CapabilityStatement.rest.resource";
4429
4430  }
4431
4432  }
4433
4434    @Block()
4435    public static class ResourceInteractionComponent extends BackboneElement implements IBaseBackboneElement {
4436        /**
4437         * Coded identifier of the operation, supported by the system resource.
4438         */
4439        @Child(name = "code", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=false)
4440        @Description(shortDefinition="read | vread | update | patch | delete | history-instance | history-type | create | search-type", formalDefinition="Coded identifier of the operation, supported by the system resource." )
4441        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/type-restful-interaction")
4442        protected Enumeration<TypeRestfulInteraction> code;
4443
4444        /**
4445         * Guidance specific to the implementation of this operation, such as 'delete is a logical delete' or 'updates are only allowed with version id' or 'creates permitted from pre-authorized certificates only'.
4446         */
4447        @Child(name = "documentation", type = {MarkdownType.class}, order=2, min=0, max=1, modifier=false, summary=false)
4448        @Description(shortDefinition="Anything special about operation behavior", formalDefinition="Guidance specific to the implementation of this operation, such as 'delete is a logical delete' or 'updates are only allowed with version id' or 'creates permitted from pre-authorized certificates only'." )
4449        protected MarkdownType documentation;
4450
4451        private static final long serialVersionUID = 2128937796L;
4452
4453    /**
4454     * Constructor
4455     */
4456      public ResourceInteractionComponent() {
4457        super();
4458      }
4459
4460    /**
4461     * Constructor
4462     */
4463      public ResourceInteractionComponent(TypeRestfulInteraction code) {
4464        super();
4465        this.setCode(code);
4466      }
4467
4468        /**
4469         * @return {@link #code} (Coded identifier of the operation, supported by the system resource.). This is the underlying object with id, value and extensions. The accessor "getCode" gives direct access to the value
4470         */
4471        public Enumeration<TypeRestfulInteraction> getCodeElement() { 
4472          if (this.code == null)
4473            if (Configuration.errorOnAutoCreate())
4474              throw new Error("Attempt to auto-create ResourceInteractionComponent.code");
4475            else if (Configuration.doAutoCreate())
4476              this.code = new Enumeration<TypeRestfulInteraction>(new TypeRestfulInteractionEnumFactory()); // bb
4477          return this.code;
4478        }
4479
4480        public boolean hasCodeElement() { 
4481          return this.code != null && !this.code.isEmpty();
4482        }
4483
4484        public boolean hasCode() { 
4485          return this.code != null && !this.code.isEmpty();
4486        }
4487
4488        /**
4489         * @param value {@link #code} (Coded identifier of the operation, supported by the system resource.). This is the underlying object with id, value and extensions. The accessor "getCode" gives direct access to the value
4490         */
4491        public ResourceInteractionComponent setCodeElement(Enumeration<TypeRestfulInteraction> value) { 
4492          this.code = value;
4493          return this;
4494        }
4495
4496        /**
4497         * @return Coded identifier of the operation, supported by the system resource.
4498         */
4499        public TypeRestfulInteraction getCode() { 
4500          return this.code == null ? null : this.code.getValue();
4501        }
4502
4503        /**
4504         * @param value Coded identifier of the operation, supported by the system resource.
4505         */
4506        public ResourceInteractionComponent setCode(TypeRestfulInteraction value) { 
4507            if (this.code == null)
4508              this.code = new Enumeration<TypeRestfulInteraction>(new TypeRestfulInteractionEnumFactory());
4509            this.code.setValue(value);
4510          return this;
4511        }
4512
4513        /**
4514         * @return {@link #documentation} (Guidance specific to the implementation of this operation, such as 'delete is a logical delete' or 'updates are only allowed with version id' or 'creates permitted from pre-authorized certificates only'.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
4515         */
4516        public MarkdownType getDocumentationElement() { 
4517          if (this.documentation == null)
4518            if (Configuration.errorOnAutoCreate())
4519              throw new Error("Attempt to auto-create ResourceInteractionComponent.documentation");
4520            else if (Configuration.doAutoCreate())
4521              this.documentation = new MarkdownType(); // bb
4522          return this.documentation;
4523        }
4524
4525        public boolean hasDocumentationElement() { 
4526          return this.documentation != null && !this.documentation.isEmpty();
4527        }
4528
4529        public boolean hasDocumentation() { 
4530          return this.documentation != null && !this.documentation.isEmpty();
4531        }
4532
4533        /**
4534         * @param value {@link #documentation} (Guidance specific to the implementation of this operation, such as 'delete is a logical delete' or 'updates are only allowed with version id' or 'creates permitted from pre-authorized certificates only'.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
4535         */
4536        public ResourceInteractionComponent setDocumentationElement(MarkdownType value) { 
4537          this.documentation = value;
4538          return this;
4539        }
4540
4541        /**
4542         * @return Guidance specific to the implementation of this operation, such as 'delete is a logical delete' or 'updates are only allowed with version id' or 'creates permitted from pre-authorized certificates only'.
4543         */
4544        public String getDocumentation() { 
4545          return this.documentation == null ? null : this.documentation.getValue();
4546        }
4547
4548        /**
4549         * @param value Guidance specific to the implementation of this operation, such as 'delete is a logical delete' or 'updates are only allowed with version id' or 'creates permitted from pre-authorized certificates only'.
4550         */
4551        public ResourceInteractionComponent setDocumentation(String value) { 
4552          if (Utilities.noString(value))
4553            this.documentation = null;
4554          else {
4555            if (this.documentation == null)
4556              this.documentation = new MarkdownType();
4557            this.documentation.setValue(value);
4558          }
4559          return this;
4560        }
4561
4562        protected void listChildren(List<Property> children) {
4563          super.listChildren(children);
4564          children.add(new Property("code", "code", "Coded identifier of the operation, supported by the system resource.", 0, 1, code));
4565          children.add(new Property("documentation", "markdown", "Guidance specific to the implementation of this operation, such as 'delete is a logical delete' or 'updates are only allowed with version id' or 'creates permitted from pre-authorized certificates only'.", 0, 1, documentation));
4566        }
4567
4568        @Override
4569        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
4570          switch (_hash) {
4571          case 3059181: /*code*/  return new Property("code", "code", "Coded identifier of the operation, supported by the system resource.", 0, 1, code);
4572          case 1587405498: /*documentation*/  return new Property("documentation", "markdown", "Guidance specific to the implementation of this operation, such as 'delete is a logical delete' or 'updates are only allowed with version id' or 'creates permitted from pre-authorized certificates only'.", 0, 1, documentation);
4573          default: return super.getNamedProperty(_hash, _name, _checkValid);
4574          }
4575
4576        }
4577
4578      @Override
4579      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
4580        switch (hash) {
4581        case 3059181: /*code*/ return this.code == null ? new Base[0] : new Base[] {this.code}; // Enumeration<TypeRestfulInteraction>
4582        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : new Base[] {this.documentation}; // MarkdownType
4583        default: return super.getProperty(hash, name, checkValid);
4584        }
4585
4586      }
4587
4588      @Override
4589      public Base setProperty(int hash, String name, Base value) throws FHIRException {
4590        switch (hash) {
4591        case 3059181: // code
4592          value = new TypeRestfulInteractionEnumFactory().fromType(TypeConvertor.castToCode(value));
4593          this.code = (Enumeration) value; // Enumeration<TypeRestfulInteraction>
4594          return value;
4595        case 1587405498: // documentation
4596          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
4597          return value;
4598        default: return super.setProperty(hash, name, value);
4599        }
4600
4601      }
4602
4603      @Override
4604      public Base setProperty(String name, Base value) throws FHIRException {
4605        if (name.equals("code")) {
4606          value = new TypeRestfulInteractionEnumFactory().fromType(TypeConvertor.castToCode(value));
4607          this.code = (Enumeration) value; // Enumeration<TypeRestfulInteraction>
4608        } else if (name.equals("documentation")) {
4609          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
4610        } else
4611          return super.setProperty(name, value);
4612        return value;
4613      }
4614
4615  @Override
4616  public void removeChild(String name, Base value) throws FHIRException {
4617        if (name.equals("code")) {
4618          value = new TypeRestfulInteractionEnumFactory().fromType(TypeConvertor.castToCode(value));
4619          this.code = (Enumeration) value; // Enumeration<TypeRestfulInteraction>
4620        } else if (name.equals("documentation")) {
4621          this.documentation = null;
4622        } else
4623          super.removeChild(name, value);
4624        
4625      }
4626
4627      @Override
4628      public Base makeProperty(int hash, String name) throws FHIRException {
4629        switch (hash) {
4630        case 3059181:  return getCodeElement();
4631        case 1587405498:  return getDocumentationElement();
4632        default: return super.makeProperty(hash, name);
4633        }
4634
4635      }
4636
4637      @Override
4638      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
4639        switch (hash) {
4640        case 3059181: /*code*/ return new String[] {"code"};
4641        case 1587405498: /*documentation*/ return new String[] {"markdown"};
4642        default: return super.getTypesForProperty(hash, name);
4643        }
4644
4645      }
4646
4647      @Override
4648      public Base addChild(String name) throws FHIRException {
4649        if (name.equals("code")) {
4650          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.interaction.code");
4651        }
4652        else if (name.equals("documentation")) {
4653          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.interaction.documentation");
4654        }
4655        else
4656          return super.addChild(name);
4657      }
4658
4659      public ResourceInteractionComponent copy() {
4660        ResourceInteractionComponent dst = new ResourceInteractionComponent();
4661        copyValues(dst);
4662        return dst;
4663      }
4664
4665      public void copyValues(ResourceInteractionComponent dst) {
4666        super.copyValues(dst);
4667        dst.code = code == null ? null : code.copy();
4668        dst.documentation = documentation == null ? null : documentation.copy();
4669      }
4670
4671      @Override
4672      public boolean equalsDeep(Base other_) {
4673        if (!super.equalsDeep(other_))
4674          return false;
4675        if (!(other_ instanceof ResourceInteractionComponent))
4676          return false;
4677        ResourceInteractionComponent o = (ResourceInteractionComponent) other_;
4678        return compareDeep(code, o.code, true) && compareDeep(documentation, o.documentation, true);
4679      }
4680
4681      @Override
4682      public boolean equalsShallow(Base other_) {
4683        if (!super.equalsShallow(other_))
4684          return false;
4685        if (!(other_ instanceof ResourceInteractionComponent))
4686          return false;
4687        ResourceInteractionComponent o = (ResourceInteractionComponent) other_;
4688        return compareValues(code, o.code, true) && compareValues(documentation, o.documentation, true);
4689      }
4690
4691      public boolean isEmpty() {
4692        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(code, documentation);
4693      }
4694
4695  public String fhirType() {
4696    return "CapabilityStatement.rest.resource.interaction";
4697
4698  }
4699
4700  }
4701
4702    @Block()
4703    public static class CapabilityStatementRestResourceSearchParamComponent extends BackboneElement implements IBaseBackboneElement {
4704        /**
4705         * The label used for the search parameter in this particular system's API - i.e. the 'name' portion of the name-value pair that will appear as part of the search URL.  This SHOULD be the same as the SearchParameter.code of the defining SearchParameter.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple SearchParameters that happen to share the same code.
4706         */
4707        @Child(name = "name", type = {StringType.class}, order=1, min=1, max=1, modifier=false, summary=false)
4708        @Description(shortDefinition="Name for parameter in search url", formalDefinition="The label used for the search parameter in this particular system's API - i.e. the 'name' portion of the name-value pair that will appear as part of the search URL.  This SHOULD be the same as the SearchParameter.code of the defining SearchParameter.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple SearchParameters that happen to share the same code." )
4709        protected StringType name;
4710
4711        /**
4712         * An absolute URI that is a formal reference to where this parameter was first defined, so that a client can be confident of the meaning of the search parameter (a reference to [SearchParameter.url](searchparameter-definitions.html#SearchParameter.url)). This element SHALL be populated if the search parameter refers to a SearchParameter defined by the FHIR core specification or externally defined IGs.
4713         */
4714        @Child(name = "definition", type = {CanonicalType.class}, order=2, min=0, max=1, modifier=false, summary=false)
4715        @Description(shortDefinition="Source of definition for parameter", formalDefinition="An absolute URI that is a formal reference to where this parameter was first defined, so that a client can be confident of the meaning of the search parameter (a reference to [SearchParameter.url](searchparameter-definitions.html#SearchParameter.url)). This element SHALL be populated if the search parameter refers to a SearchParameter defined by the FHIR core specification or externally defined IGs." )
4716        protected CanonicalType definition;
4717
4718        /**
4719         * The type of value a search parameter refers to, and how the content is interpreted.
4720         */
4721        @Child(name = "type", type = {CodeType.class}, order=3, min=1, max=1, modifier=false, summary=false)
4722        @Description(shortDefinition="number | date | string | token | reference | composite | quantity | uri | special", formalDefinition="The type of value a search parameter refers to, and how the content is interpreted." )
4723        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/search-param-type")
4724        protected Enumeration<SearchParamType> type;
4725
4726        /**
4727         * This allows documentation of any distinct behaviors about how the search parameter is used.  For example, text matching algorithms.
4728         */
4729        @Child(name = "documentation", type = {MarkdownType.class}, order=4, min=0, max=1, modifier=false, summary=false)
4730        @Description(shortDefinition="Server-specific usage", formalDefinition="This allows documentation of any distinct behaviors about how the search parameter is used.  For example, text matching algorithms." )
4731        protected MarkdownType documentation;
4732
4733        private static final long serialVersionUID = -171123928L;
4734
4735    /**
4736     * Constructor
4737     */
4738      public CapabilityStatementRestResourceSearchParamComponent() {
4739        super();
4740      }
4741
4742    /**
4743     * Constructor
4744     */
4745      public CapabilityStatementRestResourceSearchParamComponent(String name, SearchParamType type) {
4746        super();
4747        this.setName(name);
4748        this.setType(type);
4749      }
4750
4751        /**
4752         * @return {@link #name} (The label used for the search parameter in this particular system's API - i.e. the 'name' portion of the name-value pair that will appear as part of the search URL.  This SHOULD be the same as the SearchParameter.code of the defining SearchParameter.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple SearchParameters that happen to share the same code.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
4753         */
4754        public StringType getNameElement() { 
4755          if (this.name == null)
4756            if (Configuration.errorOnAutoCreate())
4757              throw new Error("Attempt to auto-create CapabilityStatementRestResourceSearchParamComponent.name");
4758            else if (Configuration.doAutoCreate())
4759              this.name = new StringType(); // bb
4760          return this.name;
4761        }
4762
4763        public boolean hasNameElement() { 
4764          return this.name != null && !this.name.isEmpty();
4765        }
4766
4767        public boolean hasName() { 
4768          return this.name != null && !this.name.isEmpty();
4769        }
4770
4771        /**
4772         * @param value {@link #name} (The label used for the search parameter in this particular system's API - i.e. the 'name' portion of the name-value pair that will appear as part of the search URL.  This SHOULD be the same as the SearchParameter.code of the defining SearchParameter.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple SearchParameters that happen to share the same code.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
4773         */
4774        public CapabilityStatementRestResourceSearchParamComponent setNameElement(StringType value) { 
4775          this.name = value;
4776          return this;
4777        }
4778
4779        /**
4780         * @return The label used for the search parameter in this particular system's API - i.e. the 'name' portion of the name-value pair that will appear as part of the search URL.  This SHOULD be the same as the SearchParameter.code of the defining SearchParameter.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple SearchParameters that happen to share the same code.
4781         */
4782        public String getName() { 
4783          return this.name == null ? null : this.name.getValue();
4784        }
4785
4786        /**
4787         * @param value The label used for the search parameter in this particular system's API - i.e. the 'name' portion of the name-value pair that will appear as part of the search URL.  This SHOULD be the same as the SearchParameter.code of the defining SearchParameter.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple SearchParameters that happen to share the same code.
4788         */
4789        public CapabilityStatementRestResourceSearchParamComponent setName(String value) { 
4790            if (this.name == null)
4791              this.name = new StringType();
4792            this.name.setValue(value);
4793          return this;
4794        }
4795
4796        /**
4797         * @return {@link #definition} (An absolute URI that is a formal reference to where this parameter was first defined, so that a client can be confident of the meaning of the search parameter (a reference to [SearchParameter.url](searchparameter-definitions.html#SearchParameter.url)). This element SHALL be populated if the search parameter refers to a SearchParameter defined by the FHIR core specification or externally defined IGs.). This is the underlying object with id, value and extensions. The accessor "getDefinition" gives direct access to the value
4798         */
4799        public CanonicalType getDefinitionElement() { 
4800          if (this.definition == null)
4801            if (Configuration.errorOnAutoCreate())
4802              throw new Error("Attempt to auto-create CapabilityStatementRestResourceSearchParamComponent.definition");
4803            else if (Configuration.doAutoCreate())
4804              this.definition = new CanonicalType(); // bb
4805          return this.definition;
4806        }
4807
4808        public boolean hasDefinitionElement() { 
4809          return this.definition != null && !this.definition.isEmpty();
4810        }
4811
4812        public boolean hasDefinition() { 
4813          return this.definition != null && !this.definition.isEmpty();
4814        }
4815
4816        /**
4817         * @param value {@link #definition} (An absolute URI that is a formal reference to where this parameter was first defined, so that a client can be confident of the meaning of the search parameter (a reference to [SearchParameter.url](searchparameter-definitions.html#SearchParameter.url)). This element SHALL be populated if the search parameter refers to a SearchParameter defined by the FHIR core specification or externally defined IGs.). This is the underlying object with id, value and extensions. The accessor "getDefinition" gives direct access to the value
4818         */
4819        public CapabilityStatementRestResourceSearchParamComponent setDefinitionElement(CanonicalType value) { 
4820          this.definition = value;
4821          return this;
4822        }
4823
4824        /**
4825         * @return An absolute URI that is a formal reference to where this parameter was first defined, so that a client can be confident of the meaning of the search parameter (a reference to [SearchParameter.url](searchparameter-definitions.html#SearchParameter.url)). This element SHALL be populated if the search parameter refers to a SearchParameter defined by the FHIR core specification or externally defined IGs.
4826         */
4827        public String getDefinition() { 
4828          return this.definition == null ? null : this.definition.getValue();
4829        }
4830
4831        /**
4832         * @param value An absolute URI that is a formal reference to where this parameter was first defined, so that a client can be confident of the meaning of the search parameter (a reference to [SearchParameter.url](searchparameter-definitions.html#SearchParameter.url)). This element SHALL be populated if the search parameter refers to a SearchParameter defined by the FHIR core specification or externally defined IGs.
4833         */
4834        public CapabilityStatementRestResourceSearchParamComponent setDefinition(String value) { 
4835          if (Utilities.noString(value))
4836            this.definition = null;
4837          else {
4838            if (this.definition == null)
4839              this.definition = new CanonicalType();
4840            this.definition.setValue(value);
4841          }
4842          return this;
4843        }
4844
4845        /**
4846         * @return {@link #type} (The type of value a search parameter refers to, and how the content is interpreted.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
4847         */
4848        public Enumeration<SearchParamType> getTypeElement() { 
4849          if (this.type == null)
4850            if (Configuration.errorOnAutoCreate())
4851              throw new Error("Attempt to auto-create CapabilityStatementRestResourceSearchParamComponent.type");
4852            else if (Configuration.doAutoCreate())
4853              this.type = new Enumeration<SearchParamType>(new SearchParamTypeEnumFactory()); // bb
4854          return this.type;
4855        }
4856
4857        public boolean hasTypeElement() { 
4858          return this.type != null && !this.type.isEmpty();
4859        }
4860
4861        public boolean hasType() { 
4862          return this.type != null && !this.type.isEmpty();
4863        }
4864
4865        /**
4866         * @param value {@link #type} (The type of value a search parameter refers to, and how the content is interpreted.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
4867         */
4868        public CapabilityStatementRestResourceSearchParamComponent setTypeElement(Enumeration<SearchParamType> value) { 
4869          this.type = value;
4870          return this;
4871        }
4872
4873        /**
4874         * @return The type of value a search parameter refers to, and how the content is interpreted.
4875         */
4876        public SearchParamType getType() { 
4877          return this.type == null ? null : this.type.getValue();
4878        }
4879
4880        /**
4881         * @param value The type of value a search parameter refers to, and how the content is interpreted.
4882         */
4883        public CapabilityStatementRestResourceSearchParamComponent setType(SearchParamType value) { 
4884            if (this.type == null)
4885              this.type = new Enumeration<SearchParamType>(new SearchParamTypeEnumFactory());
4886            this.type.setValue(value);
4887          return this;
4888        }
4889
4890        /**
4891         * @return {@link #documentation} (This allows documentation of any distinct behaviors about how the search parameter is used.  For example, text matching algorithms.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
4892         */
4893        public MarkdownType getDocumentationElement() { 
4894          if (this.documentation == null)
4895            if (Configuration.errorOnAutoCreate())
4896              throw new Error("Attempt to auto-create CapabilityStatementRestResourceSearchParamComponent.documentation");
4897            else if (Configuration.doAutoCreate())
4898              this.documentation = new MarkdownType(); // bb
4899          return this.documentation;
4900        }
4901
4902        public boolean hasDocumentationElement() { 
4903          return this.documentation != null && !this.documentation.isEmpty();
4904        }
4905
4906        public boolean hasDocumentation() { 
4907          return this.documentation != null && !this.documentation.isEmpty();
4908        }
4909
4910        /**
4911         * @param value {@link #documentation} (This allows documentation of any distinct behaviors about how the search parameter is used.  For example, text matching algorithms.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
4912         */
4913        public CapabilityStatementRestResourceSearchParamComponent setDocumentationElement(MarkdownType value) { 
4914          this.documentation = value;
4915          return this;
4916        }
4917
4918        /**
4919         * @return This allows documentation of any distinct behaviors about how the search parameter is used.  For example, text matching algorithms.
4920         */
4921        public String getDocumentation() { 
4922          return this.documentation == null ? null : this.documentation.getValue();
4923        }
4924
4925        /**
4926         * @param value This allows documentation of any distinct behaviors about how the search parameter is used.  For example, text matching algorithms.
4927         */
4928        public CapabilityStatementRestResourceSearchParamComponent setDocumentation(String value) { 
4929          if (Utilities.noString(value))
4930            this.documentation = null;
4931          else {
4932            if (this.documentation == null)
4933              this.documentation = new MarkdownType();
4934            this.documentation.setValue(value);
4935          }
4936          return this;
4937        }
4938
4939        protected void listChildren(List<Property> children) {
4940          super.listChildren(children);
4941          children.add(new Property("name", "string", "The label used for the search parameter in this particular system's API - i.e. the 'name' portion of the name-value pair that will appear as part of the search URL.  This SHOULD be the same as the SearchParameter.code of the defining SearchParameter.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple SearchParameters that happen to share the same code.", 0, 1, name));
4942          children.add(new Property("definition", "canonical(SearchParameter)", "An absolute URI that is a formal reference to where this parameter was first defined, so that a client can be confident of the meaning of the search parameter (a reference to [SearchParameter.url](searchparameter-definitions.html#SearchParameter.url)). This element SHALL be populated if the search parameter refers to a SearchParameter defined by the FHIR core specification or externally defined IGs.", 0, 1, definition));
4943          children.add(new Property("type", "code", "The type of value a search parameter refers to, and how the content is interpreted.", 0, 1, type));
4944          children.add(new Property("documentation", "markdown", "This allows documentation of any distinct behaviors about how the search parameter is used.  For example, text matching algorithms.", 0, 1, documentation));
4945        }
4946
4947        @Override
4948        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
4949          switch (_hash) {
4950          case 3373707: /*name*/  return new Property("name", "string", "The label used for the search parameter in this particular system's API - i.e. the 'name' portion of the name-value pair that will appear as part of the search URL.  This SHOULD be the same as the SearchParameter.code of the defining SearchParameter.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple SearchParameters that happen to share the same code.", 0, 1, name);
4951          case -1014418093: /*definition*/  return new Property("definition", "canonical(SearchParameter)", "An absolute URI that is a formal reference to where this parameter was first defined, so that a client can be confident of the meaning of the search parameter (a reference to [SearchParameter.url](searchparameter-definitions.html#SearchParameter.url)). This element SHALL be populated if the search parameter refers to a SearchParameter defined by the FHIR core specification or externally defined IGs.", 0, 1, definition);
4952          case 3575610: /*type*/  return new Property("type", "code", "The type of value a search parameter refers to, and how the content is interpreted.", 0, 1, type);
4953          case 1587405498: /*documentation*/  return new Property("documentation", "markdown", "This allows documentation of any distinct behaviors about how the search parameter is used.  For example, text matching algorithms.", 0, 1, documentation);
4954          default: return super.getNamedProperty(_hash, _name, _checkValid);
4955          }
4956
4957        }
4958
4959      @Override
4960      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
4961        switch (hash) {
4962        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // StringType
4963        case -1014418093: /*definition*/ return this.definition == null ? new Base[0] : new Base[] {this.definition}; // CanonicalType
4964        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // Enumeration<SearchParamType>
4965        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : new Base[] {this.documentation}; // MarkdownType
4966        default: return super.getProperty(hash, name, checkValid);
4967        }
4968
4969      }
4970
4971      @Override
4972      public Base setProperty(int hash, String name, Base value) throws FHIRException {
4973        switch (hash) {
4974        case 3373707: // name
4975          this.name = TypeConvertor.castToString(value); // StringType
4976          return value;
4977        case -1014418093: // definition
4978          this.definition = TypeConvertor.castToCanonical(value); // CanonicalType
4979          return value;
4980        case 3575610: // type
4981          value = new SearchParamTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
4982          this.type = (Enumeration) value; // Enumeration<SearchParamType>
4983          return value;
4984        case 1587405498: // documentation
4985          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
4986          return value;
4987        default: return super.setProperty(hash, name, value);
4988        }
4989
4990      }
4991
4992      @Override
4993      public Base setProperty(String name, Base value) throws FHIRException {
4994        if (name.equals("name")) {
4995          this.name = TypeConvertor.castToString(value); // StringType
4996        } else if (name.equals("definition")) {
4997          this.definition = TypeConvertor.castToCanonical(value); // CanonicalType
4998        } else if (name.equals("type")) {
4999          value = new SearchParamTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
5000          this.type = (Enumeration) value; // Enumeration<SearchParamType>
5001        } else if (name.equals("documentation")) {
5002          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
5003        } else
5004          return super.setProperty(name, value);
5005        return value;
5006      }
5007
5008  @Override
5009  public void removeChild(String name, Base value) throws FHIRException {
5010        if (name.equals("name")) {
5011          this.name = null;
5012        } else if (name.equals("definition")) {
5013          this.definition = null;
5014        } else if (name.equals("type")) {
5015          value = new SearchParamTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
5016          this.type = (Enumeration) value; // Enumeration<SearchParamType>
5017        } else if (name.equals("documentation")) {
5018          this.documentation = null;
5019        } else
5020          super.removeChild(name, value);
5021        
5022      }
5023
5024      @Override
5025      public Base makeProperty(int hash, String name) throws FHIRException {
5026        switch (hash) {
5027        case 3373707:  return getNameElement();
5028        case -1014418093:  return getDefinitionElement();
5029        case 3575610:  return getTypeElement();
5030        case 1587405498:  return getDocumentationElement();
5031        default: return super.makeProperty(hash, name);
5032        }
5033
5034      }
5035
5036      @Override
5037      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
5038        switch (hash) {
5039        case 3373707: /*name*/ return new String[] {"string"};
5040        case -1014418093: /*definition*/ return new String[] {"canonical"};
5041        case 3575610: /*type*/ return new String[] {"code"};
5042        case 1587405498: /*documentation*/ return new String[] {"markdown"};
5043        default: return super.getTypesForProperty(hash, name);
5044        }
5045
5046      }
5047
5048      @Override
5049      public Base addChild(String name) throws FHIRException {
5050        if (name.equals("name")) {
5051          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.searchParam.name");
5052        }
5053        else if (name.equals("definition")) {
5054          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.searchParam.definition");
5055        }
5056        else if (name.equals("type")) {
5057          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.searchParam.type");
5058        }
5059        else if (name.equals("documentation")) {
5060          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.searchParam.documentation");
5061        }
5062        else
5063          return super.addChild(name);
5064      }
5065
5066      public CapabilityStatementRestResourceSearchParamComponent copy() {
5067        CapabilityStatementRestResourceSearchParamComponent dst = new CapabilityStatementRestResourceSearchParamComponent();
5068        copyValues(dst);
5069        return dst;
5070      }
5071
5072      public void copyValues(CapabilityStatementRestResourceSearchParamComponent dst) {
5073        super.copyValues(dst);
5074        dst.name = name == null ? null : name.copy();
5075        dst.definition = definition == null ? null : definition.copy();
5076        dst.type = type == null ? null : type.copy();
5077        dst.documentation = documentation == null ? null : documentation.copy();
5078      }
5079
5080      @Override
5081      public boolean equalsDeep(Base other_) {
5082        if (!super.equalsDeep(other_))
5083          return false;
5084        if (!(other_ instanceof CapabilityStatementRestResourceSearchParamComponent))
5085          return false;
5086        CapabilityStatementRestResourceSearchParamComponent o = (CapabilityStatementRestResourceSearchParamComponent) other_;
5087        return compareDeep(name, o.name, true) && compareDeep(definition, o.definition, true) && compareDeep(type, o.type, true)
5088           && compareDeep(documentation, o.documentation, true);
5089      }
5090
5091      @Override
5092      public boolean equalsShallow(Base other_) {
5093        if (!super.equalsShallow(other_))
5094          return false;
5095        if (!(other_ instanceof CapabilityStatementRestResourceSearchParamComponent))
5096          return false;
5097        CapabilityStatementRestResourceSearchParamComponent o = (CapabilityStatementRestResourceSearchParamComponent) other_;
5098        return compareValues(name, o.name, true) && compareValues(definition, o.definition, true) && compareValues(type, o.type, true)
5099           && compareValues(documentation, o.documentation, true);
5100      }
5101
5102      public boolean isEmpty() {
5103        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(name, definition, type, documentation
5104          );
5105      }
5106
5107  public String fhirType() {
5108    return "CapabilityStatement.rest.resource.searchParam";
5109
5110  }
5111
5112  }
5113
5114    @Block()
5115    public static class CapabilityStatementRestResourceOperationComponent extends BackboneElement implements IBaseBackboneElement {
5116        /**
5117         * The name of the operation or query. For an operation, this name is prefixed with $ and used in the URL. For a query, this is the name used in the _query parameter when the query is called. This SHOULD be the same as the OperationDefinition.code of the defining OperationDefinition.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple OperationDefinition that happen to share the same code.
5118         */
5119        @Child(name = "name", type = {StringType.class}, order=1, min=1, max=1, modifier=false, summary=true)
5120        @Description(shortDefinition="Name by which the operation/query is invoked", formalDefinition="The name of the operation or query. For an operation, this name is prefixed with $ and used in the URL. For a query, this is the name used in the _query parameter when the query is called. This SHOULD be the same as the OperationDefinition.code of the defining OperationDefinition.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple OperationDefinition that happen to share the same code." )
5121        protected StringType name;
5122
5123        /**
5124         * Where the formal definition can be found. If a server references the base definition of an Operation (i.e. from the specification itself such as ```http://hl7.org/fhir/OperationDefinition/ValueSet-expand```), that means it supports the full capabilities of the operation - e.g. both GET and POST invocation.  If it only supports a subset, it must define its own custom [OperationDefinition](operationdefinition.html#) with a 'base' of the original OperationDefinition.  The custom definition would describe the specific subset of functionality supported.
5125         */
5126        @Child(name = "definition", type = {CanonicalType.class}, order=2, min=1, max=1, modifier=false, summary=true)
5127        @Description(shortDefinition="The defined operation/query", formalDefinition="Where the formal definition can be found. If a server references the base definition of an Operation (i.e. from the specification itself such as ```http://hl7.org/fhir/OperationDefinition/ValueSet-expand```), that means it supports the full capabilities of the operation - e.g. both GET and POST invocation.  If it only supports a subset, it must define its own custom [OperationDefinition](operationdefinition.html#) with a 'base' of the original OperationDefinition.  The custom definition would describe the specific subset of functionality supported." )
5128        protected CanonicalType definition;
5129
5130        /**
5131         * Documentation that describes anything special about the operation behavior, possibly detailing different behavior for system, type and instance-level invocation of the operation.
5132         */
5133        @Child(name = "documentation", type = {MarkdownType.class}, order=3, min=0, max=1, modifier=false, summary=false)
5134        @Description(shortDefinition="Specific details about operation behavior", formalDefinition="Documentation that describes anything special about the operation behavior, possibly detailing different behavior for system, type and instance-level invocation of the operation." )
5135        protected MarkdownType documentation;
5136
5137        private static final long serialVersionUID = -388608084L;
5138
5139    /**
5140     * Constructor
5141     */
5142      public CapabilityStatementRestResourceOperationComponent() {
5143        super();
5144      }
5145
5146    /**
5147     * Constructor
5148     */
5149      public CapabilityStatementRestResourceOperationComponent(String name, String definition) {
5150        super();
5151        this.setName(name);
5152        this.setDefinition(definition);
5153      }
5154
5155        /**
5156         * @return {@link #name} (The name of the operation or query. For an operation, this name is prefixed with $ and used in the URL. For a query, this is the name used in the _query parameter when the query is called. This SHOULD be the same as the OperationDefinition.code of the defining OperationDefinition.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple OperationDefinition that happen to share the same code.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
5157         */
5158        public StringType getNameElement() { 
5159          if (this.name == null)
5160            if (Configuration.errorOnAutoCreate())
5161              throw new Error("Attempt to auto-create CapabilityStatementRestResourceOperationComponent.name");
5162            else if (Configuration.doAutoCreate())
5163              this.name = new StringType(); // bb
5164          return this.name;
5165        }
5166
5167        public boolean hasNameElement() { 
5168          return this.name != null && !this.name.isEmpty();
5169        }
5170
5171        public boolean hasName() { 
5172          return this.name != null && !this.name.isEmpty();
5173        }
5174
5175        /**
5176         * @param value {@link #name} (The name of the operation or query. For an operation, this name is prefixed with $ and used in the URL. For a query, this is the name used in the _query parameter when the query is called. This SHOULD be the same as the OperationDefinition.code of the defining OperationDefinition.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple OperationDefinition that happen to share the same code.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
5177         */
5178        public CapabilityStatementRestResourceOperationComponent setNameElement(StringType value) { 
5179          this.name = value;
5180          return this;
5181        }
5182
5183        /**
5184         * @return The name of the operation or query. For an operation, this name is prefixed with $ and used in the URL. For a query, this is the name used in the _query parameter when the query is called. This SHOULD be the same as the OperationDefinition.code of the defining OperationDefinition.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple OperationDefinition that happen to share the same code.
5185         */
5186        public String getName() { 
5187          return this.name == null ? null : this.name.getValue();
5188        }
5189
5190        /**
5191         * @param value The name of the operation or query. For an operation, this name is prefixed with $ and used in the URL. For a query, this is the name used in the _query parameter when the query is called. This SHOULD be the same as the OperationDefinition.code of the defining OperationDefinition.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple OperationDefinition that happen to share the same code.
5192         */
5193        public CapabilityStatementRestResourceOperationComponent setName(String value) { 
5194            if (this.name == null)
5195              this.name = new StringType();
5196            this.name.setValue(value);
5197          return this;
5198        }
5199
5200        /**
5201         * @return {@link #definition} (Where the formal definition can be found. If a server references the base definition of an Operation (i.e. from the specification itself such as ```http://hl7.org/fhir/OperationDefinition/ValueSet-expand```), that means it supports the full capabilities of the operation - e.g. both GET and POST invocation.  If it only supports a subset, it must define its own custom [OperationDefinition](operationdefinition.html#) with a 'base' of the original OperationDefinition.  The custom definition would describe the specific subset of functionality supported.). This is the underlying object with id, value and extensions. The accessor "getDefinition" gives direct access to the value
5202         */
5203        public CanonicalType getDefinitionElement() { 
5204          if (this.definition == null)
5205            if (Configuration.errorOnAutoCreate())
5206              throw new Error("Attempt to auto-create CapabilityStatementRestResourceOperationComponent.definition");
5207            else if (Configuration.doAutoCreate())
5208              this.definition = new CanonicalType(); // bb
5209          return this.definition;
5210        }
5211
5212        public boolean hasDefinitionElement() { 
5213          return this.definition != null && !this.definition.isEmpty();
5214        }
5215
5216        public boolean hasDefinition() { 
5217          return this.definition != null && !this.definition.isEmpty();
5218        }
5219
5220        /**
5221         * @param value {@link #definition} (Where the formal definition can be found. If a server references the base definition of an Operation (i.e. from the specification itself such as ```http://hl7.org/fhir/OperationDefinition/ValueSet-expand```), that means it supports the full capabilities of the operation - e.g. both GET and POST invocation.  If it only supports a subset, it must define its own custom [OperationDefinition](operationdefinition.html#) with a 'base' of the original OperationDefinition.  The custom definition would describe the specific subset of functionality supported.). This is the underlying object with id, value and extensions. The accessor "getDefinition" gives direct access to the value
5222         */
5223        public CapabilityStatementRestResourceOperationComponent setDefinitionElement(CanonicalType value) { 
5224          this.definition = value;
5225          return this;
5226        }
5227
5228        /**
5229         * @return Where the formal definition can be found. If a server references the base definition of an Operation (i.e. from the specification itself such as ```http://hl7.org/fhir/OperationDefinition/ValueSet-expand```), that means it supports the full capabilities of the operation - e.g. both GET and POST invocation.  If it only supports a subset, it must define its own custom [OperationDefinition](operationdefinition.html#) with a 'base' of the original OperationDefinition.  The custom definition would describe the specific subset of functionality supported.
5230         */
5231        public String getDefinition() { 
5232          return this.definition == null ? null : this.definition.getValue();
5233        }
5234
5235        /**
5236         * @param value Where the formal definition can be found. If a server references the base definition of an Operation (i.e. from the specification itself such as ```http://hl7.org/fhir/OperationDefinition/ValueSet-expand```), that means it supports the full capabilities of the operation - e.g. both GET and POST invocation.  If it only supports a subset, it must define its own custom [OperationDefinition](operationdefinition.html#) with a 'base' of the original OperationDefinition.  The custom definition would describe the specific subset of functionality supported.
5237         */
5238        public CapabilityStatementRestResourceOperationComponent setDefinition(String value) { 
5239            if (this.definition == null)
5240              this.definition = new CanonicalType();
5241            this.definition.setValue(value);
5242          return this;
5243        }
5244
5245        /**
5246         * @return {@link #documentation} (Documentation that describes anything special about the operation behavior, possibly detailing different behavior for system, type and instance-level invocation of the operation.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
5247         */
5248        public MarkdownType getDocumentationElement() { 
5249          if (this.documentation == null)
5250            if (Configuration.errorOnAutoCreate())
5251              throw new Error("Attempt to auto-create CapabilityStatementRestResourceOperationComponent.documentation");
5252            else if (Configuration.doAutoCreate())
5253              this.documentation = new MarkdownType(); // bb
5254          return this.documentation;
5255        }
5256
5257        public boolean hasDocumentationElement() { 
5258          return this.documentation != null && !this.documentation.isEmpty();
5259        }
5260
5261        public boolean hasDocumentation() { 
5262          return this.documentation != null && !this.documentation.isEmpty();
5263        }
5264
5265        /**
5266         * @param value {@link #documentation} (Documentation that describes anything special about the operation behavior, possibly detailing different behavior for system, type and instance-level invocation of the operation.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
5267         */
5268        public CapabilityStatementRestResourceOperationComponent setDocumentationElement(MarkdownType value) { 
5269          this.documentation = value;
5270          return this;
5271        }
5272
5273        /**
5274         * @return Documentation that describes anything special about the operation behavior, possibly detailing different behavior for system, type and instance-level invocation of the operation.
5275         */
5276        public String getDocumentation() { 
5277          return this.documentation == null ? null : this.documentation.getValue();
5278        }
5279
5280        /**
5281         * @param value Documentation that describes anything special about the operation behavior, possibly detailing different behavior for system, type and instance-level invocation of the operation.
5282         */
5283        public CapabilityStatementRestResourceOperationComponent setDocumentation(String value) { 
5284          if (Utilities.noString(value))
5285            this.documentation = null;
5286          else {
5287            if (this.documentation == null)
5288              this.documentation = new MarkdownType();
5289            this.documentation.setValue(value);
5290          }
5291          return this;
5292        }
5293
5294        protected void listChildren(List<Property> children) {
5295          super.listChildren(children);
5296          children.add(new Property("name", "string", "The name of the operation or query. For an operation, this name is prefixed with $ and used in the URL. For a query, this is the name used in the _query parameter when the query is called. This SHOULD be the same as the OperationDefinition.code of the defining OperationDefinition.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple OperationDefinition that happen to share the same code.", 0, 1, name));
5297          children.add(new Property("definition", "canonical(OperationDefinition)", "Where the formal definition can be found. If a server references the base definition of an Operation (i.e. from the specification itself such as ```http://hl7.org/fhir/OperationDefinition/ValueSet-expand```), that means it supports the full capabilities of the operation - e.g. both GET and POST invocation.  If it only supports a subset, it must define its own custom [OperationDefinition](operationdefinition.html#) with a 'base' of the original OperationDefinition.  The custom definition would describe the specific subset of functionality supported.", 0, 1, definition));
5298          children.add(new Property("documentation", "markdown", "Documentation that describes anything special about the operation behavior, possibly detailing different behavior for system, type and instance-level invocation of the operation.", 0, 1, documentation));
5299        }
5300
5301        @Override
5302        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
5303          switch (_hash) {
5304          case 3373707: /*name*/  return new Property("name", "string", "The name of the operation or query. For an operation, this name is prefixed with $ and used in the URL. For a query, this is the name used in the _query parameter when the query is called. This SHOULD be the same as the OperationDefinition.code of the defining OperationDefinition.  However, it can sometimes differ if necessary to disambiguate when a server supports multiple OperationDefinition that happen to share the same code.", 0, 1, name);
5305          case -1014418093: /*definition*/  return new Property("definition", "canonical(OperationDefinition)", "Where the formal definition can be found. If a server references the base definition of an Operation (i.e. from the specification itself such as ```http://hl7.org/fhir/OperationDefinition/ValueSet-expand```), that means it supports the full capabilities of the operation - e.g. both GET and POST invocation.  If it only supports a subset, it must define its own custom [OperationDefinition](operationdefinition.html#) with a 'base' of the original OperationDefinition.  The custom definition would describe the specific subset of functionality supported.", 0, 1, definition);
5306          case 1587405498: /*documentation*/  return new Property("documentation", "markdown", "Documentation that describes anything special about the operation behavior, possibly detailing different behavior for system, type and instance-level invocation of the operation.", 0, 1, documentation);
5307          default: return super.getNamedProperty(_hash, _name, _checkValid);
5308          }
5309
5310        }
5311
5312      @Override
5313      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
5314        switch (hash) {
5315        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // StringType
5316        case -1014418093: /*definition*/ return this.definition == null ? new Base[0] : new Base[] {this.definition}; // CanonicalType
5317        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : new Base[] {this.documentation}; // MarkdownType
5318        default: return super.getProperty(hash, name, checkValid);
5319        }
5320
5321      }
5322
5323      @Override
5324      public Base setProperty(int hash, String name, Base value) throws FHIRException {
5325        switch (hash) {
5326        case 3373707: // name
5327          this.name = TypeConvertor.castToString(value); // StringType
5328          return value;
5329        case -1014418093: // definition
5330          this.definition = TypeConvertor.castToCanonical(value); // CanonicalType
5331          return value;
5332        case 1587405498: // documentation
5333          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
5334          return value;
5335        default: return super.setProperty(hash, name, value);
5336        }
5337
5338      }
5339
5340      @Override
5341      public Base setProperty(String name, Base value) throws FHIRException {
5342        if (name.equals("name")) {
5343          this.name = TypeConvertor.castToString(value); // StringType
5344        } else if (name.equals("definition")) {
5345          this.definition = TypeConvertor.castToCanonical(value); // CanonicalType
5346        } else if (name.equals("documentation")) {
5347          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
5348        } else
5349          return super.setProperty(name, value);
5350        return value;
5351      }
5352
5353  @Override
5354  public void removeChild(String name, Base value) throws FHIRException {
5355        if (name.equals("name")) {
5356          this.name = null;
5357        } else if (name.equals("definition")) {
5358          this.definition = null;
5359        } else if (name.equals("documentation")) {
5360          this.documentation = null;
5361        } else
5362          super.removeChild(name, value);
5363        
5364      }
5365
5366      @Override
5367      public Base makeProperty(int hash, String name) throws FHIRException {
5368        switch (hash) {
5369        case 3373707:  return getNameElement();
5370        case -1014418093:  return getDefinitionElement();
5371        case 1587405498:  return getDocumentationElement();
5372        default: return super.makeProperty(hash, name);
5373        }
5374
5375      }
5376
5377      @Override
5378      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
5379        switch (hash) {
5380        case 3373707: /*name*/ return new String[] {"string"};
5381        case -1014418093: /*definition*/ return new String[] {"canonical"};
5382        case 1587405498: /*documentation*/ return new String[] {"markdown"};
5383        default: return super.getTypesForProperty(hash, name);
5384        }
5385
5386      }
5387
5388      @Override
5389      public Base addChild(String name) throws FHIRException {
5390        if (name.equals("name")) {
5391          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.operation.name");
5392        }
5393        else if (name.equals("definition")) {
5394          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.operation.definition");
5395        }
5396        else if (name.equals("documentation")) {
5397          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.resource.operation.documentation");
5398        }
5399        else
5400          return super.addChild(name);
5401      }
5402
5403      public CapabilityStatementRestResourceOperationComponent copy() {
5404        CapabilityStatementRestResourceOperationComponent dst = new CapabilityStatementRestResourceOperationComponent();
5405        copyValues(dst);
5406        return dst;
5407      }
5408
5409      public void copyValues(CapabilityStatementRestResourceOperationComponent dst) {
5410        super.copyValues(dst);
5411        dst.name = name == null ? null : name.copy();
5412        dst.definition = definition == null ? null : definition.copy();
5413        dst.documentation = documentation == null ? null : documentation.copy();
5414      }
5415
5416      @Override
5417      public boolean equalsDeep(Base other_) {
5418        if (!super.equalsDeep(other_))
5419          return false;
5420        if (!(other_ instanceof CapabilityStatementRestResourceOperationComponent))
5421          return false;
5422        CapabilityStatementRestResourceOperationComponent o = (CapabilityStatementRestResourceOperationComponent) other_;
5423        return compareDeep(name, o.name, true) && compareDeep(definition, o.definition, true) && compareDeep(documentation, o.documentation, true)
5424          ;
5425      }
5426
5427      @Override
5428      public boolean equalsShallow(Base other_) {
5429        if (!super.equalsShallow(other_))
5430          return false;
5431        if (!(other_ instanceof CapabilityStatementRestResourceOperationComponent))
5432          return false;
5433        CapabilityStatementRestResourceOperationComponent o = (CapabilityStatementRestResourceOperationComponent) other_;
5434        return compareValues(name, o.name, true) && compareValues(definition, o.definition, true) && compareValues(documentation, o.documentation, true)
5435          ;
5436      }
5437
5438      public boolean isEmpty() {
5439        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(name, definition, documentation
5440          );
5441      }
5442
5443  public String fhirType() {
5444    return "CapabilityStatement.rest.resource.operation";
5445
5446  }
5447
5448  }
5449
5450    @Block()
5451    public static class SystemInteractionComponent extends BackboneElement implements IBaseBackboneElement {
5452        /**
5453         * A coded identifier of the operation, supported by the system.
5454         */
5455        @Child(name = "code", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=false)
5456        @Description(shortDefinition="transaction | batch | search-system | history-system", formalDefinition="A coded identifier of the operation, supported by the system." )
5457        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/system-restful-interaction")
5458        protected Enumeration<SystemRestfulInteraction> code;
5459
5460        /**
5461         * Guidance specific to the implementation of this operation, such as limitations on the kind of transactions allowed, or information about system wide search is implemented.
5462         */
5463        @Child(name = "documentation", type = {MarkdownType.class}, order=2, min=0, max=1, modifier=false, summary=false)
5464        @Description(shortDefinition="Anything special about operation behavior", formalDefinition="Guidance specific to the implementation of this operation, such as limitations on the kind of transactions allowed, or information about system wide search is implemented." )
5465        protected MarkdownType documentation;
5466
5467        private static final long serialVersionUID = -1495143879L;
5468
5469    /**
5470     * Constructor
5471     */
5472      public SystemInteractionComponent() {
5473        super();
5474      }
5475
5476    /**
5477     * Constructor
5478     */
5479      public SystemInteractionComponent(SystemRestfulInteraction code) {
5480        super();
5481        this.setCode(code);
5482      }
5483
5484        /**
5485         * @return {@link #code} (A coded identifier of the operation, supported by the system.). This is the underlying object with id, value and extensions. The accessor "getCode" gives direct access to the value
5486         */
5487        public Enumeration<SystemRestfulInteraction> getCodeElement() { 
5488          if (this.code == null)
5489            if (Configuration.errorOnAutoCreate())
5490              throw new Error("Attempt to auto-create SystemInteractionComponent.code");
5491            else if (Configuration.doAutoCreate())
5492              this.code = new Enumeration<SystemRestfulInteraction>(new SystemRestfulInteractionEnumFactory()); // bb
5493          return this.code;
5494        }
5495
5496        public boolean hasCodeElement() { 
5497          return this.code != null && !this.code.isEmpty();
5498        }
5499
5500        public boolean hasCode() { 
5501          return this.code != null && !this.code.isEmpty();
5502        }
5503
5504        /**
5505         * @param value {@link #code} (A coded identifier of the operation, supported by the system.). This is the underlying object with id, value and extensions. The accessor "getCode" gives direct access to the value
5506         */
5507        public SystemInteractionComponent setCodeElement(Enumeration<SystemRestfulInteraction> value) { 
5508          this.code = value;
5509          return this;
5510        }
5511
5512        /**
5513         * @return A coded identifier of the operation, supported by the system.
5514         */
5515        public SystemRestfulInteraction getCode() { 
5516          return this.code == null ? null : this.code.getValue();
5517        }
5518
5519        /**
5520         * @param value A coded identifier of the operation, supported by the system.
5521         */
5522        public SystemInteractionComponent setCode(SystemRestfulInteraction value) { 
5523            if (this.code == null)
5524              this.code = new Enumeration<SystemRestfulInteraction>(new SystemRestfulInteractionEnumFactory());
5525            this.code.setValue(value);
5526          return this;
5527        }
5528
5529        /**
5530         * @return {@link #documentation} (Guidance specific to the implementation of this operation, such as limitations on the kind of transactions allowed, or information about system wide search is implemented.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
5531         */
5532        public MarkdownType getDocumentationElement() { 
5533          if (this.documentation == null)
5534            if (Configuration.errorOnAutoCreate())
5535              throw new Error("Attempt to auto-create SystemInteractionComponent.documentation");
5536            else if (Configuration.doAutoCreate())
5537              this.documentation = new MarkdownType(); // bb
5538          return this.documentation;
5539        }
5540
5541        public boolean hasDocumentationElement() { 
5542          return this.documentation != null && !this.documentation.isEmpty();
5543        }
5544
5545        public boolean hasDocumentation() { 
5546          return this.documentation != null && !this.documentation.isEmpty();
5547        }
5548
5549        /**
5550         * @param value {@link #documentation} (Guidance specific to the implementation of this operation, such as limitations on the kind of transactions allowed, or information about system wide search is implemented.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
5551         */
5552        public SystemInteractionComponent setDocumentationElement(MarkdownType value) { 
5553          this.documentation = value;
5554          return this;
5555        }
5556
5557        /**
5558         * @return Guidance specific to the implementation of this operation, such as limitations on the kind of transactions allowed, or information about system wide search is implemented.
5559         */
5560        public String getDocumentation() { 
5561          return this.documentation == null ? null : this.documentation.getValue();
5562        }
5563
5564        /**
5565         * @param value Guidance specific to the implementation of this operation, such as limitations on the kind of transactions allowed, or information about system wide search is implemented.
5566         */
5567        public SystemInteractionComponent setDocumentation(String value) { 
5568          if (Utilities.noString(value))
5569            this.documentation = null;
5570          else {
5571            if (this.documentation == null)
5572              this.documentation = new MarkdownType();
5573            this.documentation.setValue(value);
5574          }
5575          return this;
5576        }
5577
5578        protected void listChildren(List<Property> children) {
5579          super.listChildren(children);
5580          children.add(new Property("code", "code", "A coded identifier of the operation, supported by the system.", 0, 1, code));
5581          children.add(new Property("documentation", "markdown", "Guidance specific to the implementation of this operation, such as limitations on the kind of transactions allowed, or information about system wide search is implemented.", 0, 1, documentation));
5582        }
5583
5584        @Override
5585        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
5586          switch (_hash) {
5587          case 3059181: /*code*/  return new Property("code", "code", "A coded identifier of the operation, supported by the system.", 0, 1, code);
5588          case 1587405498: /*documentation*/  return new Property("documentation", "markdown", "Guidance specific to the implementation of this operation, such as limitations on the kind of transactions allowed, or information about system wide search is implemented.", 0, 1, documentation);
5589          default: return super.getNamedProperty(_hash, _name, _checkValid);
5590          }
5591
5592        }
5593
5594      @Override
5595      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
5596        switch (hash) {
5597        case 3059181: /*code*/ return this.code == null ? new Base[0] : new Base[] {this.code}; // Enumeration<SystemRestfulInteraction>
5598        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : new Base[] {this.documentation}; // MarkdownType
5599        default: return super.getProperty(hash, name, checkValid);
5600        }
5601
5602      }
5603
5604      @Override
5605      public Base setProperty(int hash, String name, Base value) throws FHIRException {
5606        switch (hash) {
5607        case 3059181: // code
5608          value = new SystemRestfulInteractionEnumFactory().fromType(TypeConvertor.castToCode(value));
5609          this.code = (Enumeration) value; // Enumeration<SystemRestfulInteraction>
5610          return value;
5611        case 1587405498: // documentation
5612          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
5613          return value;
5614        default: return super.setProperty(hash, name, value);
5615        }
5616
5617      }
5618
5619      @Override
5620      public Base setProperty(String name, Base value) throws FHIRException {
5621        if (name.equals("code")) {
5622          value = new SystemRestfulInteractionEnumFactory().fromType(TypeConvertor.castToCode(value));
5623          this.code = (Enumeration) value; // Enumeration<SystemRestfulInteraction>
5624        } else if (name.equals("documentation")) {
5625          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
5626        } else
5627          return super.setProperty(name, value);
5628        return value;
5629      }
5630
5631  @Override
5632  public void removeChild(String name, Base value) throws FHIRException {
5633        if (name.equals("code")) {
5634          value = new SystemRestfulInteractionEnumFactory().fromType(TypeConvertor.castToCode(value));
5635          this.code = (Enumeration) value; // Enumeration<SystemRestfulInteraction>
5636        } else if (name.equals("documentation")) {
5637          this.documentation = null;
5638        } else
5639          super.removeChild(name, value);
5640        
5641      }
5642
5643      @Override
5644      public Base makeProperty(int hash, String name) throws FHIRException {
5645        switch (hash) {
5646        case 3059181:  return getCodeElement();
5647        case 1587405498:  return getDocumentationElement();
5648        default: return super.makeProperty(hash, name);
5649        }
5650
5651      }
5652
5653      @Override
5654      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
5655        switch (hash) {
5656        case 3059181: /*code*/ return new String[] {"code"};
5657        case 1587405498: /*documentation*/ return new String[] {"markdown"};
5658        default: return super.getTypesForProperty(hash, name);
5659        }
5660
5661      }
5662
5663      @Override
5664      public Base addChild(String name) throws FHIRException {
5665        if (name.equals("code")) {
5666          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.interaction.code");
5667        }
5668        else if (name.equals("documentation")) {
5669          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.rest.interaction.documentation");
5670        }
5671        else
5672          return super.addChild(name);
5673      }
5674
5675      public SystemInteractionComponent copy() {
5676        SystemInteractionComponent dst = new SystemInteractionComponent();
5677        copyValues(dst);
5678        return dst;
5679      }
5680
5681      public void copyValues(SystemInteractionComponent dst) {
5682        super.copyValues(dst);
5683        dst.code = code == null ? null : code.copy();
5684        dst.documentation = documentation == null ? null : documentation.copy();
5685      }
5686
5687      @Override
5688      public boolean equalsDeep(Base other_) {
5689        if (!super.equalsDeep(other_))
5690          return false;
5691        if (!(other_ instanceof SystemInteractionComponent))
5692          return false;
5693        SystemInteractionComponent o = (SystemInteractionComponent) other_;
5694        return compareDeep(code, o.code, true) && compareDeep(documentation, o.documentation, true);
5695      }
5696
5697      @Override
5698      public boolean equalsShallow(Base other_) {
5699        if (!super.equalsShallow(other_))
5700          return false;
5701        if (!(other_ instanceof SystemInteractionComponent))
5702          return false;
5703        SystemInteractionComponent o = (SystemInteractionComponent) other_;
5704        return compareValues(code, o.code, true) && compareValues(documentation, o.documentation, true);
5705      }
5706
5707      public boolean isEmpty() {
5708        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(code, documentation);
5709      }
5710
5711  public String fhirType() {
5712    return "CapabilityStatement.rest.interaction";
5713
5714  }
5715
5716  }
5717
5718    @Block()
5719    public static class CapabilityStatementMessagingComponent extends BackboneElement implements IBaseBackboneElement {
5720        /**
5721         * An endpoint (network accessible address) to which messages and/or replies are to be sent.
5722         */
5723        @Child(name = "endpoint", type = {}, order=1, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
5724        @Description(shortDefinition="Where messages should be sent", formalDefinition="An endpoint (network accessible address) to which messages and/or replies are to be sent." )
5725        protected List<CapabilityStatementMessagingEndpointComponent> endpoint;
5726
5727        /**
5728         * Length if the receiver's reliable messaging cache in minutes (if a receiver) or how long the cache length on the receiver should be (if a sender).
5729         */
5730        @Child(name = "reliableCache", type = {UnsignedIntType.class}, order=2, min=0, max=1, modifier=false, summary=false)
5731        @Description(shortDefinition="Reliable Message Cache Length (min)", formalDefinition="Length if the receiver's reliable messaging cache in minutes (if a receiver) or how long the cache length on the receiver should be (if a sender)." )
5732        protected UnsignedIntType reliableCache;
5733
5734        /**
5735         * Documentation about the system's messaging capabilities for this endpoint not otherwise documented by the capability statement.  For example, the process for becoming an authorized messaging exchange partner.
5736         */
5737        @Child(name = "documentation", type = {MarkdownType.class}, order=3, min=0, max=1, modifier=false, summary=false)
5738        @Description(shortDefinition="Messaging interface behavior details", formalDefinition="Documentation about the system's messaging capabilities for this endpoint not otherwise documented by the capability statement.  For example, the process for becoming an authorized messaging exchange partner." )
5739        protected MarkdownType documentation;
5740
5741        /**
5742         * References to message definitions for messages this system can send or receive.
5743         */
5744        @Child(name = "supportedMessage", type = {}, order=4, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
5745        @Description(shortDefinition="Messages supported by this system", formalDefinition="References to message definitions for messages this system can send or receive." )
5746        protected List<CapabilityStatementMessagingSupportedMessageComponent> supportedMessage;
5747
5748        private static final long serialVersionUID = 300411231L;
5749
5750    /**
5751     * Constructor
5752     */
5753      public CapabilityStatementMessagingComponent() {
5754        super();
5755      }
5756
5757        /**
5758         * @return {@link #endpoint} (An endpoint (network accessible address) to which messages and/or replies are to be sent.)
5759         */
5760        public List<CapabilityStatementMessagingEndpointComponent> getEndpoint() { 
5761          if (this.endpoint == null)
5762            this.endpoint = new ArrayList<CapabilityStatementMessagingEndpointComponent>();
5763          return this.endpoint;
5764        }
5765
5766        /**
5767         * @return Returns a reference to <code>this</code> for easy method chaining
5768         */
5769        public CapabilityStatementMessagingComponent setEndpoint(List<CapabilityStatementMessagingEndpointComponent> theEndpoint) { 
5770          this.endpoint = theEndpoint;
5771          return this;
5772        }
5773
5774        public boolean hasEndpoint() { 
5775          if (this.endpoint == null)
5776            return false;
5777          for (CapabilityStatementMessagingEndpointComponent item : this.endpoint)
5778            if (!item.isEmpty())
5779              return true;
5780          return false;
5781        }
5782
5783        public CapabilityStatementMessagingEndpointComponent addEndpoint() { //3
5784          CapabilityStatementMessagingEndpointComponent t = new CapabilityStatementMessagingEndpointComponent();
5785          if (this.endpoint == null)
5786            this.endpoint = new ArrayList<CapabilityStatementMessagingEndpointComponent>();
5787          this.endpoint.add(t);
5788          return t;
5789        }
5790
5791        public CapabilityStatementMessagingComponent addEndpoint(CapabilityStatementMessagingEndpointComponent t) { //3
5792          if (t == null)
5793            return this;
5794          if (this.endpoint == null)
5795            this.endpoint = new ArrayList<CapabilityStatementMessagingEndpointComponent>();
5796          this.endpoint.add(t);
5797          return this;
5798        }
5799
5800        /**
5801         * @return The first repetition of repeating field {@link #endpoint}, creating it if it does not already exist {3}
5802         */
5803        public CapabilityStatementMessagingEndpointComponent getEndpointFirstRep() { 
5804          if (getEndpoint().isEmpty()) {
5805            addEndpoint();
5806          }
5807          return getEndpoint().get(0);
5808        }
5809
5810        /**
5811         * @return {@link #reliableCache} (Length if the receiver's reliable messaging cache in minutes (if a receiver) or how long the cache length on the receiver should be (if a sender).). This is the underlying object with id, value and extensions. The accessor "getReliableCache" gives direct access to the value
5812         */
5813        public UnsignedIntType getReliableCacheElement() { 
5814          if (this.reliableCache == null)
5815            if (Configuration.errorOnAutoCreate())
5816              throw new Error("Attempt to auto-create CapabilityStatementMessagingComponent.reliableCache");
5817            else if (Configuration.doAutoCreate())
5818              this.reliableCache = new UnsignedIntType(); // bb
5819          return this.reliableCache;
5820        }
5821
5822        public boolean hasReliableCacheElement() { 
5823          return this.reliableCache != null && !this.reliableCache.isEmpty();
5824        }
5825
5826        public boolean hasReliableCache() { 
5827          return this.reliableCache != null && !this.reliableCache.isEmpty();
5828        }
5829
5830        /**
5831         * @param value {@link #reliableCache} (Length if the receiver's reliable messaging cache in minutes (if a receiver) or how long the cache length on the receiver should be (if a sender).). This is the underlying object with id, value and extensions. The accessor "getReliableCache" gives direct access to the value
5832         */
5833        public CapabilityStatementMessagingComponent setReliableCacheElement(UnsignedIntType value) { 
5834          this.reliableCache = value;
5835          return this;
5836        }
5837
5838        /**
5839         * @return Length if the receiver's reliable messaging cache in minutes (if a receiver) or how long the cache length on the receiver should be (if a sender).
5840         */
5841        public int getReliableCache() { 
5842          return this.reliableCache == null || this.reliableCache.isEmpty() ? 0 : this.reliableCache.getValue();
5843        }
5844
5845        /**
5846         * @param value Length if the receiver's reliable messaging cache in minutes (if a receiver) or how long the cache length on the receiver should be (if a sender).
5847         */
5848        public CapabilityStatementMessagingComponent setReliableCache(int value) { 
5849            if (this.reliableCache == null)
5850              this.reliableCache = new UnsignedIntType();
5851            this.reliableCache.setValue(value);
5852          return this;
5853        }
5854
5855        /**
5856         * @return {@link #documentation} (Documentation about the system's messaging capabilities for this endpoint not otherwise documented by the capability statement.  For example, the process for becoming an authorized messaging exchange partner.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
5857         */
5858        public MarkdownType getDocumentationElement() { 
5859          if (this.documentation == null)
5860            if (Configuration.errorOnAutoCreate())
5861              throw new Error("Attempt to auto-create CapabilityStatementMessagingComponent.documentation");
5862            else if (Configuration.doAutoCreate())
5863              this.documentation = new MarkdownType(); // bb
5864          return this.documentation;
5865        }
5866
5867        public boolean hasDocumentationElement() { 
5868          return this.documentation != null && !this.documentation.isEmpty();
5869        }
5870
5871        public boolean hasDocumentation() { 
5872          return this.documentation != null && !this.documentation.isEmpty();
5873        }
5874
5875        /**
5876         * @param value {@link #documentation} (Documentation about the system's messaging capabilities for this endpoint not otherwise documented by the capability statement.  For example, the process for becoming an authorized messaging exchange partner.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
5877         */
5878        public CapabilityStatementMessagingComponent setDocumentationElement(MarkdownType value) { 
5879          this.documentation = value;
5880          return this;
5881        }
5882
5883        /**
5884         * @return Documentation about the system's messaging capabilities for this endpoint not otherwise documented by the capability statement.  For example, the process for becoming an authorized messaging exchange partner.
5885         */
5886        public String getDocumentation() { 
5887          return this.documentation == null ? null : this.documentation.getValue();
5888        }
5889
5890        /**
5891         * @param value Documentation about the system's messaging capabilities for this endpoint not otherwise documented by the capability statement.  For example, the process for becoming an authorized messaging exchange partner.
5892         */
5893        public CapabilityStatementMessagingComponent setDocumentation(String value) { 
5894          if (Utilities.noString(value))
5895            this.documentation = null;
5896          else {
5897            if (this.documentation == null)
5898              this.documentation = new MarkdownType();
5899            this.documentation.setValue(value);
5900          }
5901          return this;
5902        }
5903
5904        /**
5905         * @return {@link #supportedMessage} (References to message definitions for messages this system can send or receive.)
5906         */
5907        public List<CapabilityStatementMessagingSupportedMessageComponent> getSupportedMessage() { 
5908          if (this.supportedMessage == null)
5909            this.supportedMessage = new ArrayList<CapabilityStatementMessagingSupportedMessageComponent>();
5910          return this.supportedMessage;
5911        }
5912
5913        /**
5914         * @return Returns a reference to <code>this</code> for easy method chaining
5915         */
5916        public CapabilityStatementMessagingComponent setSupportedMessage(List<CapabilityStatementMessagingSupportedMessageComponent> theSupportedMessage) { 
5917          this.supportedMessage = theSupportedMessage;
5918          return this;
5919        }
5920
5921        public boolean hasSupportedMessage() { 
5922          if (this.supportedMessage == null)
5923            return false;
5924          for (CapabilityStatementMessagingSupportedMessageComponent item : this.supportedMessage)
5925            if (!item.isEmpty())
5926              return true;
5927          return false;
5928        }
5929
5930        public CapabilityStatementMessagingSupportedMessageComponent addSupportedMessage() { //3
5931          CapabilityStatementMessagingSupportedMessageComponent t = new CapabilityStatementMessagingSupportedMessageComponent();
5932          if (this.supportedMessage == null)
5933            this.supportedMessage = new ArrayList<CapabilityStatementMessagingSupportedMessageComponent>();
5934          this.supportedMessage.add(t);
5935          return t;
5936        }
5937
5938        public CapabilityStatementMessagingComponent addSupportedMessage(CapabilityStatementMessagingSupportedMessageComponent t) { //3
5939          if (t == null)
5940            return this;
5941          if (this.supportedMessage == null)
5942            this.supportedMessage = new ArrayList<CapabilityStatementMessagingSupportedMessageComponent>();
5943          this.supportedMessage.add(t);
5944          return this;
5945        }
5946
5947        /**
5948         * @return The first repetition of repeating field {@link #supportedMessage}, creating it if it does not already exist {3}
5949         */
5950        public CapabilityStatementMessagingSupportedMessageComponent getSupportedMessageFirstRep() { 
5951          if (getSupportedMessage().isEmpty()) {
5952            addSupportedMessage();
5953          }
5954          return getSupportedMessage().get(0);
5955        }
5956
5957        protected void listChildren(List<Property> children) {
5958          super.listChildren(children);
5959          children.add(new Property("endpoint", "", "An endpoint (network accessible address) to which messages and/or replies are to be sent.", 0, java.lang.Integer.MAX_VALUE, endpoint));
5960          children.add(new Property("reliableCache", "unsignedInt", "Length if the receiver's reliable messaging cache in minutes (if a receiver) or how long the cache length on the receiver should be (if a sender).", 0, 1, reliableCache));
5961          children.add(new Property("documentation", "markdown", "Documentation about the system's messaging capabilities for this endpoint not otherwise documented by the capability statement.  For example, the process for becoming an authorized messaging exchange partner.", 0, 1, documentation));
5962          children.add(new Property("supportedMessage", "", "References to message definitions for messages this system can send or receive.", 0, java.lang.Integer.MAX_VALUE, supportedMessage));
5963        }
5964
5965        @Override
5966        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
5967          switch (_hash) {
5968          case 1741102485: /*endpoint*/  return new Property("endpoint", "", "An endpoint (network accessible address) to which messages and/or replies are to be sent.", 0, java.lang.Integer.MAX_VALUE, endpoint);
5969          case 897803608: /*reliableCache*/  return new Property("reliableCache", "unsignedInt", "Length if the receiver's reliable messaging cache in minutes (if a receiver) or how long the cache length on the receiver should be (if a sender).", 0, 1, reliableCache);
5970          case 1587405498: /*documentation*/  return new Property("documentation", "markdown", "Documentation about the system's messaging capabilities for this endpoint not otherwise documented by the capability statement.  For example, the process for becoming an authorized messaging exchange partner.", 0, 1, documentation);
5971          case -1805139079: /*supportedMessage*/  return new Property("supportedMessage", "", "References to message definitions for messages this system can send or receive.", 0, java.lang.Integer.MAX_VALUE, supportedMessage);
5972          default: return super.getNamedProperty(_hash, _name, _checkValid);
5973          }
5974
5975        }
5976
5977      @Override
5978      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
5979        switch (hash) {
5980        case 1741102485: /*endpoint*/ return this.endpoint == null ? new Base[0] : this.endpoint.toArray(new Base[this.endpoint.size()]); // CapabilityStatementMessagingEndpointComponent
5981        case 897803608: /*reliableCache*/ return this.reliableCache == null ? new Base[0] : new Base[] {this.reliableCache}; // UnsignedIntType
5982        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : new Base[] {this.documentation}; // MarkdownType
5983        case -1805139079: /*supportedMessage*/ return this.supportedMessage == null ? new Base[0] : this.supportedMessage.toArray(new Base[this.supportedMessage.size()]); // CapabilityStatementMessagingSupportedMessageComponent
5984        default: return super.getProperty(hash, name, checkValid);
5985        }
5986
5987      }
5988
5989      @Override
5990      public Base setProperty(int hash, String name, Base value) throws FHIRException {
5991        switch (hash) {
5992        case 1741102485: // endpoint
5993          this.getEndpoint().add((CapabilityStatementMessagingEndpointComponent) value); // CapabilityStatementMessagingEndpointComponent
5994          return value;
5995        case 897803608: // reliableCache
5996          this.reliableCache = TypeConvertor.castToUnsignedInt(value); // UnsignedIntType
5997          return value;
5998        case 1587405498: // documentation
5999          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
6000          return value;
6001        case -1805139079: // supportedMessage
6002          this.getSupportedMessage().add((CapabilityStatementMessagingSupportedMessageComponent) value); // CapabilityStatementMessagingSupportedMessageComponent
6003          return value;
6004        default: return super.setProperty(hash, name, value);
6005        }
6006
6007      }
6008
6009      @Override
6010      public Base setProperty(String name, Base value) throws FHIRException {
6011        if (name.equals("endpoint")) {
6012          this.getEndpoint().add((CapabilityStatementMessagingEndpointComponent) value);
6013        } else if (name.equals("reliableCache")) {
6014          this.reliableCache = TypeConvertor.castToUnsignedInt(value); // UnsignedIntType
6015        } else if (name.equals("documentation")) {
6016          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
6017        } else if (name.equals("supportedMessage")) {
6018          this.getSupportedMessage().add((CapabilityStatementMessagingSupportedMessageComponent) value);
6019        } else
6020          return super.setProperty(name, value);
6021        return value;
6022      }
6023
6024  @Override
6025  public void removeChild(String name, Base value) throws FHIRException {
6026        if (name.equals("endpoint")) {
6027          this.getEndpoint().remove((CapabilityStatementMessagingEndpointComponent) value);
6028        } else if (name.equals("reliableCache")) {
6029          this.reliableCache = null;
6030        } else if (name.equals("documentation")) {
6031          this.documentation = null;
6032        } else if (name.equals("supportedMessage")) {
6033          this.getSupportedMessage().remove((CapabilityStatementMessagingSupportedMessageComponent) value);
6034        } else
6035          super.removeChild(name, value);
6036        
6037      }
6038
6039      @Override
6040      public Base makeProperty(int hash, String name) throws FHIRException {
6041        switch (hash) {
6042        case 1741102485:  return addEndpoint(); 
6043        case 897803608:  return getReliableCacheElement();
6044        case 1587405498:  return getDocumentationElement();
6045        case -1805139079:  return addSupportedMessage(); 
6046        default: return super.makeProperty(hash, name);
6047        }
6048
6049      }
6050
6051      @Override
6052      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
6053        switch (hash) {
6054        case 1741102485: /*endpoint*/ return new String[] {};
6055        case 897803608: /*reliableCache*/ return new String[] {"unsignedInt"};
6056        case 1587405498: /*documentation*/ return new String[] {"markdown"};
6057        case -1805139079: /*supportedMessage*/ return new String[] {};
6058        default: return super.getTypesForProperty(hash, name);
6059        }
6060
6061      }
6062
6063      @Override
6064      public Base addChild(String name) throws FHIRException {
6065        if (name.equals("endpoint")) {
6066          return addEndpoint();
6067        }
6068        else if (name.equals("reliableCache")) {
6069          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.messaging.reliableCache");
6070        }
6071        else if (name.equals("documentation")) {
6072          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.messaging.documentation");
6073        }
6074        else if (name.equals("supportedMessage")) {
6075          return addSupportedMessage();
6076        }
6077        else
6078          return super.addChild(name);
6079      }
6080
6081      public CapabilityStatementMessagingComponent copy() {
6082        CapabilityStatementMessagingComponent dst = new CapabilityStatementMessagingComponent();
6083        copyValues(dst);
6084        return dst;
6085      }
6086
6087      public void copyValues(CapabilityStatementMessagingComponent dst) {
6088        super.copyValues(dst);
6089        if (endpoint != null) {
6090          dst.endpoint = new ArrayList<CapabilityStatementMessagingEndpointComponent>();
6091          for (CapabilityStatementMessagingEndpointComponent i : endpoint)
6092            dst.endpoint.add(i.copy());
6093        };
6094        dst.reliableCache = reliableCache == null ? null : reliableCache.copy();
6095        dst.documentation = documentation == null ? null : documentation.copy();
6096        if (supportedMessage != null) {
6097          dst.supportedMessage = new ArrayList<CapabilityStatementMessagingSupportedMessageComponent>();
6098          for (CapabilityStatementMessagingSupportedMessageComponent i : supportedMessage)
6099            dst.supportedMessage.add(i.copy());
6100        };
6101      }
6102
6103      @Override
6104      public boolean equalsDeep(Base other_) {
6105        if (!super.equalsDeep(other_))
6106          return false;
6107        if (!(other_ instanceof CapabilityStatementMessagingComponent))
6108          return false;
6109        CapabilityStatementMessagingComponent o = (CapabilityStatementMessagingComponent) other_;
6110        return compareDeep(endpoint, o.endpoint, true) && compareDeep(reliableCache, o.reliableCache, true)
6111           && compareDeep(documentation, o.documentation, true) && compareDeep(supportedMessage, o.supportedMessage, true)
6112          ;
6113      }
6114
6115      @Override
6116      public boolean equalsShallow(Base other_) {
6117        if (!super.equalsShallow(other_))
6118          return false;
6119        if (!(other_ instanceof CapabilityStatementMessagingComponent))
6120          return false;
6121        CapabilityStatementMessagingComponent o = (CapabilityStatementMessagingComponent) other_;
6122        return compareValues(reliableCache, o.reliableCache, true) && compareValues(documentation, o.documentation, true)
6123          ;
6124      }
6125
6126      public boolean isEmpty() {
6127        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(endpoint, reliableCache, documentation
6128          , supportedMessage);
6129      }
6130
6131  public String fhirType() {
6132    return "CapabilityStatement.messaging";
6133
6134  }
6135
6136  }
6137
6138    @Block()
6139    public static class CapabilityStatementMessagingEndpointComponent extends BackboneElement implements IBaseBackboneElement {
6140        /**
6141         * A list of the messaging transport protocol(s) identifiers, supported by this endpoint.
6142         */
6143        @Child(name = "protocol", type = {Coding.class}, order=1, min=1, max=1, modifier=false, summary=false)
6144        @Description(shortDefinition="http | ftp | mllp +", formalDefinition="A list of the messaging transport protocol(s) identifiers, supported by this endpoint." )
6145        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/message-transport")
6146        protected Coding protocol;
6147
6148        /**
6149         * The network address of the endpoint. For solutions that do not use network addresses for routing, it can be just an identifier.
6150         */
6151        @Child(name = "address", type = {UrlType.class}, order=2, min=1, max=1, modifier=false, summary=false)
6152        @Description(shortDefinition="Network address or identifier of the end-point", formalDefinition="The network address of the endpoint. For solutions that do not use network addresses for routing, it can be just an identifier." )
6153        protected UrlType address;
6154
6155        private static final long serialVersionUID = -236946103L;
6156
6157    /**
6158     * Constructor
6159     */
6160      public CapabilityStatementMessagingEndpointComponent() {
6161        super();
6162      }
6163
6164    /**
6165     * Constructor
6166     */
6167      public CapabilityStatementMessagingEndpointComponent(Coding protocol, String address) {
6168        super();
6169        this.setProtocol(protocol);
6170        this.setAddress(address);
6171      }
6172
6173        /**
6174         * @return {@link #protocol} (A list of the messaging transport protocol(s) identifiers, supported by this endpoint.)
6175         */
6176        public Coding getProtocol() { 
6177          if (this.protocol == null)
6178            if (Configuration.errorOnAutoCreate())
6179              throw new Error("Attempt to auto-create CapabilityStatementMessagingEndpointComponent.protocol");
6180            else if (Configuration.doAutoCreate())
6181              this.protocol = new Coding(); // cc
6182          return this.protocol;
6183        }
6184
6185        public boolean hasProtocol() { 
6186          return this.protocol != null && !this.protocol.isEmpty();
6187        }
6188
6189        /**
6190         * @param value {@link #protocol} (A list of the messaging transport protocol(s) identifiers, supported by this endpoint.)
6191         */
6192        public CapabilityStatementMessagingEndpointComponent setProtocol(Coding value) { 
6193          this.protocol = value;
6194          return this;
6195        }
6196
6197        /**
6198         * @return {@link #address} (The network address of the endpoint. For solutions that do not use network addresses for routing, it can be just an identifier.). This is the underlying object with id, value and extensions. The accessor "getAddress" gives direct access to the value
6199         */
6200        public UrlType getAddressElement() { 
6201          if (this.address == null)
6202            if (Configuration.errorOnAutoCreate())
6203              throw new Error("Attempt to auto-create CapabilityStatementMessagingEndpointComponent.address");
6204            else if (Configuration.doAutoCreate())
6205              this.address = new UrlType(); // bb
6206          return this.address;
6207        }
6208
6209        public boolean hasAddressElement() { 
6210          return this.address != null && !this.address.isEmpty();
6211        }
6212
6213        public boolean hasAddress() { 
6214          return this.address != null && !this.address.isEmpty();
6215        }
6216
6217        /**
6218         * @param value {@link #address} (The network address of the endpoint. For solutions that do not use network addresses for routing, it can be just an identifier.). This is the underlying object with id, value and extensions. The accessor "getAddress" gives direct access to the value
6219         */
6220        public CapabilityStatementMessagingEndpointComponent setAddressElement(UrlType value) { 
6221          this.address = value;
6222          return this;
6223        }
6224
6225        /**
6226         * @return The network address of the endpoint. For solutions that do not use network addresses for routing, it can be just an identifier.
6227         */
6228        public String getAddress() { 
6229          return this.address == null ? null : this.address.getValue();
6230        }
6231
6232        /**
6233         * @param value The network address of the endpoint. For solutions that do not use network addresses for routing, it can be just an identifier.
6234         */
6235        public CapabilityStatementMessagingEndpointComponent setAddress(String value) { 
6236            if (this.address == null)
6237              this.address = new UrlType();
6238            this.address.setValue(value);
6239          return this;
6240        }
6241
6242        protected void listChildren(List<Property> children) {
6243          super.listChildren(children);
6244          children.add(new Property("protocol", "Coding", "A list of the messaging transport protocol(s) identifiers, supported by this endpoint.", 0, 1, protocol));
6245          children.add(new Property("address", "url", "The network address of the endpoint. For solutions that do not use network addresses for routing, it can be just an identifier.", 0, 1, address));
6246        }
6247
6248        @Override
6249        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
6250          switch (_hash) {
6251          case -989163880: /*protocol*/  return new Property("protocol", "Coding", "A list of the messaging transport protocol(s) identifiers, supported by this endpoint.", 0, 1, protocol);
6252          case -1147692044: /*address*/  return new Property("address", "url", "The network address of the endpoint. For solutions that do not use network addresses for routing, it can be just an identifier.", 0, 1, address);
6253          default: return super.getNamedProperty(_hash, _name, _checkValid);
6254          }
6255
6256        }
6257
6258      @Override
6259      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
6260        switch (hash) {
6261        case -989163880: /*protocol*/ return this.protocol == null ? new Base[0] : new Base[] {this.protocol}; // Coding
6262        case -1147692044: /*address*/ return this.address == null ? new Base[0] : new Base[] {this.address}; // UrlType
6263        default: return super.getProperty(hash, name, checkValid);
6264        }
6265
6266      }
6267
6268      @Override
6269      public Base setProperty(int hash, String name, Base value) throws FHIRException {
6270        switch (hash) {
6271        case -989163880: // protocol
6272          this.protocol = TypeConvertor.castToCoding(value); // Coding
6273          return value;
6274        case -1147692044: // address
6275          this.address = TypeConvertor.castToUrl(value); // UrlType
6276          return value;
6277        default: return super.setProperty(hash, name, value);
6278        }
6279
6280      }
6281
6282      @Override
6283      public Base setProperty(String name, Base value) throws FHIRException {
6284        if (name.equals("protocol")) {
6285          this.protocol = TypeConvertor.castToCoding(value); // Coding
6286        } else if (name.equals("address")) {
6287          this.address = TypeConvertor.castToUrl(value); // UrlType
6288        } else
6289          return super.setProperty(name, value);
6290        return value;
6291      }
6292
6293  @Override
6294  public void removeChild(String name, Base value) throws FHIRException {
6295        if (name.equals("protocol")) {
6296          this.protocol = null;
6297        } else if (name.equals("address")) {
6298          this.address = null;
6299        } else
6300          super.removeChild(name, value);
6301        
6302      }
6303
6304      @Override
6305      public Base makeProperty(int hash, String name) throws FHIRException {
6306        switch (hash) {
6307        case -989163880:  return getProtocol();
6308        case -1147692044:  return getAddressElement();
6309        default: return super.makeProperty(hash, name);
6310        }
6311
6312      }
6313
6314      @Override
6315      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
6316        switch (hash) {
6317        case -989163880: /*protocol*/ return new String[] {"Coding"};
6318        case -1147692044: /*address*/ return new String[] {"url"};
6319        default: return super.getTypesForProperty(hash, name);
6320        }
6321
6322      }
6323
6324      @Override
6325      public Base addChild(String name) throws FHIRException {
6326        if (name.equals("protocol")) {
6327          this.protocol = new Coding();
6328          return this.protocol;
6329        }
6330        else if (name.equals("address")) {
6331          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.messaging.endpoint.address");
6332        }
6333        else
6334          return super.addChild(name);
6335      }
6336
6337      public CapabilityStatementMessagingEndpointComponent copy() {
6338        CapabilityStatementMessagingEndpointComponent dst = new CapabilityStatementMessagingEndpointComponent();
6339        copyValues(dst);
6340        return dst;
6341      }
6342
6343      public void copyValues(CapabilityStatementMessagingEndpointComponent dst) {
6344        super.copyValues(dst);
6345        dst.protocol = protocol == null ? null : protocol.copy();
6346        dst.address = address == null ? null : address.copy();
6347      }
6348
6349      @Override
6350      public boolean equalsDeep(Base other_) {
6351        if (!super.equalsDeep(other_))
6352          return false;
6353        if (!(other_ instanceof CapabilityStatementMessagingEndpointComponent))
6354          return false;
6355        CapabilityStatementMessagingEndpointComponent o = (CapabilityStatementMessagingEndpointComponent) other_;
6356        return compareDeep(protocol, o.protocol, true) && compareDeep(address, o.address, true);
6357      }
6358
6359      @Override
6360      public boolean equalsShallow(Base other_) {
6361        if (!super.equalsShallow(other_))
6362          return false;
6363        if (!(other_ instanceof CapabilityStatementMessagingEndpointComponent))
6364          return false;
6365        CapabilityStatementMessagingEndpointComponent o = (CapabilityStatementMessagingEndpointComponent) other_;
6366        return compareValues(address, o.address, true);
6367      }
6368
6369      public boolean isEmpty() {
6370        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(protocol, address);
6371      }
6372
6373  public String fhirType() {
6374    return "CapabilityStatement.messaging.endpoint";
6375
6376  }
6377
6378  }
6379
6380    @Block()
6381    public static class CapabilityStatementMessagingSupportedMessageComponent extends BackboneElement implements IBaseBackboneElement {
6382        /**
6383         * The mode of this event declaration - whether application is sender or receiver.
6384         */
6385        @Child(name = "mode", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=true)
6386        @Description(shortDefinition="sender | receiver", formalDefinition="The mode of this event declaration - whether application is sender or receiver." )
6387        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/event-capability-mode")
6388        protected Enumeration<EventCapabilityMode> mode;
6389
6390        /**
6391         * Points to a message definition that identifies the messaging event, message structure, allowed responses, etc.
6392         */
6393        @Child(name = "definition", type = {CanonicalType.class}, order=2, min=1, max=1, modifier=false, summary=true)
6394        @Description(shortDefinition="Message supported by this system", formalDefinition="Points to a message definition that identifies the messaging event, message structure, allowed responses, etc." )
6395        protected CanonicalType definition;
6396
6397        private static final long serialVersionUID = -1172840676L;
6398
6399    /**
6400     * Constructor
6401     */
6402      public CapabilityStatementMessagingSupportedMessageComponent() {
6403        super();
6404      }
6405
6406    /**
6407     * Constructor
6408     */
6409      public CapabilityStatementMessagingSupportedMessageComponent(EventCapabilityMode mode, String definition) {
6410        super();
6411        this.setMode(mode);
6412        this.setDefinition(definition);
6413      }
6414
6415        /**
6416         * @return {@link #mode} (The mode of this event declaration - whether application is sender or receiver.). This is the underlying object with id, value and extensions. The accessor "getMode" gives direct access to the value
6417         */
6418        public Enumeration<EventCapabilityMode> getModeElement() { 
6419          if (this.mode == null)
6420            if (Configuration.errorOnAutoCreate())
6421              throw new Error("Attempt to auto-create CapabilityStatementMessagingSupportedMessageComponent.mode");
6422            else if (Configuration.doAutoCreate())
6423              this.mode = new Enumeration<EventCapabilityMode>(new EventCapabilityModeEnumFactory()); // bb
6424          return this.mode;
6425        }
6426
6427        public boolean hasModeElement() { 
6428          return this.mode != null && !this.mode.isEmpty();
6429        }
6430
6431        public boolean hasMode() { 
6432          return this.mode != null && !this.mode.isEmpty();
6433        }
6434
6435        /**
6436         * @param value {@link #mode} (The mode of this event declaration - whether application is sender or receiver.). This is the underlying object with id, value and extensions. The accessor "getMode" gives direct access to the value
6437         */
6438        public CapabilityStatementMessagingSupportedMessageComponent setModeElement(Enumeration<EventCapabilityMode> value) { 
6439          this.mode = value;
6440          return this;
6441        }
6442
6443        /**
6444         * @return The mode of this event declaration - whether application is sender or receiver.
6445         */
6446        public EventCapabilityMode getMode() { 
6447          return this.mode == null ? null : this.mode.getValue();
6448        }
6449
6450        /**
6451         * @param value The mode of this event declaration - whether application is sender or receiver.
6452         */
6453        public CapabilityStatementMessagingSupportedMessageComponent setMode(EventCapabilityMode value) { 
6454            if (this.mode == null)
6455              this.mode = new Enumeration<EventCapabilityMode>(new EventCapabilityModeEnumFactory());
6456            this.mode.setValue(value);
6457          return this;
6458        }
6459
6460        /**
6461         * @return {@link #definition} (Points to a message definition that identifies the messaging event, message structure, allowed responses, etc.). This is the underlying object with id, value and extensions. The accessor "getDefinition" gives direct access to the value
6462         */
6463        public CanonicalType getDefinitionElement() { 
6464          if (this.definition == null)
6465            if (Configuration.errorOnAutoCreate())
6466              throw new Error("Attempt to auto-create CapabilityStatementMessagingSupportedMessageComponent.definition");
6467            else if (Configuration.doAutoCreate())
6468              this.definition = new CanonicalType(); // bb
6469          return this.definition;
6470        }
6471
6472        public boolean hasDefinitionElement() { 
6473          return this.definition != null && !this.definition.isEmpty();
6474        }
6475
6476        public boolean hasDefinition() { 
6477          return this.definition != null && !this.definition.isEmpty();
6478        }
6479
6480        /**
6481         * @param value {@link #definition} (Points to a message definition that identifies the messaging event, message structure, allowed responses, etc.). This is the underlying object with id, value and extensions. The accessor "getDefinition" gives direct access to the value
6482         */
6483        public CapabilityStatementMessagingSupportedMessageComponent setDefinitionElement(CanonicalType value) { 
6484          this.definition = value;
6485          return this;
6486        }
6487
6488        /**
6489         * @return Points to a message definition that identifies the messaging event, message structure, allowed responses, etc.
6490         */
6491        public String getDefinition() { 
6492          return this.definition == null ? null : this.definition.getValue();
6493        }
6494
6495        /**
6496         * @param value Points to a message definition that identifies the messaging event, message structure, allowed responses, etc.
6497         */
6498        public CapabilityStatementMessagingSupportedMessageComponent setDefinition(String value) { 
6499            if (this.definition == null)
6500              this.definition = new CanonicalType();
6501            this.definition.setValue(value);
6502          return this;
6503        }
6504
6505        protected void listChildren(List<Property> children) {
6506          super.listChildren(children);
6507          children.add(new Property("mode", "code", "The mode of this event declaration - whether application is sender or receiver.", 0, 1, mode));
6508          children.add(new Property("definition", "canonical(MessageDefinition)", "Points to a message definition that identifies the messaging event, message structure, allowed responses, etc.", 0, 1, definition));
6509        }
6510
6511        @Override
6512        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
6513          switch (_hash) {
6514          case 3357091: /*mode*/  return new Property("mode", "code", "The mode of this event declaration - whether application is sender or receiver.", 0, 1, mode);
6515          case -1014418093: /*definition*/  return new Property("definition", "canonical(MessageDefinition)", "Points to a message definition that identifies the messaging event, message structure, allowed responses, etc.", 0, 1, definition);
6516          default: return super.getNamedProperty(_hash, _name, _checkValid);
6517          }
6518
6519        }
6520
6521      @Override
6522      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
6523        switch (hash) {
6524        case 3357091: /*mode*/ return this.mode == null ? new Base[0] : new Base[] {this.mode}; // Enumeration<EventCapabilityMode>
6525        case -1014418093: /*definition*/ return this.definition == null ? new Base[0] : new Base[] {this.definition}; // CanonicalType
6526        default: return super.getProperty(hash, name, checkValid);
6527        }
6528
6529      }
6530
6531      @Override
6532      public Base setProperty(int hash, String name, Base value) throws FHIRException {
6533        switch (hash) {
6534        case 3357091: // mode
6535          value = new EventCapabilityModeEnumFactory().fromType(TypeConvertor.castToCode(value));
6536          this.mode = (Enumeration) value; // Enumeration<EventCapabilityMode>
6537          return value;
6538        case -1014418093: // definition
6539          this.definition = TypeConvertor.castToCanonical(value); // CanonicalType
6540          return value;
6541        default: return super.setProperty(hash, name, value);
6542        }
6543
6544      }
6545
6546      @Override
6547      public Base setProperty(String name, Base value) throws FHIRException {
6548        if (name.equals("mode")) {
6549          value = new EventCapabilityModeEnumFactory().fromType(TypeConvertor.castToCode(value));
6550          this.mode = (Enumeration) value; // Enumeration<EventCapabilityMode>
6551        } else if (name.equals("definition")) {
6552          this.definition = TypeConvertor.castToCanonical(value); // CanonicalType
6553        } else
6554          return super.setProperty(name, value);
6555        return value;
6556      }
6557
6558  @Override
6559  public void removeChild(String name, Base value) throws FHIRException {
6560        if (name.equals("mode")) {
6561          value = new EventCapabilityModeEnumFactory().fromType(TypeConvertor.castToCode(value));
6562          this.mode = (Enumeration) value; // Enumeration<EventCapabilityMode>
6563        } else if (name.equals("definition")) {
6564          this.definition = null;
6565        } else
6566          super.removeChild(name, value);
6567        
6568      }
6569
6570      @Override
6571      public Base makeProperty(int hash, String name) throws FHIRException {
6572        switch (hash) {
6573        case 3357091:  return getModeElement();
6574        case -1014418093:  return getDefinitionElement();
6575        default: return super.makeProperty(hash, name);
6576        }
6577
6578      }
6579
6580      @Override
6581      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
6582        switch (hash) {
6583        case 3357091: /*mode*/ return new String[] {"code"};
6584        case -1014418093: /*definition*/ return new String[] {"canonical"};
6585        default: return super.getTypesForProperty(hash, name);
6586        }
6587
6588      }
6589
6590      @Override
6591      public Base addChild(String name) throws FHIRException {
6592        if (name.equals("mode")) {
6593          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.messaging.supportedMessage.mode");
6594        }
6595        else if (name.equals("definition")) {
6596          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.messaging.supportedMessage.definition");
6597        }
6598        else
6599          return super.addChild(name);
6600      }
6601
6602      public CapabilityStatementMessagingSupportedMessageComponent copy() {
6603        CapabilityStatementMessagingSupportedMessageComponent dst = new CapabilityStatementMessagingSupportedMessageComponent();
6604        copyValues(dst);
6605        return dst;
6606      }
6607
6608      public void copyValues(CapabilityStatementMessagingSupportedMessageComponent dst) {
6609        super.copyValues(dst);
6610        dst.mode = mode == null ? null : mode.copy();
6611        dst.definition = definition == null ? null : definition.copy();
6612      }
6613
6614      @Override
6615      public boolean equalsDeep(Base other_) {
6616        if (!super.equalsDeep(other_))
6617          return false;
6618        if (!(other_ instanceof CapabilityStatementMessagingSupportedMessageComponent))
6619          return false;
6620        CapabilityStatementMessagingSupportedMessageComponent o = (CapabilityStatementMessagingSupportedMessageComponent) other_;
6621        return compareDeep(mode, o.mode, true) && compareDeep(definition, o.definition, true);
6622      }
6623
6624      @Override
6625      public boolean equalsShallow(Base other_) {
6626        if (!super.equalsShallow(other_))
6627          return false;
6628        if (!(other_ instanceof CapabilityStatementMessagingSupportedMessageComponent))
6629          return false;
6630        CapabilityStatementMessagingSupportedMessageComponent o = (CapabilityStatementMessagingSupportedMessageComponent) other_;
6631        return compareValues(mode, o.mode, true) && compareValues(definition, o.definition, true);
6632      }
6633
6634      public boolean isEmpty() {
6635        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(mode, definition);
6636      }
6637
6638  public String fhirType() {
6639    return "CapabilityStatement.messaging.supportedMessage";
6640
6641  }
6642
6643  }
6644
6645    @Block()
6646    public static class CapabilityStatementDocumentComponent extends BackboneElement implements IBaseBackboneElement {
6647        /**
6648         * Mode of this document declaration - whether an application is a producer or consumer.
6649         */
6650        @Child(name = "mode", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=true)
6651        @Description(shortDefinition="producer | consumer", formalDefinition="Mode of this document declaration - whether an application is a producer or consumer." )
6652        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/document-mode")
6653        protected Enumeration<DocumentMode> mode;
6654
6655        /**
6656         * A description of how the application supports or uses the specified document profile.  For example, when documents are created, what action is taken with consumed documents, etc.
6657         */
6658        @Child(name = "documentation", type = {MarkdownType.class}, order=2, min=0, max=1, modifier=false, summary=false)
6659        @Description(shortDefinition="Description of document support", formalDefinition="A description of how the application supports or uses the specified document profile.  For example, when documents are created, what action is taken with consumed documents, etc." )
6660        protected MarkdownType documentation;
6661
6662        /**
6663         * A profile on the document Bundle that constrains which resources are present, and their contents.
6664         */
6665        @Child(name = "profile", type = {CanonicalType.class}, order=3, min=1, max=1, modifier=false, summary=true)
6666        @Description(shortDefinition="Constraint on the resources used in the document", formalDefinition="A profile on the document Bundle that constrains which resources are present, and their contents." )
6667        protected CanonicalType profile;
6668
6669        private static final long serialVersionUID = 18026632L;
6670
6671    /**
6672     * Constructor
6673     */
6674      public CapabilityStatementDocumentComponent() {
6675        super();
6676      }
6677
6678    /**
6679     * Constructor
6680     */
6681      public CapabilityStatementDocumentComponent(DocumentMode mode, String profile) {
6682        super();
6683        this.setMode(mode);
6684        this.setProfile(profile);
6685      }
6686
6687        /**
6688         * @return {@link #mode} (Mode of this document declaration - whether an application is a producer or consumer.). This is the underlying object with id, value and extensions. The accessor "getMode" gives direct access to the value
6689         */
6690        public Enumeration<DocumentMode> getModeElement() { 
6691          if (this.mode == null)
6692            if (Configuration.errorOnAutoCreate())
6693              throw new Error("Attempt to auto-create CapabilityStatementDocumentComponent.mode");
6694            else if (Configuration.doAutoCreate())
6695              this.mode = new Enumeration<DocumentMode>(new DocumentModeEnumFactory()); // bb
6696          return this.mode;
6697        }
6698
6699        public boolean hasModeElement() { 
6700          return this.mode != null && !this.mode.isEmpty();
6701        }
6702
6703        public boolean hasMode() { 
6704          return this.mode != null && !this.mode.isEmpty();
6705        }
6706
6707        /**
6708         * @param value {@link #mode} (Mode of this document declaration - whether an application is a producer or consumer.). This is the underlying object with id, value and extensions. The accessor "getMode" gives direct access to the value
6709         */
6710        public CapabilityStatementDocumentComponent setModeElement(Enumeration<DocumentMode> value) { 
6711          this.mode = value;
6712          return this;
6713        }
6714
6715        /**
6716         * @return Mode of this document declaration - whether an application is a producer or consumer.
6717         */
6718        public DocumentMode getMode() { 
6719          return this.mode == null ? null : this.mode.getValue();
6720        }
6721
6722        /**
6723         * @param value Mode of this document declaration - whether an application is a producer or consumer.
6724         */
6725        public CapabilityStatementDocumentComponent setMode(DocumentMode value) { 
6726            if (this.mode == null)
6727              this.mode = new Enumeration<DocumentMode>(new DocumentModeEnumFactory());
6728            this.mode.setValue(value);
6729          return this;
6730        }
6731
6732        /**
6733         * @return {@link #documentation} (A description of how the application supports or uses the specified document profile.  For example, when documents are created, what action is taken with consumed documents, etc.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
6734         */
6735        public MarkdownType getDocumentationElement() { 
6736          if (this.documentation == null)
6737            if (Configuration.errorOnAutoCreate())
6738              throw new Error("Attempt to auto-create CapabilityStatementDocumentComponent.documentation");
6739            else if (Configuration.doAutoCreate())
6740              this.documentation = new MarkdownType(); // bb
6741          return this.documentation;
6742        }
6743
6744        public boolean hasDocumentationElement() { 
6745          return this.documentation != null && !this.documentation.isEmpty();
6746        }
6747
6748        public boolean hasDocumentation() { 
6749          return this.documentation != null && !this.documentation.isEmpty();
6750        }
6751
6752        /**
6753         * @param value {@link #documentation} (A description of how the application supports or uses the specified document profile.  For example, when documents are created, what action is taken with consumed documents, etc.). This is the underlying object with id, value and extensions. The accessor "getDocumentation" gives direct access to the value
6754         */
6755        public CapabilityStatementDocumentComponent setDocumentationElement(MarkdownType value) { 
6756          this.documentation = value;
6757          return this;
6758        }
6759
6760        /**
6761         * @return A description of how the application supports or uses the specified document profile.  For example, when documents are created, what action is taken with consumed documents, etc.
6762         */
6763        public String getDocumentation() { 
6764          return this.documentation == null ? null : this.documentation.getValue();
6765        }
6766
6767        /**
6768         * @param value A description of how the application supports or uses the specified document profile.  For example, when documents are created, what action is taken with consumed documents, etc.
6769         */
6770        public CapabilityStatementDocumentComponent setDocumentation(String value) { 
6771          if (Utilities.noString(value))
6772            this.documentation = null;
6773          else {
6774            if (this.documentation == null)
6775              this.documentation = new MarkdownType();
6776            this.documentation.setValue(value);
6777          }
6778          return this;
6779        }
6780
6781        /**
6782         * @return {@link #profile} (A profile on the document Bundle that constrains which resources are present, and their contents.). This is the underlying object with id, value and extensions. The accessor "getProfile" gives direct access to the value
6783         */
6784        public CanonicalType getProfileElement() { 
6785          if (this.profile == null)
6786            if (Configuration.errorOnAutoCreate())
6787              throw new Error("Attempt to auto-create CapabilityStatementDocumentComponent.profile");
6788            else if (Configuration.doAutoCreate())
6789              this.profile = new CanonicalType(); // bb
6790          return this.profile;
6791        }
6792
6793        public boolean hasProfileElement() { 
6794          return this.profile != null && !this.profile.isEmpty();
6795        }
6796
6797        public boolean hasProfile() { 
6798          return this.profile != null && !this.profile.isEmpty();
6799        }
6800
6801        /**
6802         * @param value {@link #profile} (A profile on the document Bundle that constrains which resources are present, and their contents.). This is the underlying object with id, value and extensions. The accessor "getProfile" gives direct access to the value
6803         */
6804        public CapabilityStatementDocumentComponent setProfileElement(CanonicalType value) { 
6805          this.profile = value;
6806          return this;
6807        }
6808
6809        /**
6810         * @return A profile on the document Bundle that constrains which resources are present, and their contents.
6811         */
6812        public String getProfile() { 
6813          return this.profile == null ? null : this.profile.getValue();
6814        }
6815
6816        /**
6817         * @param value A profile on the document Bundle that constrains which resources are present, and their contents.
6818         */
6819        public CapabilityStatementDocumentComponent setProfile(String value) { 
6820            if (this.profile == null)
6821              this.profile = new CanonicalType();
6822            this.profile.setValue(value);
6823          return this;
6824        }
6825
6826        protected void listChildren(List<Property> children) {
6827          super.listChildren(children);
6828          children.add(new Property("mode", "code", "Mode of this document declaration - whether an application is a producer or consumer.", 0, 1, mode));
6829          children.add(new Property("documentation", "markdown", "A description of how the application supports or uses the specified document profile.  For example, when documents are created, what action is taken with consumed documents, etc.", 0, 1, documentation));
6830          children.add(new Property("profile", "canonical(StructureDefinition)", "A profile on the document Bundle that constrains which resources are present, and their contents.", 0, 1, profile));
6831        }
6832
6833        @Override
6834        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
6835          switch (_hash) {
6836          case 3357091: /*mode*/  return new Property("mode", "code", "Mode of this document declaration - whether an application is a producer or consumer.", 0, 1, mode);
6837          case 1587405498: /*documentation*/  return new Property("documentation", "markdown", "A description of how the application supports or uses the specified document profile.  For example, when documents are created, what action is taken with consumed documents, etc.", 0, 1, documentation);
6838          case -309425751: /*profile*/  return new Property("profile", "canonical(StructureDefinition)", "A profile on the document Bundle that constrains which resources are present, and their contents.", 0, 1, profile);
6839          default: return super.getNamedProperty(_hash, _name, _checkValid);
6840          }
6841
6842        }
6843
6844      @Override
6845      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
6846        switch (hash) {
6847        case 3357091: /*mode*/ return this.mode == null ? new Base[0] : new Base[] {this.mode}; // Enumeration<DocumentMode>
6848        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : new Base[] {this.documentation}; // MarkdownType
6849        case -309425751: /*profile*/ return this.profile == null ? new Base[0] : new Base[] {this.profile}; // CanonicalType
6850        default: return super.getProperty(hash, name, checkValid);
6851        }
6852
6853      }
6854
6855      @Override
6856      public Base setProperty(int hash, String name, Base value) throws FHIRException {
6857        switch (hash) {
6858        case 3357091: // mode
6859          value = new DocumentModeEnumFactory().fromType(TypeConvertor.castToCode(value));
6860          this.mode = (Enumeration) value; // Enumeration<DocumentMode>
6861          return value;
6862        case 1587405498: // documentation
6863          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
6864          return value;
6865        case -309425751: // profile
6866          this.profile = TypeConvertor.castToCanonical(value); // CanonicalType
6867          return value;
6868        default: return super.setProperty(hash, name, value);
6869        }
6870
6871      }
6872
6873      @Override
6874      public Base setProperty(String name, Base value) throws FHIRException {
6875        if (name.equals("mode")) {
6876          value = new DocumentModeEnumFactory().fromType(TypeConvertor.castToCode(value));
6877          this.mode = (Enumeration) value; // Enumeration<DocumentMode>
6878        } else if (name.equals("documentation")) {
6879          this.documentation = TypeConvertor.castToMarkdown(value); // MarkdownType
6880        } else if (name.equals("profile")) {
6881          this.profile = TypeConvertor.castToCanonical(value); // CanonicalType
6882        } else
6883          return super.setProperty(name, value);
6884        return value;
6885      }
6886
6887  @Override
6888  public void removeChild(String name, Base value) throws FHIRException {
6889        if (name.equals("mode")) {
6890          value = new DocumentModeEnumFactory().fromType(TypeConvertor.castToCode(value));
6891          this.mode = (Enumeration) value; // Enumeration<DocumentMode>
6892        } else if (name.equals("documentation")) {
6893          this.documentation = null;
6894        } else if (name.equals("profile")) {
6895          this.profile = null;
6896        } else
6897          super.removeChild(name, value);
6898        
6899      }
6900
6901      @Override
6902      public Base makeProperty(int hash, String name) throws FHIRException {
6903        switch (hash) {
6904        case 3357091:  return getModeElement();
6905        case 1587405498:  return getDocumentationElement();
6906        case -309425751:  return getProfileElement();
6907        default: return super.makeProperty(hash, name);
6908        }
6909
6910      }
6911
6912      @Override
6913      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
6914        switch (hash) {
6915        case 3357091: /*mode*/ return new String[] {"code"};
6916        case 1587405498: /*documentation*/ return new String[] {"markdown"};
6917        case -309425751: /*profile*/ return new String[] {"canonical"};
6918        default: return super.getTypesForProperty(hash, name);
6919        }
6920
6921      }
6922
6923      @Override
6924      public Base addChild(String name) throws FHIRException {
6925        if (name.equals("mode")) {
6926          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.document.mode");
6927        }
6928        else if (name.equals("documentation")) {
6929          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.document.documentation");
6930        }
6931        else if (name.equals("profile")) {
6932          throw new FHIRException("Cannot call addChild on a singleton property CapabilityStatement.document.profile");
6933        }
6934        else
6935          return super.addChild(name);
6936      }
6937
6938      public CapabilityStatementDocumentComponent copy() {
6939        CapabilityStatementDocumentComponent dst = new CapabilityStatementDocumentComponent();
6940        copyValues(dst);
6941        return dst;
6942      }
6943
6944      public void copyValues(CapabilityStatementDocumentComponent dst) {
6945        super.copyValues(dst);
6946        dst.mode = mode == null ? null : mode.copy();
6947        dst.documentation = documentation == null ? null : documentation.copy();
6948        dst.profile = profile == null ? null : profile.copy();
6949      }
6950
6951      @Override
6952      public boolean equalsDeep(Base other_) {
6953        if (!super.equalsDeep(other_))
6954          return false;
6955        if (!(other_ instanceof CapabilityStatementDocumentComponent))
6956          return false;
6957        CapabilityStatementDocumentComponent o = (CapabilityStatementDocumentComponent) other_;
6958        return compareDeep(mode, o.mode, true) && compareDeep(documentation, o.documentation, true) && compareDeep(profile, o.profile, true)
6959          ;
6960      }
6961
6962      @Override
6963      public boolean equalsShallow(Base other_) {
6964        if (!super.equalsShallow(other_))
6965          return false;
6966        if (!(other_ instanceof CapabilityStatementDocumentComponent))
6967          return false;
6968        CapabilityStatementDocumentComponent o = (CapabilityStatementDocumentComponent) other_;
6969        return compareValues(mode, o.mode, true) && compareValues(documentation, o.documentation, true) && compareValues(profile, o.profile, true)
6970          ;
6971      }
6972
6973      public boolean isEmpty() {
6974        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(mode, documentation, profile
6975          );
6976      }
6977
6978  public String fhirType() {
6979    return "CapabilityStatement.document";
6980
6981  }
6982
6983  }
6984
6985    /**
6986     * An absolute URI that is used to identify this capability statement 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 an authoritative instance of this capability statement is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the capability statement is stored on different servers.
6987     */
6988    @Child(name = "url", type = {UriType.class}, order=0, min=0, max=1, modifier=false, summary=true)
6989    @Description(shortDefinition="Canonical identifier for this capability statement, represented as a URI (globally unique)", formalDefinition="An absolute URI that is used to identify this capability statement 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 an authoritative instance of this capability statement is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the capability statement is stored on different servers." )
6990    protected UriType url;
6991
6992    /**
6993     * A formal identifier that is used to identify this CapabilityStatement when it is represented in other formats, or referenced in a specification, model, design or an instance.
6994     */
6995    @Child(name = "identifier", type = {Identifier.class}, order=1, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
6996    @Description(shortDefinition="Additional identifier for the CapabilityStatement (business identifier)", formalDefinition="A formal identifier that is used to identify this CapabilityStatement when it is represented in other formats, or referenced in a specification, model, design or an instance." )
6997    protected List<Identifier> identifier;
6998
6999    /**
7000     * The identifier that is used to identify this version of the capability statement when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the capability statement 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.
7001     */
7002    @Child(name = "version", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=true)
7003    @Description(shortDefinition="Business version of the capability statement", formalDefinition="The identifier that is used to identify this version of the capability statement when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the capability statement 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." )
7004    protected StringType version;
7005
7006    /**
7007     * Indicates the mechanism used to compare versions to determine which is more current.
7008     */
7009    @Child(name = "versionAlgorithm", type = {StringType.class, Coding.class}, order=3, min=0, max=1, modifier=false, summary=true)
7010    @Description(shortDefinition="How to compare versions", formalDefinition="Indicates the mechanism used to compare versions to determine which is more current." )
7011    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/version-algorithm")
7012    protected DataType versionAlgorithm;
7013
7014    /**
7015     * A natural language name identifying the capability statement. This name should be usable as an identifier for the module by machine processing applications such as code generation.
7016     */
7017    @Child(name = "name", type = {StringType.class}, order=4, min=0, max=1, modifier=false, summary=true)
7018    @Description(shortDefinition="Name for this capability statement (computer friendly)", formalDefinition="A natural language name identifying the capability statement. This name should be usable as an identifier for the module by machine processing applications such as code generation." )
7019    protected StringType name;
7020
7021    /**
7022     * A short, descriptive, user-friendly title for the capability statement.
7023     */
7024    @Child(name = "title", type = {StringType.class}, order=5, min=0, max=1, modifier=false, summary=true)
7025    @Description(shortDefinition="Name for this capability statement (human friendly)", formalDefinition="A short, descriptive, user-friendly title for the capability statement." )
7026    protected StringType title;
7027
7028    /**
7029     * The status of this capability statement. Enables tracking the life-cycle of the content.
7030     */
7031    @Child(name = "status", type = {CodeType.class}, order=6, min=1, max=1, modifier=true, summary=true)
7032    @Description(shortDefinition="draft | active | retired | unknown", formalDefinition="The status of this capability statement. Enables tracking the life-cycle of the content." )
7033    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/publication-status")
7034    protected Enumeration<PublicationStatus> status;
7035
7036    /**
7037     * A Boolean value to indicate that this capability statement is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.
7038     */
7039    @Child(name = "experimental", type = {BooleanType.class}, order=7, min=0, max=1, modifier=false, summary=true)
7040    @Description(shortDefinition="For testing purposes, not real usage", formalDefinition="A Boolean value to indicate that this capability statement is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage." )
7041    protected BooleanType experimental;
7042
7043    /**
7044     * The date  (and optionally time) when the capability statement was last significantly changed. 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 capability statement changes.
7045     */
7046    @Child(name = "date", type = {DateTimeType.class}, order=8, min=1, max=1, modifier=false, summary=true)
7047    @Description(shortDefinition="Date last changed", formalDefinition="The date  (and optionally time) when the capability statement was last significantly changed. 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 capability statement changes." )
7048    protected DateTimeType date;
7049
7050    /**
7051     * The name of the organization or individual responsible for the release and ongoing maintenance of the capability statement.
7052     */
7053    @Child(name = "publisher", type = {StringType.class}, order=9, min=0, max=1, modifier=false, summary=true)
7054    @Description(shortDefinition="Name of the publisher/steward (organization or individual)", formalDefinition="The name of the organization or individual responsible for the release and ongoing maintenance of the capability statement." )
7055    protected StringType publisher;
7056
7057    /**
7058     * Contact details to assist a user in finding and communicating with the publisher.
7059     */
7060    @Child(name = "contact", type = {ContactDetail.class}, order=10, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7061    @Description(shortDefinition="Contact details for the publisher", formalDefinition="Contact details to assist a user in finding and communicating with the publisher." )
7062    protected List<ContactDetail> contact;
7063
7064    /**
7065     * A free text natural language description of the capability statement 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.
7066     */
7067    @Child(name = "description", type = {MarkdownType.class}, order=11, min=0, max=1, modifier=false, summary=false)
7068    @Description(shortDefinition="Natural language description of the capability statement", formalDefinition="A free text natural language description of the capability statement 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." )
7069    protected MarkdownType description;
7070
7071    /**
7072     * 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 capability statement instances.
7073     */
7074    @Child(name = "useContext", type = {UsageContext.class}, order=12, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7075    @Description(shortDefinition="The context that the content is intended to support", formalDefinition="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 capability statement instances." )
7076    protected List<UsageContext> useContext;
7077
7078    /**
7079     * A legal or geographic region in which the capability statement is intended to be used.
7080     */
7081    @Child(name = "jurisdiction", type = {CodeableConcept.class}, order=13, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7082    @Description(shortDefinition="Intended jurisdiction for capability statement (if applicable)", formalDefinition="A legal or geographic region in which the capability statement is intended to be used." )
7083    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/jurisdiction")
7084    protected List<CodeableConcept> jurisdiction;
7085
7086    /**
7087     * Explanation of why this capability statement is needed and why it has been designed as it has.
7088     */
7089    @Child(name = "purpose", type = {MarkdownType.class}, order=14, min=0, max=1, modifier=false, summary=false)
7090    @Description(shortDefinition="Why this capability statement is defined", formalDefinition="Explanation of why this capability statement is needed and why it has been designed as it has." )
7091    protected MarkdownType purpose;
7092
7093    /**
7094     * A copyright statement relating to the capability statement and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the capability statement.
7095     */
7096    @Child(name = "copyright", type = {MarkdownType.class}, order=15, min=0, max=1, modifier=false, summary=false)
7097    @Description(shortDefinition="Use and/or publishing restrictions", formalDefinition="A copyright statement relating to the capability statement and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the capability statement." )
7098    protected MarkdownType copyright;
7099
7100    /**
7101     * A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').
7102     */
7103    @Child(name = "copyrightLabel", type = {StringType.class}, order=16, min=0, max=1, modifier=false, summary=false)
7104    @Description(shortDefinition="Copyright holder and year(s)", formalDefinition="A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved')." )
7105    protected StringType copyrightLabel;
7106
7107    /**
7108     * 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).
7109     */
7110    @Child(name = "kind", type = {CodeType.class}, order=17, min=1, max=1, modifier=false, summary=true)
7111    @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)." )
7112    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/capability-statement-kind")
7113    protected Enumeration<CapabilityStatementKind> kind;
7114
7115    /**
7116     * Reference to a canonical URL of another CapabilityStatement that this software implements. This capability statement is a published API description that corresponds to a business service. The server may actually implement a subset of the capability statement it claims to implement, so the capability statement must specify the full capability details.
7117     */
7118    @Child(name = "instantiates", type = {CanonicalType.class}, order=18, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7119    @Description(shortDefinition="Canonical URL of another capability statement this implements", formalDefinition="Reference to a canonical URL of another CapabilityStatement that this software implements. This capability statement is a published API description that corresponds to a business service. The server may actually implement a subset of the capability statement it claims to implement, so the capability statement must specify the full capability details." )
7120    protected List<CanonicalType> instantiates;
7121
7122    /**
7123     * Reference to a canonical URL of another CapabilityStatement that this software adds to. The capability statement automatically includes everything in the other statement, and it is not duplicated, though the server may repeat the same resources, interactions and operations to add additional details to them.
7124     */
7125    @Child(name = "imports", type = {CanonicalType.class}, order=19, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7126    @Description(shortDefinition="Canonical URL of another capability statement this adds to", formalDefinition="Reference to a canonical URL of another CapabilityStatement that this software adds to. The capability statement automatically includes everything in the other statement, and it is not duplicated, though the server may repeat the same resources, interactions and operations to add additional details to them." )
7127    protected List<CanonicalType> imports;
7128
7129    /**
7130     * Software that is covered by this capability statement.  It is used when the capability statement describes the capabilities of a particular software version, independent of an installation.
7131     */
7132    @Child(name = "software", type = {}, order=20, min=0, max=1, modifier=false, summary=true)
7133    @Description(shortDefinition="Software that is covered by this capability statement", formalDefinition="Software that is covered by this capability statement.  It is used when the capability statement describes the capabilities of a particular software version, independent of an installation." )
7134    protected CapabilityStatementSoftwareComponent software;
7135
7136    /**
7137     * Identifies a specific implementation instance that is described by the capability statement - i.e. a particular installation, rather than the capabilities of a software program.
7138     */
7139    @Child(name = "implementation", type = {}, order=21, min=0, max=1, modifier=false, summary=true)
7140    @Description(shortDefinition="If this describes a specific instance", formalDefinition="Identifies a specific implementation instance that is described by the capability statement - i.e. a particular installation, rather than the capabilities of a software program." )
7141    protected CapabilityStatementImplementationComponent implementation;
7142
7143    /**
7144     * The version of the FHIR specification that this CapabilityStatement describes (which SHALL be the same as the FHIR version of the CapabilityStatement itself). There is no default value.
7145     */
7146    @Child(name = "fhirVersion", type = {CodeType.class}, order=22, min=1, max=1, modifier=false, summary=true)
7147    @Description(shortDefinition="FHIR Version the system supports", formalDefinition="The version of the FHIR specification that this CapabilityStatement describes (which SHALL be the same as the FHIR version of the CapabilityStatement itself). There is no default value." )
7148    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/FHIR-version")
7149    protected Enumeration<FHIRVersion> fhirVersion;
7150
7151    /**
7152     * A list of the formats supported by this implementation using their content types.
7153     */
7154    @Child(name = "format", type = {CodeType.class}, order=23, min=1, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7155    @Description(shortDefinition="formats supported (xml | json | ttl | mime type)", formalDefinition="A list of the formats supported by this implementation using their content types." )
7156    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/mimetypes")
7157    protected List<CodeType> format;
7158
7159    /**
7160     * A list of the patch formats supported by this implementation using their content types.
7161     */
7162    @Child(name = "patchFormat", type = {CodeType.class}, order=24, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7163    @Description(shortDefinition="Patch formats supported", formalDefinition="A list of the patch formats supported by this implementation using their content types." )
7164    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/mimetypes")
7165    protected List<CodeType> patchFormat;
7166
7167    /**
7168     * A list of the languages supported by this implementation that are usefully supported in the ```Accept-Language``` header.
7169     */
7170    @Child(name = "acceptLanguage", type = {CodeType.class}, order=25, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7171    @Description(shortDefinition="Languages supported", formalDefinition="A list of the languages supported by this implementation that are usefully supported in the ```Accept-Language``` header." )
7172    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/all-languages")
7173    protected List<CodeType> acceptLanguage;
7174
7175    /**
7176     * A list of implementation guides that the server does (or should) support in their entirety.
7177     */
7178    @Child(name = "implementationGuide", type = {CanonicalType.class}, order=26, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7179    @Description(shortDefinition="Implementation guides supported", formalDefinition="A list of implementation guides that the server does (or should) support in their entirety." )
7180    protected List<CanonicalType> implementationGuide;
7181
7182    /**
7183     * A definition of the restful capabilities of the solution, if any.
7184     */
7185    @Child(name = "rest", type = {}, order=27, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7186    @Description(shortDefinition="If the endpoint is a RESTful one", formalDefinition="A definition of the restful capabilities of the solution, if any." )
7187    protected List<CapabilityStatementRestComponent> rest;
7188
7189    /**
7190     * A description of the messaging capabilities of the solution.
7191     */
7192    @Child(name = "messaging", type = {}, order=28, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7193    @Description(shortDefinition="If messaging is supported", formalDefinition="A description of the messaging capabilities of the solution." )
7194    protected List<CapabilityStatementMessagingComponent> messaging;
7195
7196    /**
7197     * A document definition.
7198     */
7199    @Child(name = "document", type = {}, order=29, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
7200    @Description(shortDefinition="Document definition", formalDefinition="A document definition." )
7201    protected List<CapabilityStatementDocumentComponent> document;
7202
7203    private static final long serialVersionUID = -1432396321L;
7204
7205  /**
7206   * Constructor
7207   */
7208    public CapabilityStatement() {
7209      super();
7210    }
7211
7212  /**
7213   * Constructor
7214   */
7215    public CapabilityStatement(PublicationStatus status, Date date, CapabilityStatementKind kind, FHIRVersion fhirVersion, String format) {
7216      super();
7217      this.setStatus(status);
7218      this.setDate(date);
7219      this.setKind(kind);
7220      this.setFhirVersion(fhirVersion);
7221      this.addFormat(format);
7222    }
7223
7224    /**
7225     * @return {@link #url} (An absolute URI that is used to identify this capability statement 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 an authoritative instance of this capability statement is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the capability statement is stored on different servers.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
7226     */
7227    public UriType getUrlElement() { 
7228      if (this.url == null)
7229        if (Configuration.errorOnAutoCreate())
7230          throw new Error("Attempt to auto-create CapabilityStatement.url");
7231        else if (Configuration.doAutoCreate())
7232          this.url = new UriType(); // bb
7233      return this.url;
7234    }
7235
7236    public boolean hasUrlElement() { 
7237      return this.url != null && !this.url.isEmpty();
7238    }
7239
7240    public boolean hasUrl() { 
7241      return this.url != null && !this.url.isEmpty();
7242    }
7243
7244    /**
7245     * @param value {@link #url} (An absolute URI that is used to identify this capability statement 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 an authoritative instance of this capability statement is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the capability statement is stored on different servers.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
7246     */
7247    public CapabilityStatement setUrlElement(UriType value) { 
7248      this.url = value;
7249      return this;
7250    }
7251
7252    /**
7253     * @return An absolute URI that is used to identify this capability statement 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 an authoritative instance of this capability statement is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the capability statement is stored on different servers.
7254     */
7255    public String getUrl() { 
7256      return this.url == null ? null : this.url.getValue();
7257    }
7258
7259    /**
7260     * @param value An absolute URI that is used to identify this capability statement 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 an authoritative instance of this capability statement is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the capability statement is stored on different servers.
7261     */
7262    public CapabilityStatement setUrl(String value) { 
7263      if (Utilities.noString(value))
7264        this.url = null;
7265      else {
7266        if (this.url == null)
7267          this.url = new UriType();
7268        this.url.setValue(value);
7269      }
7270      return this;
7271    }
7272
7273    /**
7274     * @return {@link #identifier} (A formal identifier that is used to identify this CapabilityStatement when it is represented in other formats, or referenced in a specification, model, design or an instance.)
7275     */
7276    public List<Identifier> getIdentifier() { 
7277      if (this.identifier == null)
7278        this.identifier = new ArrayList<Identifier>();
7279      return this.identifier;
7280    }
7281
7282    /**
7283     * @return Returns a reference to <code>this</code> for easy method chaining
7284     */
7285    public CapabilityStatement setIdentifier(List<Identifier> theIdentifier) { 
7286      this.identifier = theIdentifier;
7287      return this;
7288    }
7289
7290    public boolean hasIdentifier() { 
7291      if (this.identifier == null)
7292        return false;
7293      for (Identifier item : this.identifier)
7294        if (!item.isEmpty())
7295          return true;
7296      return false;
7297    }
7298
7299    public Identifier addIdentifier() { //3
7300      Identifier t = new Identifier();
7301      if (this.identifier == null)
7302        this.identifier = new ArrayList<Identifier>();
7303      this.identifier.add(t);
7304      return t;
7305    }
7306
7307    public CapabilityStatement addIdentifier(Identifier t) { //3
7308      if (t == null)
7309        return this;
7310      if (this.identifier == null)
7311        this.identifier = new ArrayList<Identifier>();
7312      this.identifier.add(t);
7313      return this;
7314    }
7315
7316    /**
7317     * @return The first repetition of repeating field {@link #identifier}, creating it if it does not already exist {3}
7318     */
7319    public Identifier getIdentifierFirstRep() { 
7320      if (getIdentifier().isEmpty()) {
7321        addIdentifier();
7322      }
7323      return getIdentifier().get(0);
7324    }
7325
7326    /**
7327     * @return {@link #version} (The identifier that is used to identify this version of the capability statement when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the capability statement 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
7328     */
7329    public StringType getVersionElement() { 
7330      if (this.version == null)
7331        if (Configuration.errorOnAutoCreate())
7332          throw new Error("Attempt to auto-create CapabilityStatement.version");
7333        else if (Configuration.doAutoCreate())
7334          this.version = new StringType(); // bb
7335      return this.version;
7336    }
7337
7338    public boolean hasVersionElement() { 
7339      return this.version != null && !this.version.isEmpty();
7340    }
7341
7342    public boolean hasVersion() { 
7343      return this.version != null && !this.version.isEmpty();
7344    }
7345
7346    /**
7347     * @param value {@link #version} (The identifier that is used to identify this version of the capability statement when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the capability statement 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
7348     */
7349    public CapabilityStatement setVersionElement(StringType value) { 
7350      this.version = value;
7351      return this;
7352    }
7353
7354    /**
7355     * @return The identifier that is used to identify this version of the capability statement when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the capability statement 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.
7356     */
7357    public String getVersion() { 
7358      return this.version == null ? null : this.version.getValue();
7359    }
7360
7361    /**
7362     * @param value The identifier that is used to identify this version of the capability statement when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the capability statement 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.
7363     */
7364    public CapabilityStatement setVersion(String value) { 
7365      if (Utilities.noString(value))
7366        this.version = null;
7367      else {
7368        if (this.version == null)
7369          this.version = new StringType();
7370        this.version.setValue(value);
7371      }
7372      return this;
7373    }
7374
7375    /**
7376     * @return {@link #versionAlgorithm} (Indicates the mechanism used to compare versions to determine which is more current.)
7377     */
7378    public DataType getVersionAlgorithm() { 
7379      return this.versionAlgorithm;
7380    }
7381
7382    /**
7383     * @return {@link #versionAlgorithm} (Indicates the mechanism used to compare versions to determine which is more current.)
7384     */
7385    public StringType getVersionAlgorithmStringType() throws FHIRException { 
7386      if (this.versionAlgorithm == null)
7387        this.versionAlgorithm = new StringType();
7388      if (!(this.versionAlgorithm instanceof StringType))
7389        throw new FHIRException("Type mismatch: the type StringType was expected, but "+this.versionAlgorithm.getClass().getName()+" was encountered");
7390      return (StringType) this.versionAlgorithm;
7391    }
7392
7393    public boolean hasVersionAlgorithmStringType() { 
7394      return this != null && this.versionAlgorithm instanceof StringType;
7395    }
7396
7397    /**
7398     * @return {@link #versionAlgorithm} (Indicates the mechanism used to compare versions to determine which is more current.)
7399     */
7400    public Coding getVersionAlgorithmCoding() throws FHIRException { 
7401      if (this.versionAlgorithm == null)
7402        this.versionAlgorithm = new Coding();
7403      if (!(this.versionAlgorithm instanceof Coding))
7404        throw new FHIRException("Type mismatch: the type Coding was expected, but "+this.versionAlgorithm.getClass().getName()+" was encountered");
7405      return (Coding) this.versionAlgorithm;
7406    }
7407
7408    public boolean hasVersionAlgorithmCoding() { 
7409      return this != null && this.versionAlgorithm instanceof Coding;
7410    }
7411
7412    public boolean hasVersionAlgorithm() { 
7413      return this.versionAlgorithm != null && !this.versionAlgorithm.isEmpty();
7414    }
7415
7416    /**
7417     * @param value {@link #versionAlgorithm} (Indicates the mechanism used to compare versions to determine which is more current.)
7418     */
7419    public CapabilityStatement setVersionAlgorithm(DataType value) { 
7420      if (value != null && !(value instanceof StringType || value instanceof Coding))
7421        throw new FHIRException("Not the right type for CapabilityStatement.versionAlgorithm[x]: "+value.fhirType());
7422      this.versionAlgorithm = value;
7423      return this;
7424    }
7425
7426    /**
7427     * @return {@link #name} (A natural language name identifying the capability statement. 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
7428     */
7429    public StringType getNameElement() { 
7430      if (this.name == null)
7431        if (Configuration.errorOnAutoCreate())
7432          throw new Error("Attempt to auto-create CapabilityStatement.name");
7433        else if (Configuration.doAutoCreate())
7434          this.name = new StringType(); // bb
7435      return this.name;
7436    }
7437
7438    public boolean hasNameElement() { 
7439      return this.name != null && !this.name.isEmpty();
7440    }
7441
7442    public boolean hasName() { 
7443      return this.name != null && !this.name.isEmpty();
7444    }
7445
7446    /**
7447     * @param value {@link #name} (A natural language name identifying the capability statement. 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
7448     */
7449    public CapabilityStatement setNameElement(StringType value) { 
7450      this.name = value;
7451      return this;
7452    }
7453
7454    /**
7455     * @return A natural language name identifying the capability statement. This name should be usable as an identifier for the module by machine processing applications such as code generation.
7456     */
7457    public String getName() { 
7458      return this.name == null ? null : this.name.getValue();
7459    }
7460
7461    /**
7462     * @param value A natural language name identifying the capability statement. This name should be usable as an identifier for the module by machine processing applications such as code generation.
7463     */
7464    public CapabilityStatement setName(String value) { 
7465      if (Utilities.noString(value))
7466        this.name = null;
7467      else {
7468        if (this.name == null)
7469          this.name = new StringType();
7470        this.name.setValue(value);
7471      }
7472      return this;
7473    }
7474
7475    /**
7476     * @return {@link #title} (A short, descriptive, user-friendly title for the capability statement.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
7477     */
7478    public StringType getTitleElement() { 
7479      if (this.title == null)
7480        if (Configuration.errorOnAutoCreate())
7481          throw new Error("Attempt to auto-create CapabilityStatement.title");
7482        else if (Configuration.doAutoCreate())
7483          this.title = new StringType(); // bb
7484      return this.title;
7485    }
7486
7487    public boolean hasTitleElement() { 
7488      return this.title != null && !this.title.isEmpty();
7489    }
7490
7491    public boolean hasTitle() { 
7492      return this.title != null && !this.title.isEmpty();
7493    }
7494
7495    /**
7496     * @param value {@link #title} (A short, descriptive, user-friendly title for the capability statement.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
7497     */
7498    public CapabilityStatement setTitleElement(StringType value) { 
7499      this.title = value;
7500      return this;
7501    }
7502
7503    /**
7504     * @return A short, descriptive, user-friendly title for the capability statement.
7505     */
7506    public String getTitle() { 
7507      return this.title == null ? null : this.title.getValue();
7508    }
7509
7510    /**
7511     * @param value A short, descriptive, user-friendly title for the capability statement.
7512     */
7513    public CapabilityStatement setTitle(String value) { 
7514      if (Utilities.noString(value))
7515        this.title = null;
7516      else {
7517        if (this.title == null)
7518          this.title = new StringType();
7519        this.title.setValue(value);
7520      }
7521      return this;
7522    }
7523
7524    /**
7525     * @return {@link #status} (The status of this capability statement. 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
7526     */
7527    public Enumeration<PublicationStatus> getStatusElement() { 
7528      if (this.status == null)
7529        if (Configuration.errorOnAutoCreate())
7530          throw new Error("Attempt to auto-create CapabilityStatement.status");
7531        else if (Configuration.doAutoCreate())
7532          this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory()); // bb
7533      return this.status;
7534    }
7535
7536    public boolean hasStatusElement() { 
7537      return this.status != null && !this.status.isEmpty();
7538    }
7539
7540    public boolean hasStatus() { 
7541      return this.status != null && !this.status.isEmpty();
7542    }
7543
7544    /**
7545     * @param value {@link #status} (The status of this capability statement. 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
7546     */
7547    public CapabilityStatement setStatusElement(Enumeration<PublicationStatus> value) { 
7548      this.status = value;
7549      return this;
7550    }
7551
7552    /**
7553     * @return The status of this capability statement. Enables tracking the life-cycle of the content.
7554     */
7555    public PublicationStatus getStatus() { 
7556      return this.status == null ? null : this.status.getValue();
7557    }
7558
7559    /**
7560     * @param value The status of this capability statement. Enables tracking the life-cycle of the content.
7561     */
7562    public CapabilityStatement setStatus(PublicationStatus value) { 
7563        if (this.status == null)
7564          this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory());
7565        this.status.setValue(value);
7566      return this;
7567    }
7568
7569    /**
7570     * @return {@link #experimental} (A Boolean value to indicate that this capability statement 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
7571     */
7572    public BooleanType getExperimentalElement() { 
7573      if (this.experimental == null)
7574        if (Configuration.errorOnAutoCreate())
7575          throw new Error("Attempt to auto-create CapabilityStatement.experimental");
7576        else if (Configuration.doAutoCreate())
7577          this.experimental = new BooleanType(); // bb
7578      return this.experimental;
7579    }
7580
7581    public boolean hasExperimentalElement() { 
7582      return this.experimental != null && !this.experimental.isEmpty();
7583    }
7584
7585    public boolean hasExperimental() { 
7586      return this.experimental != null && !this.experimental.isEmpty();
7587    }
7588
7589    /**
7590     * @param value {@link #experimental} (A Boolean value to indicate that this capability statement 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
7591     */
7592    public CapabilityStatement setExperimentalElement(BooleanType value) { 
7593      this.experimental = value;
7594      return this;
7595    }
7596
7597    /**
7598     * @return A Boolean value to indicate that this capability statement is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.
7599     */
7600    public boolean getExperimental() { 
7601      return this.experimental == null || this.experimental.isEmpty() ? false : this.experimental.getValue();
7602    }
7603
7604    /**
7605     * @param value A Boolean value to indicate that this capability statement is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.
7606     */
7607    public CapabilityStatement setExperimental(boolean value) { 
7608        if (this.experimental == null)
7609          this.experimental = new BooleanType();
7610        this.experimental.setValue(value);
7611      return this;
7612    }
7613
7614    /**
7615     * @return {@link #date} (The date  (and optionally time) when the capability statement was last significantly changed. 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 capability statement changes.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
7616     */
7617    public DateTimeType getDateElement() { 
7618      if (this.date == null)
7619        if (Configuration.errorOnAutoCreate())
7620          throw new Error("Attempt to auto-create CapabilityStatement.date");
7621        else if (Configuration.doAutoCreate())
7622          this.date = new DateTimeType(); // bb
7623      return this.date;
7624    }
7625
7626    public boolean hasDateElement() { 
7627      return this.date != null && !this.date.isEmpty();
7628    }
7629
7630    public boolean hasDate() { 
7631      return this.date != null && !this.date.isEmpty();
7632    }
7633
7634    /**
7635     * @param value {@link #date} (The date  (and optionally time) when the capability statement was last significantly changed. 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 capability statement changes.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
7636     */
7637    public CapabilityStatement setDateElement(DateTimeType value) { 
7638      this.date = value;
7639      return this;
7640    }
7641
7642    /**
7643     * @return The date  (and optionally time) when the capability statement was last significantly changed. 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 capability statement changes.
7644     */
7645    public Date getDate() { 
7646      return this.date == null ? null : this.date.getValue();
7647    }
7648
7649    /**
7650     * @param value The date  (and optionally time) when the capability statement was last significantly changed. 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 capability statement changes.
7651     */
7652    public CapabilityStatement setDate(Date value) { 
7653        if (this.date == null)
7654          this.date = new DateTimeType();
7655        this.date.setValue(value);
7656      return this;
7657    }
7658
7659    /**
7660     * @return {@link #publisher} (The name of the organization or individual responsible for the release and ongoing maintenance of the capability statement.). This is the underlying object with id, value and extensions. The accessor "getPublisher" gives direct access to the value
7661     */
7662    public StringType getPublisherElement() { 
7663      if (this.publisher == null)
7664        if (Configuration.errorOnAutoCreate())
7665          throw new Error("Attempt to auto-create CapabilityStatement.publisher");
7666        else if (Configuration.doAutoCreate())
7667          this.publisher = new StringType(); // bb
7668      return this.publisher;
7669    }
7670
7671    public boolean hasPublisherElement() { 
7672      return this.publisher != null && !this.publisher.isEmpty();
7673    }
7674
7675    public boolean hasPublisher() { 
7676      return this.publisher != null && !this.publisher.isEmpty();
7677    }
7678
7679    /**
7680     * @param value {@link #publisher} (The name of the organization or individual responsible for the release and ongoing maintenance of the capability statement.). This is the underlying object with id, value and extensions. The accessor "getPublisher" gives direct access to the value
7681     */
7682    public CapabilityStatement setPublisherElement(StringType value) { 
7683      this.publisher = value;
7684      return this;
7685    }
7686
7687    /**
7688     * @return The name of the organization or individual responsible for the release and ongoing maintenance of the capability statement.
7689     */
7690    public String getPublisher() { 
7691      return this.publisher == null ? null : this.publisher.getValue();
7692    }
7693
7694    /**
7695     * @param value The name of the organization or individual responsible for the release and ongoing maintenance of the capability statement.
7696     */
7697    public CapabilityStatement setPublisher(String value) { 
7698      if (Utilities.noString(value))
7699        this.publisher = null;
7700      else {
7701        if (this.publisher == null)
7702          this.publisher = new StringType();
7703        this.publisher.setValue(value);
7704      }
7705      return this;
7706    }
7707
7708    /**
7709     * @return {@link #contact} (Contact details to assist a user in finding and communicating with the publisher.)
7710     */
7711    public List<ContactDetail> getContact() { 
7712      if (this.contact == null)
7713        this.contact = new ArrayList<ContactDetail>();
7714      return this.contact;
7715    }
7716
7717    /**
7718     * @return Returns a reference to <code>this</code> for easy method chaining
7719     */
7720    public CapabilityStatement setContact(List<ContactDetail> theContact) { 
7721      this.contact = theContact;
7722      return this;
7723    }
7724
7725    public boolean hasContact() { 
7726      if (this.contact == null)
7727        return false;
7728      for (ContactDetail item : this.contact)
7729        if (!item.isEmpty())
7730          return true;
7731      return false;
7732    }
7733
7734    public ContactDetail addContact() { //3
7735      ContactDetail t = new ContactDetail();
7736      if (this.contact == null)
7737        this.contact = new ArrayList<ContactDetail>();
7738      this.contact.add(t);
7739      return t;
7740    }
7741
7742    public CapabilityStatement addContact(ContactDetail t) { //3
7743      if (t == null)
7744        return this;
7745      if (this.contact == null)
7746        this.contact = new ArrayList<ContactDetail>();
7747      this.contact.add(t);
7748      return this;
7749    }
7750
7751    /**
7752     * @return The first repetition of repeating field {@link #contact}, creating it if it does not already exist {3}
7753     */
7754    public ContactDetail getContactFirstRep() { 
7755      if (getContact().isEmpty()) {
7756        addContact();
7757      }
7758      return getContact().get(0);
7759    }
7760
7761    /**
7762     * @return {@link #description} (A free text natural language description of the capability statement 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
7763     */
7764    public MarkdownType getDescriptionElement() { 
7765      if (this.description == null)
7766        if (Configuration.errorOnAutoCreate())
7767          throw new Error("Attempt to auto-create CapabilityStatement.description");
7768        else if (Configuration.doAutoCreate())
7769          this.description = new MarkdownType(); // bb
7770      return this.description;
7771    }
7772
7773    public boolean hasDescriptionElement() { 
7774      return this.description != null && !this.description.isEmpty();
7775    }
7776
7777    public boolean hasDescription() { 
7778      return this.description != null && !this.description.isEmpty();
7779    }
7780
7781    /**
7782     * @param value {@link #description} (A free text natural language description of the capability statement 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
7783     */
7784    public CapabilityStatement setDescriptionElement(MarkdownType value) { 
7785      this.description = value;
7786      return this;
7787    }
7788
7789    /**
7790     * @return A free text natural language description of the capability statement 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.
7791     */
7792    public String getDescription() { 
7793      return this.description == null ? null : this.description.getValue();
7794    }
7795
7796    /**
7797     * @param value A free text natural language description of the capability statement 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.
7798     */
7799    public CapabilityStatement setDescription(String value) { 
7800      if (Utilities.noString(value))
7801        this.description = null;
7802      else {
7803        if (this.description == null)
7804          this.description = new MarkdownType();
7805        this.description.setValue(value);
7806      }
7807      return this;
7808    }
7809
7810    /**
7811     * @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 capability statement instances.)
7812     */
7813    public List<UsageContext> getUseContext() { 
7814      if (this.useContext == null)
7815        this.useContext = new ArrayList<UsageContext>();
7816      return this.useContext;
7817    }
7818
7819    /**
7820     * @return Returns a reference to <code>this</code> for easy method chaining
7821     */
7822    public CapabilityStatement setUseContext(List<UsageContext> theUseContext) { 
7823      this.useContext = theUseContext;
7824      return this;
7825    }
7826
7827    public boolean hasUseContext() { 
7828      if (this.useContext == null)
7829        return false;
7830      for (UsageContext item : this.useContext)
7831        if (!item.isEmpty())
7832          return true;
7833      return false;
7834    }
7835
7836    public UsageContext addUseContext() { //3
7837      UsageContext t = new UsageContext();
7838      if (this.useContext == null)
7839        this.useContext = new ArrayList<UsageContext>();
7840      this.useContext.add(t);
7841      return t;
7842    }
7843
7844    public CapabilityStatement addUseContext(UsageContext t) { //3
7845      if (t == null)
7846        return this;
7847      if (this.useContext == null)
7848        this.useContext = new ArrayList<UsageContext>();
7849      this.useContext.add(t);
7850      return this;
7851    }
7852
7853    /**
7854     * @return The first repetition of repeating field {@link #useContext}, creating it if it does not already exist {3}
7855     */
7856    public UsageContext getUseContextFirstRep() { 
7857      if (getUseContext().isEmpty()) {
7858        addUseContext();
7859      }
7860      return getUseContext().get(0);
7861    }
7862
7863    /**
7864     * @return {@link #jurisdiction} (A legal or geographic region in which the capability statement is intended to be used.)
7865     */
7866    public List<CodeableConcept> getJurisdiction() { 
7867      if (this.jurisdiction == null)
7868        this.jurisdiction = new ArrayList<CodeableConcept>();
7869      return this.jurisdiction;
7870    }
7871
7872    /**
7873     * @return Returns a reference to <code>this</code> for easy method chaining
7874     */
7875    public CapabilityStatement setJurisdiction(List<CodeableConcept> theJurisdiction) { 
7876      this.jurisdiction = theJurisdiction;
7877      return this;
7878    }
7879
7880    public boolean hasJurisdiction() { 
7881      if (this.jurisdiction == null)
7882        return false;
7883      for (CodeableConcept item : this.jurisdiction)
7884        if (!item.isEmpty())
7885          return true;
7886      return false;
7887    }
7888
7889    public CodeableConcept addJurisdiction() { //3
7890      CodeableConcept t = new CodeableConcept();
7891      if (this.jurisdiction == null)
7892        this.jurisdiction = new ArrayList<CodeableConcept>();
7893      this.jurisdiction.add(t);
7894      return t;
7895    }
7896
7897    public CapabilityStatement addJurisdiction(CodeableConcept t) { //3
7898      if (t == null)
7899        return this;
7900      if (this.jurisdiction == null)
7901        this.jurisdiction = new ArrayList<CodeableConcept>();
7902      this.jurisdiction.add(t);
7903      return this;
7904    }
7905
7906    /**
7907     * @return The first repetition of repeating field {@link #jurisdiction}, creating it if it does not already exist {3}
7908     */
7909    public CodeableConcept getJurisdictionFirstRep() { 
7910      if (getJurisdiction().isEmpty()) {
7911        addJurisdiction();
7912      }
7913      return getJurisdiction().get(0);
7914    }
7915
7916    /**
7917     * @return {@link #purpose} (Explanation of why this capability statement 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
7918     */
7919    public MarkdownType getPurposeElement() { 
7920      if (this.purpose == null)
7921        if (Configuration.errorOnAutoCreate())
7922          throw new Error("Attempt to auto-create CapabilityStatement.purpose");
7923        else if (Configuration.doAutoCreate())
7924          this.purpose = new MarkdownType(); // bb
7925      return this.purpose;
7926    }
7927
7928    public boolean hasPurposeElement() { 
7929      return this.purpose != null && !this.purpose.isEmpty();
7930    }
7931
7932    public boolean hasPurpose() { 
7933      return this.purpose != null && !this.purpose.isEmpty();
7934    }
7935
7936    /**
7937     * @param value {@link #purpose} (Explanation of why this capability statement 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
7938     */
7939    public CapabilityStatement setPurposeElement(MarkdownType value) { 
7940      this.purpose = value;
7941      return this;
7942    }
7943
7944    /**
7945     * @return Explanation of why this capability statement is needed and why it has been designed as it has.
7946     */
7947    public String getPurpose() { 
7948      return this.purpose == null ? null : this.purpose.getValue();
7949    }
7950
7951    /**
7952     * @param value Explanation of why this capability statement is needed and why it has been designed as it has.
7953     */
7954    public CapabilityStatement setPurpose(String value) { 
7955      if (Utilities.noString(value))
7956        this.purpose = null;
7957      else {
7958        if (this.purpose == null)
7959          this.purpose = new MarkdownType();
7960        this.purpose.setValue(value);
7961      }
7962      return this;
7963    }
7964
7965    /**
7966     * @return {@link #copyright} (A copyright statement relating to the capability statement and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the capability statement.). This is the underlying object with id, value and extensions. The accessor "getCopyright" gives direct access to the value
7967     */
7968    public MarkdownType getCopyrightElement() { 
7969      if (this.copyright == null)
7970        if (Configuration.errorOnAutoCreate())
7971          throw new Error("Attempt to auto-create CapabilityStatement.copyright");
7972        else if (Configuration.doAutoCreate())
7973          this.copyright = new MarkdownType(); // bb
7974      return this.copyright;
7975    }
7976
7977    public boolean hasCopyrightElement() { 
7978      return this.copyright != null && !this.copyright.isEmpty();
7979    }
7980
7981    public boolean hasCopyright() { 
7982      return this.copyright != null && !this.copyright.isEmpty();
7983    }
7984
7985    /**
7986     * @param value {@link #copyright} (A copyright statement relating to the capability statement and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the capability statement.). This is the underlying object with id, value and extensions. The accessor "getCopyright" gives direct access to the value
7987     */
7988    public CapabilityStatement setCopyrightElement(MarkdownType value) { 
7989      this.copyright = value;
7990      return this;
7991    }
7992
7993    /**
7994     * @return A copyright statement relating to the capability statement and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the capability statement.
7995     */
7996    public String getCopyright() { 
7997      return this.copyright == null ? null : this.copyright.getValue();
7998    }
7999
8000    /**
8001     * @param value A copyright statement relating to the capability statement and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the capability statement.
8002     */
8003    public CapabilityStatement setCopyright(String value) { 
8004      if (Utilities.noString(value))
8005        this.copyright = null;
8006      else {
8007        if (this.copyright == null)
8008          this.copyright = new MarkdownType();
8009        this.copyright.setValue(value);
8010      }
8011      return this;
8012    }
8013
8014    /**
8015     * @return {@link #copyrightLabel} (A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').). This is the underlying object with id, value and extensions. The accessor "getCopyrightLabel" gives direct access to the value
8016     */
8017    public StringType getCopyrightLabelElement() { 
8018      if (this.copyrightLabel == null)
8019        if (Configuration.errorOnAutoCreate())
8020          throw new Error("Attempt to auto-create CapabilityStatement.copyrightLabel");
8021        else if (Configuration.doAutoCreate())
8022          this.copyrightLabel = new StringType(); // bb
8023      return this.copyrightLabel;
8024    }
8025
8026    public boolean hasCopyrightLabelElement() { 
8027      return this.copyrightLabel != null && !this.copyrightLabel.isEmpty();
8028    }
8029
8030    public boolean hasCopyrightLabel() { 
8031      return this.copyrightLabel != null && !this.copyrightLabel.isEmpty();
8032    }
8033
8034    /**
8035     * @param value {@link #copyrightLabel} (A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').). This is the underlying object with id, value and extensions. The accessor "getCopyrightLabel" gives direct access to the value
8036     */
8037    public CapabilityStatement setCopyrightLabelElement(StringType value) { 
8038      this.copyrightLabel = value;
8039      return this;
8040    }
8041
8042    /**
8043     * @return A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').
8044     */
8045    public String getCopyrightLabel() { 
8046      return this.copyrightLabel == null ? null : this.copyrightLabel.getValue();
8047    }
8048
8049    /**
8050     * @param value A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').
8051     */
8052    public CapabilityStatement setCopyrightLabel(String value) { 
8053      if (Utilities.noString(value))
8054        this.copyrightLabel = null;
8055      else {
8056        if (this.copyrightLabel == null)
8057          this.copyrightLabel = new StringType();
8058        this.copyrightLabel.setValue(value);
8059      }
8060      return this;
8061    }
8062
8063    /**
8064     * @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
8065     */
8066    public Enumeration<CapabilityStatementKind> getKindElement() { 
8067      if (this.kind == null)
8068        if (Configuration.errorOnAutoCreate())
8069          throw new Error("Attempt to auto-create CapabilityStatement.kind");
8070        else if (Configuration.doAutoCreate())
8071          this.kind = new Enumeration<CapabilityStatementKind>(new CapabilityStatementKindEnumFactory()); // bb
8072      return this.kind;
8073    }
8074
8075    public boolean hasKindElement() { 
8076      return this.kind != null && !this.kind.isEmpty();
8077    }
8078
8079    public boolean hasKind() { 
8080      return this.kind != null && !this.kind.isEmpty();
8081    }
8082
8083    /**
8084     * @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
8085     */
8086    public CapabilityStatement setKindElement(Enumeration<CapabilityStatementKind> value) { 
8087      this.kind = value;
8088      return this;
8089    }
8090
8091    /**
8092     * @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).
8093     */
8094    public CapabilityStatementKind getKind() { 
8095      return this.kind == null ? null : this.kind.getValue();
8096    }
8097
8098    /**
8099     * @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).
8100     */
8101    public CapabilityStatement setKind(CapabilityStatementKind value) { 
8102        if (this.kind == null)
8103          this.kind = new Enumeration<CapabilityStatementKind>(new CapabilityStatementKindEnumFactory());
8104        this.kind.setValue(value);
8105      return this;
8106    }
8107
8108    /**
8109     * @return {@link #instantiates} (Reference to a canonical URL of another CapabilityStatement that this software implements. This capability statement is a published API description that corresponds to a business service. The server may actually implement a subset of the capability statement it claims to implement, so the capability statement must specify the full capability details.)
8110     */
8111    public List<CanonicalType> getInstantiates() { 
8112      if (this.instantiates == null)
8113        this.instantiates = new ArrayList<CanonicalType>();
8114      return this.instantiates;
8115    }
8116
8117    /**
8118     * @return Returns a reference to <code>this</code> for easy method chaining
8119     */
8120    public CapabilityStatement setInstantiates(List<CanonicalType> theInstantiates) { 
8121      this.instantiates = theInstantiates;
8122      return this;
8123    }
8124
8125    public boolean hasInstantiates() { 
8126      if (this.instantiates == null)
8127        return false;
8128      for (CanonicalType item : this.instantiates)
8129        if (!item.isEmpty())
8130          return true;
8131      return false;
8132    }
8133
8134    /**
8135     * @return {@link #instantiates} (Reference to a canonical URL of another CapabilityStatement that this software implements. This capability statement is a published API description that corresponds to a business service. The server may actually implement a subset of the capability statement it claims to implement, so the capability statement must specify the full capability details.)
8136     */
8137    public CanonicalType addInstantiatesElement() {//2 
8138      CanonicalType t = new CanonicalType();
8139      if (this.instantiates == null)
8140        this.instantiates = new ArrayList<CanonicalType>();
8141      this.instantiates.add(t);
8142      return t;
8143    }
8144
8145    /**
8146     * @param value {@link #instantiates} (Reference to a canonical URL of another CapabilityStatement that this software implements. This capability statement is a published API description that corresponds to a business service. The server may actually implement a subset of the capability statement it claims to implement, so the capability statement must specify the full capability details.)
8147     */
8148    public CapabilityStatement addInstantiates(String value) { //1
8149      CanonicalType t = new CanonicalType();
8150      t.setValue(value);
8151      if (this.instantiates == null)
8152        this.instantiates = new ArrayList<CanonicalType>();
8153      this.instantiates.add(t);
8154      return this;
8155    }
8156
8157    /**
8158     * @param value {@link #instantiates} (Reference to a canonical URL of another CapabilityStatement that this software implements. This capability statement is a published API description that corresponds to a business service. The server may actually implement a subset of the capability statement it claims to implement, so the capability statement must specify the full capability details.)
8159     */
8160    public boolean hasInstantiates(String value) { 
8161      if (this.instantiates == null)
8162        return false;
8163      for (CanonicalType v : this.instantiates)
8164        if (v.getValue().equals(value)) // canonical
8165          return true;
8166      return false;
8167    }
8168
8169    /**
8170     * @return {@link #imports} (Reference to a canonical URL of another CapabilityStatement that this software adds to. The capability statement automatically includes everything in the other statement, and it is not duplicated, though the server may repeat the same resources, interactions and operations to add additional details to them.)
8171     */
8172    public List<CanonicalType> getImports() { 
8173      if (this.imports == null)
8174        this.imports = new ArrayList<CanonicalType>();
8175      return this.imports;
8176    }
8177
8178    /**
8179     * @return Returns a reference to <code>this</code> for easy method chaining
8180     */
8181    public CapabilityStatement setImports(List<CanonicalType> theImports) { 
8182      this.imports = theImports;
8183      return this;
8184    }
8185
8186    public boolean hasImports() { 
8187      if (this.imports == null)
8188        return false;
8189      for (CanonicalType item : this.imports)
8190        if (!item.isEmpty())
8191          return true;
8192      return false;
8193    }
8194
8195    /**
8196     * @return {@link #imports} (Reference to a canonical URL of another CapabilityStatement that this software adds to. The capability statement automatically includes everything in the other statement, and it is not duplicated, though the server may repeat the same resources, interactions and operations to add additional details to them.)
8197     */
8198    public CanonicalType addImportsElement() {//2 
8199      CanonicalType t = new CanonicalType();
8200      if (this.imports == null)
8201        this.imports = new ArrayList<CanonicalType>();
8202      this.imports.add(t);
8203      return t;
8204    }
8205
8206    /**
8207     * @param value {@link #imports} (Reference to a canonical URL of another CapabilityStatement that this software adds to. The capability statement automatically includes everything in the other statement, and it is not duplicated, though the server may repeat the same resources, interactions and operations to add additional details to them.)
8208     */
8209    public CapabilityStatement addImports(String value) { //1
8210      CanonicalType t = new CanonicalType();
8211      t.setValue(value);
8212      if (this.imports == null)
8213        this.imports = new ArrayList<CanonicalType>();
8214      this.imports.add(t);
8215      return this;
8216    }
8217
8218    /**
8219     * @param value {@link #imports} (Reference to a canonical URL of another CapabilityStatement that this software adds to. The capability statement automatically includes everything in the other statement, and it is not duplicated, though the server may repeat the same resources, interactions and operations to add additional details to them.)
8220     */
8221    public boolean hasImports(String value) { 
8222      if (this.imports == null)
8223        return false;
8224      for (CanonicalType v : this.imports)
8225        if (v.getValue().equals(value)) // canonical
8226          return true;
8227      return false;
8228    }
8229
8230    /**
8231     * @return {@link #software} (Software that is covered by this capability statement.  It is used when the capability statement describes the capabilities of a particular software version, independent of an installation.)
8232     */
8233    public CapabilityStatementSoftwareComponent getSoftware() { 
8234      if (this.software == null)
8235        if (Configuration.errorOnAutoCreate())
8236          throw new Error("Attempt to auto-create CapabilityStatement.software");
8237        else if (Configuration.doAutoCreate())
8238          this.software = new CapabilityStatementSoftwareComponent(); // cc
8239      return this.software;
8240    }
8241
8242    public boolean hasSoftware() { 
8243      return this.software != null && !this.software.isEmpty();
8244    }
8245
8246    /**
8247     * @param value {@link #software} (Software that is covered by this capability statement.  It is used when the capability statement describes the capabilities of a particular software version, independent of an installation.)
8248     */
8249    public CapabilityStatement setSoftware(CapabilityStatementSoftwareComponent value) { 
8250      this.software = value;
8251      return this;
8252    }
8253
8254    /**
8255     * @return {@link #implementation} (Identifies a specific implementation instance that is described by the capability statement - i.e. a particular installation, rather than the capabilities of a software program.)
8256     */
8257    public CapabilityStatementImplementationComponent getImplementation() { 
8258      if (this.implementation == null)
8259        if (Configuration.errorOnAutoCreate())
8260          throw new Error("Attempt to auto-create CapabilityStatement.implementation");
8261        else if (Configuration.doAutoCreate())
8262          this.implementation = new CapabilityStatementImplementationComponent(); // cc
8263      return this.implementation;
8264    }
8265
8266    public boolean hasImplementation() { 
8267      return this.implementation != null && !this.implementation.isEmpty();
8268    }
8269
8270    /**
8271     * @param value {@link #implementation} (Identifies a specific implementation instance that is described by the capability statement - i.e. a particular installation, rather than the capabilities of a software program.)
8272     */
8273    public CapabilityStatement setImplementation(CapabilityStatementImplementationComponent value) { 
8274      this.implementation = value;
8275      return this;
8276    }
8277
8278    /**
8279     * @return {@link #fhirVersion} (The version of the FHIR specification that this CapabilityStatement describes (which SHALL be the same as the FHIR version of the CapabilityStatement itself). There is no default value.). This is the underlying object with id, value and extensions. The accessor "getFhirVersion" gives direct access to the value
8280     */
8281    public Enumeration<FHIRVersion> getFhirVersionElement() { 
8282      if (this.fhirVersion == null)
8283        if (Configuration.errorOnAutoCreate())
8284          throw new Error("Attempt to auto-create CapabilityStatement.fhirVersion");
8285        else if (Configuration.doAutoCreate())
8286          this.fhirVersion = new Enumeration<FHIRVersion>(new FHIRVersionEnumFactory()); // bb
8287      return this.fhirVersion;
8288    }
8289
8290    public boolean hasFhirVersionElement() { 
8291      return this.fhirVersion != null && !this.fhirVersion.isEmpty();
8292    }
8293
8294    public boolean hasFhirVersion() { 
8295      return this.fhirVersion != null && !this.fhirVersion.isEmpty();
8296    }
8297
8298    /**
8299     * @param value {@link #fhirVersion} (The version of the FHIR specification that this CapabilityStatement describes (which SHALL be the same as the FHIR version of the CapabilityStatement itself). There is no default value.). This is the underlying object with id, value and extensions. The accessor "getFhirVersion" gives direct access to the value
8300     */
8301    public CapabilityStatement setFhirVersionElement(Enumeration<FHIRVersion> value) { 
8302      this.fhirVersion = value;
8303      return this;
8304    }
8305
8306    /**
8307     * @return The version of the FHIR specification that this CapabilityStatement describes (which SHALL be the same as the FHIR version of the CapabilityStatement itself). There is no default value.
8308     */
8309    public FHIRVersion getFhirVersion() { 
8310      return this.fhirVersion == null ? null : this.fhirVersion.getValue();
8311    }
8312
8313    /**
8314     * @param value The version of the FHIR specification that this CapabilityStatement describes (which SHALL be the same as the FHIR version of the CapabilityStatement itself). There is no default value.
8315     */
8316    public CapabilityStatement setFhirVersion(FHIRVersion value) { 
8317        if (this.fhirVersion == null)
8318          this.fhirVersion = new Enumeration<FHIRVersion>(new FHIRVersionEnumFactory());
8319        this.fhirVersion.setValue(value);
8320      return this;
8321    }
8322
8323    /**
8324     * @return {@link #format} (A list of the formats supported by this implementation using their content types.)
8325     */
8326    public List<CodeType> getFormat() { 
8327      if (this.format == null)
8328        this.format = new ArrayList<CodeType>();
8329      return this.format;
8330    }
8331
8332    /**
8333     * @return Returns a reference to <code>this</code> for easy method chaining
8334     */
8335    public CapabilityStatement setFormat(List<CodeType> theFormat) { 
8336      this.format = theFormat;
8337      return this;
8338    }
8339
8340    public boolean hasFormat() { 
8341      if (this.format == null)
8342        return false;
8343      for (CodeType item : this.format)
8344        if (!item.isEmpty())
8345          return true;
8346      return false;
8347    }
8348
8349    /**
8350     * @return {@link #format} (A list of the formats supported by this implementation using their content types.)
8351     */
8352    public CodeType addFormatElement() {//2 
8353      CodeType t = new CodeType();
8354      if (this.format == null)
8355        this.format = new ArrayList<CodeType>();
8356      this.format.add(t);
8357      return t;
8358    }
8359
8360    /**
8361     * @param value {@link #format} (A list of the formats supported by this implementation using their content types.)
8362     */
8363    public CapabilityStatement addFormat(String value) { //1
8364      CodeType t = new CodeType();
8365      t.setValue(value);
8366      if (this.format == null)
8367        this.format = new ArrayList<CodeType>();
8368      this.format.add(t);
8369      return this;
8370    }
8371
8372    /**
8373     * @param value {@link #format} (A list of the formats supported by this implementation using their content types.)
8374     */
8375    public boolean hasFormat(String value) { 
8376      if (this.format == null)
8377        return false;
8378      for (CodeType v : this.format)
8379        if (v.getValue().equals(value)) // code
8380          return true;
8381      return false;
8382    }
8383
8384    /**
8385     * @return {@link #patchFormat} (A list of the patch formats supported by this implementation using their content types.)
8386     */
8387    public List<CodeType> getPatchFormat() { 
8388      if (this.patchFormat == null)
8389        this.patchFormat = new ArrayList<CodeType>();
8390      return this.patchFormat;
8391    }
8392
8393    /**
8394     * @return Returns a reference to <code>this</code> for easy method chaining
8395     */
8396    public CapabilityStatement setPatchFormat(List<CodeType> thePatchFormat) { 
8397      this.patchFormat = thePatchFormat;
8398      return this;
8399    }
8400
8401    public boolean hasPatchFormat() { 
8402      if (this.patchFormat == null)
8403        return false;
8404      for (CodeType item : this.patchFormat)
8405        if (!item.isEmpty())
8406          return true;
8407      return false;
8408    }
8409
8410    /**
8411     * @return {@link #patchFormat} (A list of the patch formats supported by this implementation using their content types.)
8412     */
8413    public CodeType addPatchFormatElement() {//2 
8414      CodeType t = new CodeType();
8415      if (this.patchFormat == null)
8416        this.patchFormat = new ArrayList<CodeType>();
8417      this.patchFormat.add(t);
8418      return t;
8419    }
8420
8421    /**
8422     * @param value {@link #patchFormat} (A list of the patch formats supported by this implementation using their content types.)
8423     */
8424    public CapabilityStatement addPatchFormat(String value) { //1
8425      CodeType t = new CodeType();
8426      t.setValue(value);
8427      if (this.patchFormat == null)
8428        this.patchFormat = new ArrayList<CodeType>();
8429      this.patchFormat.add(t);
8430      return this;
8431    }
8432
8433    /**
8434     * @param value {@link #patchFormat} (A list of the patch formats supported by this implementation using their content types.)
8435     */
8436    public boolean hasPatchFormat(String value) { 
8437      if (this.patchFormat == null)
8438        return false;
8439      for (CodeType v : this.patchFormat)
8440        if (v.getValue().equals(value)) // code
8441          return true;
8442      return false;
8443    }
8444
8445    /**
8446     * @return {@link #acceptLanguage} (A list of the languages supported by this implementation that are usefully supported in the ```Accept-Language``` header.)
8447     */
8448    public List<CodeType> getAcceptLanguage() { 
8449      if (this.acceptLanguage == null)
8450        this.acceptLanguage = new ArrayList<CodeType>();
8451      return this.acceptLanguage;
8452    }
8453
8454    /**
8455     * @return Returns a reference to <code>this</code> for easy method chaining
8456     */
8457    public CapabilityStatement setAcceptLanguage(List<CodeType> theAcceptLanguage) { 
8458      this.acceptLanguage = theAcceptLanguage;
8459      return this;
8460    }
8461
8462    public boolean hasAcceptLanguage() { 
8463      if (this.acceptLanguage == null)
8464        return false;
8465      for (CodeType item : this.acceptLanguage)
8466        if (!item.isEmpty())
8467          return true;
8468      return false;
8469    }
8470
8471    /**
8472     * @return {@link #acceptLanguage} (A list of the languages supported by this implementation that are usefully supported in the ```Accept-Language``` header.)
8473     */
8474    public CodeType addAcceptLanguageElement() {//2 
8475      CodeType t = new CodeType();
8476      if (this.acceptLanguage == null)
8477        this.acceptLanguage = new ArrayList<CodeType>();
8478      this.acceptLanguage.add(t);
8479      return t;
8480    }
8481
8482    /**
8483     * @param value {@link #acceptLanguage} (A list of the languages supported by this implementation that are usefully supported in the ```Accept-Language``` header.)
8484     */
8485    public CapabilityStatement addAcceptLanguage(String value) { //1
8486      CodeType t = new CodeType();
8487      t.setValue(value);
8488      if (this.acceptLanguage == null)
8489        this.acceptLanguage = new ArrayList<CodeType>();
8490      this.acceptLanguage.add(t);
8491      return this;
8492    }
8493
8494    /**
8495     * @param value {@link #acceptLanguage} (A list of the languages supported by this implementation that are usefully supported in the ```Accept-Language``` header.)
8496     */
8497    public boolean hasAcceptLanguage(String value) { 
8498      if (this.acceptLanguage == null)
8499        return false;
8500      for (CodeType v : this.acceptLanguage)
8501        if (v.getValue().equals(value)) // code
8502          return true;
8503      return false;
8504    }
8505
8506    /**
8507     * @return {@link #implementationGuide} (A list of implementation guides that the server does (or should) support in their entirety.)
8508     */
8509    public List<CanonicalType> getImplementationGuide() { 
8510      if (this.implementationGuide == null)
8511        this.implementationGuide = new ArrayList<CanonicalType>();
8512      return this.implementationGuide;
8513    }
8514
8515    /**
8516     * @return Returns a reference to <code>this</code> for easy method chaining
8517     */
8518    public CapabilityStatement setImplementationGuide(List<CanonicalType> theImplementationGuide) { 
8519      this.implementationGuide = theImplementationGuide;
8520      return this;
8521    }
8522
8523    public boolean hasImplementationGuide() { 
8524      if (this.implementationGuide == null)
8525        return false;
8526      for (CanonicalType item : this.implementationGuide)
8527        if (!item.isEmpty())
8528          return true;
8529      return false;
8530    }
8531
8532    /**
8533     * @return {@link #implementationGuide} (A list of implementation guides that the server does (or should) support in their entirety.)
8534     */
8535    public CanonicalType addImplementationGuideElement() {//2 
8536      CanonicalType t = new CanonicalType();
8537      if (this.implementationGuide == null)
8538        this.implementationGuide = new ArrayList<CanonicalType>();
8539      this.implementationGuide.add(t);
8540      return t;
8541    }
8542
8543    /**
8544     * @param value {@link #implementationGuide} (A list of implementation guides that the server does (or should) support in their entirety.)
8545     */
8546    public CapabilityStatement addImplementationGuide(String value) { //1
8547      CanonicalType t = new CanonicalType();
8548      t.setValue(value);
8549      if (this.implementationGuide == null)
8550        this.implementationGuide = new ArrayList<CanonicalType>();
8551      this.implementationGuide.add(t);
8552      return this;
8553    }
8554
8555    /**
8556     * @param value {@link #implementationGuide} (A list of implementation guides that the server does (or should) support in their entirety.)
8557     */
8558    public boolean hasImplementationGuide(String value) { 
8559      if (this.implementationGuide == null)
8560        return false;
8561      for (CanonicalType v : this.implementationGuide)
8562        if (v.getValue().equals(value)) // canonical
8563          return true;
8564      return false;
8565    }
8566
8567    /**
8568     * @return {@link #rest} (A definition of the restful capabilities of the solution, if any.)
8569     */
8570    public List<CapabilityStatementRestComponent> getRest() { 
8571      if (this.rest == null)
8572        this.rest = new ArrayList<CapabilityStatementRestComponent>();
8573      return this.rest;
8574    }
8575
8576    /**
8577     * @return Returns a reference to <code>this</code> for easy method chaining
8578     */
8579    public CapabilityStatement setRest(List<CapabilityStatementRestComponent> theRest) { 
8580      this.rest = theRest;
8581      return this;
8582    }
8583
8584    public boolean hasRest() { 
8585      if (this.rest == null)
8586        return false;
8587      for (CapabilityStatementRestComponent item : this.rest)
8588        if (!item.isEmpty())
8589          return true;
8590      return false;
8591    }
8592
8593    public CapabilityStatementRestComponent addRest() { //3
8594      CapabilityStatementRestComponent t = new CapabilityStatementRestComponent();
8595      if (this.rest == null)
8596        this.rest = new ArrayList<CapabilityStatementRestComponent>();
8597      this.rest.add(t);
8598      return t;
8599    }
8600
8601    public CapabilityStatement addRest(CapabilityStatementRestComponent t) { //3
8602      if (t == null)
8603        return this;
8604      if (this.rest == null)
8605        this.rest = new ArrayList<CapabilityStatementRestComponent>();
8606      this.rest.add(t);
8607      return this;
8608    }
8609
8610    /**
8611     * @return The first repetition of repeating field {@link #rest}, creating it if it does not already exist {3}
8612     */
8613    public CapabilityStatementRestComponent getRestFirstRep() { 
8614      if (getRest().isEmpty()) {
8615        addRest();
8616      }
8617      return getRest().get(0);
8618    }
8619
8620    /**
8621     * @return {@link #messaging} (A description of the messaging capabilities of the solution.)
8622     */
8623    public List<CapabilityStatementMessagingComponent> getMessaging() { 
8624      if (this.messaging == null)
8625        this.messaging = new ArrayList<CapabilityStatementMessagingComponent>();
8626      return this.messaging;
8627    }
8628
8629    /**
8630     * @return Returns a reference to <code>this</code> for easy method chaining
8631     */
8632    public CapabilityStatement setMessaging(List<CapabilityStatementMessagingComponent> theMessaging) { 
8633      this.messaging = theMessaging;
8634      return this;
8635    }
8636
8637    public boolean hasMessaging() { 
8638      if (this.messaging == null)
8639        return false;
8640      for (CapabilityStatementMessagingComponent item : this.messaging)
8641        if (!item.isEmpty())
8642          return true;
8643      return false;
8644    }
8645
8646    public CapabilityStatementMessagingComponent addMessaging() { //3
8647      CapabilityStatementMessagingComponent t = new CapabilityStatementMessagingComponent();
8648      if (this.messaging == null)
8649        this.messaging = new ArrayList<CapabilityStatementMessagingComponent>();
8650      this.messaging.add(t);
8651      return t;
8652    }
8653
8654    public CapabilityStatement addMessaging(CapabilityStatementMessagingComponent t) { //3
8655      if (t == null)
8656        return this;
8657      if (this.messaging == null)
8658        this.messaging = new ArrayList<CapabilityStatementMessagingComponent>();
8659      this.messaging.add(t);
8660      return this;
8661    }
8662
8663    /**
8664     * @return The first repetition of repeating field {@link #messaging}, creating it if it does not already exist {3}
8665     */
8666    public CapabilityStatementMessagingComponent getMessagingFirstRep() { 
8667      if (getMessaging().isEmpty()) {
8668        addMessaging();
8669      }
8670      return getMessaging().get(0);
8671    }
8672
8673    /**
8674     * @return {@link #document} (A document definition.)
8675     */
8676    public List<CapabilityStatementDocumentComponent> getDocument() { 
8677      if (this.document == null)
8678        this.document = new ArrayList<CapabilityStatementDocumentComponent>();
8679      return this.document;
8680    }
8681
8682    /**
8683     * @return Returns a reference to <code>this</code> for easy method chaining
8684     */
8685    public CapabilityStatement setDocument(List<CapabilityStatementDocumentComponent> theDocument) { 
8686      this.document = theDocument;
8687      return this;
8688    }
8689
8690    public boolean hasDocument() { 
8691      if (this.document == null)
8692        return false;
8693      for (CapabilityStatementDocumentComponent item : this.document)
8694        if (!item.isEmpty())
8695          return true;
8696      return false;
8697    }
8698
8699    public CapabilityStatementDocumentComponent addDocument() { //3
8700      CapabilityStatementDocumentComponent t = new CapabilityStatementDocumentComponent();
8701      if (this.document == null)
8702        this.document = new ArrayList<CapabilityStatementDocumentComponent>();
8703      this.document.add(t);
8704      return t;
8705    }
8706
8707    public CapabilityStatement addDocument(CapabilityStatementDocumentComponent t) { //3
8708      if (t == null)
8709        return this;
8710      if (this.document == null)
8711        this.document = new ArrayList<CapabilityStatementDocumentComponent>();
8712      this.document.add(t);
8713      return this;
8714    }
8715
8716    /**
8717     * @return The first repetition of repeating field {@link #document}, creating it if it does not already exist {3}
8718     */
8719    public CapabilityStatementDocumentComponent getDocumentFirstRep() { 
8720      if (getDocument().isEmpty()) {
8721        addDocument();
8722      }
8723      return getDocument().get(0);
8724    }
8725
8726      protected void listChildren(List<Property> children) {
8727        super.listChildren(children);
8728        children.add(new Property("url", "uri", "An absolute URI that is used to identify this capability statement 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 an authoritative instance of this capability statement is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the capability statement is stored on different servers.", 0, 1, url));
8729        children.add(new Property("identifier", "Identifier", "A formal identifier that is used to identify this CapabilityStatement when it is represented in other formats, or referenced in a specification, model, design or an instance.", 0, java.lang.Integer.MAX_VALUE, identifier));
8730        children.add(new Property("version", "string", "The identifier that is used to identify this version of the capability statement when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the capability statement 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));
8731        children.add(new Property("versionAlgorithm[x]", "string|Coding", "Indicates the mechanism used to compare versions to determine which is more current.", 0, 1, versionAlgorithm));
8732        children.add(new Property("name", "string", "A natural language name identifying the capability statement. This name should be usable as an identifier for the module by machine processing applications such as code generation.", 0, 1, name));
8733        children.add(new Property("title", "string", "A short, descriptive, user-friendly title for the capability statement.", 0, 1, title));
8734        children.add(new Property("status", "code", "The status of this capability statement. Enables tracking the life-cycle of the content.", 0, 1, status));
8735        children.add(new Property("experimental", "boolean", "A Boolean value to indicate that this capability statement is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.", 0, 1, experimental));
8736        children.add(new Property("date", "dateTime", "The date  (and optionally time) when the capability statement was last significantly changed. 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 capability statement changes.", 0, 1, date));
8737        children.add(new Property("publisher", "string", "The name of the organization or individual responsible for the release and ongoing maintenance of the capability statement.", 0, 1, publisher));
8738        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));
8739        children.add(new Property("description", "markdown", "A free text natural language description of the capability statement 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));
8740        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 capability statement instances.", 0, java.lang.Integer.MAX_VALUE, useContext));
8741        children.add(new Property("jurisdiction", "CodeableConcept", "A legal or geographic region in which the capability statement is intended to be used.", 0, java.lang.Integer.MAX_VALUE, jurisdiction));
8742        children.add(new Property("purpose", "markdown", "Explanation of why this capability statement is needed and why it has been designed as it has.", 0, 1, purpose));
8743        children.add(new Property("copyright", "markdown", "A copyright statement relating to the capability statement and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the capability statement.", 0, 1, copyright));
8744        children.add(new Property("copyrightLabel", "string", "A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').", 0, 1, copyrightLabel));
8745        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));
8746        children.add(new Property("instantiates", "canonical(CapabilityStatement)", "Reference to a canonical URL of another CapabilityStatement that this software implements. This capability statement is a published API description that corresponds to a business service. The server may actually implement a subset of the capability statement it claims to implement, so the capability statement must specify the full capability details.", 0, java.lang.Integer.MAX_VALUE, instantiates));
8747        children.add(new Property("imports", "canonical(CapabilityStatement)", "Reference to a canonical URL of another CapabilityStatement that this software adds to. The capability statement automatically includes everything in the other statement, and it is not duplicated, though the server may repeat the same resources, interactions and operations to add additional details to them.", 0, java.lang.Integer.MAX_VALUE, imports));
8748        children.add(new Property("software", "", "Software that is covered by this capability statement.  It is used when the capability statement describes the capabilities of a particular software version, independent of an installation.", 0, 1, software));
8749        children.add(new Property("implementation", "", "Identifies a specific implementation instance that is described by the capability statement - i.e. a particular installation, rather than the capabilities of a software program.", 0, 1, implementation));
8750        children.add(new Property("fhirVersion", "code", "The version of the FHIR specification that this CapabilityStatement describes (which SHALL be the same as the FHIR version of the CapabilityStatement itself). There is no default value.", 0, 1, fhirVersion));
8751        children.add(new Property("format", "code", "A list of the formats supported by this implementation using their content types.", 0, java.lang.Integer.MAX_VALUE, format));
8752        children.add(new Property("patchFormat", "code", "A list of the patch formats supported by this implementation using their content types.", 0, java.lang.Integer.MAX_VALUE, patchFormat));
8753        children.add(new Property("acceptLanguage", "code", "A list of the languages supported by this implementation that are usefully supported in the ```Accept-Language``` header.", 0, java.lang.Integer.MAX_VALUE, acceptLanguage));
8754        children.add(new Property("implementationGuide", "canonical(ImplementationGuide)", "A list of implementation guides that the server does (or should) support in their entirety.", 0, java.lang.Integer.MAX_VALUE, implementationGuide));
8755        children.add(new Property("rest", "", "A definition of the restful capabilities of the solution, if any.", 0, java.lang.Integer.MAX_VALUE, rest));
8756        children.add(new Property("messaging", "", "A description of the messaging capabilities of the solution.", 0, java.lang.Integer.MAX_VALUE, messaging));
8757        children.add(new Property("document", "", "A document definition.", 0, java.lang.Integer.MAX_VALUE, document));
8758      }
8759
8760      @Override
8761      public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
8762        switch (_hash) {
8763        case 116079: /*url*/  return new Property("url", "uri", "An absolute URI that is used to identify this capability statement when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD