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