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