001package org.hl7.fhir.r5.model;
002
003
004/*
005  Copyright (c) 2011+, HL7, Inc.
006  All rights reserved.
007  
008  Redistribution and use in source and binary forms, with or without modification, \
009  are permitted provided that the following conditions are met:
010  
011   * Redistributions of source code must retain the above copyright notice, this \
012     list of conditions and the following disclaimer.
013   * Redistributions in binary form must reproduce the above copyright notice, \
014     this list of conditions and the following disclaimer in the documentation \
015     and/or other materials provided with the distribution.
016   * Neither the name of HL7 nor the names of its contributors may be used to 
017     endorse or promote products derived from this software without specific 
018     prior written permission.
019  
020  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \
021  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \
022  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \
023  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \
024  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT \
025  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR \
026  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \
027  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \
028  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \
029  POSSIBILITY OF SUCH DAMAGE.
030  */
031
032// Generated on Fri, Jul 15, 2022 11:20+1000 for FHIR v5.0.0-snapshot2
033
034import java.util.ArrayList;
035import java.util.Date;
036import java.util.List;
037import org.hl7.fhir.utilities.Utilities;
038import org.hl7.fhir.r5.model.Enumerations.*;
039import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
040import org.hl7.fhir.exceptions.FHIRException;
041import org.hl7.fhir.instance.model.api.ICompositeType;
042import ca.uhn.fhir.model.api.annotation.ResourceDef;
043import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
044import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
045import ca.uhn.fhir.model.api.annotation.Child;
046import ca.uhn.fhir.model.api.annotation.ChildOrder;
047import ca.uhn.fhir.model.api.annotation.Description;
048import ca.uhn.fhir.model.api.annotation.Block;
049
050/**
051 * A record of an event relevant for purposes such as operations, privacy, security, maintenance, and performance analysis.
052 */
053@ResourceDef(name="AuditEvent", profile="http://hl7.org/fhir/StructureDefinition/AuditEvent")
054public class AuditEvent extends DomainResource {
055
056    public enum AuditEventAction {
057        /**
058         * Create a new database object, such as placing an order.
059         */
060        C, 
061        /**
062         * Display or print data, such as a doctor census.
063         */
064        R, 
065        /**
066         * Update data, such as revise patient information.
067         */
068        U, 
069        /**
070         * Delete items, such as a doctor master file record.
071         */
072        D, 
073        /**
074         * Perform a system or application function such as log-on, program execution or use of an object's method, or perform a query/search operation.
075         */
076        E, 
077        /**
078         * added to help the parsers with the generic types
079         */
080        NULL;
081        public static AuditEventAction fromCode(String codeString) throws FHIRException {
082            if (codeString == null || "".equals(codeString))
083                return null;
084        if ("C".equals(codeString))
085          return C;
086        if ("R".equals(codeString))
087          return R;
088        if ("U".equals(codeString))
089          return U;
090        if ("D".equals(codeString))
091          return D;
092        if ("E".equals(codeString))
093          return E;
094        if (Configuration.isAcceptInvalidEnums())
095          return null;
096        else
097          throw new FHIRException("Unknown AuditEventAction code '"+codeString+"'");
098        }
099        public String toCode() {
100          switch (this) {
101            case C: return "C";
102            case R: return "R";
103            case U: return "U";
104            case D: return "D";
105            case E: return "E";
106            case NULL: return null;
107            default: return "?";
108          }
109        }
110        public String getSystem() {
111          switch (this) {
112            case C: return "http://hl7.org/fhir/audit-event-action";
113            case R: return "http://hl7.org/fhir/audit-event-action";
114            case U: return "http://hl7.org/fhir/audit-event-action";
115            case D: return "http://hl7.org/fhir/audit-event-action";
116            case E: return "http://hl7.org/fhir/audit-event-action";
117            case NULL: return null;
118            default: return "?";
119          }
120        }
121        public String getDefinition() {
122          switch (this) {
123            case C: return "Create a new database object, such as placing an order.";
124            case R: return "Display or print data, such as a doctor census.";
125            case U: return "Update data, such as revise patient information.";
126            case D: return "Delete items, such as a doctor master file record.";
127            case E: return "Perform a system or application function such as log-on, program execution or use of an object's method, or perform a query/search operation.";
128            case NULL: return null;
129            default: return "?";
130          }
131        }
132        public String getDisplay() {
133          switch (this) {
134            case C: return "Create";
135            case R: return "Read/View/Print";
136            case U: return "Update";
137            case D: return "Delete";
138            case E: return "Execute";
139            case NULL: return null;
140            default: return "?";
141          }
142        }
143    }
144
145  public static class AuditEventActionEnumFactory implements EnumFactory<AuditEventAction> {
146    public AuditEventAction fromCode(String codeString) throws IllegalArgumentException {
147      if (codeString == null || "".equals(codeString))
148            if (codeString == null || "".equals(codeString))
149                return null;
150        if ("C".equals(codeString))
151          return AuditEventAction.C;
152        if ("R".equals(codeString))
153          return AuditEventAction.R;
154        if ("U".equals(codeString))
155          return AuditEventAction.U;
156        if ("D".equals(codeString))
157          return AuditEventAction.D;
158        if ("E".equals(codeString))
159          return AuditEventAction.E;
160        throw new IllegalArgumentException("Unknown AuditEventAction code '"+codeString+"'");
161        }
162        public Enumeration<AuditEventAction> fromType(Base code) throws FHIRException {
163          if (code == null)
164            return null;
165          if (code.isEmpty())
166            return new Enumeration<AuditEventAction>(this);
167          String codeString = ((PrimitiveType) code).asStringValue();
168          if (codeString == null || "".equals(codeString))
169            return null;
170        if ("C".equals(codeString))
171          return new Enumeration<AuditEventAction>(this, AuditEventAction.C);
172        if ("R".equals(codeString))
173          return new Enumeration<AuditEventAction>(this, AuditEventAction.R);
174        if ("U".equals(codeString))
175          return new Enumeration<AuditEventAction>(this, AuditEventAction.U);
176        if ("D".equals(codeString))
177          return new Enumeration<AuditEventAction>(this, AuditEventAction.D);
178        if ("E".equals(codeString))
179          return new Enumeration<AuditEventAction>(this, AuditEventAction.E);
180        throw new FHIRException("Unknown AuditEventAction code '"+codeString+"'");
181        }
182    public String toCode(AuditEventAction code) {
183      if (code == AuditEventAction.C)
184        return "C";
185      if (code == AuditEventAction.R)
186        return "R";
187      if (code == AuditEventAction.U)
188        return "U";
189      if (code == AuditEventAction.D)
190        return "D";
191      if (code == AuditEventAction.E)
192        return "E";
193      return "?";
194      }
195    public String toSystem(AuditEventAction code) {
196      return code.getSystem();
197      }
198    }
199
200    public enum AuditEventSeverity {
201        /**
202         * System is unusable. e.g., This level should only be reported by infrastructure and should not be used by applications.
203         */
204        EMERGENCY, 
205        /**
206         * Notification should be sent to trigger action be taken. e.g., Loss of the primary network connection needing attention.
207         */
208        ALERT, 
209        /**
210         * Critical conditions. e.g., A failure in the system's primary application that will reset automatically.
211         */
212        CRITICAL, 
213        /**
214         * Error conditions. e.g., An application has exceeded its file storage limit and attempts to write are failing. 
215         */
216        ERROR, 
217        /**
218         * Warning conditions. May indicate that an error will occur if action is not taken. e.g., A non-root file system has only 2GB remaining.
219         */
220        WARNING, 
221        /**
222         * Notice messages. Normal but significant condition. Events that are unusual, but not error conditions.
223         */
224        NOTICE, 
225        /**
226         * Normal operational messages that require no action. e.g., An application has started, paused, or ended successfully.
227         */
228        INFORMATIONAL, 
229        /**
230         * Debug-level messages. Information useful to developers for debugging the application.
231         */
232        DEBUG, 
233        /**
234         * added to help the parsers with the generic types
235         */
236        NULL;
237        public static AuditEventSeverity fromCode(String codeString) throws FHIRException {
238            if (codeString == null || "".equals(codeString))
239                return null;
240        if ("emergency".equals(codeString))
241          return EMERGENCY;
242        if ("alert".equals(codeString))
243          return ALERT;
244        if ("critical".equals(codeString))
245          return CRITICAL;
246        if ("error".equals(codeString))
247          return ERROR;
248        if ("warning".equals(codeString))
249          return WARNING;
250        if ("notice".equals(codeString))
251          return NOTICE;
252        if ("informational".equals(codeString))
253          return INFORMATIONAL;
254        if ("debug".equals(codeString))
255          return DEBUG;
256        if (Configuration.isAcceptInvalidEnums())
257          return null;
258        else
259          throw new FHIRException("Unknown AuditEventSeverity code '"+codeString+"'");
260        }
261        public String toCode() {
262          switch (this) {
263            case EMERGENCY: return "emergency";
264            case ALERT: return "alert";
265            case CRITICAL: return "critical";
266            case ERROR: return "error";
267            case WARNING: return "warning";
268            case NOTICE: return "notice";
269            case INFORMATIONAL: return "informational";
270            case DEBUG: return "debug";
271            case NULL: return null;
272            default: return "?";
273          }
274        }
275        public String getSystem() {
276          switch (this) {
277            case EMERGENCY: return "http://hl7.org/fhir/audit-event-severity";
278            case ALERT: return "http://hl7.org/fhir/audit-event-severity";
279            case CRITICAL: return "http://hl7.org/fhir/audit-event-severity";
280            case ERROR: return "http://hl7.org/fhir/audit-event-severity";
281            case WARNING: return "http://hl7.org/fhir/audit-event-severity";
282            case NOTICE: return "http://hl7.org/fhir/audit-event-severity";
283            case INFORMATIONAL: return "http://hl7.org/fhir/audit-event-severity";
284            case DEBUG: return "http://hl7.org/fhir/audit-event-severity";
285            case NULL: return null;
286            default: return "?";
287          }
288        }
289        public String getDefinition() {
290          switch (this) {
291            case EMERGENCY: return "System is unusable. e.g., This level should only be reported by infrastructure and should not be used by applications.";
292            case ALERT: return "Notification should be sent to trigger action be taken. e.g., Loss of the primary network connection needing attention.";
293            case CRITICAL: return "Critical conditions. e.g., A failure in the system's primary application that will reset automatically.";
294            case ERROR: return "Error conditions. e.g., An application has exceeded its file storage limit and attempts to write are failing. ";
295            case WARNING: return "Warning conditions. May indicate that an error will occur if action is not taken. e.g., A non-root file system has only 2GB remaining.";
296            case NOTICE: return "Notice messages. Normal but significant condition. Events that are unusual, but not error conditions.";
297            case INFORMATIONAL: return "Normal operational messages that require no action. e.g., An application has started, paused, or ended successfully.";
298            case DEBUG: return "Debug-level messages. Information useful to developers for debugging the application.";
299            case NULL: return null;
300            default: return "?";
301          }
302        }
303        public String getDisplay() {
304          switch (this) {
305            case EMERGENCY: return "Emergency";
306            case ALERT: return "Alert";
307            case CRITICAL: return "Critical";
308            case ERROR: return "Error";
309            case WARNING: return "Warning";
310            case NOTICE: return "Notice";
311            case INFORMATIONAL: return "Informational";
312            case DEBUG: return "Debug";
313            case NULL: return null;
314            default: return "?";
315          }
316        }
317    }
318
319  public static class AuditEventSeverityEnumFactory implements EnumFactory<AuditEventSeverity> {
320    public AuditEventSeverity fromCode(String codeString) throws IllegalArgumentException {
321      if (codeString == null || "".equals(codeString))
322            if (codeString == null || "".equals(codeString))
323                return null;
324        if ("emergency".equals(codeString))
325          return AuditEventSeverity.EMERGENCY;
326        if ("alert".equals(codeString))
327          return AuditEventSeverity.ALERT;
328        if ("critical".equals(codeString))
329          return AuditEventSeverity.CRITICAL;
330        if ("error".equals(codeString))
331          return AuditEventSeverity.ERROR;
332        if ("warning".equals(codeString))
333          return AuditEventSeverity.WARNING;
334        if ("notice".equals(codeString))
335          return AuditEventSeverity.NOTICE;
336        if ("informational".equals(codeString))
337          return AuditEventSeverity.INFORMATIONAL;
338        if ("debug".equals(codeString))
339          return AuditEventSeverity.DEBUG;
340        throw new IllegalArgumentException("Unknown AuditEventSeverity code '"+codeString+"'");
341        }
342        public Enumeration<AuditEventSeverity> fromType(Base code) throws FHIRException {
343          if (code == null)
344            return null;
345          if (code.isEmpty())
346            return new Enumeration<AuditEventSeverity>(this);
347          String codeString = ((PrimitiveType) code).asStringValue();
348          if (codeString == null || "".equals(codeString))
349            return null;
350        if ("emergency".equals(codeString))
351          return new Enumeration<AuditEventSeverity>(this, AuditEventSeverity.EMERGENCY);
352        if ("alert".equals(codeString))
353          return new Enumeration<AuditEventSeverity>(this, AuditEventSeverity.ALERT);
354        if ("critical".equals(codeString))
355          return new Enumeration<AuditEventSeverity>(this, AuditEventSeverity.CRITICAL);
356        if ("error".equals(codeString))
357          return new Enumeration<AuditEventSeverity>(this, AuditEventSeverity.ERROR);
358        if ("warning".equals(codeString))
359          return new Enumeration<AuditEventSeverity>(this, AuditEventSeverity.WARNING);
360        if ("notice".equals(codeString))
361          return new Enumeration<AuditEventSeverity>(this, AuditEventSeverity.NOTICE);
362        if ("informational".equals(codeString))
363          return new Enumeration<AuditEventSeverity>(this, AuditEventSeverity.INFORMATIONAL);
364        if ("debug".equals(codeString))
365          return new Enumeration<AuditEventSeverity>(this, AuditEventSeverity.DEBUG);
366        throw new FHIRException("Unknown AuditEventSeverity code '"+codeString+"'");
367        }
368    public String toCode(AuditEventSeverity code) {
369      if (code == AuditEventSeverity.EMERGENCY)
370        return "emergency";
371      if (code == AuditEventSeverity.ALERT)
372        return "alert";
373      if (code == AuditEventSeverity.CRITICAL)
374        return "critical";
375      if (code == AuditEventSeverity.ERROR)
376        return "error";
377      if (code == AuditEventSeverity.WARNING)
378        return "warning";
379      if (code == AuditEventSeverity.NOTICE)
380        return "notice";
381      if (code == AuditEventSeverity.INFORMATIONAL)
382        return "informational";
383      if (code == AuditEventSeverity.DEBUG)
384        return "debug";
385      return "?";
386      }
387    public String toSystem(AuditEventSeverity code) {
388      return code.getSystem();
389      }
390    }
391
392    @Block()
393    public static class AuditEventOutcomeComponent extends BackboneElement implements IBaseBackboneElement {
394        /**
395         * Indicates whether the event succeeded or failed.
396         */
397        @Child(name = "code", type = {Coding.class}, order=1, min=1, max=1, modifier=false, summary=true)
398        @Description(shortDefinition="Whether the event succeeded or failed", formalDefinition="Indicates whether the event succeeded or failed." )
399        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/audit-event-outcome")
400        protected Coding code;
401
402        /**
403         * Additional details about the error. This may be a text description of the error or a system code that identifies the error.
404         */
405        @Child(name = "detail", type = {CodeableConcept.class}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
406        @Description(shortDefinition="Additional outcome detail", formalDefinition="Additional details about the error. This may be a text description of the error or a system code that identifies the error." )
407        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/audit-event-outcome-detail")
408        protected List<CodeableConcept> detail;
409
410        private static final long serialVersionUID = -1108329559L;
411
412    /**
413     * Constructor
414     */
415      public AuditEventOutcomeComponent() {
416        super();
417      }
418
419    /**
420     * Constructor
421     */
422      public AuditEventOutcomeComponent(Coding code) {
423        super();
424        this.setCode(code);
425      }
426
427        /**
428         * @return {@link #code} (Indicates whether the event succeeded or failed.)
429         */
430        public Coding getCode() { 
431          if (this.code == null)
432            if (Configuration.errorOnAutoCreate())
433              throw new Error("Attempt to auto-create AuditEventOutcomeComponent.code");
434            else if (Configuration.doAutoCreate())
435              this.code = new Coding(); // cc
436          return this.code;
437        }
438
439        public boolean hasCode() { 
440          return this.code != null && !this.code.isEmpty();
441        }
442
443        /**
444         * @param value {@link #code} (Indicates whether the event succeeded or failed.)
445         */
446        public AuditEventOutcomeComponent setCode(Coding value) { 
447          this.code = value;
448          return this;
449        }
450
451        /**
452         * @return {@link #detail} (Additional details about the error. This may be a text description of the error or a system code that identifies the error.)
453         */
454        public List<CodeableConcept> getDetail() { 
455          if (this.detail == null)
456            this.detail = new ArrayList<CodeableConcept>();
457          return this.detail;
458        }
459
460        /**
461         * @return Returns a reference to <code>this</code> for easy method chaining
462         */
463        public AuditEventOutcomeComponent setDetail(List<CodeableConcept> theDetail) { 
464          this.detail = theDetail;
465          return this;
466        }
467
468        public boolean hasDetail() { 
469          if (this.detail == null)
470            return false;
471          for (CodeableConcept item : this.detail)
472            if (!item.isEmpty())
473              return true;
474          return false;
475        }
476
477        public CodeableConcept addDetail() { //3
478          CodeableConcept t = new CodeableConcept();
479          if (this.detail == null)
480            this.detail = new ArrayList<CodeableConcept>();
481          this.detail.add(t);
482          return t;
483        }
484
485        public AuditEventOutcomeComponent addDetail(CodeableConcept t) { //3
486          if (t == null)
487            return this;
488          if (this.detail == null)
489            this.detail = new ArrayList<CodeableConcept>();
490          this.detail.add(t);
491          return this;
492        }
493
494        /**
495         * @return The first repetition of repeating field {@link #detail}, creating it if it does not already exist {3}
496         */
497        public CodeableConcept getDetailFirstRep() { 
498          if (getDetail().isEmpty()) {
499            addDetail();
500          }
501          return getDetail().get(0);
502        }
503
504        protected void listChildren(List<Property> children) {
505          super.listChildren(children);
506          children.add(new Property("code", "Coding", "Indicates whether the event succeeded or failed.", 0, 1, code));
507          children.add(new Property("detail", "CodeableConcept", "Additional details about the error. This may be a text description of the error or a system code that identifies the error.", 0, java.lang.Integer.MAX_VALUE, detail));
508        }
509
510        @Override
511        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
512          switch (_hash) {
513          case 3059181: /*code*/  return new Property("code", "Coding", "Indicates whether the event succeeded or failed.", 0, 1, code);
514          case -1335224239: /*detail*/  return new Property("detail", "CodeableConcept", "Additional details about the error. This may be a text description of the error or a system code that identifies the error.", 0, java.lang.Integer.MAX_VALUE, detail);
515          default: return super.getNamedProperty(_hash, _name, _checkValid);
516          }
517
518        }
519
520      @Override
521      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
522        switch (hash) {
523        case 3059181: /*code*/ return this.code == null ? new Base[0] : new Base[] {this.code}; // Coding
524        case -1335224239: /*detail*/ return this.detail == null ? new Base[0] : this.detail.toArray(new Base[this.detail.size()]); // CodeableConcept
525        default: return super.getProperty(hash, name, checkValid);
526        }
527
528      }
529
530      @Override
531      public Base setProperty(int hash, String name, Base value) throws FHIRException {
532        switch (hash) {
533        case 3059181: // code
534          this.code = TypeConvertor.castToCoding(value); // Coding
535          return value;
536        case -1335224239: // detail
537          this.getDetail().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
538          return value;
539        default: return super.setProperty(hash, name, value);
540        }
541
542      }
543
544      @Override
545      public Base setProperty(String name, Base value) throws FHIRException {
546        if (name.equals("code")) {
547          this.code = TypeConvertor.castToCoding(value); // Coding
548        } else if (name.equals("detail")) {
549          this.getDetail().add(TypeConvertor.castToCodeableConcept(value));
550        } else
551          return super.setProperty(name, value);
552        return value;
553      }
554
555      @Override
556      public Base makeProperty(int hash, String name) throws FHIRException {
557        switch (hash) {
558        case 3059181:  return getCode();
559        case -1335224239:  return addDetail(); 
560        default: return super.makeProperty(hash, name);
561        }
562
563      }
564
565      @Override
566      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
567        switch (hash) {
568        case 3059181: /*code*/ return new String[] {"Coding"};
569        case -1335224239: /*detail*/ return new String[] {"CodeableConcept"};
570        default: return super.getTypesForProperty(hash, name);
571        }
572
573      }
574
575      @Override
576      public Base addChild(String name) throws FHIRException {
577        if (name.equals("code")) {
578          this.code = new Coding();
579          return this.code;
580        }
581        else if (name.equals("detail")) {
582          return addDetail();
583        }
584        else
585          return super.addChild(name);
586      }
587
588      public AuditEventOutcomeComponent copy() {
589        AuditEventOutcomeComponent dst = new AuditEventOutcomeComponent();
590        copyValues(dst);
591        return dst;
592      }
593
594      public void copyValues(AuditEventOutcomeComponent dst) {
595        super.copyValues(dst);
596        dst.code = code == null ? null : code.copy();
597        if (detail != null) {
598          dst.detail = new ArrayList<CodeableConcept>();
599          for (CodeableConcept i : detail)
600            dst.detail.add(i.copy());
601        };
602      }
603
604      @Override
605      public boolean equalsDeep(Base other_) {
606        if (!super.equalsDeep(other_))
607          return false;
608        if (!(other_ instanceof AuditEventOutcomeComponent))
609          return false;
610        AuditEventOutcomeComponent o = (AuditEventOutcomeComponent) other_;
611        return compareDeep(code, o.code, true) && compareDeep(detail, o.detail, true);
612      }
613
614      @Override
615      public boolean equalsShallow(Base other_) {
616        if (!super.equalsShallow(other_))
617          return false;
618        if (!(other_ instanceof AuditEventOutcomeComponent))
619          return false;
620        AuditEventOutcomeComponent o = (AuditEventOutcomeComponent) other_;
621        return true;
622      }
623
624      public boolean isEmpty() {
625        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(code, detail);
626      }
627
628  public String fhirType() {
629    return "AuditEvent.outcome";
630
631  }
632
633  }
634
635    @Block()
636    public static class AuditEventAgentComponent extends BackboneElement implements IBaseBackboneElement {
637        /**
638         * The Functional Role of the user when performing the event.
639         */
640        @Child(name = "type", type = {CodeableConcept.class}, order=1, min=0, max=1, modifier=false, summary=false)
641        @Description(shortDefinition="How agent participated", formalDefinition="The Functional Role of the user when performing the event." )
642        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/participation-role-type")
643        protected CodeableConcept type;
644
645        /**
646         * The structural roles of the agent indicating the agent's competency. The security role enabling the agent with respect to the activity.
647         */
648        @Child(name = "role", type = {CodeableConcept.class}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
649        @Description(shortDefinition="Agent role in the event", formalDefinition="The structural roles of the agent indicating the agent's competency. The security role enabling the agent with respect to the activity." )
650        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/security-role-type")
651        protected List<CodeableConcept> role;
652
653        /**
654         * Reference to who this agent is that was involved in the event.
655         */
656        @Child(name = "who", type = {Practitioner.class, PractitionerRole.class, Organization.class, CareTeam.class, Patient.class, Device.class, RelatedPerson.class}, order=3, min=1, max=1, modifier=false, summary=true)
657        @Description(shortDefinition="Identifier of who", formalDefinition="Reference to who this agent is that was involved in the event." )
658        protected Reference who;
659
660        /**
661         * Indicator that the user is or is not the requestor, or initiator, for the event being audited.
662         */
663        @Child(name = "requestor", type = {BooleanType.class}, order=4, min=0, max=1, modifier=false, summary=true)
664        @Description(shortDefinition="Whether user is initiator", formalDefinition="Indicator that the user is or is not the requestor, or initiator, for the event being audited." )
665        protected BooleanType requestor;
666
667        /**
668         * Where the agent location is known, the agent location when the event occurred.
669         */
670        @Child(name = "location", type = {Location.class}, order=5, min=0, max=1, modifier=false, summary=false)
671        @Description(shortDefinition="The agent location when the event occurred", formalDefinition="Where the agent location is known, the agent location when the event occurred." )
672        protected Reference location;
673
674        /**
675         * Where the policy(ies) are known that authorized the agent participation in the event. Typically, a single activity may have multiple applicable policies, such as patient consent, guarantor funding, etc. The policy would also indicate the security token used.
676         */
677        @Child(name = "policy", type = {UriType.class}, order=6, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
678        @Description(shortDefinition="Policy that authorized the agent participation in the event", formalDefinition="Where the policy(ies) are known that authorized the agent participation in the event. Typically, a single activity may have multiple applicable policies, such as patient consent, guarantor funding, etc. The policy would also indicate the security token used." )
679        protected List<UriType> policy;
680
681        /**
682         * When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.
683         */
684        @Child(name = "network", type = {Endpoint.class, UriType.class, StringType.class}, order=7, min=0, max=1, modifier=false, summary=false)
685        @Description(shortDefinition="This agent network location for the activity", formalDefinition="When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details." )
686        protected DataType network;
687
688        /**
689         * The authorization (e.g., PurposeOfUse) that was used during the event being recorded.
690         */
691        @Child(name = "authorization", type = {CodeableConcept.class}, order=8, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
692        @Description(shortDefinition="Allowable authorization for this agent", formalDefinition="The authorization (e.g., PurposeOfUse) that was used during the event being recorded." )
693        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://terminology.hl7.org/ValueSet/v3-PurposeOfUse")
694        protected List<CodeableConcept> authorization;
695
696        private static final long serialVersionUID = 509129255L;
697
698    /**
699     * Constructor
700     */
701      public AuditEventAgentComponent() {
702        super();
703      }
704
705    /**
706     * Constructor
707     */
708      public AuditEventAgentComponent(Reference who) {
709        super();
710        this.setWho(who);
711      }
712
713        /**
714         * @return {@link #type} (The Functional Role of the user when performing the event.)
715         */
716        public CodeableConcept getType() { 
717          if (this.type == null)
718            if (Configuration.errorOnAutoCreate())
719              throw new Error("Attempt to auto-create AuditEventAgentComponent.type");
720            else if (Configuration.doAutoCreate())
721              this.type = new CodeableConcept(); // cc
722          return this.type;
723        }
724
725        public boolean hasType() { 
726          return this.type != null && !this.type.isEmpty();
727        }
728
729        /**
730         * @param value {@link #type} (The Functional Role of the user when performing the event.)
731         */
732        public AuditEventAgentComponent setType(CodeableConcept value) { 
733          this.type = value;
734          return this;
735        }
736
737        /**
738         * @return {@link #role} (The structural roles of the agent indicating the agent's competency. The security role enabling the agent with respect to the activity.)
739         */
740        public List<CodeableConcept> getRole() { 
741          if (this.role == null)
742            this.role = new ArrayList<CodeableConcept>();
743          return this.role;
744        }
745
746        /**
747         * @return Returns a reference to <code>this</code> for easy method chaining
748         */
749        public AuditEventAgentComponent setRole(List<CodeableConcept> theRole) { 
750          this.role = theRole;
751          return this;
752        }
753
754        public boolean hasRole() { 
755          if (this.role == null)
756            return false;
757          for (CodeableConcept item : this.role)
758            if (!item.isEmpty())
759              return true;
760          return false;
761        }
762
763        public CodeableConcept addRole() { //3
764          CodeableConcept t = new CodeableConcept();
765          if (this.role == null)
766            this.role = new ArrayList<CodeableConcept>();
767          this.role.add(t);
768          return t;
769        }
770
771        public AuditEventAgentComponent addRole(CodeableConcept t) { //3
772          if (t == null)
773            return this;
774          if (this.role == null)
775            this.role = new ArrayList<CodeableConcept>();
776          this.role.add(t);
777          return this;
778        }
779
780        /**
781         * @return The first repetition of repeating field {@link #role}, creating it if it does not already exist {3}
782         */
783        public CodeableConcept getRoleFirstRep() { 
784          if (getRole().isEmpty()) {
785            addRole();
786          }
787          return getRole().get(0);
788        }
789
790        /**
791         * @return {@link #who} (Reference to who this agent is that was involved in the event.)
792         */
793        public Reference getWho() { 
794          if (this.who == null)
795            if (Configuration.errorOnAutoCreate())
796              throw new Error("Attempt to auto-create AuditEventAgentComponent.who");
797            else if (Configuration.doAutoCreate())
798              this.who = new Reference(); // cc
799          return this.who;
800        }
801
802        public boolean hasWho() { 
803          return this.who != null && !this.who.isEmpty();
804        }
805
806        /**
807         * @param value {@link #who} (Reference to who this agent is that was involved in the event.)
808         */
809        public AuditEventAgentComponent setWho(Reference value) { 
810          this.who = value;
811          return this;
812        }
813
814        /**
815         * @return {@link #requestor} (Indicator that the user is or is not the requestor, or initiator, for the event being audited.). This is the underlying object with id, value and extensions. The accessor "getRequestor" gives direct access to the value
816         */
817        public BooleanType getRequestorElement() { 
818          if (this.requestor == null)
819            if (Configuration.errorOnAutoCreate())
820              throw new Error("Attempt to auto-create AuditEventAgentComponent.requestor");
821            else if (Configuration.doAutoCreate())
822              this.requestor = new BooleanType(); // bb
823          return this.requestor;
824        }
825
826        public boolean hasRequestorElement() { 
827          return this.requestor != null && !this.requestor.isEmpty();
828        }
829
830        public boolean hasRequestor() { 
831          return this.requestor != null && !this.requestor.isEmpty();
832        }
833
834        /**
835         * @param value {@link #requestor} (Indicator that the user is or is not the requestor, or initiator, for the event being audited.). This is the underlying object with id, value and extensions. The accessor "getRequestor" gives direct access to the value
836         */
837        public AuditEventAgentComponent setRequestorElement(BooleanType value) { 
838          this.requestor = value;
839          return this;
840        }
841
842        /**
843         * @return Indicator that the user is or is not the requestor, or initiator, for the event being audited.
844         */
845        public boolean getRequestor() { 
846          return this.requestor == null || this.requestor.isEmpty() ? false : this.requestor.getValue();
847        }
848
849        /**
850         * @param value Indicator that the user is or is not the requestor, or initiator, for the event being audited.
851         */
852        public AuditEventAgentComponent setRequestor(boolean value) { 
853            if (this.requestor == null)
854              this.requestor = new BooleanType();
855            this.requestor.setValue(value);
856          return this;
857        }
858
859        /**
860         * @return {@link #location} (Where the agent location is known, the agent location when the event occurred.)
861         */
862        public Reference getLocation() { 
863          if (this.location == null)
864            if (Configuration.errorOnAutoCreate())
865              throw new Error("Attempt to auto-create AuditEventAgentComponent.location");
866            else if (Configuration.doAutoCreate())
867              this.location = new Reference(); // cc
868          return this.location;
869        }
870
871        public boolean hasLocation() { 
872          return this.location != null && !this.location.isEmpty();
873        }
874
875        /**
876         * @param value {@link #location} (Where the agent location is known, the agent location when the event occurred.)
877         */
878        public AuditEventAgentComponent setLocation(Reference value) { 
879          this.location = value;
880          return this;
881        }
882
883        /**
884         * @return {@link #policy} (Where the policy(ies) are known that authorized the agent participation in the event. Typically, a single activity may have multiple applicable policies, such as patient consent, guarantor funding, etc. The policy would also indicate the security token used.)
885         */
886        public List<UriType> getPolicy() { 
887          if (this.policy == null)
888            this.policy = new ArrayList<UriType>();
889          return this.policy;
890        }
891
892        /**
893         * @return Returns a reference to <code>this</code> for easy method chaining
894         */
895        public AuditEventAgentComponent setPolicy(List<UriType> thePolicy) { 
896          this.policy = thePolicy;
897          return this;
898        }
899
900        public boolean hasPolicy() { 
901          if (this.policy == null)
902            return false;
903          for (UriType item : this.policy)
904            if (!item.isEmpty())
905              return true;
906          return false;
907        }
908
909        /**
910         * @return {@link #policy} (Where the policy(ies) are known that authorized the agent participation in the event. Typically, a single activity may have multiple applicable policies, such as patient consent, guarantor funding, etc. The policy would also indicate the security token used.)
911         */
912        public UriType addPolicyElement() {//2 
913          UriType t = new UriType();
914          if (this.policy == null)
915            this.policy = new ArrayList<UriType>();
916          this.policy.add(t);
917          return t;
918        }
919
920        /**
921         * @param value {@link #policy} (Where the policy(ies) are known that authorized the agent participation in the event. Typically, a single activity may have multiple applicable policies, such as patient consent, guarantor funding, etc. The policy would also indicate the security token used.)
922         */
923        public AuditEventAgentComponent addPolicy(String value) { //1
924          UriType t = new UriType();
925          t.setValue(value);
926          if (this.policy == null)
927            this.policy = new ArrayList<UriType>();
928          this.policy.add(t);
929          return this;
930        }
931
932        /**
933         * @param value {@link #policy} (Where the policy(ies) are known that authorized the agent participation in the event. Typically, a single activity may have multiple applicable policies, such as patient consent, guarantor funding, etc. The policy would also indicate the security token used.)
934         */
935        public boolean hasPolicy(String value) { 
936          if (this.policy == null)
937            return false;
938          for (UriType v : this.policy)
939            if (v.getValue().equals(value)) // uri
940              return true;
941          return false;
942        }
943
944        /**
945         * @return {@link #network} (When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.)
946         */
947        public DataType getNetwork() { 
948          return this.network;
949        }
950
951        /**
952         * @return {@link #network} (When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.)
953         */
954        public Reference getNetworkReference() throws FHIRException { 
955          if (this.network == null)
956            this.network = new Reference();
957          if (!(this.network instanceof Reference))
958            throw new FHIRException("Type mismatch: the type Reference was expected, but "+this.network.getClass().getName()+" was encountered");
959          return (Reference) this.network;
960        }
961
962        public boolean hasNetworkReference() { 
963          return this != null && this.network instanceof Reference;
964        }
965
966        /**
967         * @return {@link #network} (When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.)
968         */
969        public UriType getNetworkUriType() throws FHIRException { 
970          if (this.network == null)
971            this.network = new UriType();
972          if (!(this.network instanceof UriType))
973            throw new FHIRException("Type mismatch: the type UriType was expected, but "+this.network.getClass().getName()+" was encountered");
974          return (UriType) this.network;
975        }
976
977        public boolean hasNetworkUriType() { 
978          return this != null && this.network instanceof UriType;
979        }
980
981        /**
982         * @return {@link #network} (When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.)
983         */
984        public StringType getNetworkStringType() throws FHIRException { 
985          if (this.network == null)
986            this.network = new StringType();
987          if (!(this.network instanceof StringType))
988            throw new FHIRException("Type mismatch: the type StringType was expected, but "+this.network.getClass().getName()+" was encountered");
989          return (StringType) this.network;
990        }
991
992        public boolean hasNetworkStringType() { 
993          return this != null && this.network instanceof StringType;
994        }
995
996        public boolean hasNetwork() { 
997          return this.network != null && !this.network.isEmpty();
998        }
999
1000        /**
1001         * @param value {@link #network} (When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.)
1002         */
1003        public AuditEventAgentComponent setNetwork(DataType value) { 
1004          if (value != null && !(value instanceof Reference || value instanceof UriType || value instanceof StringType))
1005            throw new Error("Not the right type for AuditEvent.agent.network[x]: "+value.fhirType());
1006          this.network = value;
1007          return this;
1008        }
1009
1010        /**
1011         * @return {@link #authorization} (The authorization (e.g., PurposeOfUse) that was used during the event being recorded.)
1012         */
1013        public List<CodeableConcept> getAuthorization() { 
1014          if (this.authorization == null)
1015            this.authorization = new ArrayList<CodeableConcept>();
1016          return this.authorization;
1017        }
1018
1019        /**
1020         * @return Returns a reference to <code>this</code> for easy method chaining
1021         */
1022        public AuditEventAgentComponent setAuthorization(List<CodeableConcept> theAuthorization) { 
1023          this.authorization = theAuthorization;
1024          return this;
1025        }
1026
1027        public boolean hasAuthorization() { 
1028          if (this.authorization == null)
1029            return false;
1030          for (CodeableConcept item : this.authorization)
1031            if (!item.isEmpty())
1032              return true;
1033          return false;
1034        }
1035
1036        public CodeableConcept addAuthorization() { //3
1037          CodeableConcept t = new CodeableConcept();
1038          if (this.authorization == null)
1039            this.authorization = new ArrayList<CodeableConcept>();
1040          this.authorization.add(t);
1041          return t;
1042        }
1043
1044        public AuditEventAgentComponent addAuthorization(CodeableConcept t) { //3
1045          if (t == null)
1046            return this;
1047          if (this.authorization == null)
1048            this.authorization = new ArrayList<CodeableConcept>();
1049          this.authorization.add(t);
1050          return this;
1051        }
1052
1053        /**
1054         * @return The first repetition of repeating field {@link #authorization}, creating it if it does not already exist {3}
1055         */
1056        public CodeableConcept getAuthorizationFirstRep() { 
1057          if (getAuthorization().isEmpty()) {
1058            addAuthorization();
1059          }
1060          return getAuthorization().get(0);
1061        }
1062
1063        protected void listChildren(List<Property> children) {
1064          super.listChildren(children);
1065          children.add(new Property("type", "CodeableConcept", "The Functional Role of the user when performing the event.", 0, 1, type));
1066          children.add(new Property("role", "CodeableConcept", "The structural roles of the agent indicating the agent's competency. The security role enabling the agent with respect to the activity.", 0, java.lang.Integer.MAX_VALUE, role));
1067          children.add(new Property("who", "Reference(Practitioner|PractitionerRole|Organization|CareTeam|Patient|Device|RelatedPerson)", "Reference to who this agent is that was involved in the event.", 0, 1, who));
1068          children.add(new Property("requestor", "boolean", "Indicator that the user is or is not the requestor, or initiator, for the event being audited.", 0, 1, requestor));
1069          children.add(new Property("location", "Reference(Location)", "Where the agent location is known, the agent location when the event occurred.", 0, 1, location));
1070          children.add(new Property("policy", "uri", "Where the policy(ies) are known that authorized the agent participation in the event. Typically, a single activity may have multiple applicable policies, such as patient consent, guarantor funding, etc. The policy would also indicate the security token used.", 0, java.lang.Integer.MAX_VALUE, policy));
1071          children.add(new Property("network[x]", "Reference(Endpoint)|uri|string", "When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.", 0, 1, network));
1072          children.add(new Property("authorization", "CodeableConcept", "The authorization (e.g., PurposeOfUse) that was used during the event being recorded.", 0, java.lang.Integer.MAX_VALUE, authorization));
1073        }
1074
1075        @Override
1076        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1077          switch (_hash) {
1078          case 3575610: /*type*/  return new Property("type", "CodeableConcept", "The Functional Role of the user when performing the event.", 0, 1, type);
1079          case 3506294: /*role*/  return new Property("role", "CodeableConcept", "The structural roles of the agent indicating the agent's competency. The security role enabling the agent with respect to the activity.", 0, java.lang.Integer.MAX_VALUE, role);
1080          case 117694: /*who*/  return new Property("who", "Reference(Practitioner|PractitionerRole|Organization|CareTeam|Patient|Device|RelatedPerson)", "Reference to who this agent is that was involved in the event.", 0, 1, who);
1081          case 693934258: /*requestor*/  return new Property("requestor", "boolean", "Indicator that the user is or is not the requestor, or initiator, for the event being audited.", 0, 1, requestor);
1082          case 1901043637: /*location*/  return new Property("location", "Reference(Location)", "Where the agent location is known, the agent location when the event occurred.", 0, 1, location);
1083          case -982670030: /*policy*/  return new Property("policy", "uri", "Where the policy(ies) are known that authorized the agent participation in the event. Typically, a single activity may have multiple applicable policies, such as patient consent, guarantor funding, etc. The policy would also indicate the security token used.", 0, java.lang.Integer.MAX_VALUE, policy);
1084          case -478235758: /*network[x]*/  return new Property("network[x]", "Reference(Endpoint)|uri|string", "When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.", 0, 1, network);
1085          case 1843485230: /*network*/  return new Property("network[x]", "Reference(Endpoint)|uri|string", "When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.", 0, 1, network);
1086          case -1769760579: /*networkReference*/  return new Property("network[x]", "Reference(Endpoint)", "When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.", 0, 1, network);
1087          case -478241698: /*networkUri*/  return new Property("network[x]", "uri", "When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.", 0, 1, network);
1088          case -946943009: /*networkString*/  return new Property("network[x]", "string", "When the event utilizes a network there should be an agent describing the local system, and an agent describing remote system, with the network interface details.", 0, 1, network);
1089          case -1385570183: /*authorization*/  return new Property("authorization", "CodeableConcept", "The authorization (e.g., PurposeOfUse) that was used during the event being recorded.", 0, java.lang.Integer.MAX_VALUE, authorization);
1090          default: return super.getNamedProperty(_hash, _name, _checkValid);
1091          }
1092
1093        }
1094
1095      @Override
1096      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1097        switch (hash) {
1098        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // CodeableConcept
1099        case 3506294: /*role*/ return this.role == null ? new Base[0] : this.role.toArray(new Base[this.role.size()]); // CodeableConcept
1100        case 117694: /*who*/ return this.who == null ? new Base[0] : new Base[] {this.who}; // Reference
1101        case 693934258: /*requestor*/ return this.requestor == null ? new Base[0] : new Base[] {this.requestor}; // BooleanType
1102        case 1901043637: /*location*/ return this.location == null ? new Base[0] : new Base[] {this.location}; // Reference
1103        case -982670030: /*policy*/ return this.policy == null ? new Base[0] : this.policy.toArray(new Base[this.policy.size()]); // UriType
1104        case 1843485230: /*network*/ return this.network == null ? new Base[0] : new Base[] {this.network}; // DataType
1105        case -1385570183: /*authorization*/ return this.authorization == null ? new Base[0] : this.authorization.toArray(new Base[this.authorization.size()]); // CodeableConcept
1106        default: return super.getProperty(hash, name, checkValid);
1107        }
1108
1109      }
1110
1111      @Override
1112      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1113        switch (hash) {
1114        case 3575610: // type
1115          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1116          return value;
1117        case 3506294: // role
1118          this.getRole().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
1119          return value;
1120        case 117694: // who
1121          this.who = TypeConvertor.castToReference(value); // Reference
1122          return value;
1123        case 693934258: // requestor
1124          this.requestor = TypeConvertor.castToBoolean(value); // BooleanType
1125          return value;
1126        case 1901043637: // location
1127          this.location = TypeConvertor.castToReference(value); // Reference
1128          return value;
1129        case -982670030: // policy
1130          this.getPolicy().add(TypeConvertor.castToUri(value)); // UriType
1131          return value;
1132        case 1843485230: // network
1133          this.network = TypeConvertor.castToType(value); // DataType
1134          return value;
1135        case -1385570183: // authorization
1136          this.getAuthorization().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
1137          return value;
1138        default: return super.setProperty(hash, name, value);
1139        }
1140
1141      }
1142
1143      @Override
1144      public Base setProperty(String name, Base value) throws FHIRException {
1145        if (name.equals("type")) {
1146          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1147        } else if (name.equals("role")) {
1148          this.getRole().add(TypeConvertor.castToCodeableConcept(value));
1149        } else if (name.equals("who")) {
1150          this.who = TypeConvertor.castToReference(value); // Reference
1151        } else if (name.equals("requestor")) {
1152          this.requestor = TypeConvertor.castToBoolean(value); // BooleanType
1153        } else if (name.equals("location")) {
1154          this.location = TypeConvertor.castToReference(value); // Reference
1155        } else if (name.equals("policy")) {
1156          this.getPolicy().add(TypeConvertor.castToUri(value));
1157        } else if (name.equals("network[x]")) {
1158          this.network = TypeConvertor.castToType(value); // DataType
1159        } else if (name.equals("authorization")) {
1160          this.getAuthorization().add(TypeConvertor.castToCodeableConcept(value));
1161        } else
1162          return super.setProperty(name, value);
1163        return value;
1164      }
1165
1166      @Override
1167      public Base makeProperty(int hash, String name) throws FHIRException {
1168        switch (hash) {
1169        case 3575610:  return getType();
1170        case 3506294:  return addRole(); 
1171        case 117694:  return getWho();
1172        case 693934258:  return getRequestorElement();
1173        case 1901043637:  return getLocation();
1174        case -982670030:  return addPolicyElement();
1175        case -478235758:  return getNetwork();
1176        case 1843485230:  return getNetwork();
1177        case -1385570183:  return addAuthorization(); 
1178        default: return super.makeProperty(hash, name);
1179        }
1180
1181      }
1182
1183      @Override
1184      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1185        switch (hash) {
1186        case 3575610: /*type*/ return new String[] {"CodeableConcept"};
1187        case 3506294: /*role*/ return new String[] {"CodeableConcept"};
1188        case 117694: /*who*/ return new String[] {"Reference"};
1189        case 693934258: /*requestor*/ return new String[] {"boolean"};
1190        case 1901043637: /*location*/ return new String[] {"Reference"};
1191        case -982670030: /*policy*/ return new String[] {"uri"};
1192        case 1843485230: /*network*/ return new String[] {"Reference", "uri", "string"};
1193        case -1385570183: /*authorization*/ return new String[] {"CodeableConcept"};
1194        default: return super.getTypesForProperty(hash, name);
1195        }
1196
1197      }
1198
1199      @Override
1200      public Base addChild(String name) throws FHIRException {
1201        if (name.equals("type")) {
1202          this.type = new CodeableConcept();
1203          return this.type;
1204        }
1205        else if (name.equals("role")) {
1206          return addRole();
1207        }
1208        else if (name.equals("who")) {
1209          this.who = new Reference();
1210          return this.who;
1211        }
1212        else if (name.equals("requestor")) {
1213          throw new FHIRException("Cannot call addChild on a primitive type AuditEvent.agent.requestor");
1214        }
1215        else if (name.equals("location")) {
1216          this.location = new Reference();
1217          return this.location;
1218        }
1219        else if (name.equals("policy")) {
1220          throw new FHIRException("Cannot call addChild on a primitive type AuditEvent.agent.policy");
1221        }
1222        else if (name.equals("networkReference")) {
1223          this.network = new Reference();
1224          return this.network;
1225        }
1226        else if (name.equals("networkUri")) {
1227          this.network = new UriType();
1228          return this.network;
1229        }
1230        else if (name.equals("networkString")) {
1231          this.network = new StringType();
1232          return this.network;
1233        }
1234        else if (name.equals("authorization")) {
1235          return addAuthorization();
1236        }
1237        else
1238          return super.addChild(name);
1239      }
1240
1241      public AuditEventAgentComponent copy() {
1242        AuditEventAgentComponent dst = new AuditEventAgentComponent();
1243        copyValues(dst);
1244        return dst;
1245      }
1246
1247      public void copyValues(AuditEventAgentComponent dst) {
1248        super.copyValues(dst);
1249        dst.type = type == null ? null : type.copy();
1250        if (role != null) {
1251          dst.role = new ArrayList<CodeableConcept>();
1252          for (CodeableConcept i : role)
1253            dst.role.add(i.copy());
1254        };
1255        dst.who = who == null ? null : who.copy();
1256        dst.requestor = requestor == null ? null : requestor.copy();
1257        dst.location = location == null ? null : location.copy();
1258        if (policy != null) {
1259          dst.policy = new ArrayList<UriType>();
1260          for (UriType i : policy)
1261            dst.policy.add(i.copy());
1262        };
1263        dst.network = network == null ? null : network.copy();
1264        if (authorization != null) {
1265          dst.authorization = new ArrayList<CodeableConcept>();
1266          for (CodeableConcept i : authorization)
1267            dst.authorization.add(i.copy());
1268        };
1269      }
1270
1271      @Override
1272      public boolean equalsDeep(Base other_) {
1273        if (!super.equalsDeep(other_))
1274          return false;
1275        if (!(other_ instanceof AuditEventAgentComponent))
1276          return false;
1277        AuditEventAgentComponent o = (AuditEventAgentComponent) other_;
1278        return compareDeep(type, o.type, true) && compareDeep(role, o.role, true) && compareDeep(who, o.who, true)
1279           && compareDeep(requestor, o.requestor, true) && compareDeep(location, o.location, true) && compareDeep(policy, o.policy, true)
1280           && compareDeep(network, o.network, true) && compareDeep(authorization, o.authorization, true);
1281      }
1282
1283      @Override
1284      public boolean equalsShallow(Base other_) {
1285        if (!super.equalsShallow(other_))
1286          return false;
1287        if (!(other_ instanceof AuditEventAgentComponent))
1288          return false;
1289        AuditEventAgentComponent o = (AuditEventAgentComponent) other_;
1290        return compareValues(requestor, o.requestor, true) && compareValues(policy, o.policy, true);
1291      }
1292
1293      public boolean isEmpty() {
1294        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(type, role, who, requestor
1295          , location, policy, network, authorization);
1296      }
1297
1298  public String fhirType() {
1299    return "AuditEvent.agent";
1300
1301  }
1302
1303  }
1304
1305    @Block()
1306    public static class AuditEventSourceComponent extends BackboneElement implements IBaseBackboneElement {
1307        /**
1308         * Logical source location within the healthcare enterprise network.  For example, a hospital or other provider location within a multi-entity provider group.
1309         */
1310        @Child(name = "site", type = {Location.class}, order=1, min=0, max=1, modifier=false, summary=false)
1311        @Description(shortDefinition="Logical source location within the enterprise", formalDefinition="Logical source location within the healthcare enterprise network.  For example, a hospital or other provider location within a multi-entity provider group." )
1312        protected Reference site;
1313
1314        /**
1315         * Identifier of the source where the event was detected.
1316         */
1317        @Child(name = "observer", type = {Practitioner.class, PractitionerRole.class, Organization.class, CareTeam.class, Patient.class, Device.class, RelatedPerson.class}, order=2, min=1, max=1, modifier=false, summary=true)
1318        @Description(shortDefinition="The identity of source detecting the event", formalDefinition="Identifier of the source where the event was detected." )
1319        protected Reference observer;
1320
1321        /**
1322         * Code specifying the type of source where event originated.
1323         */
1324        @Child(name = "type", type = {CodeableConcept.class}, order=3, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1325        @Description(shortDefinition="The type of source where event originated", formalDefinition="Code specifying the type of source where event originated." )
1326        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/security-source-type")
1327        protected List<CodeableConcept> type;
1328
1329        private static final long serialVersionUID = -140005578L;
1330
1331    /**
1332     * Constructor
1333     */
1334      public AuditEventSourceComponent() {
1335        super();
1336      }
1337
1338    /**
1339     * Constructor
1340     */
1341      public AuditEventSourceComponent(Reference observer) {
1342        super();
1343        this.setObserver(observer);
1344      }
1345
1346        /**
1347         * @return {@link #site} (Logical source location within the healthcare enterprise network.  For example, a hospital or other provider location within a multi-entity provider group.)
1348         */
1349        public Reference getSite() { 
1350          if (this.site == null)
1351            if (Configuration.errorOnAutoCreate())
1352              throw new Error("Attempt to auto-create AuditEventSourceComponent.site");
1353            else if (Configuration.doAutoCreate())
1354              this.site = new Reference(); // cc
1355          return this.site;
1356        }
1357
1358        public boolean hasSite() { 
1359          return this.site != null && !this.site.isEmpty();
1360        }
1361
1362        /**
1363         * @param value {@link #site} (Logical source location within the healthcare enterprise network.  For example, a hospital or other provider location within a multi-entity provider group.)
1364         */
1365        public AuditEventSourceComponent setSite(Reference value) { 
1366          this.site = value;
1367          return this;
1368        }
1369
1370        /**
1371         * @return {@link #observer} (Identifier of the source where the event was detected.)
1372         */
1373        public Reference getObserver() { 
1374          if (this.observer == null)
1375            if (Configuration.errorOnAutoCreate())
1376              throw new Error("Attempt to auto-create AuditEventSourceComponent.observer");
1377            else if (Configuration.doAutoCreate())
1378              this.observer = new Reference(); // cc
1379          return this.observer;
1380        }
1381
1382        public boolean hasObserver() { 
1383          return this.observer != null && !this.observer.isEmpty();
1384        }
1385
1386        /**
1387         * @param value {@link #observer} (Identifier of the source where the event was detected.)
1388         */
1389        public AuditEventSourceComponent setObserver(Reference value) { 
1390          this.observer = value;
1391          return this;
1392        }
1393
1394        /**
1395         * @return {@link #type} (Code specifying the type of source where event originated.)
1396         */
1397        public List<CodeableConcept> getType() { 
1398          if (this.type == null)
1399            this.type = new ArrayList<CodeableConcept>();
1400          return this.type;
1401        }
1402
1403        /**
1404         * @return Returns a reference to <code>this</code> for easy method chaining
1405         */
1406        public AuditEventSourceComponent setType(List<CodeableConcept> theType) { 
1407          this.type = theType;
1408          return this;
1409        }
1410
1411        public boolean hasType() { 
1412          if (this.type == null)
1413            return false;
1414          for (CodeableConcept item : this.type)
1415            if (!item.isEmpty())
1416              return true;
1417          return false;
1418        }
1419
1420        public CodeableConcept addType() { //3
1421          CodeableConcept t = new CodeableConcept();
1422          if (this.type == null)
1423            this.type = new ArrayList<CodeableConcept>();
1424          this.type.add(t);
1425          return t;
1426        }
1427
1428        public AuditEventSourceComponent addType(CodeableConcept t) { //3
1429          if (t == null)
1430            return this;
1431          if (this.type == null)
1432            this.type = new ArrayList<CodeableConcept>();
1433          this.type.add(t);
1434          return this;
1435        }
1436
1437        /**
1438         * @return The first repetition of repeating field {@link #type}, creating it if it does not already exist {3}
1439         */
1440        public CodeableConcept getTypeFirstRep() { 
1441          if (getType().isEmpty()) {
1442            addType();
1443          }
1444          return getType().get(0);
1445        }
1446
1447        protected void listChildren(List<Property> children) {
1448          super.listChildren(children);
1449          children.add(new Property("site", "Reference(Location)", "Logical source location within the healthcare enterprise network.  For example, a hospital or other provider location within a multi-entity provider group.", 0, 1, site));
1450          children.add(new Property("observer", "Reference(Practitioner|PractitionerRole|Organization|CareTeam|Patient|Device|RelatedPerson)", "Identifier of the source where the event was detected.", 0, 1, observer));
1451          children.add(new Property("type", "CodeableConcept", "Code specifying the type of source where event originated.", 0, java.lang.Integer.MAX_VALUE, type));
1452        }
1453
1454        @Override
1455        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1456          switch (_hash) {
1457          case 3530567: /*site*/  return new Property("site", "Reference(Location)", "Logical source location within the healthcare enterprise network.  For example, a hospital or other provider location within a multi-entity provider group.", 0, 1, site);
1458          case 348607190: /*observer*/  return new Property("observer", "Reference(Practitioner|PractitionerRole|Organization|CareTeam|Patient|Device|RelatedPerson)", "Identifier of the source where the event was detected.", 0, 1, observer);
1459          case 3575610: /*type*/  return new Property("type", "CodeableConcept", "Code specifying the type of source where event originated.", 0, java.lang.Integer.MAX_VALUE, type);
1460          default: return super.getNamedProperty(_hash, _name, _checkValid);
1461          }
1462
1463        }
1464
1465      @Override
1466      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1467        switch (hash) {
1468        case 3530567: /*site*/ return this.site == null ? new Base[0] : new Base[] {this.site}; // Reference
1469        case 348607190: /*observer*/ return this.observer == null ? new Base[0] : new Base[] {this.observer}; // Reference
1470        case 3575610: /*type*/ return this.type == null ? new Base[0] : this.type.toArray(new Base[this.type.size()]); // CodeableConcept
1471        default: return super.getProperty(hash, name, checkValid);
1472        }
1473
1474      }
1475
1476      @Override
1477      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1478        switch (hash) {
1479        case 3530567: // site
1480          this.site = TypeConvertor.castToReference(value); // Reference
1481          return value;
1482        case 348607190: // observer
1483          this.observer = TypeConvertor.castToReference(value); // Reference
1484          return value;
1485        case 3575610: // type
1486          this.getType().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
1487          return value;
1488        default: return super.setProperty(hash, name, value);
1489        }
1490
1491      }
1492
1493      @Override
1494      public Base setProperty(String name, Base value) throws FHIRException {
1495        if (name.equals("site")) {
1496          this.site = TypeConvertor.castToReference(value); // Reference
1497        } else if (name.equals("observer")) {
1498          this.observer = TypeConvertor.castToReference(value); // Reference
1499        } else if (name.equals("type")) {
1500          this.getType().add(TypeConvertor.castToCodeableConcept(value));
1501        } else
1502          return super.setProperty(name, value);
1503        return value;
1504      }
1505
1506      @Override
1507      public Base makeProperty(int hash, String name) throws FHIRException {
1508        switch (hash) {
1509        case 3530567:  return getSite();
1510        case 348607190:  return getObserver();
1511        case 3575610:  return addType(); 
1512        default: return super.makeProperty(hash, name);
1513        }
1514
1515      }
1516
1517      @Override
1518      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1519        switch (hash) {
1520        case 3530567: /*site*/ return new String[] {"Reference"};
1521        case 348607190: /*observer*/ return new String[] {"Reference"};
1522        case 3575610: /*type*/ return new String[] {"CodeableConcept"};
1523        default: return super.getTypesForProperty(hash, name);
1524        }
1525
1526      }
1527
1528      @Override
1529      public Base addChild(String name) throws FHIRException {
1530        if (name.equals("site")) {
1531          this.site = new Reference();
1532          return this.site;
1533        }
1534        else if (name.equals("observer")) {
1535          this.observer = new Reference();
1536          return this.observer;
1537        }
1538        else if (name.equals("type")) {
1539          return addType();
1540        }
1541        else
1542          return super.addChild(name);
1543      }
1544
1545      public AuditEventSourceComponent copy() {
1546        AuditEventSourceComponent dst = new AuditEventSourceComponent();
1547        copyValues(dst);
1548        return dst;
1549      }
1550
1551      public void copyValues(AuditEventSourceComponent dst) {
1552        super.copyValues(dst);
1553        dst.site = site == null ? null : site.copy();
1554        dst.observer = observer == null ? null : observer.copy();
1555        if (type != null) {
1556          dst.type = new ArrayList<CodeableConcept>();
1557          for (CodeableConcept i : type)
1558            dst.type.add(i.copy());
1559        };
1560      }
1561
1562      @Override
1563      public boolean equalsDeep(Base other_) {
1564        if (!super.equalsDeep(other_))
1565          return false;
1566        if (!(other_ instanceof AuditEventSourceComponent))
1567          return false;
1568        AuditEventSourceComponent o = (AuditEventSourceComponent) other_;
1569        return compareDeep(site, o.site, true) && compareDeep(observer, o.observer, true) && compareDeep(type, o.type, true)
1570          ;
1571      }
1572
1573      @Override
1574      public boolean equalsShallow(Base other_) {
1575        if (!super.equalsShallow(other_))
1576          return false;
1577        if (!(other_ instanceof AuditEventSourceComponent))
1578          return false;
1579        AuditEventSourceComponent o = (AuditEventSourceComponent) other_;
1580        return true;
1581      }
1582
1583      public boolean isEmpty() {
1584        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(site, observer, type);
1585      }
1586
1587  public String fhirType() {
1588    return "AuditEvent.source";
1589
1590  }
1591
1592  }
1593
1594    @Block()
1595    public static class AuditEventEntityComponent extends BackboneElement implements IBaseBackboneElement {
1596        /**
1597         * Identifies a specific instance of the entity. The reference should be version specific.
1598         */
1599        @Child(name = "what", type = {Reference.class}, order=1, min=0, max=1, modifier=false, summary=true)
1600        @Description(shortDefinition="Specific instance of resource", formalDefinition="Identifies a specific instance of the entity. The reference should be version specific." )
1601        protected Reference what;
1602
1603        /**
1604         * Code representing the role the entity played in the event being audited.
1605         */
1606        @Child(name = "role", type = {CodeableConcept.class}, order=2, min=0, max=1, modifier=false, summary=false)
1607        @Description(shortDefinition="What role the entity played", formalDefinition="Code representing the role the entity played in the event being audited." )
1608        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/object-role")
1609        protected CodeableConcept role;
1610
1611        /**
1612         * Security labels for the identified entity.
1613         */
1614        @Child(name = "securityLabel", type = {CodeableConcept.class}, order=3, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1615        @Description(shortDefinition="Security labels on the entity", formalDefinition="Security labels for the identified entity." )
1616        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/security-label-examples")
1617        protected List<CodeableConcept> securityLabel;
1618
1619        /**
1620         * The query parameters for a query-type entities.
1621         */
1622        @Child(name = "query", type = {Base64BinaryType.class}, order=4, min=0, max=1, modifier=false, summary=true)
1623        @Description(shortDefinition="Query parameters", formalDefinition="The query parameters for a query-type entities." )
1624        protected Base64BinaryType query;
1625
1626        /**
1627         * Tagged value pairs for conveying additional information about the entity.
1628         */
1629        @Child(name = "detail", type = {}, order=5, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1630        @Description(shortDefinition="Additional Information about the entity", formalDefinition="Tagged value pairs for conveying additional information about the entity." )
1631        protected List<AuditEventEntityDetailComponent> detail;
1632
1633        /**
1634         * The entity is attributed to an agent to express the agent's responsibility for that entity in the activity. This is most used to indicate when persistence media (the entity) are used by an agent. For example when importing data from a device, the device would be described in an entity, and the user importing data from that media would be indicated as the entity.agent.
1635         */
1636        @Child(name = "agent", type = {AuditEventAgentComponent.class}, order=6, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1637        @Description(shortDefinition="Entity is attributed to this agent", formalDefinition="The entity is attributed to an agent to express the agent's responsibility for that entity in the activity. This is most used to indicate when persistence media (the entity) are used by an agent. For example when importing data from a device, the device would be described in an entity, and the user importing data from that media would be indicated as the entity.agent." )
1638        protected List<AuditEventAgentComponent> agent;
1639
1640        private static final long serialVersionUID = -711898650L;
1641
1642    /**
1643     * Constructor
1644     */
1645      public AuditEventEntityComponent() {
1646        super();
1647      }
1648
1649        /**
1650         * @return {@link #what} (Identifies a specific instance of the entity. The reference should be version specific.)
1651         */
1652        public Reference getWhat() { 
1653          if (this.what == null)
1654            if (Configuration.errorOnAutoCreate())
1655              throw new Error("Attempt to auto-create AuditEventEntityComponent.what");
1656            else if (Configuration.doAutoCreate())
1657              this.what = new Reference(); // cc
1658          return this.what;
1659        }
1660
1661        public boolean hasWhat() { 
1662          return this.what != null && !this.what.isEmpty();
1663        }
1664
1665        /**
1666         * @param value {@link #what} (Identifies a specific instance of the entity. The reference should be version specific.)
1667         */
1668        public AuditEventEntityComponent setWhat(Reference value) { 
1669          this.what = value;
1670          return this;
1671        }
1672
1673        /**
1674         * @return {@link #role} (Code representing the role the entity played in the event being audited.)
1675         */
1676        public CodeableConcept getRole() { 
1677          if (this.role == null)
1678            if (Configuration.errorOnAutoCreate())
1679              throw new Error("Attempt to auto-create AuditEventEntityComponent.role");
1680            else if (Configuration.doAutoCreate())
1681              this.role = new CodeableConcept(); // cc
1682          return this.role;
1683        }
1684
1685        public boolean hasRole() { 
1686          return this.role != null && !this.role.isEmpty();
1687        }
1688
1689        /**
1690         * @param value {@link #role} (Code representing the role the entity played in the event being audited.)
1691         */
1692        public AuditEventEntityComponent setRole(CodeableConcept value) { 
1693          this.role = value;
1694          return this;
1695        }
1696
1697        /**
1698         * @return {@link #securityLabel} (Security labels for the identified entity.)
1699         */
1700        public List<CodeableConcept> getSecurityLabel() { 
1701          if (this.securityLabel == null)
1702            this.securityLabel = new ArrayList<CodeableConcept>();
1703          return this.securityLabel;
1704        }
1705
1706        /**
1707         * @return Returns a reference to <code>this</code> for easy method chaining
1708         */
1709        public AuditEventEntityComponent setSecurityLabel(List<CodeableConcept> theSecurityLabel) { 
1710          this.securityLabel = theSecurityLabel;
1711          return this;
1712        }
1713
1714        public boolean hasSecurityLabel() { 
1715          if (this.securityLabel == null)
1716            return false;
1717          for (CodeableConcept item : this.securityLabel)
1718            if (!item.isEmpty())
1719              return true;
1720          return false;
1721        }
1722
1723        public CodeableConcept addSecurityLabel() { //3
1724          CodeableConcept t = new CodeableConcept();
1725          if (this.securityLabel == null)
1726            this.securityLabel = new ArrayList<CodeableConcept>();
1727          this.securityLabel.add(t);
1728          return t;
1729        }
1730
1731        public AuditEventEntityComponent addSecurityLabel(CodeableConcept t) { //3
1732          if (t == null)
1733            return this;
1734          if (this.securityLabel == null)
1735            this.securityLabel = new ArrayList<CodeableConcept>();
1736          this.securityLabel.add(t);
1737          return this;
1738        }
1739
1740        /**
1741         * @return The first repetition of repeating field {@link #securityLabel}, creating it if it does not already exist {3}
1742         */
1743        public CodeableConcept getSecurityLabelFirstRep() { 
1744          if (getSecurityLabel().isEmpty()) {
1745            addSecurityLabel();
1746          }
1747          return getSecurityLabel().get(0);
1748        }
1749
1750        /**
1751         * @return {@link #query} (The query parameters for a query-type entities.). This is the underlying object with id, value and extensions. The accessor "getQuery" gives direct access to the value
1752         */
1753        public Base64BinaryType getQueryElement() { 
1754          if (this.query == null)
1755            if (Configuration.errorOnAutoCreate())
1756              throw new Error("Attempt to auto-create AuditEventEntityComponent.query");
1757            else if (Configuration.doAutoCreate())
1758              this.query = new Base64BinaryType(); // bb
1759          return this.query;
1760        }
1761
1762        public boolean hasQueryElement() { 
1763          return this.query != null && !this.query.isEmpty();
1764        }
1765
1766        public boolean hasQuery() { 
1767          return this.query != null && !this.query.isEmpty();
1768        }
1769
1770        /**
1771         * @param value {@link #query} (The query parameters for a query-type entities.). This is the underlying object with id, value and extensions. The accessor "getQuery" gives direct access to the value
1772         */
1773        public AuditEventEntityComponent setQueryElement(Base64BinaryType value) { 
1774          this.query = value;
1775          return this;
1776        }
1777
1778        /**
1779         * @return The query parameters for a query-type entities.
1780         */
1781        public byte[] getQuery() { 
1782          return this.query == null ? null : this.query.getValue();
1783        }
1784
1785        /**
1786         * @param value The query parameters for a query-type entities.
1787         */
1788        public AuditEventEntityComponent setQuery(byte[] value) { 
1789          if (value == null)
1790            this.query = null;
1791          else {
1792            if (this.query == null)
1793              this.query = new Base64BinaryType();
1794            this.query.setValue(value);
1795          }
1796          return this;
1797        }
1798
1799        /**
1800         * @return {@link #detail} (Tagged value pairs for conveying additional information about the entity.)
1801         */
1802        public List<AuditEventEntityDetailComponent> getDetail() { 
1803          if (this.detail == null)
1804            this.detail = new ArrayList<AuditEventEntityDetailComponent>();
1805          return this.detail;
1806        }
1807
1808        /**
1809         * @return Returns a reference to <code>this</code> for easy method chaining
1810         */
1811        public AuditEventEntityComponent setDetail(List<AuditEventEntityDetailComponent> theDetail) { 
1812          this.detail = theDetail;
1813          return this;
1814        }
1815
1816        public boolean hasDetail() { 
1817          if (this.detail == null)
1818            return false;
1819          for (AuditEventEntityDetailComponent item : this.detail)
1820            if (!item.isEmpty())
1821              return true;
1822          return false;
1823        }
1824
1825        public AuditEventEntityDetailComponent addDetail() { //3
1826          AuditEventEntityDetailComponent t = new AuditEventEntityDetailComponent();
1827          if (this.detail == null)
1828            this.detail = new ArrayList<AuditEventEntityDetailComponent>();
1829          this.detail.add(t);
1830          return t;
1831        }
1832
1833        public AuditEventEntityComponent addDetail(AuditEventEntityDetailComponent t) { //3
1834          if (t == null)
1835            return this;
1836          if (this.detail == null)
1837            this.detail = new ArrayList<AuditEventEntityDetailComponent>();
1838          this.detail.add(t);
1839          return this;
1840        }
1841
1842        /**
1843         * @return The first repetition of repeating field {@link #detail}, creating it if it does not already exist {3}
1844         */
1845        public AuditEventEntityDetailComponent getDetailFirstRep() { 
1846          if (getDetail().isEmpty()) {
1847            addDetail();
1848          }
1849          return getDetail().get(0);
1850        }
1851
1852        /**
1853         * @return {@link #agent} (The entity is attributed to an agent to express the agent's responsibility for that entity in the activity. This is most used to indicate when persistence media (the entity) are used by an agent. For example when importing data from a device, the device would be described in an entity, and the user importing data from that media would be indicated as the entity.agent.)
1854         */
1855        public List<AuditEventAgentComponent> getAgent() { 
1856          if (this.agent == null)
1857            this.agent = new ArrayList<AuditEventAgentComponent>();
1858          return this.agent;
1859        }
1860
1861        /**
1862         * @return Returns a reference to <code>this</code> for easy method chaining
1863         */
1864        public AuditEventEntityComponent setAgent(List<AuditEventAgentComponent> theAgent) { 
1865          this.agent = theAgent;
1866          return this;
1867        }
1868
1869        public boolean hasAgent() { 
1870          if (this.agent == null)
1871            return false;
1872          for (AuditEventAgentComponent item : this.agent)
1873            if (!item.isEmpty())
1874              return true;
1875          return false;
1876        }
1877
1878        public AuditEventAgentComponent addAgent() { //3
1879          AuditEventAgentComponent t = new AuditEventAgentComponent();
1880          if (this.agent == null)
1881            this.agent = new ArrayList<AuditEventAgentComponent>();
1882          this.agent.add(t);
1883          return t;
1884        }
1885
1886        public AuditEventEntityComponent addAgent(AuditEventAgentComponent t) { //3
1887          if (t == null)
1888            return this;
1889          if (this.agent == null)
1890            this.agent = new ArrayList<AuditEventAgentComponent>();
1891          this.agent.add(t);
1892          return this;
1893        }
1894
1895        /**
1896         * @return The first repetition of repeating field {@link #agent}, creating it if it does not already exist {3}
1897         */
1898        public AuditEventAgentComponent getAgentFirstRep() { 
1899          if (getAgent().isEmpty()) {
1900            addAgent();
1901          }
1902          return getAgent().get(0);
1903        }
1904
1905        protected void listChildren(List<Property> children) {
1906          super.listChildren(children);
1907          children.add(new Property("what", "Reference(Any)", "Identifies a specific instance of the entity. The reference should be version specific.", 0, 1, what));
1908          children.add(new Property("role", "CodeableConcept", "Code representing the role the entity played in the event being audited.", 0, 1, role));
1909          children.add(new Property("securityLabel", "CodeableConcept", "Security labels for the identified entity.", 0, java.lang.Integer.MAX_VALUE, securityLabel));
1910          children.add(new Property("query", "base64Binary", "The query parameters for a query-type entities.", 0, 1, query));
1911          children.add(new Property("detail", "", "Tagged value pairs for conveying additional information about the entity.", 0, java.lang.Integer.MAX_VALUE, detail));
1912          children.add(new Property("agent", "@AuditEvent.agent", "The entity is attributed to an agent to express the agent's responsibility for that entity in the activity. This is most used to indicate when persistence media (the entity) are used by an agent. For example when importing data from a device, the device would be described in an entity, and the user importing data from that media would be indicated as the entity.agent.", 0, java.lang.Integer.MAX_VALUE, agent));
1913        }
1914
1915        @Override
1916        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1917          switch (_hash) {
1918          case 3648196: /*what*/  return new Property("what", "Reference(Any)", "Identifies a specific instance of the entity. The reference should be version specific.", 0, 1, what);
1919          case 3506294: /*role*/  return new Property("role", "CodeableConcept", "Code representing the role the entity played in the event being audited.", 0, 1, role);
1920          case -722296940: /*securityLabel*/  return new Property("securityLabel", "CodeableConcept", "Security labels for the identified entity.", 0, java.lang.Integer.MAX_VALUE, securityLabel);
1921          case 107944136: /*query*/  return new Property("query", "base64Binary", "The query parameters for a query-type entities.", 0, 1, query);
1922          case -1335224239: /*detail*/  return new Property("detail", "", "Tagged value pairs for conveying additional information about the entity.", 0, java.lang.Integer.MAX_VALUE, detail);
1923          case 92750597: /*agent*/  return new Property("agent", "@AuditEvent.agent", "The entity is attributed to an agent to express the agent's responsibility for that entity in the activity. This is most used to indicate when persistence media (the entity) are used by an agent. For example when importing data from a device, the device would be described in an entity, and the user importing data from that media would be indicated as the entity.agent.", 0, java.lang.Integer.MAX_VALUE, agent);
1924          default: return super.getNamedProperty(_hash, _name, _checkValid);
1925          }
1926
1927        }
1928
1929      @Override
1930      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1931        switch (hash) {
1932        case 3648196: /*what*/ return this.what == null ? new Base[0] : new Base[] {this.what}; // Reference
1933        case 3506294: /*role*/ return this.role == null ? new Base[0] : new Base[] {this.role}; // CodeableConcept
1934        case -722296940: /*securityLabel*/ return this.securityLabel == null ? new Base[0] : this.securityLabel.toArray(new Base[this.securityLabel.size()]); // CodeableConcept
1935        case 107944136: /*query*/ return this.query == null ? new Base[0] : new Base[] {this.query}; // Base64BinaryType
1936        case -1335224239: /*detail*/ return this.detail == null ? new Base[0] : this.detail.toArray(new Base[this.detail.size()]); // AuditEventEntityDetailComponent
1937        case 92750597: /*agent*/ return this.agent == null ? new Base[0] : this.agent.toArray(new Base[this.agent.size()]); // AuditEventAgentComponent
1938        default: return super.getProperty(hash, name, checkValid);
1939        }
1940
1941      }
1942
1943      @Override
1944      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1945        switch (hash) {
1946        case 3648196: // what
1947          this.what = TypeConvertor.castToReference(value); // Reference
1948          return value;
1949        case 3506294: // role
1950          this.role = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1951          return value;
1952        case -722296940: // securityLabel
1953          this.getSecurityLabel().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
1954          return value;
1955        case 107944136: // query
1956          this.query = TypeConvertor.castToBase64Binary(value); // Base64BinaryType
1957          return value;
1958        case -1335224239: // detail
1959          this.getDetail().add((AuditEventEntityDetailComponent) value); // AuditEventEntityDetailComponent
1960          return value;
1961        case 92750597: // agent
1962          this.getAgent().add((AuditEventAgentComponent) value); // AuditEventAgentComponent
1963          return value;
1964        default: return super.setProperty(hash, name, value);
1965        }
1966
1967      }
1968
1969      @Override
1970      public Base setProperty(String name, Base value) throws FHIRException {
1971        if (name.equals("what")) {
1972          this.what = TypeConvertor.castToReference(value); // Reference
1973        } else if (name.equals("role")) {
1974          this.role = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1975        } else if (name.equals("securityLabel")) {
1976          this.getSecurityLabel().add(TypeConvertor.castToCodeableConcept(value));
1977        } else if (name.equals("query")) {
1978          this.query = TypeConvertor.castToBase64Binary(value); // Base64BinaryType
1979        } else if (name.equals("detail")) {
1980          this.getDetail().add((AuditEventEntityDetailComponent) value);
1981        } else if (name.equals("agent")) {
1982          this.getAgent().add((AuditEventAgentComponent) value);
1983        } else
1984          return super.setProperty(name, value);
1985        return value;
1986      }
1987
1988      @Override
1989      public Base makeProperty(int hash, String name) throws FHIRException {
1990        switch (hash) {
1991        case 3648196:  return getWhat();
1992        case 3506294:  return getRole();
1993        case -722296940:  return addSecurityLabel(); 
1994        case 107944136:  return getQueryElement();
1995        case -1335224239:  return addDetail(); 
1996        case 92750597:  return addAgent(); 
1997        default: return super.makeProperty(hash, name);
1998        }
1999
2000      }
2001
2002      @Override
2003      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2004        switch (hash) {
2005        case 3648196: /*what*/ return new String[] {"Reference"};
2006        case 3506294: /*role*/ return new String[] {"CodeableConcept"};
2007        case -722296940: /*securityLabel*/ return new String[] {"CodeableConcept"};
2008        case 107944136: /*query*/ return new String[] {"base64Binary"};
2009        case -1335224239: /*detail*/ return new String[] {};
2010        case 92750597: /*agent*/ return new String[] {"@AuditEvent.agent"};
2011        default: return super.getTypesForProperty(hash, name);
2012        }
2013
2014      }
2015
2016      @Override
2017      public Base addChild(String name) throws FHIRException {
2018        if (name.equals("what")) {
2019          this.what = new Reference();
2020          return this.what;
2021        }
2022        else if (name.equals("role")) {
2023          this.role = new CodeableConcept();
2024          return this.role;
2025        }
2026        else if (name.equals("securityLabel")) {
2027          return addSecurityLabel();
2028        }
2029        else if (name.equals("query")) {
2030          throw new FHIRException("Cannot call addChild on a primitive type AuditEvent.entity.query");
2031        }
2032        else if (name.equals("detail")) {
2033          return addDetail();
2034        }
2035        else if (name.equals("agent")) {
2036          return addAgent();
2037        }
2038        else
2039          return super.addChild(name);
2040      }
2041
2042      public AuditEventEntityComponent copy() {
2043        AuditEventEntityComponent dst = new AuditEventEntityComponent();
2044        copyValues(dst);
2045        return dst;
2046      }
2047
2048      public void copyValues(AuditEventEntityComponent dst) {
2049        super.copyValues(dst);
2050        dst.what = what == null ? null : what.copy();
2051        dst.role = role == null ? null : role.copy();
2052        if (securityLabel != null) {
2053          dst.securityLabel = new ArrayList<CodeableConcept>();
2054          for (CodeableConcept i : securityLabel)
2055            dst.securityLabel.add(i.copy());
2056        };
2057        dst.query = query == null ? null : query.copy();
2058        if (detail != null) {
2059          dst.detail = new ArrayList<AuditEventEntityDetailComponent>();
2060          for (AuditEventEntityDetailComponent i : detail)
2061            dst.detail.add(i.copy());
2062        };
2063        if (agent != null) {
2064          dst.agent = new ArrayList<AuditEventAgentComponent>();
2065          for (AuditEventAgentComponent i : agent)
2066            dst.agent.add(i.copy());
2067        };
2068      }
2069
2070      @Override
2071      public boolean equalsDeep(Base other_) {
2072        if (!super.equalsDeep(other_))
2073          return false;
2074        if (!(other_ instanceof AuditEventEntityComponent))
2075          return false;
2076        AuditEventEntityComponent o = (AuditEventEntityComponent) other_;
2077        return compareDeep(what, o.what, true) && compareDeep(role, o.role, true) && compareDeep(securityLabel, o.securityLabel, true)
2078           && compareDeep(query, o.query, true) && compareDeep(detail, o.detail, true) && compareDeep(agent, o.agent, true)
2079          ;
2080      }
2081
2082      @Override
2083      public boolean equalsShallow(Base other_) {
2084        if (!super.equalsShallow(other_))
2085          return false;
2086        if (!(other_ instanceof AuditEventEntityComponent))
2087          return false;
2088        AuditEventEntityComponent o = (AuditEventEntityComponent) other_;
2089        return compareValues(query, o.query, true);
2090      }
2091
2092      public boolean isEmpty() {
2093        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(what, role, securityLabel
2094          , query, detail, agent);
2095      }
2096
2097  public String fhirType() {
2098    return "AuditEvent.entity";
2099
2100  }
2101
2102  }
2103
2104    @Block()
2105    public static class AuditEventEntityDetailComponent extends BackboneElement implements IBaseBackboneElement {
2106        /**
2107         * The type of extra detail provided in the value.
2108         */
2109        @Child(name = "type", type = {CodeableConcept.class}, order=1, min=1, max=1, modifier=false, summary=false)
2110        @Description(shortDefinition="Name of the property", formalDefinition="The type of extra detail provided in the value." )
2111        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/audit-event-type")
2112        protected CodeableConcept type;
2113
2114        /**
2115         * The  value of the extra detail.
2116         */
2117        @Child(name = "value", type = {Quantity.class, CodeableConcept.class, StringType.class, BooleanType.class, IntegerType.class, Range.class, Ratio.class, TimeType.class, DateTimeType.class, Period.class, Base64BinaryType.class}, order=2, min=1, max=1, modifier=false, summary=false)
2118        @Description(shortDefinition="Property value", formalDefinition="The  value of the extra detail." )
2119        protected DataType value;
2120
2121        private static final long serialVersionUID = -1659186716L;
2122
2123    /**
2124     * Constructor
2125     */
2126      public AuditEventEntityDetailComponent() {
2127        super();
2128      }
2129
2130    /**
2131     * Constructor
2132     */
2133      public AuditEventEntityDetailComponent(CodeableConcept type, DataType value) {
2134        super();
2135        this.setType(type);
2136        this.setValue(value);
2137      }
2138
2139        /**
2140         * @return {@link #type} (The type of extra detail provided in the value.)
2141         */
2142        public CodeableConcept getType() { 
2143          if (this.type == null)
2144            if (Configuration.errorOnAutoCreate())
2145              throw new Error("Attempt to auto-create AuditEventEntityDetailComponent.type");
2146            else if (Configuration.doAutoCreate())
2147              this.type = new CodeableConcept(); // cc
2148          return this.type;
2149        }
2150
2151        public boolean hasType() { 
2152          return this.type != null && !this.type.isEmpty();
2153        }
2154
2155        /**
2156         * @param value {@link #type} (The type of extra detail provided in the value.)
2157         */
2158        public AuditEventEntityDetailComponent setType(CodeableConcept value) { 
2159          this.type = value;
2160          return this;
2161        }
2162
2163        /**
2164         * @return {@link #value} (The  value of the extra detail.)
2165         */
2166        public DataType getValue() { 
2167          return this.value;
2168        }
2169
2170        /**
2171         * @return {@link #value} (The  value of the extra detail.)
2172         */
2173        public Quantity getValueQuantity() throws FHIRException { 
2174          if (this.value == null)
2175            this.value = new Quantity();
2176          if (!(this.value instanceof Quantity))
2177            throw new FHIRException("Type mismatch: the type Quantity was expected, but "+this.value.getClass().getName()+" was encountered");
2178          return (Quantity) this.value;
2179        }
2180
2181        public boolean hasValueQuantity() { 
2182          return this != null && this.value instanceof Quantity;
2183        }
2184
2185        /**
2186         * @return {@link #value} (The  value of the extra detail.)
2187         */
2188        public CodeableConcept getValueCodeableConcept() throws FHIRException { 
2189          if (this.value == null)
2190            this.value = new CodeableConcept();
2191          if (!(this.value instanceof CodeableConcept))
2192            throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "+this.value.getClass().getName()+" was encountered");
2193          return (CodeableConcept) this.value;
2194        }
2195
2196        public boolean hasValueCodeableConcept() { 
2197          return this != null && this.value instanceof CodeableConcept;
2198        }
2199
2200        /**
2201         * @return {@link #value} (The  value of the extra detail.)
2202         */
2203        public StringType getValueStringType() throws FHIRException { 
2204          if (this.value == null)
2205            this.value = new StringType();
2206          if (!(this.value instanceof StringType))
2207            throw new FHIRException("Type mismatch: the type StringType was expected, but "+this.value.getClass().getName()+" was encountered");
2208          return (StringType) this.value;
2209        }
2210
2211        public boolean hasValueStringType() { 
2212          return this != null && this.value instanceof StringType;
2213        }
2214
2215        /**
2216         * @return {@link #value} (The  value of the extra detail.)
2217         */
2218        public BooleanType getValueBooleanType() throws FHIRException { 
2219          if (this.value == null)
2220            this.value = new BooleanType();
2221          if (!(this.value instanceof BooleanType))
2222            throw new FHIRException("Type mismatch: the type BooleanType was expected, but "+this.value.getClass().getName()+" was encountered");
2223          return (BooleanType) this.value;
2224        }
2225
2226        public boolean hasValueBooleanType() { 
2227          return this != null && this.value instanceof BooleanType;
2228        }
2229
2230        /**
2231         * @return {@link #value} (The  value of the extra detail.)
2232         */
2233        public IntegerType getValueIntegerType() throws FHIRException { 
2234          if (this.value == null)
2235            this.value = new IntegerType();
2236          if (!(this.value instanceof IntegerType))
2237            throw new FHIRException("Type mismatch: the type IntegerType was expected, but "+this.value.getClass().getName()+" was encountered");
2238          return (IntegerType) this.value;
2239        }
2240
2241        public boolean hasValueIntegerType() { 
2242          return this != null && this.value instanceof IntegerType;
2243        }
2244
2245        /**
2246         * @return {@link #value} (The  value of the extra detail.)
2247         */
2248        public Range getValueRange() throws FHIRException { 
2249          if (this.value == null)
2250            this.value = new Range();
2251          if (!(this.value instanceof Range))
2252            throw new FHIRException("Type mismatch: the type Range was expected, but "+this.value.getClass().getName()+" was encountered");
2253          return (Range) this.value;
2254        }
2255
2256        public boolean hasValueRange() { 
2257          return this != null && this.value instanceof Range;
2258        }
2259
2260        /**
2261         * @return {@link #value} (The  value of the extra detail.)
2262         */
2263        public Ratio getValueRatio() throws FHIRException { 
2264          if (this.value == null)
2265            this.value = new Ratio();
2266          if (!(this.value instanceof Ratio))
2267            throw new FHIRException("Type mismatch: the type Ratio was expected, but "+this.value.getClass().getName()+" was encountered");
2268          return (Ratio) this.value;
2269        }
2270
2271        public boolean hasValueRatio() { 
2272          return this != null && this.value instanceof Ratio;
2273        }
2274
2275        /**
2276         * @return {@link #value} (The  value of the extra detail.)
2277         */
2278        public TimeType getValueTimeType() throws FHIRException { 
2279          if (this.value == null)
2280            this.value = new TimeType();
2281          if (!(this.value instanceof TimeType))
2282            throw new FHIRException("Type mismatch: the type TimeType was expected, but "+this.value.getClass().getName()+" was encountered");
2283          return (TimeType) this.value;
2284        }
2285
2286        public boolean hasValueTimeType() { 
2287          return this != null && this.value instanceof TimeType;
2288        }
2289
2290        /**
2291         * @return {@link #value} (The  value of the extra detail.)
2292         */
2293        public DateTimeType getValueDateTimeType() throws FHIRException { 
2294          if (this.value == null)
2295            this.value = new DateTimeType();
2296          if (!(this.value instanceof DateTimeType))
2297            throw new FHIRException("Type mismatch: the type DateTimeType was expected, but "+this.value.getClass().getName()+" was encountered");
2298          return (DateTimeType) this.value;
2299        }
2300
2301        public boolean hasValueDateTimeType() { 
2302          return this != null && this.value instanceof DateTimeType;
2303        }
2304
2305        /**
2306         * @return {@link #value} (The  value of the extra detail.)
2307         */
2308        public Period getValuePeriod() throws FHIRException { 
2309          if (this.value == null)
2310            this.value = new Period();
2311          if (!(this.value instanceof Period))
2312            throw new FHIRException("Type mismatch: the type Period was expected, but "+this.value.getClass().getName()+" was encountered");
2313          return (Period) this.value;
2314        }
2315
2316        public boolean hasValuePeriod() { 
2317          return this != null && this.value instanceof Period;
2318        }
2319
2320        /**
2321         * @return {@link #value} (The  value of the extra detail.)
2322         */
2323        public Base64BinaryType getValueBase64BinaryType() throws FHIRException { 
2324          if (this.value == null)
2325            this.value = new Base64BinaryType();
2326          if (!(this.value instanceof Base64BinaryType))
2327            throw new FHIRException("Type mismatch: the type Base64BinaryType was expected, but "+this.value.getClass().getName()+" was encountered");
2328          return (Base64BinaryType) this.value;
2329        }
2330
2331        public boolean hasValueBase64BinaryType() { 
2332          return this != null && this.value instanceof Base64BinaryType;
2333        }
2334
2335        public boolean hasValue() { 
2336          return this.value != null && !this.value.isEmpty();
2337        }
2338
2339        /**
2340         * @param value {@link #value} (The  value of the extra detail.)
2341         */
2342        public AuditEventEntityDetailComponent setValue(DataType value) { 
2343          if (value != null && !(value instanceof Quantity || value instanceof CodeableConcept || value instanceof StringType || value instanceof BooleanType || value instanceof IntegerType || value instanceof Range || value instanceof Ratio || value instanceof TimeType || value instanceof DateTimeType || value instanceof Period || value instanceof Base64BinaryType))
2344            throw new Error("Not the right type for AuditEvent.entity.detail.value[x]: "+value.fhirType());
2345          this.value = value;
2346          return this;
2347        }
2348
2349        protected void listChildren(List<Property> children) {
2350          super.listChildren(children);
2351          children.add(new Property("type", "CodeableConcept", "The type of extra detail provided in the value.", 0, 1, type));
2352          children.add(new Property("value[x]", "Quantity|CodeableConcept|string|boolean|integer|Range|Ratio|time|dateTime|Period|base64Binary", "The  value of the extra detail.", 0, 1, value));
2353        }
2354
2355        @Override
2356        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2357          switch (_hash) {
2358          case 3575610: /*type*/  return new Property("type", "CodeableConcept", "The type of extra detail provided in the value.", 0, 1, type);
2359          case -1410166417: /*value[x]*/  return new Property("value[x]", "Quantity|CodeableConcept|string|boolean|integer|Range|Ratio|time|dateTime|Period|base64Binary", "The  value of the extra detail.", 0, 1, value);
2360          case 111972721: /*value*/  return new Property("value[x]", "Quantity|CodeableConcept|string|boolean|integer|Range|Ratio|time|dateTime|Period|base64Binary", "The  value of the extra detail.", 0, 1, value);
2361          case -2029823716: /*valueQuantity*/  return new Property("value[x]", "Quantity", "The  value of the extra detail.", 0, 1, value);
2362          case 924902896: /*valueCodeableConcept*/  return new Property("value[x]", "CodeableConcept", "The  value of the extra detail.", 0, 1, value);
2363          case -1424603934: /*valueString*/  return new Property("value[x]", "string", "The  value of the extra detail.", 0, 1, value);
2364          case 733421943: /*valueBoolean*/  return new Property("value[x]", "boolean", "The  value of the extra detail.", 0, 1, value);
2365          case -1668204915: /*valueInteger*/  return new Property("value[x]", "integer", "The  value of the extra detail.", 0, 1, value);
2366          case 2030761548: /*valueRange*/  return new Property("value[x]", "Range", "The  value of the extra detail.", 0, 1, value);
2367          case 2030767386: /*valueRatio*/  return new Property("value[x]", "Ratio", "The  value of the extra detail.", 0, 1, value);
2368          case -765708322: /*valueTime*/  return new Property("value[x]", "time", "The  value of the extra detail.", 0, 1, value);
2369          case 1047929900: /*valueDateTime*/  return new Property("value[x]", "dateTime", "The  value of the extra detail.", 0, 1, value);
2370          case -1524344174: /*valuePeriod*/  return new Property("value[x]", "Period", "The  value of the extra detail.", 0, 1, value);
2371          case -1535024575: /*valueBase64Binary*/  return new Property("value[x]", "base64Binary", "The  value of the extra detail.", 0, 1, value);
2372          default: return super.getNamedProperty(_hash, _name, _checkValid);
2373          }
2374
2375        }
2376
2377      @Override
2378      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2379        switch (hash) {
2380        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // CodeableConcept
2381        case 111972721: /*value*/ return this.value == null ? new Base[0] : new Base[] {this.value}; // DataType
2382        default: return super.getProperty(hash, name, checkValid);
2383        }
2384
2385      }
2386
2387      @Override
2388      public Base setProperty(int hash, String name, Base value) throws FHIRException {
2389        switch (hash) {
2390        case 3575610: // type
2391          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
2392          return value;
2393        case 111972721: // value
2394          this.value = TypeConvertor.castToType(value); // DataType
2395          return value;
2396        default: return super.setProperty(hash, name, value);
2397        }
2398
2399      }
2400
2401      @Override
2402      public Base setProperty(String name, Base value) throws FHIRException {
2403        if (name.equals("type")) {
2404          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
2405        } else if (name.equals("value[x]")) {
2406          this.value = TypeConvertor.castToType(value); // DataType
2407        } else
2408          return super.setProperty(name, value);
2409        return value;
2410      }
2411
2412      @Override
2413      public Base makeProperty(int hash, String name) throws FHIRException {
2414        switch (hash) {
2415        case 3575610:  return getType();
2416        case -1410166417:  return getValue();
2417        case 111972721:  return getValue();
2418        default: return super.makeProperty(hash, name);
2419        }
2420
2421      }
2422
2423      @Override
2424      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2425        switch (hash) {
2426        case 3575610: /*type*/ return new String[] {"CodeableConcept"};
2427        case 111972721: /*value*/ return new String[] {"Quantity", "CodeableConcept", "string", "boolean", "integer", "Range", "Ratio", "time", "dateTime", "Period", "base64Binary"};
2428        default: return super.getTypesForProperty(hash, name);
2429        }
2430
2431      }
2432
2433      @Override
2434      public Base addChild(String name) throws FHIRException {
2435        if (name.equals("type")) {
2436          this.type = new CodeableConcept();
2437          return this.type;
2438        }
2439        else if (name.equals("valueQuantity")) {
2440          this.value = new Quantity();
2441          return this.value;
2442        }
2443        else if (name.equals("valueCodeableConcept")) {
2444          this.value = new CodeableConcept();
2445          return this.value;
2446        }
2447        else if (name.equals("valueString")) {
2448          this.value = new StringType();
2449          return this.value;
2450        }
2451        else if (name.equals("valueBoolean")) {
2452          this.value = new BooleanType();
2453          return this.value;
2454        }
2455        else if (name.equals("valueInteger")) {
2456          this.value = new IntegerType();
2457          return this.value;
2458        }
2459        else if (name.equals("valueRange")) {
2460          this.value = new Range();
2461          return this.value;
2462        }
2463        else if (name.equals("valueRatio")) {
2464          this.value = new Ratio();
2465          return this.value;
2466        }
2467        else if (name.equals("valueTime")) {
2468          this.value = new TimeType();
2469          return this.value;
2470        }
2471        else if (name.equals("valueDateTime")) {
2472          this.value = new DateTimeType();
2473          return this.value;
2474        }
2475        else if (name.equals("valuePeriod")) {
2476          this.value = new Period();
2477          return this.value;
2478        }
2479        else if (name.equals("valueBase64Binary")) {
2480          this.value = new Base64BinaryType();
2481          return this.value;
2482        }
2483        else
2484          return super.addChild(name);
2485      }
2486
2487      public AuditEventEntityDetailComponent copy() {
2488        AuditEventEntityDetailComponent dst = new AuditEventEntityDetailComponent();
2489        copyValues(dst);
2490        return dst;
2491      }
2492
2493      public void copyValues(AuditEventEntityDetailComponent dst) {
2494        super.copyValues(dst);
2495        dst.type = type == null ? null : type.copy();
2496        dst.value = value == null ? null : value.copy();
2497      }
2498
2499      @Override
2500      public boolean equalsDeep(Base other_) {
2501        if (!super.equalsDeep(other_))
2502          return false;
2503        if (!(other_ instanceof AuditEventEntityDetailComponent))
2504          return false;
2505        AuditEventEntityDetailComponent o = (AuditEventEntityDetailComponent) other_;
2506        return compareDeep(type, o.type, true) && compareDeep(value, o.value, true);
2507      }
2508
2509      @Override
2510      public boolean equalsShallow(Base other_) {
2511        if (!super.equalsShallow(other_))
2512          return false;
2513        if (!(other_ instanceof AuditEventEntityDetailComponent))
2514          return false;
2515        AuditEventEntityDetailComponent o = (AuditEventEntityDetailComponent) other_;
2516        return true;
2517      }
2518
2519      public boolean isEmpty() {
2520        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(type, value);
2521      }
2522
2523  public String fhirType() {
2524    return "AuditEvent.entity.detail";
2525
2526  }
2527
2528  }
2529
2530    /**
2531     * Classification of the type of event.
2532     */
2533    @Child(name = "category", type = {CodeableConcept.class}, order=0, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
2534    @Description(shortDefinition="Type/identifier of event", formalDefinition="Classification of the type of event." )
2535    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/audit-event-type")
2536    protected List<CodeableConcept> category;
2537
2538    /**
2539     * Describes what happened. The most specific code for the event.
2540     */
2541    @Child(name = "code", type = {CodeableConcept.class}, order=1, min=1, max=1, modifier=false, summary=true)
2542    @Description(shortDefinition="Specific type of event", formalDefinition="Describes what happened. The most specific code for the event." )
2543    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/audit-event-sub-type")
2544    protected CodeableConcept code;
2545
2546    /**
2547     * Indicator for type of action performed during the event that generated the audit.
2548     */
2549    @Child(name = "action", type = {CodeType.class}, order=2, min=0, max=1, modifier=false, summary=true)
2550    @Description(shortDefinition="Type of action performed during the event", formalDefinition="Indicator for type of action performed during the event that generated the audit." )
2551    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/audit-event-action")
2552    protected Enumeration<AuditEventAction> action;
2553
2554    /**
2555     * Indicates and enables segmentation of various severity including debugging from critical.
2556     */
2557    @Child(name = "severity", type = {CodeType.class}, order=3, min=0, max=1, modifier=false, summary=true)
2558    @Description(shortDefinition="emergency | alert | critical | error | warning | notice | informational | debug", formalDefinition="Indicates and enables segmentation of various severity including debugging from critical." )
2559    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/audit-event-severity")
2560    protected Enumeration<AuditEventSeverity> severity;
2561
2562    /**
2563     * The time or period during which the activity occurred.
2564     */
2565    @Child(name = "occurred", type = {Period.class, DateTimeType.class}, order=4, min=0, max=1, modifier=false, summary=false)
2566    @Description(shortDefinition="When the activity occurred", formalDefinition="The time or period during which the activity occurred." )
2567    protected DataType occurred;
2568
2569    /**
2570     * The time when the event was recorded.
2571     */
2572    @Child(name = "recorded", type = {InstantType.class}, order=5, min=1, max=1, modifier=false, summary=true)
2573    @Description(shortDefinition="Time when the event was recorded", formalDefinition="The time when the event was recorded." )
2574    protected InstantType recorded;
2575
2576    /**
2577     * Indicates whether the event succeeded or failed. A free text descripiton can be given in outcome.text.
2578     */
2579    @Child(name = "outcome", type = {}, order=6, min=0, max=1, modifier=false, summary=true)
2580    @Description(shortDefinition="Whether the event succeeded or failed", formalDefinition="Indicates whether the event succeeded or failed. A free text descripiton can be given in outcome.text." )
2581    protected AuditEventOutcomeComponent outcome;
2582
2583    /**
2584     * The authorization (e.g., PurposeOfUse) that was used during the event being recorded.
2585     */
2586    @Child(name = "authorization", type = {CodeableConcept.class}, order=7, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
2587    @Description(shortDefinition="Authorization related to the event", formalDefinition="The authorization (e.g., PurposeOfUse) that was used during the event being recorded." )
2588    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://terminology.hl7.org/ValueSet/v3-PurposeOfUse")
2589    protected List<CodeableConcept> authorization;
2590
2591    /**
2592     * Allows tracing of authorizatino for the events and tracking whether proposals/recommendations were acted upon.
2593     */
2594    @Child(name = "basedOn", type = {CarePlan.class, DeviceRequest.class, ImmunizationRecommendation.class, MedicationRequest.class, NutritionOrder.class, ServiceRequest.class, Task.class}, order=8, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
2595    @Description(shortDefinition="Workflow authorization within which this event occurred", formalDefinition="Allows tracing of authorizatino for the events and tracking whether proposals/recommendations were acted upon." )
2596    protected List<Reference> basedOn;
2597
2598    /**
2599     * The patient element is available to enable deterministic tracking of activities that involve the patient as the subject of the data used in an activity.
2600     */
2601    @Child(name = "patient", type = {Patient.class}, order=9, min=0, max=1, modifier=false, summary=false)
2602    @Description(shortDefinition="The patient is the subject of the data used/created/updated/deleted during the activity", formalDefinition="The patient element is available to enable deterministic tracking of activities that involve the patient as the subject of the data used in an activity." )
2603    protected Reference patient;
2604
2605    /**
2606     * This will typically be the encounter the event occurred, but some events may be initiated prior to or after the official completion of an encounter but still be tied to the context of the encounter (e.g. pre-admission lab tests).
2607     */
2608    @Child(name = "encounter", type = {Encounter.class}, order=10, min=0, max=1, modifier=false, summary=false)
2609    @Description(shortDefinition="Encounter within which this event occurred or which the event is tightly associated", formalDefinition="This will typically be the encounter the event occurred, but some events may be initiated prior to or after the official completion of an encounter but still be tied to the context of the encounter (e.g. pre-admission lab tests)." )
2610    protected Reference encounter;
2611
2612    /**
2613     * An actor taking an active role in the event or activity that is logged.
2614     */
2615    @Child(name = "agent", type = {}, order=11, min=1, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
2616    @Description(shortDefinition="Actor involved in the event", formalDefinition="An actor taking an active role in the event or activity that is logged." )
2617    protected List<AuditEventAgentComponent> agent;
2618
2619    /**
2620     * The actor that is reporting the event.
2621     */
2622    @Child(name = "source", type = {}, order=12, min=1, max=1, modifier=false, summary=true)
2623    @Description(shortDefinition="Audit Event Reporter", formalDefinition="The actor that is reporting the event." )
2624    protected AuditEventSourceComponent source;
2625
2626    /**
2627     * Specific instances of data or objects that have been accessed.
2628     */
2629    @Child(name = "entity", type = {}, order=13, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
2630    @Description(shortDefinition="Data or objects used", formalDefinition="Specific instances of data or objects that have been accessed." )
2631    protected List<AuditEventEntityComponent> entity;
2632
2633    private static final long serialVersionUID = -1335832480L;
2634
2635  /**
2636   * Constructor
2637   */
2638    public AuditEvent() {
2639      super();
2640    }
2641
2642  /**
2643   * Constructor
2644   */
2645    public AuditEvent(CodeableConcept code, Date recorded, AuditEventAgentComponent agent, AuditEventSourceComponent source) {
2646      super();
2647      this.setCode(code);
2648      this.setRecorded(recorded);
2649      this.addAgent(agent);
2650      this.setSource(source);
2651    }
2652
2653    /**
2654     * @return {@link #category} (Classification of the type of event.)
2655     */
2656    public List<CodeableConcept> getCategory() { 
2657      if (this.category == null)
2658        this.category = new ArrayList<CodeableConcept>();
2659      return this.category;
2660    }
2661
2662    /**
2663     * @return Returns a reference to <code>this</code> for easy method chaining
2664     */
2665    public AuditEvent setCategory(List<CodeableConcept> theCategory) { 
2666      this.category = theCategory;
2667      return this;
2668    }
2669
2670    public boolean hasCategory() { 
2671      if (this.category == null)
2672        return false;
2673      for (CodeableConcept item : this.category)
2674        if (!item.isEmpty())
2675          return true;
2676      return false;
2677    }
2678
2679    public CodeableConcept addCategory() { //3
2680      CodeableConcept t = new CodeableConcept();
2681      if (this.category == null)
2682        this.category = new ArrayList<CodeableConcept>();
2683      this.category.add(t);
2684      return t;
2685    }
2686
2687    public AuditEvent addCategory(CodeableConcept t) { //3
2688      if (t == null)
2689        return this;
2690      if (this.category == null)
2691        this.category = new ArrayList<CodeableConcept>();
2692      this.category.add(t);
2693      return this;
2694    }
2695
2696    /**
2697     * @return The first repetition of repeating field {@link #category}, creating it if it does not already exist {3}
2698     */
2699    public CodeableConcept getCategoryFirstRep() { 
2700      if (getCategory().isEmpty()) {
2701        addCategory();
2702      }
2703      return getCategory().get(0);
2704    }
2705
2706    /**
2707     * @return {@link #code} (Describes what happened. The most specific code for the event.)
2708     */
2709    public CodeableConcept getCode() { 
2710      if (this.code == null)
2711        if (Configuration.errorOnAutoCreate())
2712          throw new Error("Attempt to auto-create AuditEvent.code");
2713        else if (Configuration.doAutoCreate())
2714          this.code = new CodeableConcept(); // cc
2715      return this.code;
2716    }
2717
2718    public boolean hasCode() { 
2719      return this.code != null && !this.code.isEmpty();
2720    }
2721
2722    /**
2723     * @param value {@link #code} (Describes what happened. The most specific code for the event.)
2724     */
2725    public AuditEvent setCode(CodeableConcept value) { 
2726      this.code = value;
2727      return this;
2728    }
2729
2730    /**
2731     * @return {@link #action} (Indicator for type of action performed during the event that generated the audit.). This is the underlying object with id, value and extensions. The accessor "getAction" gives direct access to the value
2732     */
2733    public Enumeration<AuditEventAction> getActionElement() { 
2734      if (this.action == null)
2735        if (Configuration.errorOnAutoCreate())
2736          throw new Error("Attempt to auto-create AuditEvent.action");
2737        else if (Configuration.doAutoCreate())
2738          this.action = new Enumeration<AuditEventAction>(new AuditEventActionEnumFactory()); // bb
2739      return this.action;
2740    }
2741
2742    public boolean hasActionElement() { 
2743      return this.action != null && !this.action.isEmpty();
2744    }
2745
2746    public boolean hasAction() { 
2747      return this.action != null && !this.action.isEmpty();
2748    }
2749
2750    /**
2751     * @param value {@link #action} (Indicator for type of action performed during the event that generated the audit.). This is the underlying object with id, value and extensions. The accessor "getAction" gives direct access to the value
2752     */
2753    public AuditEvent setActionElement(Enumeration<AuditEventAction> value) { 
2754      this.action = value;
2755      return this;
2756    }
2757
2758    /**
2759     * @return Indicator for type of action performed during the event that generated the audit.
2760     */
2761    public AuditEventAction getAction() { 
2762      return this.action == null ? null : this.action.getValue();
2763    }
2764
2765    /**
2766     * @param value Indicator for type of action performed during the event that generated the audit.
2767     */
2768    public AuditEvent setAction(AuditEventAction value) { 
2769      if (value == null)
2770        this.action = null;
2771      else {
2772        if (this.action == null)
2773          this.action = new Enumeration<AuditEventAction>(new AuditEventActionEnumFactory());
2774        this.action.setValue(value);
2775      }
2776      return this;
2777    }
2778
2779    /**
2780     * @return {@link #severity} (Indicates and enables segmentation of various severity including debugging from critical.). This is the underlying object with id, value and extensions. The accessor "getSeverity" gives direct access to the value
2781     */
2782    public Enumeration<AuditEventSeverity> getSeverityElement() { 
2783      if (this.severity == null)
2784        if (Configuration.errorOnAutoCreate())
2785          throw new Error("Attempt to auto-create AuditEvent.severity");
2786        else if (Configuration.doAutoCreate())
2787          this.severity = new Enumeration<AuditEventSeverity>(new AuditEventSeverityEnumFactory()); // bb
2788      return this.severity;
2789    }
2790
2791    public boolean hasSeverityElement() { 
2792      return this.severity != null && !this.severity.isEmpty();
2793    }
2794
2795    public boolean hasSeverity() { 
2796      return this.severity != null && !this.severity.isEmpty();
2797    }
2798
2799    /**
2800     * @param value {@link #severity} (Indicates and enables segmentation of various severity including debugging from critical.). This is the underlying object with id, value and extensions. The accessor "getSeverity" gives direct access to the value
2801     */
2802    public AuditEvent setSeverityElement(Enumeration<AuditEventSeverity> value) { 
2803      this.severity = value;
2804      return this;
2805    }
2806
2807    /**
2808     * @return Indicates and enables segmentation of various severity including debugging from critical.
2809     */
2810    public AuditEventSeverity getSeverity() { 
2811      return this.severity == null ? null : this.severity.getValue();
2812    }
2813
2814    /**
2815     * @param value Indicates and enables segmentation of various severity including debugging from critical.
2816     */
2817    public AuditEvent setSeverity(AuditEventSeverity value) { 
2818      if (value == null)
2819        this.severity = null;
2820      else {
2821        if (this.severity == null)
2822          this.severity = new Enumeration<AuditEventSeverity>(new AuditEventSeverityEnumFactory());
2823        this.severity.setValue(value);
2824      }
2825      return this;
2826    }
2827
2828    /**
2829     * @return {@link #occurred} (The time or period during which the activity occurred.)
2830     */
2831    public DataType getOccurred() { 
2832      return this.occurred;
2833    }
2834
2835    /**
2836     * @return {@link #occurred} (The time or period during which the activity occurred.)
2837     */
2838    public Period getOccurredPeriod() throws FHIRException { 
2839      if (this.occurred == null)
2840        this.occurred = new Period();
2841      if (!(this.occurred instanceof Period))
2842        throw new FHIRException("Type mismatch: the type Period was expected, but "+this.occurred.getClass().getName()+" was encountered");
2843      return (Period) this.occurred;
2844    }
2845
2846    public boolean hasOccurredPeriod() { 
2847      return this != null && this.occurred instanceof Period;
2848    }
2849
2850    /**
2851     * @return {@link #occurred} (The time or period during which the activity occurred.)
2852     */
2853    public DateTimeType getOccurredDateTimeType() throws FHIRException { 
2854      if (this.occurred == null)
2855        this.occurred = new DateTimeType();
2856      if (!(this.occurred instanceof DateTimeType))
2857        throw new FHIRException("Type mismatch: the type DateTimeType was expected, but "+this.occurred.getClass().getName()+" was encountered");
2858      return (DateTimeType) this.occurred;
2859    }
2860
2861    public boolean hasOccurredDateTimeType() { 
2862      return this != null && this.occurred instanceof DateTimeType;
2863    }
2864
2865    public boolean hasOccurred() { 
2866      return this.occurred != null && !this.occurred.isEmpty();
2867    }
2868
2869    /**
2870     * @param value {@link #occurred} (The time or period during which the activity occurred.)
2871     */
2872    public AuditEvent setOccurred(DataType value) { 
2873      if (value != null && !(value instanceof Period || value instanceof DateTimeType))
2874        throw new Error("Not the right type for AuditEvent.occurred[x]: "+value.fhirType());
2875      this.occurred = value;
2876      return this;
2877    }
2878
2879    /**
2880     * @return {@link #recorded} (The time when the event was recorded.). This is the underlying object with id, value and extensions. The accessor "getRecorded" gives direct access to the value
2881     */
2882    public InstantType getRecordedElement() { 
2883      if (this.recorded == null)
2884        if (Configuration.errorOnAutoCreate())
2885          throw new Error("Attempt to auto-create AuditEvent.recorded");
2886        else if (Configuration.doAutoCreate())
2887          this.recorded = new InstantType(); // bb
2888      return this.recorded;
2889    }
2890
2891    public boolean hasRecordedElement() { 
2892      return this.recorded != null && !this.recorded.isEmpty();
2893    }
2894
2895    public boolean hasRecorded() { 
2896      return this.recorded != null && !this.recorded.isEmpty();
2897    }
2898
2899    /**
2900     * @param value {@link #recorded} (The time when the event was recorded.). This is the underlying object with id, value and extensions. The accessor "getRecorded" gives direct access to the value
2901     */
2902    public AuditEvent setRecordedElement(InstantType value) { 
2903      this.recorded = value;
2904      return this;
2905    }
2906
2907    /**
2908     * @return The time when the event was recorded.
2909     */
2910    public Date getRecorded() { 
2911      return this.recorded == null ? null : this.recorded.getValue();
2912    }
2913
2914    /**
2915     * @param value The time when the event was recorded.
2916     */
2917    public AuditEvent setRecorded(Date value) { 
2918        if (this.recorded == null)
2919          this.recorded = new InstantType();
2920        this.recorded.setValue(value);
2921      return this;
2922    }
2923
2924    /**
2925     * @return {@link #outcome} (Indicates whether the event succeeded or failed. A free text descripiton can be given in outcome.text.)
2926     */
2927    public AuditEventOutcomeComponent getOutcome() { 
2928      if (this.outcome == null)
2929        if (Configuration.errorOnAutoCreate())
2930          throw new Error("Attempt to auto-create AuditEvent.outcome");
2931        else if (Configuration.doAutoCreate())
2932          this.outcome = new AuditEventOutcomeComponent(); // cc
2933      return this.outcome;
2934    }
2935
2936    public boolean hasOutcome() { 
2937      return this.outcome != null && !this.outcome.isEmpty();
2938    }
2939
2940    /**
2941     * @param value {@link #outcome} (Indicates whether the event succeeded or failed. A free text descripiton can be given in outcome.text.)
2942     */
2943    public AuditEvent setOutcome(AuditEventOutcomeComponent value) { 
2944      this.outcome = value;
2945      return this;
2946    }
2947
2948    /**
2949     * @return {@link #authorization} (The authorization (e.g., PurposeOfUse) that was used during the event being recorded.)
2950     */
2951    public List<CodeableConcept> getAuthorization() { 
2952      if (this.authorization == null)
2953        this.authorization = new ArrayList<CodeableConcept>();
2954      return this.authorization;
2955    }
2956
2957    /**
2958     * @return Returns a reference to <code>this</code> for easy method chaining
2959     */
2960    public AuditEvent setAuthorization(List<CodeableConcept> theAuthorization) { 
2961      this.authorization = theAuthorization;
2962      return this;
2963    }
2964
2965    public boolean hasAuthorization() { 
2966      if (this.authorization == null)
2967        return false;
2968      for (CodeableConcept item : this.authorization)
2969        if (!item.isEmpty())
2970          return true;
2971      return false;
2972    }
2973
2974    public CodeableConcept addAuthorization() { //3
2975      CodeableConcept t = new CodeableConcept();
2976      if (this.authorization == null)
2977        this.authorization = new ArrayList<CodeableConcept>();
2978      this.authorization.add(t);
2979      return t;
2980    }
2981
2982    public AuditEvent addAuthorization(CodeableConcept t) { //3
2983      if (t == null)
2984        return this;
2985      if (this.authorization == null)
2986        this.authorization = new ArrayList<CodeableConcept>();
2987      this.authorization.add(t);
2988      return this;
2989    }
2990
2991    /**
2992     * @return The first repetition of repeating field {@link #authorization}, creating it if it does not already exist {3}
2993     */
2994    public CodeableConcept getAuthorizationFirstRep() { 
2995      if (getAuthorization().isEmpty()) {
2996        addAuthorization();
2997      }
2998      return getAuthorization().get(0);
2999    }
3000
3001    /**
3002     * @return {@link #basedOn} (Allows tracing of authorizatino for the events and tracking whether proposals/recommendations were acted upon.)
3003     */
3004    public List<Reference> getBasedOn() { 
3005      if (this.basedOn == null)
3006        this.basedOn = new ArrayList<Reference>();
3007      return this.basedOn;
3008    }
3009
3010    /**
3011     * @return Returns a reference to <code>this</code> for easy method chaining
3012     */
3013    public AuditEvent setBasedOn(List<Reference> theBasedOn) { 
3014      this.basedOn = theBasedOn;
3015      return this;
3016    }
3017
3018    public boolean hasBasedOn() { 
3019      if (this.basedOn == null)
3020        return false;
3021      for (Reference item : this.basedOn)
3022        if (!item.isEmpty())
3023          return true;
3024      return false;
3025    }
3026
3027    public Reference addBasedOn() { //3
3028      Reference t = new Reference();
3029      if (this.basedOn == null)
3030        this.basedOn = new ArrayList<Reference>();
3031      this.basedOn.add(t);
3032      return t;
3033    }
3034
3035    public AuditEvent addBasedOn(Reference t) { //3
3036      if (t == null)
3037        return this;
3038      if (this.basedOn == null)
3039        this.basedOn = new ArrayList<Reference>();
3040      this.basedOn.add(t);
3041      return this;
3042    }
3043
3044    /**
3045     * @return The first repetition of repeating field {@link #basedOn}, creating it if it does not already exist {3}
3046     */
3047    public Reference getBasedOnFirstRep() { 
3048      if (getBasedOn().isEmpty()) {
3049        addBasedOn();
3050      }
3051      return getBasedOn().get(0);
3052    }
3053
3054    /**
3055     * @return {@link #patient} (The patient element is available to enable deterministic tracking of activities that involve the patient as the subject of the data used in an activity.)
3056     */
3057    public Reference getPatient() { 
3058      if (this.patient == null)
3059        if (Configuration.errorOnAutoCreate())
3060          throw new Error("Attempt to auto-create AuditEvent.patient");
3061        else if (Configuration.doAutoCreate())
3062          this.patient = new Reference(); // cc
3063      return this.patient;
3064    }
3065
3066    public boolean hasPatient() { 
3067      return this.patient != null && !this.patient.isEmpty();
3068    }
3069
3070    /**
3071     * @param value {@link #patient} (The patient element is available to enable deterministic tracking of activities that involve the patient as the subject of the data used in an activity.)
3072     */
3073    public AuditEvent setPatient(Reference value) { 
3074      this.patient = value;
3075      return this;
3076    }
3077
3078    /**
3079     * @return {@link #encounter} (This will typically be the encounter the event occurred, but some events may be initiated prior to or after the official completion of an encounter but still be tied to the context of the encounter (e.g. pre-admission lab tests).)
3080     */
3081    public Reference getEncounter() { 
3082      if (this.encounter == null)
3083        if (Configuration.errorOnAutoCreate())
3084          throw new Error("Attempt to auto-create AuditEvent.encounter");
3085        else if (Configuration.doAutoCreate())
3086          this.encounter = new Reference(); // cc
3087      return this.encounter;
3088    }
3089
3090    public boolean hasEncounter() { 
3091      return this.encounter != null && !this.encounter.isEmpty();
3092    }
3093
3094    /**
3095     * @param value {@link #encounter} (This will typically be the encounter the event occurred, but some events may be initiated prior to or after the official completion of an encounter but still be tied to the context of the encounter (e.g. pre-admission lab tests).)
3096     */
3097    public AuditEvent setEncounter(Reference value) { 
3098      this.encounter = value;
3099      return this;
3100    }
3101
3102    /**
3103     * @return {@link #agent} (An actor taking an active role in the event or activity that is logged.)
3104     */
3105    public List<AuditEventAgentComponent> getAgent() { 
3106      if (this.agent == null)
3107        this.agent = new ArrayList<AuditEventAgentComponent>();
3108      return this.agent;
3109    }
3110
3111    /**
3112     * @return Returns a reference to <code>this</code> for easy method chaining
3113     */
3114    public AuditEvent setAgent(List<AuditEventAgentComponent> theAgent) { 
3115      this.agent = theAgent;
3116      return this;
3117    }
3118
3119    public boolean hasAgent() { 
3120      if (this.agent == null)
3121        return false;
3122      for (AuditEventAgentComponent item : this.agent)
3123        if (!item.isEmpty())
3124          return true;
3125      return false;
3126    }
3127
3128    public AuditEventAgentComponent addAgent() { //3
3129      AuditEventAgentComponent t = new AuditEventAgentComponent();
3130      if (this.agent == null)
3131        this.agent = new ArrayList<AuditEventAgentComponent>();
3132      this.agent.add(t);
3133      return t;
3134    }
3135
3136    public AuditEvent addAgent(AuditEventAgentComponent t) { //3
3137      if (t == null)
3138        return this;
3139      if (this.agent == null)
3140        this.agent = new ArrayList<AuditEventAgentComponent>();
3141      this.agent.add(t);
3142      return this;
3143    }
3144
3145    /**
3146     * @return The first repetition of repeating field {@link #agent}, creating it if it does not already exist {3}
3147     */
3148    public AuditEventAgentComponent getAgentFirstRep() { 
3149      if (getAgent().isEmpty()) {
3150        addAgent();
3151      }
3152      return getAgent().get(0);
3153    }
3154
3155    /**
3156     * @return {@link #source} (The actor that is reporting the event.)
3157     */
3158    public AuditEventSourceComponent getSource() { 
3159      if (this.source == null)
3160        if (Configuration.errorOnAutoCreate())
3161          throw new Error("Attempt to auto-create AuditEvent.source");
3162        else if (Configuration.doAutoCreate())
3163          this.source = new AuditEventSourceComponent(); // cc
3164      return this.source;
3165    }
3166
3167    public boolean hasSource() { 
3168      return this.source != null && !this.source.isEmpty();
3169    }
3170
3171    /**
3172     * @param value {@link #source} (The actor that is reporting the event.)
3173     */
3174    public AuditEvent setSource(AuditEventSourceComponent value) { 
3175      this.source = value;
3176      return this;
3177    }
3178
3179    /**
3180     * @return {@link #entity} (Specific instances of data or objects that have been accessed.)
3181     */
3182    public List<AuditEventEntityComponent> getEntity() { 
3183      if (this.entity == null)
3184        this.entity = new ArrayList<AuditEventEntityComponent>();
3185      return this.entity;
3186    }
3187
3188    /**
3189     * @return Returns a reference to <code>this</code> for easy method chaining
3190     */
3191    public AuditEvent setEntity(List<AuditEventEntityComponent> theEntity) { 
3192      this.entity = theEntity;
3193      return this;
3194    }
3195
3196    public boolean hasEntity() { 
3197      if (this.entity == null)
3198        return false;
3199      for (AuditEventEntityComponent item : this.entity)
3200        if (!item.isEmpty())
3201          return true;
3202      return false;
3203    }
3204
3205    public AuditEventEntityComponent addEntity() { //3
3206      AuditEventEntityComponent t = new AuditEventEntityComponent();
3207      if (this.entity == null)
3208        this.entity = new ArrayList<AuditEventEntityComponent>();
3209      this.entity.add(t);
3210      return t;
3211    }
3212
3213    public AuditEvent addEntity(AuditEventEntityComponent t) { //3
3214      if (t == null)
3215        return this;
3216      if (this.entity == null)
3217        this.entity = new ArrayList<AuditEventEntityComponent>();
3218      this.entity.add(t);
3219      return this;
3220    }
3221
3222    /**
3223     * @return The first repetition of repeating field {@link #entity}, creating it if it does not already exist {3}
3224     */
3225    public AuditEventEntityComponent getEntityFirstRep() { 
3226      if (getEntity().isEmpty()) {
3227        addEntity();
3228      }
3229      return getEntity().get(0);
3230    }
3231
3232      protected void listChildren(List<Property> children) {
3233        super.listChildren(children);
3234        children.add(new Property("category", "CodeableConcept", "Classification of the type of event.", 0, java.lang.Integer.MAX_VALUE, category));
3235        children.add(new Property("code", "CodeableConcept", "Describes what happened. The most specific code for the event.", 0, 1, code));
3236        children.add(new Property("action", "code", "Indicator for type of action performed during the event that generated the audit.", 0, 1, action));
3237        children.add(new Property("severity", "code", "Indicates and enables segmentation of various severity including debugging from critical.", 0, 1, severity));
3238        children.add(new Property("occurred[x]", "Period|dateTime", "The time or period during which the activity occurred.", 0, 1, occurred));
3239        children.add(new Property("recorded", "instant", "The time when the event was recorded.", 0, 1, recorded));
3240        children.add(new Property("outcome", "", "Indicates whether the event succeeded or failed. A free text descripiton can be given in outcome.text.", 0, 1, outcome));
3241        children.add(new Property("authorization", "CodeableConcept", "The authorization (e.g., PurposeOfUse) that was used during the event being recorded.", 0, java.lang.Integer.MAX_VALUE, authorization));
3242        children.add(new Property("basedOn", "Reference(CarePlan|DeviceRequest|ImmunizationRecommendation|MedicationRequest|NutritionOrder|ServiceRequest|Task)", "Allows tracing of authorizatino for the events and tracking whether proposals/recommendations were acted upon.", 0, java.lang.Integer.MAX_VALUE, basedOn));
3243        children.add(new Property("patient", "Reference(Patient)", "The patient element is available to enable deterministic tracking of activities that involve the patient as the subject of the data used in an activity.", 0, 1, patient));
3244        children.add(new Property("encounter", "Reference(Encounter)", "This will typically be the encounter the event occurred, but some events may be initiated prior to or after the official completion of an encounter but still be tied to the context of the encounter (e.g. pre-admission lab tests).", 0, 1, encounter));
3245        children.add(new Property("agent", "", "An actor taking an active role in the event or activity that is logged.", 0, java.lang.Integer.MAX_VALUE, agent));
3246        children.add(new Property("source", "", "The actor that is reporting the event.", 0, 1, source));
3247        children.add(new Property("entity", "", "Specific instances of data or objects that have been accessed.", 0, java.lang.Integer.MAX_VALUE, entity));
3248      }
3249
3250      @Override
3251      public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
3252        switch (_hash) {
3253        case 50511102: /*category*/  return new Property("category", "CodeableConcept", "Classification of the type of event.", 0, java.lang.Integer.MAX_VALUE, category);
3254        case 3059181: /*code*/  return new Property("code", "CodeableConcept", "Describes what happened. The most specific code for the event.", 0, 1, code);
3255        case -1422950858: /*action*/  return new Property("action", "code", "Indicator for type of action performed during the event that generated the audit.", 0, 1, action);
3256        case 1478300413: /*severity*/  return new Property("severity", "code", "Indicates and enables segmentation of various severity including debugging from critical.", 0, 1, severity);
3257        case 784181563: /*occurred[x]*/  return new Property("occurred[x]", "Period|dateTime", "The time or period during which the activity occurred.", 0, 1, occurred);
3258        case 792816933: /*occurred*/  return new Property("occurred[x]", "Period|dateTime", "The time or period during which the activity occurred.", 0, 1, occurred);
3259        case 894082886: /*occurredPeriod*/  return new Property("occurred[x]", "Period", "The time or period during which the activity occurred.", 0, 1, occurred);
3260        case 1579027424: /*occurredDateTime*/  return new Property("occurred[x]", "dateTime", "The time or period during which the activity occurred.", 0, 1, occurred);
3261        case -799233872: /*recorded*/  return new Property("recorded", "instant", "The time when the event was recorded.", 0, 1, recorded);
3262        case -1106507950: /*outcome*/  return new Property("outcome", "", "Indicates whether the event succeeded or failed. A free text descripiton can be given in outcome.text.", 0, 1, outcome);
3263        case -1385570183: /*authorization*/  return new Property("authorization", "CodeableConcept", "The authorization (e.g., PurposeOfUse) that was used during the event being recorded.", 0, java.lang.Integer.MAX_VALUE, authorization);
3264        case -332612366: /*basedOn*/  return new Property("basedOn", "Reference(CarePlan|DeviceRequest|ImmunizationRecommendation|MedicationRequest|NutritionOrder|ServiceRequest|Task)", "Allows tracing of authorizatino for the events and tracking whether proposals/recommendations were acted upon.", 0, java.lang.Integer.MAX_VALUE, basedOn);
3265        case -791418107: /*patient*/  return new Property("patient", "Reference(Patient)", "The patient element is available to enable deterministic tracking of activities that involve the patient as the subject of the data used in an activity.", 0, 1, patient);
3266        case 1524132147: /*encounter*/  return new Property("encounter", "Reference(Encounter)", "This will typically be the encounter the event occurred, but some events may be initiated prior to or after the official completion of an encounter but still be tied to the context of the encounter (e.g. pre-admission lab tests).", 0, 1, encounter);
3267        case 92750597: /*agent*/  return new Property("agent", "", "An actor taking an active role in the event or activity that is logged.", 0, java.lang.Integer.MAX_VALUE, agent);
3268        case -896505829: /*source*/  return new Property("source", "", "The actor that is reporting the event.", 0, 1, source);
3269        case -1298275357: /*entity*/  return new Property("entity", "", "Specific instances of data or objects that have been accessed.", 0, java.lang.Integer.MAX_VALUE, entity);
3270        default: return super.getNamedProperty(_hash, _name, _checkValid);
3271        }
3272
3273      }
3274
3275      @Override
3276      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
3277        switch (hash) {
3278        case 50511102: /*category*/ return this.category == null ? new Base[0] : this.category.toArray(new Base[this.category.size()]); // CodeableConcept
3279        case 3059181: /*code*/ return this.code == null ? new Base[0] : new Base[] {this.code}; // CodeableConcept
3280        case -1422950858: /*action*/ return this.action == null ? new Base[0] : new Base[] {this.action}; // Enumeration<AuditEventAction>
3281        case 1478300413: /*severity*/ return this.severity == null ? new Base[0] : new Base[] {this.severity}; // Enumeration<AuditEventSeverity>
3282        case 792816933: /*occurred*/ return this.occurred == null ? new Base[0] : new Base[] {this.occurred}; // DataType
3283        case -799233872: /*recorded*/ return this.recorded == null ? new Base[0] : new Base[] {this.recorded}; // InstantType
3284        case -1106507950: /*outcome*/ return this.outcome == null ? new Base[0] : new Base[] {this.outcome}; // AuditEventOutcomeComponent
3285        case -1385570183: /*authorization*/ return this.authorization == null ? new Base[0] : this.authorization.toArray(new Base[this.authorization.size()]); // CodeableConcept
3286        case -332612366: /*basedOn*/ return this.basedOn == null ? new Base[0] : this.basedOn.toArray(new Base[this.basedOn.size()]); // Reference
3287        case -791418107: /*patient*/ return this.patient == null ? new Base[0] : new Base[] {this.patient}; // Reference
3288        case 1524132147: /*encounter*/ return this.encounter == null ? new Base[0] : new Base[] {this.encounter}; // Reference
3289        case 92750597: /*agent*/ return this.agent == null ? new Base[0] : this.agent.toArray(new Base[this.agent.size()]); // AuditEventAgentComponent
3290        case -896505829: /*source*/ return this.source == null ? new Base[0] : new Base[] {this.source}; // AuditEventSourceComponent
3291        case -1298275357: /*entity*/ return this.entity == null ? new Base[0] : this.entity.toArray(new Base[this.entity.size()]); // AuditEventEntityComponent
3292        default: return super.getProperty(hash, name, checkValid);
3293        }
3294
3295      }
3296
3297      @Override
3298      public Base setProperty(int hash, String name, Base value) throws FHIRException {
3299        switch (hash) {
3300        case 50511102: // category
3301          this.getCategory().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
3302          return value;
3303        case 3059181: // code
3304          this.code = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
3305          return value;
3306        case -1422950858: // action
3307          value = new AuditEventActionEnumFactory().fromType(TypeConvertor.castToCode(value));
3308          this.action = (Enumeration) value; // Enumeration<AuditEventAction>
3309          return value;
3310        case 1478300413: // severity
3311          value = new AuditEventSeverityEnumFactory().fromType(TypeConvertor.castToCode(value));
3312          this.severity = (Enumeration) value; // Enumeration<AuditEventSeverity>
3313          return value;
3314        case 792816933: // occurred
3315          this.occurred = TypeConvertor.castToType(value); // DataType
3316          return value;
3317        case -799233872: // recorded
3318          this.recorded = TypeConvertor.castToInstant(value); // InstantType
3319          return value;
3320        case -1106507950: // outcome
3321          this.outcome = (AuditEventOutcomeComponent) value; // AuditEventOutcomeComponent
3322          return value;
3323        case -1385570183: // authorization
3324          this.getAuthorization().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
3325          return value;
3326        case -332612366: // basedOn
3327          this.getBasedOn().add(TypeConvertor.castToReference(value)); // Reference
3328          return value;
3329        case -791418107: // patient
3330          this.patient = TypeConvertor.castToReference(value); // Reference
3331          return value;
3332        case 1524132147: // encounter
3333          this.encounter = TypeConvertor.castToReference(value); // Reference
3334          return value;
3335        case 92750597: // agent
3336          this.getAgent().add((AuditEventAgentComponent) value); // AuditEventAgentComponent
3337          return value;
3338        case -896505829: // source
3339          this.source = (AuditEventSourceComponent) value; // AuditEventSourceComponent
3340          return value;
3341        case -1298275357: // entity
3342          this.getEntity().add((AuditEventEntityComponent) value); // AuditEventEntityComponent
3343          return value;
3344        default: return super.setProperty(hash, name, value);
3345        }
3346
3347      }
3348
3349      @Override
3350      public Base setProperty(String name, Base value) throws FHIRException {
3351        if (name.equals("category")) {
3352          this.getCategory().add(TypeConvertor.castToCodeableConcept(value));
3353        } else if (name.equals("code")) {
3354          this.code = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
3355        } else if (name.equals("action")) {
3356          value = new AuditEventActionEnumFactory().fromType(TypeConvertor.castToCode(value));
3357          this.action = (Enumeration) value; // Enumeration<AuditEventAction>
3358        } else if (name.equals("severity")) {
3359          value = new AuditEventSeverityEnumFactory().fromType(TypeConvertor.castToCode(value));
3360          this.severity = (Enumeration) value; // Enumeration<AuditEventSeverity>
3361        } else if (name.equals("occurred[x]")) {
3362          this.occurred = TypeConvertor.castToType(value); // DataType
3363        } else if (name.equals("recorded")) {
3364          this.recorded = TypeConvertor.castToInstant(value); // InstantType
3365        } else if (name.equals("outcome")) {
3366          this.outcome = (AuditEventOutcomeComponent) value; // AuditEventOutcomeComponent
3367        } else if (name.equals("authorization")) {
3368          this.getAuthorization().add(TypeConvertor.castToCodeableConcept(value));
3369        } else if (name.equals("basedOn")) {
3370          this.getBasedOn().add(TypeConvertor.castToReference(value));
3371        } else if (name.equals("patient")) {
3372          this.patient = TypeConvertor.castToReference(value); // Reference
3373        } else if (name.equals("encounter")) {
3374          this.encounter = TypeConvertor.castToReference(value); // Reference
3375        } else if (name.equals("agent")) {
3376          this.getAgent().add((AuditEventAgentComponent) value);
3377        } else if (name.equals("source")) {
3378          this.source = (AuditEventSourceComponent) value; // AuditEventSourceComponent
3379        } else if (name.equals("entity")) {
3380          this.getEntity().add((AuditEventEntityComponent) value);
3381        } else
3382          return super.setProperty(name, value);
3383        return value;
3384      }
3385
3386      @Override
3387      public Base makeProperty(int hash, String name) throws FHIRException {
3388        switch (hash) {
3389        case 50511102:  return addCategory(); 
3390        case 3059181:  return getCode();
3391        case -1422950858:  return getActionElement();
3392        case 1478300413:  return getSeverityElement();
3393        case 784181563:  return getOccurred();
3394        case 792816933:  return getOccurred();
3395        case -799233872:  return getRecordedElement();
3396        case -1106507950:  return getOutcome();
3397        case -1385570183:  return addAuthorization(); 
3398        case -332612366:  return addBasedOn(); 
3399        case -791418107:  return getPatient();
3400        case 1524132147:  return getEncounter();
3401        case 92750597:  return addAgent(); 
3402        case -896505829:  return getSource();
3403        case -1298275357:  return addEntity(); 
3404        default: return super.makeProperty(hash, name);
3405        }
3406
3407      }
3408
3409      @Override
3410      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
3411        switch (hash) {
3412        case 50511102: /*category*/ return new String[] {"CodeableConcept"};
3413        case 3059181: /*code*/ return new String[] {"CodeableConcept"};
3414        case -1422950858: /*action*/ return new String[] {"code"};
3415        case 1478300413: /*severity*/ return new String[] {"code"};
3416        case 792816933: /*occurred*/ return new String[] {"Period", "dateTime"};
3417        case -799233872: /*recorded*/ return new String[] {"instant"};
3418        case -1106507950: /*outcome*/ return new String[] {};
3419        case -1385570183: /*authorization*/ return new String[] {"CodeableConcept"};
3420        case -332612366: /*basedOn*/ return new String[] {"Reference"};
3421        case -791418107: /*patient*/ return new String[] {"Reference"};
3422        case 1524132147: /*encounter*/ return new String[] {"Reference"};
3423        case 92750597: /*agent*/ return new String[] {};
3424        case -896505829: /*source*/ return new String[] {};
3425        case -1298275357: /*entity*/ return new String[] {};
3426        default: return super.getTypesForProperty(hash, name);
3427        }
3428
3429      }
3430
3431      @Override
3432      public Base addChild(String name) throws FHIRException {
3433        if (name.equals("category")) {
3434          return addCategory();
3435        }
3436        else if (name.equals("code")) {
3437          this.code = new CodeableConcept();
3438          return this.code;
3439        }
3440        else if (name.equals("action")) {
3441          throw new FHIRException("Cannot call addChild on a primitive type AuditEvent.action");
3442        }
3443        else if (name.equals("severity")) {
3444          throw new FHIRException("Cannot call addChild on a primitive type AuditEvent.severity");
3445        }
3446        else if (name.equals("occurredPeriod")) {
3447          this.occurred = new Period();
3448          return this.occurred;
3449        }
3450        else if (name.equals("occurredDateTime")) {
3451          this.occurred = new DateTimeType();
3452          return this.occurred;
3453        }
3454        else if (name.equals("recorded")) {
3455          throw new FHIRException("Cannot call addChild on a primitive type AuditEvent.recorded");
3456        }
3457        else if (name.equals("outcome")) {
3458          this.outcome = new AuditEventOutcomeComponent();
3459          return this.outcome;
3460        }
3461        else if (name.equals("authorization")) {
3462          return addAuthorization();
3463        }
3464        else if (name.equals("basedOn")) {
3465          return addBasedOn();
3466        }
3467        else if (name.equals("patient")) {
3468          this.patient = new Reference();
3469          return this.patient;
3470        }
3471        else if (name.equals("encounter")) {
3472          this.encounter = new Reference();
3473          return this.encounter;
3474        }
3475        else if (name.equals("agent")) {
3476          return addAgent();
3477        }
3478        else if (name.equals("source")) {
3479          this.source = new AuditEventSourceComponent();
3480          return this.source;
3481        }
3482        else if (name.equals("entity")) {
3483          return addEntity();
3484        }
3485        else
3486          return super.addChild(name);
3487      }
3488
3489  public String fhirType() {
3490    return "AuditEvent";
3491
3492  }
3493
3494      public AuditEvent copy() {
3495        AuditEvent dst = new AuditEvent();
3496        copyValues(dst);
3497        return dst;
3498      }
3499
3500      public void copyValues(AuditEvent dst) {
3501        super.copyValues(dst);
3502        if (category != null) {
3503          dst.category = new ArrayList<CodeableConcept>();
3504          for (CodeableConcept i : category)
3505            dst.category.add(i.copy());
3506        };
3507        dst.code = code == null ? null : code.copy();
3508        dst.action = action == null ? null : action.copy();
3509        dst.severity = severity == null ? null : severity.copy();
3510        dst.occurred = occurred == null ? null : occurred.copy();
3511        dst.recorded = recorded == null ? null : recorded.copy();
3512        dst.outcome = outcome == null ? null : outcome.copy();
3513        if (authorization != null) {
3514          dst.authorization = new ArrayList<CodeableConcept>();
3515          for (CodeableConcept i : authorization)
3516            dst.authorization.add(i.copy());
3517        };
3518        if (basedOn != null) {
3519          dst.basedOn = new ArrayList<Reference>();
3520          for (Reference i : basedOn)
3521            dst.basedOn.add(i.copy());
3522        };
3523        dst.patient = patient == null ? null : patient.copy();
3524        dst.encounter = encounter == null ? null : encounter.copy();
3525        if (agent != null) {
3526          dst.agent = new ArrayList<AuditEventAgentComponent>();
3527          for (AuditEventAgentComponent i : agent)
3528            dst.agent.add(i.copy());
3529        };
3530        dst.source = source == null ? null : source.copy();
3531        if (entity != null) {
3532          dst.entity = new ArrayList<AuditEventEntityComponent>();
3533          for (AuditEventEntityComponent i : entity)
3534            dst.entity.add(i.copy());
3535        };
3536      }
3537
3538      protected AuditEvent typedCopy() {
3539        return copy();
3540      }
3541
3542      @Override
3543      public boolean equalsDeep(Base other_) {
3544        if (!super.equalsDeep(other_))
3545          return false;
3546        if (!(other_ instanceof AuditEvent))
3547          return false;
3548        AuditEvent o = (AuditEvent) other_;
3549        return compareDeep(category, o.category, true) && compareDeep(code, o.code, true) && compareDeep(action, o.action, true)
3550           && compareDeep(severity, o.severity, true) && compareDeep(occurred, o.occurred, true) && compareDeep(recorded, o.recorded, true)
3551           && compareDeep(outcome, o.outcome, true) && compareDeep(authorization, o.authorization, true) && compareDeep(basedOn, o.basedOn, true)
3552           && compareDeep(patient, o.patient, true) && compareDeep(encounter, o.encounter, true) && compareDeep(agent, o.agent, true)
3553           && compareDeep(source, o.source, true) && compareDeep(entity, o.entity, true);
3554      }
3555
3556      @Override
3557      public boolean equalsShallow(Base other_) {
3558        if (!super.equalsShallow(other_))
3559          return false;
3560        if (!(other_ instanceof AuditEvent))
3561          return false;
3562        AuditEvent o = (AuditEvent) other_;
3563        return compareValues(action, o.action, true) && compareValues(severity, o.severity, true) && compareValues(recorded, o.recorded, true)
3564          ;
3565      }
3566
3567      public boolean isEmpty() {
3568        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(category, code, action, severity
3569          , occurred, recorded, outcome, authorization, basedOn, patient, encounter, agent
3570          , source, entity);
3571      }
3572
3573  @Override
3574  public ResourceType getResourceType() {
3575    return ResourceType.AuditEvent;
3576   }
3577
3578 /**
3579   * Search parameter: <b>action</b>
3580   * <p>
3581   * Description: <b>Type of action performed during the event</b><br>
3582   * Type: <b>token</b><br>
3583   * Path: <b>AuditEvent.action</b><br>
3584   * </p>
3585   */
3586  @SearchParamDefinition(name="action", path="AuditEvent.action", description="Type of action performed during the event", type="token" )
3587  public static final String SP_ACTION = "action";
3588 /**
3589   * <b>Fluent Client</b> search parameter constant for <b>action</b>
3590   * <p>
3591   * Description: <b>Type of action performed during the event</b><br>
3592   * Type: <b>token</b><br>
3593   * Path: <b>AuditEvent.action</b><br>
3594   * </p>
3595   */
3596  public static final ca.uhn.fhir.rest.gclient.TokenClientParam ACTION = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_ACTION);
3597
3598 /**
3599   * Search parameter: <b>agent-role</b>
3600   * <p>
3601   * Description: <b>Agent role in the event</b><br>
3602   * Type: <b>token</b><br>
3603   * Path: <b>AuditEvent.agent.role</b><br>
3604   * </p>
3605   */
3606  @SearchParamDefinition(name="agent-role", path="AuditEvent.agent.role", description="Agent role in the event", type="token" )
3607  public static final String SP_AGENT_ROLE = "agent-role";
3608 /**
3609   * <b>Fluent Client</b> search parameter constant for <b>agent-role</b>
3610   * <p>
3611   * Description: <b>Agent role in the event</b><br>
3612   * Type: <b>token</b><br>
3613   * Path: <b>AuditEvent.agent.role</b><br>
3614   * </p>
3615   */
3616  public static final ca.uhn.fhir.rest.gclient.TokenClientParam AGENT_ROLE = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_AGENT_ROLE);
3617
3618 /**
3619   * Search parameter: <b>agent</b>
3620   * <p>
3621   * Description: <b>Identifier of who</b><br>
3622   * Type: <b>reference</b><br>
3623   * Path: <b>AuditEvent.agent.who</b><br>
3624   * </p>
3625   */
3626  @SearchParamDefinition(name="agent", path="AuditEvent.agent.who", description="Identifier of who", type="reference", providesMembershipIn={ @ca.uhn.fhir.model.api.annotation.Compartment(name="Base FHIR compartment definition for Device"), @ca.uhn.fhir.model.api.annotation.Compartment(name="Base FHIR compartment definition for Practitioner") }, target={CareTeam.class, Device.class, Organization.class, Patient.class, Practitioner.class, PractitionerRole.class, RelatedPerson.class } )
3627  public static final String SP_AGENT = "agent";
3628 /**
3629   * <b>Fluent Client</b> search parameter constant for <b>agent</b>
3630   * <p>
3631   * Description: <b>Identifier of who</b><br>
3632   * Type: <b>reference</b><br>
3633   * Path: <b>AuditEvent.agent.who</b><br>
3634   * </p>
3635   */
3636  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam AGENT = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_AGENT);
3637
3638/**
3639   * Constant for fluent queries to be used to add include statements. Specifies
3640   * the path value of "<b>AuditEvent:agent</b>".
3641   */
3642  public static final ca.uhn.fhir.model.api.Include INCLUDE_AGENT = new ca.uhn.fhir.model.api.Include("AuditEvent:agent").toLocked();
3643
3644 /**
3645   * Search parameter: <b>based-on</b>
3646   * <p>
3647   * Description: <b>Reference to the service request.</b><br>
3648   * Type: <b>reference</b><br>
3649   * Path: <b>AuditEvent.basedOn</b><br>
3650   * </p>
3651   */
3652  @SearchParamDefinition(name="based-on", path="AuditEvent.basedOn", description="Reference to the service request.", type="reference", target={CarePlan.class, DeviceRequest.class, ImmunizationRecommendation.class, MedicationRequest.class, NutritionOrder.class, ServiceRequest.class, Task.class } )
3653  public static final String SP_BASED_ON = "based-on";
3654 /**
3655   * <b>Fluent Client</b> search parameter constant for <b>based-on</b>
3656   * <p>
3657   * Description: <b>Reference to the service request.</b><br>
3658   * Type: <b>reference</b><br>
3659   * Path: <b>AuditEvent.basedOn</b><br>
3660   * </p>
3661   */
3662  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam BASED_ON = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_BASED_ON);
3663
3664/**
3665   * Constant for fluent queries to be used to add include statements. Specifies
3666   * the path value of "<b>AuditEvent:based-on</b>".
3667   */
3668  public static final ca.uhn.fhir.model.api.Include INCLUDE_BASED_ON = new ca.uhn.fhir.model.api.Include("AuditEvent:based-on").toLocked();
3669
3670 /**
3671   * Search parameter: <b>category</b>
3672   * <p>
3673   * Description: <b>Category of event</b><br>
3674   * Type: <b>token</b><br>
3675   * Path: <b>AuditEvent.category</b><br>
3676   * </p>
3677   */
3678  @SearchParamDefinition(name="category", path="AuditEvent.category", description="Category of event", type="token" )
3679  public static final String SP_CATEGORY = "category";
3680 /**
3681   * <b>Fluent Client</b> search parameter constant for <b>category</b>
3682   * <p>
3683   * Description: <b>Category of event</b><br>
3684   * Type: <b>token</b><br>
3685   * Path: <b>AuditEvent.category</b><br>
3686   * </p>
3687   */
3688  public static final ca.uhn.fhir.rest.gclient.TokenClientParam CATEGORY = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_CATEGORY);
3689
3690 /**
3691   * Search parameter: <b>code</b>
3692   * <p>
3693   * Description: <b>More specific code for the event</b><br>
3694   * Type: <b>token</b><br>
3695   * Path: <b>AuditEvent.code</b><br>
3696   * </p>
3697   */
3698  @SearchParamDefinition(name="code", path="AuditEvent.code", description="More specific code for the event", type="token" )
3699  public static final String SP_CODE = "code";
3700 /**
3701   * <b>Fluent Client</b> search parameter constant for <b>code</b>
3702   * <p>
3703   * Description: <b>More specific code for the event</b><br>
3704   * Type: <b>token</b><br>
3705   * Path: <b>AuditEvent.code</b><br>
3706   * </p>
3707   */
3708  public static final ca.uhn.fhir.rest.gclient.TokenClientParam CODE = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_CODE);
3709
3710 /**
3711   * Search parameter: <b>date</b>
3712   * <p>
3713   * Description: <b>Time when the event was recorded</b><br>
3714   * Type: <b>date</b><br>
3715   * Path: <b>AuditEvent.recorded</b><br>
3716   * </p>
3717   */
3718  @SearchParamDefinition(name="date", path="AuditEvent.recorded", description="Time when the event was recorded", type="date" )
3719  public static final String SP_DATE = "date";
3720 /**
3721   * <b>Fluent Client</b> search parameter constant for <b>date</b>
3722   * <p>
3723   * Description: <b>Time when the event was recorded</b><br>
3724   * Type: <b>date</b><br>
3725   * Path: <b>AuditEvent.recorded</b><br>
3726   * </p>
3727   */
3728  public static final ca.uhn.fhir.rest.gclient.DateClientParam DATE = new ca.uhn.fhir.rest.gclient.DateClientParam(SP_DATE);
3729
3730 /**
3731   * Search parameter: <b>encounter</b>
3732   * <p>
3733   * Description: <b>Encounter related to the activity recorded in the AuditEvent</b><br>
3734   * Type: <b>reference</b><br>
3735   * Path: <b>AuditEvent.encounter</b><br>
3736   * </p>
3737   */
3738  @SearchParamDefinition(name="encounter", path="AuditEvent.encounter", description="Encounter related to the activity recorded in the AuditEvent", type="reference", target={Encounter.class } )
3739  public static final String SP_ENCOUNTER = "encounter";
3740 /**
3741   * <b>Fluent Client</b> search parameter constant for <b>encounter</b>
3742   * <p>
3743   * Description: <b>Encounter related to the activity recorded in the AuditEvent</b><br>
3744   * Type: <b>reference</b><br>
3745   * Path: <b>AuditEvent.encounter</b><br>
3746   * </p>
3747   */
3748  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam ENCOUNTER = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_ENCOUNTER);
3749
3750/**
3751   * Constant for fluent queries to be used to add include statements. Specifies
3752   * the path value of "<b>AuditEvent:encounter</b>".
3753   */
3754  public static final ca.uhn.fhir.model.api.Include INCLUDE_ENCOUNTER = new ca.uhn.fhir.model.api.Include("AuditEvent:encounter").toLocked();
3755
3756 /**
3757   * Search parameter: <b>entity-role</b>
3758   * <p>
3759   * Description: <b>What role the entity played</b><br>
3760   * Type: <b>token</b><br>
3761   * Path: <b>AuditEvent.entity.role</b><br>
3762   * </p>
3763   */
3764  @SearchParamDefinition(name="entity-role", path="AuditEvent.entity.role", description="What role the entity played", type="token" )
3765  public static final String SP_ENTITY_ROLE = "entity-role";
3766 /**
3767   * <b>Fluent Client</b> search parameter constant for <b>entity-role</b>
3768   * <p>
3769   * Description: <b>What role the entity played</b><br>
3770   * Type: <b>token</b><br>
3771   * Path: <b>AuditEvent.entity.role</b><br>
3772   * </p>
3773   */
3774  public static final ca.uhn.fhir.rest.gclient.TokenClientParam ENTITY_ROLE = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_ENTITY_ROLE);
3775
3776 /**
3777   * Search parameter: <b>entity</b>
3778   * <p>
3779   * Description: <b>Specific instance of resource</b><br>
3780   * Type: <b>reference</b><br>
3781   * Path: <b>AuditEvent.entity.what</b><br>
3782   * </p>
3783   */
3784  @SearchParamDefinition(name="entity", path="AuditEvent.entity.what", description="Specific instance of resource", type="reference", target={Account.class, ActivityDefinition.class, AdministrableProductDefinition.class, AdverseEvent.class, AllergyIntolerance.class, Appointment.class, AppointmentResponse.class, ArtifactAssessment.class, AuditEvent.class, Basic.class, Binary.class, BiologicallyDerivedProduct.class, BodyStructure.class, Bundle.class, CapabilityStatement.class, CapabilityStatement2.class, CarePlan.class, CareTeam.class, ChargeItem.class, ChargeItemDefinition.class, Citation.class, Claim.class, ClaimResponse.class, ClinicalImpression.class, ClinicalUseDefinition.class, CodeSystem.class, Communication.class, CommunicationRequest.class, CompartmentDefinition.class, Composition.class, ConceptMap.class, Condition.class, ConditionDefinition.class, Consent.class, Contract.class, Coverage.class, CoverageEligibilityRequest.class, CoverageEligibilityResponse.class, DetectedIssue.class, Device.class, DeviceDefinition.class, DeviceDispense.class, DeviceMetric.class, DeviceRequest.class, DeviceUsage.class, DiagnosticReport.class, DocumentManifest.class, DocumentReference.class, Encounter.class, Endpoint.class, EnrollmentRequest.class, EnrollmentResponse.class, EpisodeOfCare.class, EventDefinition.class, Evidence.class, EvidenceReport.class, EvidenceVariable.class, ExampleScenario.class, ExplanationOfBenefit.class, FamilyMemberHistory.class, Flag.class, FormularyItem.class, Goal.class, GraphDefinition.class, Group.class, GuidanceResponse.class, HealthcareService.class, ImagingSelection.class, ImagingStudy.class, Immunization.class, ImmunizationEvaluation.class, ImmunizationRecommendation.class, ImplementationGuide.class, Ingredient.class, InsurancePlan.class, InventoryReport.class, Invoice.class, Library.class, Linkage.class, ListResource.class, Location.class, ManufacturedItemDefinition.class, Measure.class, MeasureReport.class, Medication.class, MedicationAdministration.class, MedicationDispense.class, MedicationKnowledge.class, MedicationRequest.class, MedicationUsage.class, MedicinalProductDefinition.class, MessageDefinition.class, MessageHeader.class, MolecularSequence.class, NamingSystem.class, NutritionIntake.class, NutritionOrder.class, NutritionProduct.class, Observation.class, ObservationDefinition.class, OperationDefinition.class, OperationOutcome.class, Organization.class, OrganizationAffiliation.class, PackagedProductDefinition.class, Patient.class, PaymentNotice.class, PaymentReconciliation.class, Permission.class, Person.class, PlanDefinition.class, Practitioner.class, PractitionerRole.class, Procedure.class, Provenance.class, Questionnaire.class, QuestionnaireResponse.class, RegulatedAuthorization.class, RelatedPerson.class, RequestGroup.class, ResearchStudy.class, ResearchSubject.class, RiskAssessment.class, Schedule.class, SearchParameter.class, ServiceRequest.class, Slot.class, Specimen.class, SpecimenDefinition.class, StructureDefinition.class, StructureMap.class, Subscription.class, SubscriptionStatus.class, SubscriptionTopic.class, Substance.class, SubstanceDefinition.class, SubstanceNucleicAcid.class, SubstancePolymer.class, SubstanceProtein.class, SubstanceReferenceInformation.class, SubstanceSourceMaterial.class, SupplyDelivery.class, SupplyRequest.class, Task.class, TerminologyCapabilities.class, TestReport.class, TestScript.class, Transport.class, ValueSet.class, VerificationResult.class, VisionPrescription.class } )
3785  public static final String SP_ENTITY = "entity";
3786 /**
3787   * <b>Fluent Client</b> search parameter constant for <b>entity</b>
3788   * <p>
3789   * Description: <b>Specific instance of resource</b><br>
3790   * Type: <b>reference</b><br>
3791   * Path: <b>AuditEvent.entity.what</b><br>
3792   * </p>
3793   */
3794  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam ENTITY = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_ENTITY);
3795
3796/**
3797   * Constant for fluent queries to be used to add include statements. Specifies
3798   * the path value of "<b>AuditEvent:entity</b>".
3799   */
3800  public static final ca.uhn.fhir.model.api.Include INCLUDE_ENTITY = new ca.uhn.fhir.model.api.Include("AuditEvent:entity").toLocked();
3801
3802 /**
3803   * Search parameter: <b>outcome</b>
3804   * <p>
3805   * Description: <b>Whether the event succeeded or failed</b><br>
3806   * Type: <b>token</b><br>
3807   * Path: <b>AuditEvent.outcome.code</b><br>
3808   * </p>
3809   */
3810  @SearchParamDefinition(name="outcome", path="AuditEvent.outcome.code", description="Whether the event succeeded or failed", type="token" )
3811  public static final String SP_OUTCOME = "outcome";
3812 /**
3813   * <b>Fluent Client</b> search parameter constant for <b>outcome</b>
3814   * <p>
3815   * Description: <b>Whether the event succeeded or failed</b><br>
3816   * Type: <b>token</b><br>
3817   * Path: <b>AuditEvent.outcome.code</b><br>
3818   * </p>
3819   */
3820  public static final ca.uhn.fhir.rest.gclient.TokenClientParam OUTCOME = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_OUTCOME);
3821
3822 /**
3823   * Search parameter: <b>patient</b>
3824   * <p>
3825   * Description: <b>Where the activity involved patient data</b><br>
3826   * Type: <b>reference</b><br>
3827   * Path: <b>AuditEvent.patient</b><br>
3828   * </p>
3829   */
3830  @SearchParamDefinition(name="patient", path="AuditEvent.patient", description="Where the activity involved patient data", type="reference", providesMembershipIn={ @ca.uhn.fhir.model.api.annotation.Compartment(name="Base FHIR compartment definition for Patient") }, target={Patient.class } )
3831  public static final String SP_PATIENT = "patient";
3832 /**
3833   * <b>Fluent Client</b> search parameter constant for <b>patient</b>
3834   * <p>
3835   * Description: <b>Where the activity involved patient data</b><br>
3836   * Type: <b>reference</b><br>
3837   * Path: <b>AuditEvent.patient</b><br>
3838   * </p>
3839   */
3840  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam PATIENT = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_PATIENT);
3841
3842/**
3843   * Constant for fluent queries to be used to add include statements. Specifies
3844   * the path value of "<b>AuditEvent:patient</b>".
3845   */
3846  public static final ca.uhn.fhir.model.api.Include INCLUDE_PATIENT = new ca.uhn.fhir.model.api.Include("AuditEvent:patient").toLocked();
3847
3848 /**
3849   * Search parameter: <b>policy</b>
3850   * <p>
3851   * Description: <b>Policy that authorized event</b><br>
3852   * Type: <b>uri</b><br>
3853   * Path: <b>AuditEvent.agent.policy</b><br>
3854   * </p>
3855   */
3856  @SearchParamDefinition(name="policy", path="AuditEvent.agent.policy", description="Policy that authorized event", type="uri" )
3857  public static final String SP_POLICY = "policy";
3858 /**
3859   * <b>Fluent Client</b> search parameter constant for <b>policy</b>
3860   * <p>
3861   * Description: <b>Policy that authorized event</b><br>
3862   * Type: <b>uri</b><br>
3863   * Path: <b>AuditEvent.agent.policy</b><br>
3864   * </p>
3865   */
3866  public static final ca.uhn.fhir.rest.gclient.UriClientParam POLICY = new ca.uhn.fhir.rest.gclient.UriClientParam(SP_POLICY);
3867
3868 /**
3869   * Search parameter: <b>purpose</b>
3870   * <p>
3871   * Description: <b>The authorization (purposeOfUse) of the event</b><br>
3872   * Type: <b>token</b><br>
3873   * Path: <b>AuditEvent.authorization | AuditEvent.agent.authorization</b><br>
3874   * </p>
3875   */
3876  @SearchParamDefinition(name="purpose", path="AuditEvent.authorization | AuditEvent.agent.authorization", description="The authorization (purposeOfUse) of the event", type="token" )
3877  public static final String SP_PURPOSE = "purpose";
3878 /**
3879   * <b>Fluent Client</b> search parameter constant for <b>purpose</b>
3880   * <p>
3881   * Description: <b>The authorization (purposeOfUse) of the event</b><br>
3882   * Type: <b>token</b><br>
3883   * Path: <b>AuditEvent.authorization | AuditEvent.agent.authorization</b><br>
3884   * </p>
3885   */
3886  public static final ca.uhn.fhir.rest.gclient.TokenClientParam PURPOSE = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_PURPOSE);
3887
3888 /**
3889   * Search parameter: <b>source</b>
3890   * <p>
3891   * Description: <b>The identity of source detecting the event</b><br>
3892   * Type: <b>reference</b><br>
3893   * Path: <b>AuditEvent.source.observer</b><br>
3894   * </p>
3895   */
3896  @SearchParamDefinition(name="source", path="AuditEvent.source.observer", description="The identity of source detecting the event", type="reference", target={CareTeam.class, Device.class, Organization.class, Patient.class, Practitioner.class, PractitionerRole.class, RelatedPerson.class } )
3897  public static final String SP_SOURCE = "source";
3898 /**
3899   * <b>Fluent Client</b> search parameter constant for <b>source</b>
3900   * <p>
3901   * Description: <b>The identity of source detecting the event</b><br>
3902   * Type: <b>reference</b><br>
3903   * Path: <b>AuditEvent.source.observer</b><br>
3904   * </p>
3905   */
3906  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam SOURCE = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_SOURCE);
3907
3908/**
3909   * Constant for fluent queries to be used to add include statements. Specifies
3910   * the path value of "<b>AuditEvent:source</b>".
3911   */
3912  public static final ca.uhn.fhir.model.api.Include INCLUDE_SOURCE = new ca.uhn.fhir.model.api.Include("AuditEvent:source").toLocked();
3913
3914
3915}
3916