001package org.hl7.fhir.r4.model;
002
003/*
004  Copyright (c) 2011+, HL7, Inc.
005  All rights reserved.
006  
007  Redistribution and use in source and binary forms, with or without modification, 
008  are permitted provided that the following conditions are met:
009  
010   * Redistributions of source code must retain the above copyright notice, this 
011     list of conditions and the following disclaimer.
012   * Redistributions in binary form must reproduce the above copyright notice, 
013     this list of conditions and the following disclaimer in the documentation 
014     and/or other materials provided with the distribution.
015   * Neither the name of HL7 nor the names of its contributors may be used to 
016     endorse or promote products derived from this software without specific 
017     prior written permission.
018  
019  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
020  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
021  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
022  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
023  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
024  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
025  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
026  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
027  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
028  POSSIBILITY OF SUCH DAMAGE.
029  
030*/
031
032// Generated on Tue, May 12, 2020 07:26+1000 for FHIR v4.0.1
033import java.util.ArrayList;
034import java.util.Date;
035import java.util.List;
036
037import org.hl7.fhir.exceptions.FHIRException;
038import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
039import org.hl7.fhir.r4.model.Enumerations.PublicationStatus;
040import org.hl7.fhir.r4.model.Enumerations.PublicationStatusEnumFactory;
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.ChildOrder;
046import ca.uhn.fhir.model.api.annotation.Description;
047import ca.uhn.fhir.model.api.annotation.ResourceDef;
048import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
049
050/**
051 * The ResearchElementDefinition resource describes a "PICO" element that
052 * knowledge (evidence, assertion, recommendation) is about.
053 */
054@ResourceDef(name = "ResearchElementDefinition", profile = "http://hl7.org/fhir/StructureDefinition/ResearchElementDefinition")
055@ChildOrder(names = { "url", "identifier", "version", "name", "title", "shortTitle", "subtitle", "status",
056    "experimental", "subject[x]", "date", "publisher", "contact", "description", "comment", "useContext",
057    "jurisdiction", "purpose", "usage", "copyright", "approvalDate", "lastReviewDate", "effectivePeriod", "topic",
058    "author", "editor", "reviewer", "endorser", "relatedArtifact", "library", "type", "variableType",
059    "characteristic" })
060public class ResearchElementDefinition extends MetadataResource {
061
062  public enum ResearchElementType {
063    /**
064     * The element defines the population that forms the basis for research.
065     */
066    POPULATION,
067    /**
068     * The element defines an exposure within the population that is being
069     * researched.
070     */
071    EXPOSURE,
072    /**
073     * The element defines an outcome within the population that is being
074     * researched.
075     */
076    OUTCOME,
077    /**
078     * added to help the parsers with the generic types
079     */
080    NULL;
081
082    public static ResearchElementType fromCode(String codeString) throws FHIRException {
083      if (codeString == null || "".equals(codeString))
084        return null;
085      if ("population".equals(codeString))
086        return POPULATION;
087      if ("exposure".equals(codeString))
088        return EXPOSURE;
089      if ("outcome".equals(codeString))
090        return OUTCOME;
091      if (Configuration.isAcceptInvalidEnums())
092        return null;
093      else
094        throw new FHIRException("Unknown ResearchElementType code '" + codeString + "'");
095    }
096
097    public String toCode() {
098      switch (this) {
099      case POPULATION:
100        return "population";
101      case EXPOSURE:
102        return "exposure";
103      case OUTCOME:
104        return "outcome";
105      case NULL:
106        return null;
107      default:
108        return "?";
109      }
110    }
111
112    public String getSystem() {
113      switch (this) {
114      case POPULATION:
115        return "http://hl7.org/fhir/research-element-type";
116      case EXPOSURE:
117        return "http://hl7.org/fhir/research-element-type";
118      case OUTCOME:
119        return "http://hl7.org/fhir/research-element-type";
120      case NULL:
121        return null;
122      default:
123        return "?";
124      }
125    }
126
127    public String getDefinition() {
128      switch (this) {
129      case POPULATION:
130        return "The element defines the population that forms the basis for research.";
131      case EXPOSURE:
132        return "The element defines an exposure within the population that is being researched.";
133      case OUTCOME:
134        return "The element defines an outcome within the population that is being researched.";
135      case NULL:
136        return null;
137      default:
138        return "?";
139      }
140    }
141
142    public String getDisplay() {
143      switch (this) {
144      case POPULATION:
145        return "Population";
146      case EXPOSURE:
147        return "Exposure";
148      case OUTCOME:
149        return "Outcome";
150      case NULL:
151        return null;
152      default:
153        return "?";
154      }
155    }
156  }
157
158  public static class ResearchElementTypeEnumFactory implements EnumFactory<ResearchElementType> {
159    public ResearchElementType fromCode(String codeString) throws IllegalArgumentException {
160      if (codeString == null || "".equals(codeString))
161        if (codeString == null || "".equals(codeString))
162          return null;
163      if ("population".equals(codeString))
164        return ResearchElementType.POPULATION;
165      if ("exposure".equals(codeString))
166        return ResearchElementType.EXPOSURE;
167      if ("outcome".equals(codeString))
168        return ResearchElementType.OUTCOME;
169      throw new IllegalArgumentException("Unknown ResearchElementType code '" + codeString + "'");
170    }
171
172    public Enumeration<ResearchElementType> fromType(PrimitiveType<?> code) throws FHIRException {
173      if (code == null)
174        return null;
175      if (code.isEmpty())
176        return new Enumeration<ResearchElementType>(this, ResearchElementType.NULL, code);
177      String codeString = code.asStringValue();
178      if (codeString == null || "".equals(codeString))
179        return new Enumeration<ResearchElementType>(this, ResearchElementType.NULL, code);
180      if ("population".equals(codeString))
181        return new Enumeration<ResearchElementType>(this, ResearchElementType.POPULATION, code);
182      if ("exposure".equals(codeString))
183        return new Enumeration<ResearchElementType>(this, ResearchElementType.EXPOSURE, code);
184      if ("outcome".equals(codeString))
185        return new Enumeration<ResearchElementType>(this, ResearchElementType.OUTCOME, code);
186      throw new FHIRException("Unknown ResearchElementType code '" + codeString + "'");
187    }
188
189    public String toCode(ResearchElementType code) {
190      if (code == ResearchElementType.POPULATION)
191        return "population";
192      if (code == ResearchElementType.EXPOSURE)
193        return "exposure";
194      if (code == ResearchElementType.OUTCOME)
195        return "outcome";
196      return "?";
197    }
198
199    public String toSystem(ResearchElementType code) {
200      return code.getSystem();
201    }
202  }
203
204  public enum VariableType {
205    /**
206     * The variable is dichotomous, such as present or absent.
207     */
208    DICHOTOMOUS,
209    /**
210     * The variable is a continuous result such as a quantity.
211     */
212    CONTINUOUS,
213    /**
214     * The variable is described narratively rather than quantitatively.
215     */
216    DESCRIPTIVE,
217    /**
218     * added to help the parsers with the generic types
219     */
220    NULL;
221
222    public static VariableType fromCode(String codeString) throws FHIRException {
223      if (codeString == null || "".equals(codeString))
224        return null;
225      if ("dichotomous".equals(codeString))
226        return DICHOTOMOUS;
227      if ("continuous".equals(codeString))
228        return CONTINUOUS;
229      if ("descriptive".equals(codeString))
230        return DESCRIPTIVE;
231      if (Configuration.isAcceptInvalidEnums())
232        return null;
233      else
234        throw new FHIRException("Unknown VariableType code '" + codeString + "'");
235    }
236
237    public String toCode() {
238      switch (this) {
239      case DICHOTOMOUS:
240        return "dichotomous";
241      case CONTINUOUS:
242        return "continuous";
243      case DESCRIPTIVE:
244        return "descriptive";
245      case NULL:
246        return null;
247      default:
248        return "?";
249      }
250    }
251
252    public String getSystem() {
253      switch (this) {
254      case DICHOTOMOUS:
255        return "http://hl7.org/fhir/variable-type";
256      case CONTINUOUS:
257        return "http://hl7.org/fhir/variable-type";
258      case DESCRIPTIVE:
259        return "http://hl7.org/fhir/variable-type";
260      case NULL:
261        return null;
262      default:
263        return "?";
264      }
265    }
266
267    public String getDefinition() {
268      switch (this) {
269      case DICHOTOMOUS:
270        return "The variable is dichotomous, such as present or absent.";
271      case CONTINUOUS:
272        return "The variable is a continuous result such as a quantity.";
273      case DESCRIPTIVE:
274        return "The variable is described narratively rather than quantitatively.";
275      case NULL:
276        return null;
277      default:
278        return "?";
279      }
280    }
281
282    public String getDisplay() {
283      switch (this) {
284      case DICHOTOMOUS:
285        return "Dichotomous";
286      case CONTINUOUS:
287        return "Continuous";
288      case DESCRIPTIVE:
289        return "Descriptive";
290      case NULL:
291        return null;
292      default:
293        return "?";
294      }
295    }
296  }
297
298  public static class VariableTypeEnumFactory implements EnumFactory<VariableType> {
299    public VariableType fromCode(String codeString) throws IllegalArgumentException {
300      if (codeString == null || "".equals(codeString))
301        if (codeString == null || "".equals(codeString))
302          return null;
303      if ("dichotomous".equals(codeString))
304        return VariableType.DICHOTOMOUS;
305      if ("continuous".equals(codeString))
306        return VariableType.CONTINUOUS;
307      if ("descriptive".equals(codeString))
308        return VariableType.DESCRIPTIVE;
309      throw new IllegalArgumentException("Unknown VariableType code '" + codeString + "'");
310    }
311
312    public Enumeration<VariableType> fromType(PrimitiveType<?> code) throws FHIRException {
313      if (code == null)
314        return null;
315      if (code.isEmpty())
316        return new Enumeration<VariableType>(this, VariableType.NULL, code);
317      String codeString = code.asStringValue();
318      if (codeString == null || "".equals(codeString))
319        return new Enumeration<VariableType>(this, VariableType.NULL, code);
320      if ("dichotomous".equals(codeString))
321        return new Enumeration<VariableType>(this, VariableType.DICHOTOMOUS, code);
322      if ("continuous".equals(codeString))
323        return new Enumeration<VariableType>(this, VariableType.CONTINUOUS, code);
324      if ("descriptive".equals(codeString))
325        return new Enumeration<VariableType>(this, VariableType.DESCRIPTIVE, code);
326      throw new FHIRException("Unknown VariableType code '" + codeString + "'");
327    }
328
329    public String toCode(VariableType code) {
330      if (code == VariableType.DICHOTOMOUS)
331        return "dichotomous";
332      if (code == VariableType.CONTINUOUS)
333        return "continuous";
334      if (code == VariableType.DESCRIPTIVE)
335        return "descriptive";
336      return "?";
337    }
338
339    public String toSystem(VariableType code) {
340      return code.getSystem();
341    }
342  }
343
344  public enum GroupMeasure {
345    /**
346     * Aggregated using Mean of participant values.
347     */
348    MEAN,
349    /**
350     * Aggregated using Median of participant values.
351     */
352    MEDIAN,
353    /**
354     * Aggregated using Mean of study mean values.
355     */
356    MEANOFMEAN,
357    /**
358     * Aggregated using Mean of study median values.
359     */
360    MEANOFMEDIAN,
361    /**
362     * Aggregated using Median of study mean values.
363     */
364    MEDIANOFMEAN,
365    /**
366     * Aggregated using Median of study median values.
367     */
368    MEDIANOFMEDIAN,
369    /**
370     * added to help the parsers with the generic types
371     */
372    NULL;
373
374    public static GroupMeasure fromCode(String codeString) throws FHIRException {
375      if (codeString == null || "".equals(codeString))
376        return null;
377      if ("mean".equals(codeString))
378        return MEAN;
379      if ("median".equals(codeString))
380        return MEDIAN;
381      if ("mean-of-mean".equals(codeString))
382        return MEANOFMEAN;
383      if ("mean-of-median".equals(codeString))
384        return MEANOFMEDIAN;
385      if ("median-of-mean".equals(codeString))
386        return MEDIANOFMEAN;
387      if ("median-of-median".equals(codeString))
388        return MEDIANOFMEDIAN;
389      if (Configuration.isAcceptInvalidEnums())
390        return null;
391      else
392        throw new FHIRException("Unknown GroupMeasure code '" + codeString + "'");
393    }
394
395    public String toCode() {
396      switch (this) {
397      case MEAN:
398        return "mean";
399      case MEDIAN:
400        return "median";
401      case MEANOFMEAN:
402        return "mean-of-mean";
403      case MEANOFMEDIAN:
404        return "mean-of-median";
405      case MEDIANOFMEAN:
406        return "median-of-mean";
407      case MEDIANOFMEDIAN:
408        return "median-of-median";
409      case NULL:
410        return null;
411      default:
412        return "?";
413      }
414    }
415
416    public String getSystem() {
417      switch (this) {
418      case MEAN:
419        return "http://hl7.org/fhir/group-measure";
420      case MEDIAN:
421        return "http://hl7.org/fhir/group-measure";
422      case MEANOFMEAN:
423        return "http://hl7.org/fhir/group-measure";
424      case MEANOFMEDIAN:
425        return "http://hl7.org/fhir/group-measure";
426      case MEDIANOFMEAN:
427        return "http://hl7.org/fhir/group-measure";
428      case MEDIANOFMEDIAN:
429        return "http://hl7.org/fhir/group-measure";
430      case NULL:
431        return null;
432      default:
433        return "?";
434      }
435    }
436
437    public String getDefinition() {
438      switch (this) {
439      case MEAN:
440        return "Aggregated using Mean of participant values.";
441      case MEDIAN:
442        return "Aggregated using Median of participant values.";
443      case MEANOFMEAN:
444        return "Aggregated using Mean of study mean values.";
445      case MEANOFMEDIAN:
446        return "Aggregated using Mean of study median values.";
447      case MEDIANOFMEAN:
448        return "Aggregated using Median of study mean values.";
449      case MEDIANOFMEDIAN:
450        return "Aggregated using Median of study median values.";
451      case NULL:
452        return null;
453      default:
454        return "?";
455      }
456    }
457
458    public String getDisplay() {
459      switch (this) {
460      case MEAN:
461        return "Mean";
462      case MEDIAN:
463        return "Median";
464      case MEANOFMEAN:
465        return "Mean of Study Means";
466      case MEANOFMEDIAN:
467        return "Mean of Study Medins";
468      case MEDIANOFMEAN:
469        return "Median of Study Means";
470      case MEDIANOFMEDIAN:
471        return "Median of Study Medians";
472      case NULL:
473        return null;
474      default:
475        return "?";
476      }
477    }
478  }
479
480  public static class GroupMeasureEnumFactory implements EnumFactory<GroupMeasure> {
481    public GroupMeasure fromCode(String codeString) throws IllegalArgumentException {
482      if (codeString == null || "".equals(codeString))
483        if (codeString == null || "".equals(codeString))
484          return null;
485      if ("mean".equals(codeString))
486        return GroupMeasure.MEAN;
487      if ("median".equals(codeString))
488        return GroupMeasure.MEDIAN;
489      if ("mean-of-mean".equals(codeString))
490        return GroupMeasure.MEANOFMEAN;
491      if ("mean-of-median".equals(codeString))
492        return GroupMeasure.MEANOFMEDIAN;
493      if ("median-of-mean".equals(codeString))
494        return GroupMeasure.MEDIANOFMEAN;
495      if ("median-of-median".equals(codeString))
496        return GroupMeasure.MEDIANOFMEDIAN;
497      throw new IllegalArgumentException("Unknown GroupMeasure code '" + codeString + "'");
498    }
499
500    public Enumeration<GroupMeasure> fromType(PrimitiveType<?> code) throws FHIRException {
501      if (code == null)
502        return null;
503      if (code.isEmpty())
504        return new Enumeration<GroupMeasure>(this, GroupMeasure.NULL, code);
505      String codeString = code.asStringValue();
506      if (codeString == null || "".equals(codeString))
507        return new Enumeration<GroupMeasure>(this, GroupMeasure.NULL, code);
508      if ("mean".equals(codeString))
509        return new Enumeration<GroupMeasure>(this, GroupMeasure.MEAN, code);
510      if ("median".equals(codeString))
511        return new Enumeration<GroupMeasure>(this, GroupMeasure.MEDIAN, code);
512      if ("mean-of-mean".equals(codeString))
513        return new Enumeration<GroupMeasure>(this, GroupMeasure.MEANOFMEAN, code);
514      if ("mean-of-median".equals(codeString))
515        return new Enumeration<GroupMeasure>(this, GroupMeasure.MEANOFMEDIAN, code);
516      if ("median-of-mean".equals(codeString))
517        return new Enumeration<GroupMeasure>(this, GroupMeasure.MEDIANOFMEAN, code);
518      if ("median-of-median".equals(codeString))
519        return new Enumeration<GroupMeasure>(this, GroupMeasure.MEDIANOFMEDIAN, code);
520      throw new FHIRException("Unknown GroupMeasure code '" + codeString + "'");
521    }
522
523    public String toCode(GroupMeasure code) {
524      if (code == GroupMeasure.MEAN)
525        return "mean";
526      if (code == GroupMeasure.MEDIAN)
527        return "median";
528      if (code == GroupMeasure.MEANOFMEAN)
529        return "mean-of-mean";
530      if (code == GroupMeasure.MEANOFMEDIAN)
531        return "mean-of-median";
532      if (code == GroupMeasure.MEDIANOFMEAN)
533        return "median-of-mean";
534      if (code == GroupMeasure.MEDIANOFMEDIAN)
535        return "median-of-median";
536      return "?";
537    }
538
539    public String toSystem(GroupMeasure code) {
540      return code.getSystem();
541    }
542  }
543
544  @Block()
545  public static class ResearchElementDefinitionCharacteristicComponent extends BackboneElement
546      implements IBaseBackboneElement {
547    /**
548     * Define members of the research element using Codes (such as condition,
549     * medication, or observation), Expressions ( using an expression language such
550     * as FHIRPath or CQL) or DataRequirements (such as Diabetes diagnosis onset in
551     * the last year).
552     */
553    @Child(name = "definition", type = { CodeableConcept.class, CanonicalType.class, Expression.class,
554        DataRequirement.class }, order = 1, min = 1, max = 1, modifier = false, summary = true)
555    @Description(shortDefinition = "What code or expression defines members?", formalDefinition = "Define members of the research element using Codes (such as condition, medication, or observation), Expressions ( using an expression language such as FHIRPath or CQL) or DataRequirements (such as Diabetes diagnosis onset in the last year).")
556    protected Type definition;
557
558    /**
559     * Use UsageContext to define the members of the population, such as Age Ranges,
560     * Genders, Settings.
561     */
562    @Child(name = "usageContext", type = {
563        UsageContext.class }, order = 2, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
564    @Description(shortDefinition = "What code/value pairs define members?", formalDefinition = "Use UsageContext to define the members of the population, such as Age Ranges, Genders, Settings.")
565    protected List<UsageContext> usageContext;
566
567    /**
568     * When true, members with this characteristic are excluded from the element.
569     */
570    @Child(name = "exclude", type = {
571        BooleanType.class }, order = 3, min = 0, max = 1, modifier = false, summary = false)
572    @Description(shortDefinition = "Whether the characteristic includes or excludes members", formalDefinition = "When true, members with this characteristic are excluded from the element.")
573    protected BooleanType exclude;
574
575    /**
576     * Specifies the UCUM unit for the outcome.
577     */
578    @Child(name = "unitOfMeasure", type = {
579        CodeableConcept.class }, order = 4, min = 0, max = 1, modifier = false, summary = false)
580    @Description(shortDefinition = "What unit is the outcome described in?", formalDefinition = "Specifies the UCUM unit for the outcome.")
581    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ucum-units")
582    protected CodeableConcept unitOfMeasure;
583
584    /**
585     * A narrative description of the time period the study covers.
586     */
587    @Child(name = "studyEffectiveDescription", type = {
588        StringType.class }, order = 5, min = 0, max = 1, modifier = false, summary = false)
589    @Description(shortDefinition = "What time period does the study cover", formalDefinition = "A narrative description of the time period the study covers.")
590    protected StringType studyEffectiveDescription;
591
592    /**
593     * Indicates what effective period the study covers.
594     */
595    @Child(name = "studyEffective", type = { DateTimeType.class, Period.class, Duration.class,
596        Timing.class }, order = 6, min = 0, max = 1, modifier = false, summary = false)
597    @Description(shortDefinition = "What time period does the study cover", formalDefinition = "Indicates what effective period the study covers.")
598    protected Type studyEffective;
599
600    /**
601     * Indicates duration from the study initiation.
602     */
603    @Child(name = "studyEffectiveTimeFromStart", type = {
604        Duration.class }, order = 7, min = 0, max = 1, modifier = false, summary = false)
605    @Description(shortDefinition = "Observation time from study start", formalDefinition = "Indicates duration from the study initiation.")
606    protected Duration studyEffectiveTimeFromStart;
607
608    /**
609     * Indicates how elements are aggregated within the study effective period.
610     */
611    @Child(name = "studyEffectiveGroupMeasure", type = {
612        CodeType.class }, order = 8, min = 0, max = 1, modifier = false, summary = false)
613    @Description(shortDefinition = "mean | median | mean-of-mean | mean-of-median | median-of-mean | median-of-median", formalDefinition = "Indicates how elements are aggregated within the study effective period.")
614    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/group-measure")
615    protected Enumeration<GroupMeasure> studyEffectiveGroupMeasure;
616
617    /**
618     * A narrative description of the time period the study covers.
619     */
620    @Child(name = "participantEffectiveDescription", type = {
621        StringType.class }, order = 9, min = 0, max = 1, modifier = false, summary = false)
622    @Description(shortDefinition = "What time period do participants cover", formalDefinition = "A narrative description of the time period the study covers.")
623    protected StringType participantEffectiveDescription;
624
625    /**
626     * Indicates what effective period the study covers.
627     */
628    @Child(name = "participantEffective", type = { DateTimeType.class, Period.class, Duration.class,
629        Timing.class }, order = 10, min = 0, max = 1, modifier = false, summary = false)
630    @Description(shortDefinition = "What time period do participants cover", formalDefinition = "Indicates what effective period the study covers.")
631    protected Type participantEffective;
632
633    /**
634     * Indicates duration from the participant's study entry.
635     */
636    @Child(name = "participantEffectiveTimeFromStart", type = {
637        Duration.class }, order = 11, min = 0, max = 1, modifier = false, summary = false)
638    @Description(shortDefinition = "Observation time from study start", formalDefinition = "Indicates duration from the participant's study entry.")
639    protected Duration participantEffectiveTimeFromStart;
640
641    /**
642     * Indicates how elements are aggregated within the study effective period.
643     */
644    @Child(name = "participantEffectiveGroupMeasure", type = {
645        CodeType.class }, order = 12, min = 0, max = 1, modifier = false, summary = false)
646    @Description(shortDefinition = "mean | median | mean-of-mean | mean-of-median | median-of-mean | median-of-median", formalDefinition = "Indicates how elements are aggregated within the study effective period.")
647    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/group-measure")
648    protected Enumeration<GroupMeasure> participantEffectiveGroupMeasure;
649
650    private static final long serialVersionUID = -1102952665L;
651
652    /**
653     * Constructor
654     */
655    public ResearchElementDefinitionCharacteristicComponent() {
656      super();
657    }
658
659    /**
660     * Constructor
661     */
662    public ResearchElementDefinitionCharacteristicComponent(Type definition) {
663      super();
664      this.definition = definition;
665    }
666
667    /**
668     * @return {@link #definition} (Define members of the research element using
669     *         Codes (such as condition, medication, or observation), Expressions (
670     *         using an expression language such as FHIRPath or CQL) or
671     *         DataRequirements (such as Diabetes diagnosis onset in the last
672     *         year).)
673     */
674    public Type getDefinition() {
675      return this.definition;
676    }
677
678    /**
679     * @return {@link #definition} (Define members of the research element using
680     *         Codes (such as condition, medication, or observation), Expressions (
681     *         using an expression language such as FHIRPath or CQL) or
682     *         DataRequirements (such as Diabetes diagnosis onset in the last
683     *         year).)
684     */
685    public CodeableConcept getDefinitionCodeableConcept() throws FHIRException {
686      if (this.definition == null)
687        this.definition = new CodeableConcept();
688      if (!(this.definition instanceof CodeableConcept))
689        throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "
690            + this.definition.getClass().getName() + " was encountered");
691      return (CodeableConcept) this.definition;
692    }
693
694    public boolean hasDefinitionCodeableConcept() {
695      return this != null && this.definition instanceof CodeableConcept;
696    }
697
698    /**
699     * @return {@link #definition} (Define members of the research element using
700     *         Codes (such as condition, medication, or observation), Expressions (
701     *         using an expression language such as FHIRPath or CQL) or
702     *         DataRequirements (such as Diabetes diagnosis onset in the last
703     *         year).)
704     */
705    public CanonicalType getDefinitionCanonicalType() throws FHIRException {
706      if (this.definition == null)
707        this.definition = new CanonicalType();
708      if (!(this.definition instanceof CanonicalType))
709        throw new FHIRException("Type mismatch: the type CanonicalType was expected, but "
710            + this.definition.getClass().getName() + " was encountered");
711      return (CanonicalType) this.definition;
712    }
713
714    public boolean hasDefinitionCanonicalType() {
715      return this != null && this.definition instanceof CanonicalType;
716    }
717
718    /**
719     * @return {@link #definition} (Define members of the research element using
720     *         Codes (such as condition, medication, or observation), Expressions (
721     *         using an expression language such as FHIRPath or CQL) or
722     *         DataRequirements (such as Diabetes diagnosis onset in the last
723     *         year).)
724     */
725    public Expression getDefinitionExpression() throws FHIRException {
726      if (this.definition == null)
727        this.definition = new Expression();
728      if (!(this.definition instanceof Expression))
729        throw new FHIRException("Type mismatch: the type Expression was expected, but "
730            + this.definition.getClass().getName() + " was encountered");
731      return (Expression) this.definition;
732    }
733
734    public boolean hasDefinitionExpression() {
735      return this != null && this.definition instanceof Expression;
736    }
737
738    /**
739     * @return {@link #definition} (Define members of the research element using
740     *         Codes (such as condition, medication, or observation), Expressions (
741     *         using an expression language such as FHIRPath or CQL) or
742     *         DataRequirements (such as Diabetes diagnosis onset in the last
743     *         year).)
744     */
745    public DataRequirement getDefinitionDataRequirement() throws FHIRException {
746      if (this.definition == null)
747        this.definition = new DataRequirement();
748      if (!(this.definition instanceof DataRequirement))
749        throw new FHIRException("Type mismatch: the type DataRequirement was expected, but "
750            + this.definition.getClass().getName() + " was encountered");
751      return (DataRequirement) this.definition;
752    }
753
754    public boolean hasDefinitionDataRequirement() {
755      return this != null && this.definition instanceof DataRequirement;
756    }
757
758    public boolean hasDefinition() {
759      return this.definition != null && !this.definition.isEmpty();
760    }
761
762    /**
763     * @param value {@link #definition} (Define members of the research element
764     *              using Codes (such as condition, medication, or observation),
765     *              Expressions ( using an expression language such as FHIRPath or
766     *              CQL) or DataRequirements (such as Diabetes diagnosis onset in
767     *              the last year).)
768     */
769    public ResearchElementDefinitionCharacteristicComponent setDefinition(Type value) {
770      if (value != null && !(value instanceof CodeableConcept || value instanceof CanonicalType
771          || value instanceof Expression || value instanceof DataRequirement))
772        throw new Error(
773            "Not the right type for ResearchElementDefinition.characteristic.definition[x]: " + value.fhirType());
774      this.definition = value;
775      return this;
776    }
777
778    /**
779     * @return {@link #usageContext} (Use UsageContext to define the members of the
780     *         population, such as Age Ranges, Genders, Settings.)
781     */
782    public List<UsageContext> getUsageContext() {
783      if (this.usageContext == null)
784        this.usageContext = new ArrayList<UsageContext>();
785      return this.usageContext;
786    }
787
788    /**
789     * @return Returns a reference to <code>this</code> for easy method chaining
790     */
791    public ResearchElementDefinitionCharacteristicComponent setUsageContext(List<UsageContext> theUsageContext) {
792      this.usageContext = theUsageContext;
793      return this;
794    }
795
796    public boolean hasUsageContext() {
797      if (this.usageContext == null)
798        return false;
799      for (UsageContext item : this.usageContext)
800        if (!item.isEmpty())
801          return true;
802      return false;
803    }
804
805    public UsageContext addUsageContext() { // 3
806      UsageContext t = new UsageContext();
807      if (this.usageContext == null)
808        this.usageContext = new ArrayList<UsageContext>();
809      this.usageContext.add(t);
810      return t;
811    }
812
813    public ResearchElementDefinitionCharacteristicComponent addUsageContext(UsageContext t) { // 3
814      if (t == null)
815        return this;
816      if (this.usageContext == null)
817        this.usageContext = new ArrayList<UsageContext>();
818      this.usageContext.add(t);
819      return this;
820    }
821
822    /**
823     * @return The first repetition of repeating field {@link #usageContext},
824     *         creating it if it does not already exist
825     */
826    public UsageContext getUsageContextFirstRep() {
827      if (getUsageContext().isEmpty()) {
828        addUsageContext();
829      }
830      return getUsageContext().get(0);
831    }
832
833    /**
834     * @return {@link #exclude} (When true, members with this characteristic are
835     *         excluded from the element.). This is the underlying object with id,
836     *         value and extensions. The accessor "getExclude" gives direct access
837     *         to the value
838     */
839    public BooleanType getExcludeElement() {
840      if (this.exclude == null)
841        if (Configuration.errorOnAutoCreate())
842          throw new Error("Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.exclude");
843        else if (Configuration.doAutoCreate())
844          this.exclude = new BooleanType(); // bb
845      return this.exclude;
846    }
847
848    public boolean hasExcludeElement() {
849      return this.exclude != null && !this.exclude.isEmpty();
850    }
851
852    public boolean hasExclude() {
853      return this.exclude != null && !this.exclude.isEmpty();
854    }
855
856    /**
857     * @param value {@link #exclude} (When true, members with this characteristic
858     *              are excluded from the element.). This is the underlying object
859     *              with id, value and extensions. The accessor "getExclude" gives
860     *              direct access to the value
861     */
862    public ResearchElementDefinitionCharacteristicComponent setExcludeElement(BooleanType value) {
863      this.exclude = value;
864      return this;
865    }
866
867    /**
868     * @return When true, members with this characteristic are excluded from the
869     *         element.
870     */
871    public boolean getExclude() {
872      return this.exclude == null || this.exclude.isEmpty() ? false : this.exclude.getValue();
873    }
874
875    /**
876     * @param value When true, members with this characteristic are excluded from
877     *              the element.
878     */
879    public ResearchElementDefinitionCharacteristicComponent setExclude(boolean value) {
880      if (this.exclude == null)
881        this.exclude = new BooleanType();
882      this.exclude.setValue(value);
883      return this;
884    }
885
886    /**
887     * @return {@link #unitOfMeasure} (Specifies the UCUM unit for the outcome.)
888     */
889    public CodeableConcept getUnitOfMeasure() {
890      if (this.unitOfMeasure == null)
891        if (Configuration.errorOnAutoCreate())
892          throw new Error("Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.unitOfMeasure");
893        else if (Configuration.doAutoCreate())
894          this.unitOfMeasure = new CodeableConcept(); // cc
895      return this.unitOfMeasure;
896    }
897
898    public boolean hasUnitOfMeasure() {
899      return this.unitOfMeasure != null && !this.unitOfMeasure.isEmpty();
900    }
901
902    /**
903     * @param value {@link #unitOfMeasure} (Specifies the UCUM unit for the
904     *              outcome.)
905     */
906    public ResearchElementDefinitionCharacteristicComponent setUnitOfMeasure(CodeableConcept value) {
907      this.unitOfMeasure = value;
908      return this;
909    }
910
911    /**
912     * @return {@link #studyEffectiveDescription} (A narrative description of the
913     *         time period the study covers.). This is the underlying object with
914     *         id, value and extensions. The accessor "getStudyEffectiveDescription"
915     *         gives direct access to the value
916     */
917    public StringType getStudyEffectiveDescriptionElement() {
918      if (this.studyEffectiveDescription == null)
919        if (Configuration.errorOnAutoCreate())
920          throw new Error(
921              "Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.studyEffectiveDescription");
922        else if (Configuration.doAutoCreate())
923          this.studyEffectiveDescription = new StringType(); // bb
924      return this.studyEffectiveDescription;
925    }
926
927    public boolean hasStudyEffectiveDescriptionElement() {
928      return this.studyEffectiveDescription != null && !this.studyEffectiveDescription.isEmpty();
929    }
930
931    public boolean hasStudyEffectiveDescription() {
932      return this.studyEffectiveDescription != null && !this.studyEffectiveDescription.isEmpty();
933    }
934
935    /**
936     * @param value {@link #studyEffectiveDescription} (A narrative description of
937     *              the time period the study covers.). This is the underlying
938     *              object with id, value and extensions. The accessor
939     *              "getStudyEffectiveDescription" gives direct access to the value
940     */
941    public ResearchElementDefinitionCharacteristicComponent setStudyEffectiveDescriptionElement(StringType value) {
942      this.studyEffectiveDescription = value;
943      return this;
944    }
945
946    /**
947     * @return A narrative description of the time period the study covers.
948     */
949    public String getStudyEffectiveDescription() {
950      return this.studyEffectiveDescription == null ? null : this.studyEffectiveDescription.getValue();
951    }
952
953    /**
954     * @param value A narrative description of the time period the study covers.
955     */
956    public ResearchElementDefinitionCharacteristicComponent setStudyEffectiveDescription(String value) {
957      if (Utilities.noString(value))
958        this.studyEffectiveDescription = null;
959      else {
960        if (this.studyEffectiveDescription == null)
961          this.studyEffectiveDescription = new StringType();
962        this.studyEffectiveDescription.setValue(value);
963      }
964      return this;
965    }
966
967    /**
968     * @return {@link #studyEffective} (Indicates what effective period the study
969     *         covers.)
970     */
971    public Type getStudyEffective() {
972      return this.studyEffective;
973    }
974
975    /**
976     * @return {@link #studyEffective} (Indicates what effective period the study
977     *         covers.)
978     */
979    public DateTimeType getStudyEffectiveDateTimeType() throws FHIRException {
980      if (this.studyEffective == null)
981        this.studyEffective = new DateTimeType();
982      if (!(this.studyEffective instanceof DateTimeType))
983        throw new FHIRException("Type mismatch: the type DateTimeType was expected, but "
984            + this.studyEffective.getClass().getName() + " was encountered");
985      return (DateTimeType) this.studyEffective;
986    }
987
988    public boolean hasStudyEffectiveDateTimeType() {
989      return this != null && this.studyEffective instanceof DateTimeType;
990    }
991
992    /**
993     * @return {@link #studyEffective} (Indicates what effective period the study
994     *         covers.)
995     */
996    public Period getStudyEffectivePeriod() throws FHIRException {
997      if (this.studyEffective == null)
998        this.studyEffective = new Period();
999      if (!(this.studyEffective instanceof Period))
1000        throw new FHIRException("Type mismatch: the type Period was expected, but "
1001            + this.studyEffective.getClass().getName() + " was encountered");
1002      return (Period) this.studyEffective;
1003    }
1004
1005    public boolean hasStudyEffectivePeriod() {
1006      return this != null && this.studyEffective instanceof Period;
1007    }
1008
1009    /**
1010     * @return {@link #studyEffective} (Indicates what effective period the study
1011     *         covers.)
1012     */
1013    public Duration getStudyEffectiveDuration() throws FHIRException {
1014      if (this.studyEffective == null)
1015        this.studyEffective = new Duration();
1016      if (!(this.studyEffective instanceof Duration))
1017        throw new FHIRException("Type mismatch: the type Duration was expected, but "
1018            + this.studyEffective.getClass().getName() + " was encountered");
1019      return (Duration) this.studyEffective;
1020    }
1021
1022    public boolean hasStudyEffectiveDuration() {
1023      return this != null && this.studyEffective instanceof Duration;
1024    }
1025
1026    /**
1027     * @return {@link #studyEffective} (Indicates what effective period the study
1028     *         covers.)
1029     */
1030    public Timing getStudyEffectiveTiming() throws FHIRException {
1031      if (this.studyEffective == null)
1032        this.studyEffective = new Timing();
1033      if (!(this.studyEffective instanceof Timing))
1034        throw new FHIRException("Type mismatch: the type Timing was expected, but "
1035            + this.studyEffective.getClass().getName() + " was encountered");
1036      return (Timing) this.studyEffective;
1037    }
1038
1039    public boolean hasStudyEffectiveTiming() {
1040      return this != null && this.studyEffective instanceof Timing;
1041    }
1042
1043    public boolean hasStudyEffective() {
1044      return this.studyEffective != null && !this.studyEffective.isEmpty();
1045    }
1046
1047    /**
1048     * @param value {@link #studyEffective} (Indicates what effective period the
1049     *              study covers.)
1050     */
1051    public ResearchElementDefinitionCharacteristicComponent setStudyEffective(Type value) {
1052      if (value != null && !(value instanceof DateTimeType || value instanceof Period || value instanceof Duration
1053          || value instanceof Timing))
1054        throw new Error(
1055            "Not the right type for ResearchElementDefinition.characteristic.studyEffective[x]: " + value.fhirType());
1056      this.studyEffective = value;
1057      return this;
1058    }
1059
1060    /**
1061     * @return {@link #studyEffectiveTimeFromStart} (Indicates duration from the
1062     *         study initiation.)
1063     */
1064    public Duration getStudyEffectiveTimeFromStart() {
1065      if (this.studyEffectiveTimeFromStart == null)
1066        if (Configuration.errorOnAutoCreate())
1067          throw new Error(
1068              "Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.studyEffectiveTimeFromStart");
1069        else if (Configuration.doAutoCreate())
1070          this.studyEffectiveTimeFromStart = new Duration(); // cc
1071      return this.studyEffectiveTimeFromStart;
1072    }
1073
1074    public boolean hasStudyEffectiveTimeFromStart() {
1075      return this.studyEffectiveTimeFromStart != null && !this.studyEffectiveTimeFromStart.isEmpty();
1076    }
1077
1078    /**
1079     * @param value {@link #studyEffectiveTimeFromStart} (Indicates duration from
1080     *              the study initiation.)
1081     */
1082    public ResearchElementDefinitionCharacteristicComponent setStudyEffectiveTimeFromStart(Duration value) {
1083      this.studyEffectiveTimeFromStart = value;
1084      return this;
1085    }
1086
1087    /**
1088     * @return {@link #studyEffectiveGroupMeasure} (Indicates how elements are
1089     *         aggregated within the study effective period.). This is the
1090     *         underlying object with id, value and extensions. The accessor
1091     *         "getStudyEffectiveGroupMeasure" gives direct access to the value
1092     */
1093    public Enumeration<GroupMeasure> getStudyEffectiveGroupMeasureElement() {
1094      if (this.studyEffectiveGroupMeasure == null)
1095        if (Configuration.errorOnAutoCreate())
1096          throw new Error(
1097              "Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.studyEffectiveGroupMeasure");
1098        else if (Configuration.doAutoCreate())
1099          this.studyEffectiveGroupMeasure = new Enumeration<GroupMeasure>(new GroupMeasureEnumFactory()); // bb
1100      return this.studyEffectiveGroupMeasure;
1101    }
1102
1103    public boolean hasStudyEffectiveGroupMeasureElement() {
1104      return this.studyEffectiveGroupMeasure != null && !this.studyEffectiveGroupMeasure.isEmpty();
1105    }
1106
1107    public boolean hasStudyEffectiveGroupMeasure() {
1108      return this.studyEffectiveGroupMeasure != null && !this.studyEffectiveGroupMeasure.isEmpty();
1109    }
1110
1111    /**
1112     * @param value {@link #studyEffectiveGroupMeasure} (Indicates how elements are
1113     *              aggregated within the study effective period.). This is the
1114     *              underlying object with id, value and extensions. The accessor
1115     *              "getStudyEffectiveGroupMeasure" gives direct access to the value
1116     */
1117    public ResearchElementDefinitionCharacteristicComponent setStudyEffectiveGroupMeasureElement(
1118        Enumeration<GroupMeasure> value) {
1119      this.studyEffectiveGroupMeasure = value;
1120      return this;
1121    }
1122
1123    /**
1124     * @return Indicates how elements are aggregated within the study effective
1125     *         period.
1126     */
1127    public GroupMeasure getStudyEffectiveGroupMeasure() {
1128      return this.studyEffectiveGroupMeasure == null ? null : this.studyEffectiveGroupMeasure.getValue();
1129    }
1130
1131    /**
1132     * @param value Indicates how elements are aggregated within the study effective
1133     *              period.
1134     */
1135    public ResearchElementDefinitionCharacteristicComponent setStudyEffectiveGroupMeasure(GroupMeasure value) {
1136      if (value == null)
1137        this.studyEffectiveGroupMeasure = null;
1138      else {
1139        if (this.studyEffectiveGroupMeasure == null)
1140          this.studyEffectiveGroupMeasure = new Enumeration<GroupMeasure>(new GroupMeasureEnumFactory());
1141        this.studyEffectiveGroupMeasure.setValue(value);
1142      }
1143      return this;
1144    }
1145
1146    /**
1147     * @return {@link #participantEffectiveDescription} (A narrative description of
1148     *         the time period the study covers.). This is the underlying object
1149     *         with id, value and extensions. The accessor
1150     *         "getParticipantEffectiveDescription" gives direct access to the value
1151     */
1152    public StringType getParticipantEffectiveDescriptionElement() {
1153      if (this.participantEffectiveDescription == null)
1154        if (Configuration.errorOnAutoCreate())
1155          throw new Error(
1156              "Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.participantEffectiveDescription");
1157        else if (Configuration.doAutoCreate())
1158          this.participantEffectiveDescription = new StringType(); // bb
1159      return this.participantEffectiveDescription;
1160    }
1161
1162    public boolean hasParticipantEffectiveDescriptionElement() {
1163      return this.participantEffectiveDescription != null && !this.participantEffectiveDescription.isEmpty();
1164    }
1165
1166    public boolean hasParticipantEffectiveDescription() {
1167      return this.participantEffectiveDescription != null && !this.participantEffectiveDescription.isEmpty();
1168    }
1169
1170    /**
1171     * @param value {@link #participantEffectiveDescription} (A narrative
1172     *              description of the time period the study covers.). This is the
1173     *              underlying object with id, value and extensions. The accessor
1174     *              "getParticipantEffectiveDescription" gives direct access to the
1175     *              value
1176     */
1177    public ResearchElementDefinitionCharacteristicComponent setParticipantEffectiveDescriptionElement(
1178        StringType value) {
1179      this.participantEffectiveDescription = value;
1180      return this;
1181    }
1182
1183    /**
1184     * @return A narrative description of the time period the study covers.
1185     */
1186    public String getParticipantEffectiveDescription() {
1187      return this.participantEffectiveDescription == null ? null : this.participantEffectiveDescription.getValue();
1188    }
1189
1190    /**
1191     * @param value A narrative description of the time period the study covers.
1192     */
1193    public ResearchElementDefinitionCharacteristicComponent setParticipantEffectiveDescription(String value) {
1194      if (Utilities.noString(value))
1195        this.participantEffectiveDescription = null;
1196      else {
1197        if (this.participantEffectiveDescription == null)
1198          this.participantEffectiveDescription = new StringType();
1199        this.participantEffectiveDescription.setValue(value);
1200      }
1201      return this;
1202    }
1203
1204    /**
1205     * @return {@link #participantEffective} (Indicates what effective period the
1206     *         study covers.)
1207     */
1208    public Type getParticipantEffective() {
1209      return this.participantEffective;
1210    }
1211
1212    /**
1213     * @return {@link #participantEffective} (Indicates what effective period the
1214     *         study covers.)
1215     */
1216    public DateTimeType getParticipantEffectiveDateTimeType() throws FHIRException {
1217      if (this.participantEffective == null)
1218        this.participantEffective = new DateTimeType();
1219      if (!(this.participantEffective instanceof DateTimeType))
1220        throw new FHIRException("Type mismatch: the type DateTimeType was expected, but "
1221            + this.participantEffective.getClass().getName() + " was encountered");
1222      return (DateTimeType) this.participantEffective;
1223    }
1224
1225    public boolean hasParticipantEffectiveDateTimeType() {
1226      return this != null && this.participantEffective instanceof DateTimeType;
1227    }
1228
1229    /**
1230     * @return {@link #participantEffective} (Indicates what effective period the
1231     *         study covers.)
1232     */
1233    public Period getParticipantEffectivePeriod() throws FHIRException {
1234      if (this.participantEffective == null)
1235        this.participantEffective = new Period();
1236      if (!(this.participantEffective instanceof Period))
1237        throw new FHIRException("Type mismatch: the type Period was expected, but "
1238            + this.participantEffective.getClass().getName() + " was encountered");
1239      return (Period) this.participantEffective;
1240    }
1241
1242    public boolean hasParticipantEffectivePeriod() {
1243      return this != null && this.participantEffective instanceof Period;
1244    }
1245
1246    /**
1247     * @return {@link #participantEffective} (Indicates what effective period the
1248     *         study covers.)
1249     */
1250    public Duration getParticipantEffectiveDuration() throws FHIRException {
1251      if (this.participantEffective == null)
1252        this.participantEffective = new Duration();
1253      if (!(this.participantEffective instanceof Duration))
1254        throw new FHIRException("Type mismatch: the type Duration was expected, but "
1255            + this.participantEffective.getClass().getName() + " was encountered");
1256      return (Duration) this.participantEffective;
1257    }
1258
1259    public boolean hasParticipantEffectiveDuration() {
1260      return this != null && this.participantEffective instanceof Duration;
1261    }
1262
1263    /**
1264     * @return {@link #participantEffective} (Indicates what effective period the
1265     *         study covers.)
1266     */
1267    public Timing getParticipantEffectiveTiming() throws FHIRException {
1268      if (this.participantEffective == null)
1269        this.participantEffective = new Timing();
1270      if (!(this.participantEffective instanceof Timing))
1271        throw new FHIRException("Type mismatch: the type Timing was expected, but "
1272            + this.participantEffective.getClass().getName() + " was encountered");
1273      return (Timing) this.participantEffective;
1274    }
1275
1276    public boolean hasParticipantEffectiveTiming() {
1277      return this != null && this.participantEffective instanceof Timing;
1278    }
1279
1280    public boolean hasParticipantEffective() {
1281      return this.participantEffective != null && !this.participantEffective.isEmpty();
1282    }
1283
1284    /**
1285     * @param value {@link #participantEffective} (Indicates what effective period
1286     *              the study covers.)
1287     */
1288    public ResearchElementDefinitionCharacteristicComponent setParticipantEffective(Type value) {
1289      if (value != null && !(value instanceof DateTimeType || value instanceof Period || value instanceof Duration
1290          || value instanceof Timing))
1291        throw new Error("Not the right type for ResearchElementDefinition.characteristic.participantEffective[x]: "
1292            + value.fhirType());
1293      this.participantEffective = value;
1294      return this;
1295    }
1296
1297    /**
1298     * @return {@link #participantEffectiveTimeFromStart} (Indicates duration from
1299     *         the participant's study entry.)
1300     */
1301    public Duration getParticipantEffectiveTimeFromStart() {
1302      if (this.participantEffectiveTimeFromStart == null)
1303        if (Configuration.errorOnAutoCreate())
1304          throw new Error(
1305              "Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.participantEffectiveTimeFromStart");
1306        else if (Configuration.doAutoCreate())
1307          this.participantEffectiveTimeFromStart = new Duration(); // cc
1308      return this.participantEffectiveTimeFromStart;
1309    }
1310
1311    public boolean hasParticipantEffectiveTimeFromStart() {
1312      return this.participantEffectiveTimeFromStart != null && !this.participantEffectiveTimeFromStart.isEmpty();
1313    }
1314
1315    /**
1316     * @param value {@link #participantEffectiveTimeFromStart} (Indicates duration
1317     *              from the participant's study entry.)
1318     */
1319    public ResearchElementDefinitionCharacteristicComponent setParticipantEffectiveTimeFromStart(Duration value) {
1320      this.participantEffectiveTimeFromStart = value;
1321      return this;
1322    }
1323
1324    /**
1325     * @return {@link #participantEffectiveGroupMeasure} (Indicates how elements are
1326     *         aggregated within the study effective period.). This is the
1327     *         underlying object with id, value and extensions. The accessor
1328     *         "getParticipantEffectiveGroupMeasure" gives direct access to the
1329     *         value
1330     */
1331    public Enumeration<GroupMeasure> getParticipantEffectiveGroupMeasureElement() {
1332      if (this.participantEffectiveGroupMeasure == null)
1333        if (Configuration.errorOnAutoCreate())
1334          throw new Error(
1335              "Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.participantEffectiveGroupMeasure");
1336        else if (Configuration.doAutoCreate())
1337          this.participantEffectiveGroupMeasure = new Enumeration<GroupMeasure>(new GroupMeasureEnumFactory()); // bb
1338      return this.participantEffectiveGroupMeasure;
1339    }
1340
1341    public boolean hasParticipantEffectiveGroupMeasureElement() {
1342      return this.participantEffectiveGroupMeasure != null && !this.participantEffectiveGroupMeasure.isEmpty();
1343    }
1344
1345    public boolean hasParticipantEffectiveGroupMeasure() {
1346      return this.participantEffectiveGroupMeasure != null && !this.participantEffectiveGroupMeasure.isEmpty();
1347    }
1348
1349    /**
1350     * @param value {@link #participantEffectiveGroupMeasure} (Indicates how
1351     *              elements are aggregated within the study effective period.).
1352     *              This is the underlying object with id, value and extensions. The
1353     *              accessor "getParticipantEffectiveGroupMeasure" gives direct
1354     *              access to the value
1355     */
1356    public ResearchElementDefinitionCharacteristicComponent setParticipantEffectiveGroupMeasureElement(
1357        Enumeration<GroupMeasure> value) {
1358      this.participantEffectiveGroupMeasure = value;
1359      return this;
1360    }
1361
1362    /**
1363     * @return Indicates how elements are aggregated within the study effective
1364     *         period.
1365     */
1366    public GroupMeasure getParticipantEffectiveGroupMeasure() {
1367      return this.participantEffectiveGroupMeasure == null ? null : this.participantEffectiveGroupMeasure.getValue();
1368    }
1369
1370    /**
1371     * @param value Indicates how elements are aggregated within the study effective
1372     *              period.
1373     */
1374    public ResearchElementDefinitionCharacteristicComponent setParticipantEffectiveGroupMeasure(GroupMeasure value) {
1375      if (value == null)
1376        this.participantEffectiveGroupMeasure = null;
1377      else {
1378        if (this.participantEffectiveGroupMeasure == null)
1379          this.participantEffectiveGroupMeasure = new Enumeration<GroupMeasure>(new GroupMeasureEnumFactory());
1380        this.participantEffectiveGroupMeasure.setValue(value);
1381      }
1382      return this;
1383    }
1384
1385    protected void listChildren(List<Property> children) {
1386      super.listChildren(children);
1387      children.add(new Property("definition[x]", "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement",
1388          "Define members of the research element using Codes (such as condition, medication, or observation), Expressions ( using an expression language such as FHIRPath or CQL) or DataRequirements (such as Diabetes diagnosis onset in the last year).",
1389          0, 1, definition));
1390      children.add(new Property("usageContext", "UsageContext",
1391          "Use UsageContext to define the members of the population, such as Age Ranges, Genders, Settings.", 0,
1392          java.lang.Integer.MAX_VALUE, usageContext));
1393      children.add(new Property("exclude", "boolean",
1394          "When true, members with this characteristic are excluded from the element.", 0, 1, exclude));
1395      children.add(new Property("unitOfMeasure", "CodeableConcept", "Specifies the UCUM unit for the outcome.", 0, 1,
1396          unitOfMeasure));
1397      children.add(new Property("studyEffectiveDescription", "string",
1398          "A narrative description of the time period the study covers.", 0, 1, studyEffectiveDescription));
1399      children.add(new Property("studyEffective[x]", "dateTime|Period|Duration|Timing",
1400          "Indicates what effective period the study covers.", 0, 1, studyEffective));
1401      children.add(new Property("studyEffectiveTimeFromStart", "Duration",
1402          "Indicates duration from the study initiation.", 0, 1, studyEffectiveTimeFromStart));
1403      children.add(new Property("studyEffectiveGroupMeasure", "code",
1404          "Indicates how elements are aggregated within the study effective period.", 0, 1,
1405          studyEffectiveGroupMeasure));
1406      children.add(new Property("participantEffectiveDescription", "string",
1407          "A narrative description of the time period the study covers.", 0, 1, participantEffectiveDescription));
1408      children.add(new Property("participantEffective[x]", "dateTime|Period|Duration|Timing",
1409          "Indicates what effective period the study covers.", 0, 1, participantEffective));
1410      children.add(new Property("participantEffectiveTimeFromStart", "Duration",
1411          "Indicates duration from the participant's study entry.", 0, 1, participantEffectiveTimeFromStart));
1412      children.add(new Property("participantEffectiveGroupMeasure", "code",
1413          "Indicates how elements are aggregated within the study effective period.", 0, 1,
1414          participantEffectiveGroupMeasure));
1415    }
1416
1417    @Override
1418    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1419      switch (_hash) {
1420      case -1139422643:
1421        /* definition[x] */ return new Property("definition[x]",
1422            "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement",
1423            "Define members of the research element using Codes (such as condition, medication, or observation), Expressions ( using an expression language such as FHIRPath or CQL) or DataRequirements (such as Diabetes diagnosis onset in the last year).",
1424            0, 1, definition);
1425      case -1014418093:
1426        /* definition */ return new Property("definition[x]",
1427            "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement",
1428            "Define members of the research element using Codes (such as condition, medication, or observation), Expressions ( using an expression language such as FHIRPath or CQL) or DataRequirements (such as Diabetes diagnosis onset in the last year).",
1429            0, 1, definition);
1430      case -1446002226:
1431        /* definitionCodeableConcept */ return new Property("definition[x]",
1432            "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement",
1433            "Define members of the research element using Codes (such as condition, medication, or observation), Expressions ( using an expression language such as FHIRPath or CQL) or DataRequirements (such as Diabetes diagnosis onset in the last year).",
1434            0, 1, definition);
1435      case 933485793:
1436        /* definitionCanonical */ return new Property("definition[x]",
1437            "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement",
1438            "Define members of the research element using Codes (such as condition, medication, or observation), Expressions ( using an expression language such as FHIRPath or CQL) or DataRequirements (such as Diabetes diagnosis onset in the last year).",
1439            0, 1, definition);
1440      case 1463703627:
1441        /* definitionExpression */ return new Property("definition[x]",
1442            "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement",
1443            "Define members of the research element using Codes (such as condition, medication, or observation), Expressions ( using an expression language such as FHIRPath or CQL) or DataRequirements (such as Diabetes diagnosis onset in the last year).",
1444            0, 1, definition);
1445      case -660350874:
1446        /* definitionDataRequirement */ return new Property("definition[x]",
1447            "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement",
1448            "Define members of the research element using Codes (such as condition, medication, or observation), Expressions ( using an expression language such as FHIRPath or CQL) or DataRequirements (such as Diabetes diagnosis onset in the last year).",
1449            0, 1, definition);
1450      case 907012302:
1451        /* usageContext */ return new Property("usageContext", "UsageContext",
1452            "Use UsageContext to define the members of the population, such as Age Ranges, Genders, Settings.", 0,
1453            java.lang.Integer.MAX_VALUE, usageContext);
1454      case -1321148966:
1455        /* exclude */ return new Property("exclude", "boolean",
1456            "When true, members with this characteristic are excluded from the element.", 0, 1, exclude);
1457      case -750257565:
1458        /* unitOfMeasure */ return new Property("unitOfMeasure", "CodeableConcept",
1459            "Specifies the UCUM unit for the outcome.", 0, 1, unitOfMeasure);
1460      case 237553470:
1461        /* studyEffectiveDescription */ return new Property("studyEffectiveDescription", "string",
1462            "A narrative description of the time period the study covers.", 0, 1, studyEffectiveDescription);
1463      case -1832549918:
1464        /* studyEffective[x] */ return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing",
1465            "Indicates what effective period the study covers.", 0, 1, studyEffective);
1466      case -836391458:
1467        /* studyEffective */ return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing",
1468            "Indicates what effective period the study covers.", 0, 1, studyEffective);
1469      case 439780249:
1470        /* studyEffectiveDateTime */ return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing",
1471            "Indicates what effective period the study covers.", 0, 1, studyEffective);
1472      case -497045185:
1473        /* studyEffectivePeriod */ return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing",
1474            "Indicates what effective period the study covers.", 0, 1, studyEffective);
1475      case 949985682:
1476        /* studyEffectiveDuration */ return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing",
1477            "Indicates what effective period the study covers.", 0, 1, studyEffective);
1478      case -378983480:
1479        /* studyEffectiveTiming */ return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing",
1480            "Indicates what effective period the study covers.", 0, 1, studyEffective);
1481      case -2107828915:
1482        /* studyEffectiveTimeFromStart */ return new Property("studyEffectiveTimeFromStart", "Duration",
1483            "Indicates duration from the study initiation.", 0, 1, studyEffectiveTimeFromStart);
1484      case 1284435677:
1485        /* studyEffectiveGroupMeasure */ return new Property("studyEffectiveGroupMeasure", "code",
1486            "Indicates how elements are aggregated within the study effective period.", 0, 1,
1487            studyEffectiveGroupMeasure);
1488      case 1333186472:
1489        /* participantEffectiveDescription */ return new Property("participantEffectiveDescription", "string",
1490            "A narrative description of the time period the study covers.", 0, 1, participantEffectiveDescription);
1491      case 1777308748:
1492        /* participantEffective[x] */ return new Property("participantEffective[x]", "dateTime|Period|Duration|Timing",
1493            "Indicates what effective period the study covers.", 0, 1, participantEffective);
1494      case 1376306100:
1495        /* participantEffective */ return new Property("participantEffective[x]", "dateTime|Period|Duration|Timing",
1496            "Indicates what effective period the study covers.", 0, 1, participantEffective);
1497      case -1721146513:
1498        /* participantEffectiveDateTime */ return new Property("participantEffective[x]",
1499            "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1,
1500            participantEffective);
1501      case -883650923:
1502        /* participantEffectivePeriod */ return new Property("participantEffective[x]",
1503            "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1,
1504            participantEffective);
1505      case -1210941080:
1506        /* participantEffectiveDuration */ return new Property("participantEffective[x]",
1507            "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1,
1508            participantEffective);
1509      case -765589218:
1510        /* participantEffectiveTiming */ return new Property("participantEffective[x]",
1511            "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1,
1512            participantEffective);
1513      case -1471501513:
1514        /* participantEffectiveTimeFromStart */ return new Property("participantEffectiveTimeFromStart", "Duration",
1515            "Indicates duration from the participant's study entry.", 0, 1, participantEffectiveTimeFromStart);
1516      case 889320371:
1517        /* participantEffectiveGroupMeasure */ return new Property("participantEffectiveGroupMeasure", "code",
1518            "Indicates how elements are aggregated within the study effective period.", 0, 1,
1519            participantEffectiveGroupMeasure);
1520      default:
1521        return super.getNamedProperty(_hash, _name, _checkValid);
1522      }
1523
1524    }
1525
1526    @Override
1527    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1528      switch (hash) {
1529      case -1014418093:
1530        /* definition */ return this.definition == null ? new Base[0] : new Base[] { this.definition }; // Type
1531      case 907012302:
1532        /* usageContext */ return this.usageContext == null ? new Base[0]
1533            : this.usageContext.toArray(new Base[this.usageContext.size()]); // UsageContext
1534      case -1321148966:
1535        /* exclude */ return this.exclude == null ? new Base[0] : new Base[] { this.exclude }; // BooleanType
1536      case -750257565:
1537        /* unitOfMeasure */ return this.unitOfMeasure == null ? new Base[0] : new Base[] { this.unitOfMeasure }; // CodeableConcept
1538      case 237553470:
1539        /* studyEffectiveDescription */ return this.studyEffectiveDescription == null ? new Base[0]
1540            : new Base[] { this.studyEffectiveDescription }; // StringType
1541      case -836391458:
1542        /* studyEffective */ return this.studyEffective == null ? new Base[0] : new Base[] { this.studyEffective }; // Type
1543      case -2107828915:
1544        /* studyEffectiveTimeFromStart */ return this.studyEffectiveTimeFromStart == null ? new Base[0]
1545            : new Base[] { this.studyEffectiveTimeFromStart }; // Duration
1546      case 1284435677:
1547        /* studyEffectiveGroupMeasure */ return this.studyEffectiveGroupMeasure == null ? new Base[0]
1548            : new Base[] { this.studyEffectiveGroupMeasure }; // Enumeration<GroupMeasure>
1549      case 1333186472:
1550        /* participantEffectiveDescription */ return this.participantEffectiveDescription == null ? new Base[0]
1551            : new Base[] { this.participantEffectiveDescription }; // StringType
1552      case 1376306100:
1553        /* participantEffective */ return this.participantEffective == null ? new Base[0]
1554            : new Base[] { this.participantEffective }; // Type
1555      case -1471501513:
1556        /* participantEffectiveTimeFromStart */ return this.participantEffectiveTimeFromStart == null ? new Base[0]
1557            : new Base[] { this.participantEffectiveTimeFromStart }; // Duration
1558      case 889320371:
1559        /* participantEffectiveGroupMeasure */ return this.participantEffectiveGroupMeasure == null ? new Base[0]
1560            : new Base[] { this.participantEffectiveGroupMeasure }; // Enumeration<GroupMeasure>
1561      default:
1562        return super.getProperty(hash, name, checkValid);
1563      }
1564
1565    }
1566
1567    @Override
1568    public Base setProperty(int hash, String name, Base value) throws FHIRException {
1569      switch (hash) {
1570      case -1014418093: // definition
1571        this.definition = castToType(value); // Type
1572        return value;
1573      case 907012302: // usageContext
1574        this.getUsageContext().add(castToUsageContext(value)); // UsageContext
1575        return value;
1576      case -1321148966: // exclude
1577        this.exclude = castToBoolean(value); // BooleanType
1578        return value;
1579      case -750257565: // unitOfMeasure
1580        this.unitOfMeasure = castToCodeableConcept(value); // CodeableConcept
1581        return value;
1582      case 237553470: // studyEffectiveDescription
1583        this.studyEffectiveDescription = castToString(value); // StringType
1584        return value;
1585      case -836391458: // studyEffective
1586        this.studyEffective = castToType(value); // Type
1587        return value;
1588      case -2107828915: // studyEffectiveTimeFromStart
1589        this.studyEffectiveTimeFromStart = castToDuration(value); // Duration
1590        return value;
1591      case 1284435677: // studyEffectiveGroupMeasure
1592        value = new GroupMeasureEnumFactory().fromType(castToCode(value));
1593        this.studyEffectiveGroupMeasure = (Enumeration) value; // Enumeration<GroupMeasure>
1594        return value;
1595      case 1333186472: // participantEffectiveDescription
1596        this.participantEffectiveDescription = castToString(value); // StringType
1597        return value;
1598      case 1376306100: // participantEffective
1599        this.participantEffective = castToType(value); // Type
1600        return value;
1601      case -1471501513: // participantEffectiveTimeFromStart
1602        this.participantEffectiveTimeFromStart = castToDuration(value); // Duration
1603        return value;
1604      case 889320371: // participantEffectiveGroupMeasure
1605        value = new GroupMeasureEnumFactory().fromType(castToCode(value));
1606        this.participantEffectiveGroupMeasure = (Enumeration) value; // Enumeration<GroupMeasure>
1607        return value;
1608      default:
1609        return super.setProperty(hash, name, value);
1610      }
1611
1612    }
1613
1614    @Override
1615    public Base setProperty(String name, Base value) throws FHIRException {
1616      if (name.equals("definition[x]")) {
1617        this.definition = castToType(value); // Type
1618      } else if (name.equals("usageContext")) {
1619        this.getUsageContext().add(castToUsageContext(value));
1620      } else if (name.equals("exclude")) {
1621        this.exclude = castToBoolean(value); // BooleanType
1622      } else if (name.equals("unitOfMeasure")) {
1623        this.unitOfMeasure = castToCodeableConcept(value); // CodeableConcept
1624      } else if (name.equals("studyEffectiveDescription")) {
1625        this.studyEffectiveDescription = castToString(value); // StringType
1626      } else if (name.equals("studyEffective[x]")) {
1627        this.studyEffective = castToType(value); // Type
1628      } else if (name.equals("studyEffectiveTimeFromStart")) {
1629        this.studyEffectiveTimeFromStart = castToDuration(value); // Duration
1630      } else if (name.equals("studyEffectiveGroupMeasure")) {
1631        value = new GroupMeasureEnumFactory().fromType(castToCode(value));
1632        this.studyEffectiveGroupMeasure = (Enumeration) value; // Enumeration<GroupMeasure>
1633      } else if (name.equals("participantEffectiveDescription")) {
1634        this.participantEffectiveDescription = castToString(value); // StringType
1635      } else if (name.equals("participantEffective[x]")) {
1636        this.participantEffective = castToType(value); // Type
1637      } else if (name.equals("participantEffectiveTimeFromStart")) {
1638        this.participantEffectiveTimeFromStart = castToDuration(value); // Duration
1639      } else if (name.equals("participantEffectiveGroupMeasure")) {
1640        value = new GroupMeasureEnumFactory().fromType(castToCode(value));
1641        this.participantEffectiveGroupMeasure = (Enumeration) value; // Enumeration<GroupMeasure>
1642      } else
1643        return super.setProperty(name, value);
1644      return value;
1645    }
1646
1647  @Override
1648  public void removeChild(String name, Base value) throws FHIRException {
1649      if (name.equals("definition[x]")) {
1650        this.definition = null;
1651      } else if (name.equals("usageContext")) {
1652        this.getUsageContext().remove(castToUsageContext(value));
1653      } else if (name.equals("exclude")) {
1654        this.exclude = null;
1655      } else if (name.equals("unitOfMeasure")) {
1656        this.unitOfMeasure = null;
1657      } else if (name.equals("studyEffectiveDescription")) {
1658        this.studyEffectiveDescription = null;
1659      } else if (name.equals("studyEffective[x]")) {
1660        this.studyEffective = null;
1661      } else if (name.equals("studyEffectiveTimeFromStart")) {
1662        this.studyEffectiveTimeFromStart = null;
1663      } else if (name.equals("studyEffectiveGroupMeasure")) {
1664        this.studyEffectiveGroupMeasure = null;
1665      } else if (name.equals("participantEffectiveDescription")) {
1666        this.participantEffectiveDescription = null;
1667      } else if (name.equals("participantEffective[x]")) {
1668        this.participantEffective = null;
1669      } else if (name.equals("participantEffectiveTimeFromStart")) {
1670        this.participantEffectiveTimeFromStart = null;
1671      } else if (name.equals("participantEffectiveGroupMeasure")) {
1672        this.participantEffectiveGroupMeasure = null;
1673      } else
1674        super.removeChild(name, value);
1675      
1676    }
1677
1678    @Override
1679    public Base makeProperty(int hash, String name) throws FHIRException {
1680      switch (hash) {
1681      case -1139422643:
1682        return getDefinition();
1683      case -1014418093:
1684        return getDefinition();
1685      case 907012302:
1686        return addUsageContext();
1687      case -1321148966:
1688        return getExcludeElement();
1689      case -750257565:
1690        return getUnitOfMeasure();
1691      case 237553470:
1692        return getStudyEffectiveDescriptionElement();
1693      case -1832549918:
1694        return getStudyEffective();
1695      case -836391458:
1696        return getStudyEffective();
1697      case -2107828915:
1698        return getStudyEffectiveTimeFromStart();
1699      case 1284435677:
1700        return getStudyEffectiveGroupMeasureElement();
1701      case 1333186472:
1702        return getParticipantEffectiveDescriptionElement();
1703      case 1777308748:
1704        return getParticipantEffective();
1705      case 1376306100:
1706        return getParticipantEffective();
1707      case -1471501513:
1708        return getParticipantEffectiveTimeFromStart();
1709      case 889320371:
1710        return getParticipantEffectiveGroupMeasureElement();
1711      default:
1712        return super.makeProperty(hash, name);
1713      }
1714
1715    }
1716
1717    @Override
1718    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1719      switch (hash) {
1720      case -1014418093:
1721        /* definition */ return new String[] { "CodeableConcept", "canonical", "Expression", "DataRequirement" };
1722      case 907012302:
1723        /* usageContext */ return new String[] { "UsageContext" };
1724      case -1321148966:
1725        /* exclude */ return new String[] { "boolean" };
1726      case -750257565:
1727        /* unitOfMeasure */ return new String[] { "CodeableConcept" };
1728      case 237553470:
1729        /* studyEffectiveDescription */ return new String[] { "string" };
1730      case -836391458:
1731        /* studyEffective */ return new String[] { "dateTime", "Period", "Duration", "Timing" };
1732      case -2107828915:
1733        /* studyEffectiveTimeFromStart */ return new String[] { "Duration" };
1734      case 1284435677:
1735        /* studyEffectiveGroupMeasure */ return new String[] { "code" };
1736      case 1333186472:
1737        /* participantEffectiveDescription */ return new String[] { "string" };
1738      case 1376306100:
1739        /* participantEffective */ return new String[] { "dateTime", "Period", "Duration", "Timing" };
1740      case -1471501513:
1741        /* participantEffectiveTimeFromStart */ return new String[] { "Duration" };
1742      case 889320371:
1743        /* participantEffectiveGroupMeasure */ return new String[] { "code" };
1744      default:
1745        return super.getTypesForProperty(hash, name);
1746      }
1747
1748    }
1749
1750    @Override
1751    public Base addChild(String name) throws FHIRException {
1752      if (name.equals("definitionCodeableConcept")) {
1753        this.definition = new CodeableConcept();
1754        return this.definition;
1755      } else if (name.equals("definitionCanonical")) {
1756        this.definition = new CanonicalType();
1757        return this.definition;
1758      } else if (name.equals("definitionExpression")) {
1759        this.definition = new Expression();
1760        return this.definition;
1761      } else if (name.equals("definitionDataRequirement")) {
1762        this.definition = new DataRequirement();
1763        return this.definition;
1764      } else if (name.equals("usageContext")) {
1765        return addUsageContext();
1766      } else if (name.equals("exclude")) {
1767        throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.exclude");
1768      } else if (name.equals("unitOfMeasure")) {
1769        this.unitOfMeasure = new CodeableConcept();
1770        return this.unitOfMeasure;
1771      } else if (name.equals("studyEffectiveDescription")) {
1772        throw new FHIRException(
1773            "Cannot call addChild on a singleton property ResearchElementDefinition.studyEffectiveDescription");
1774      } else if (name.equals("studyEffectiveDateTime")) {
1775        this.studyEffective = new DateTimeType();
1776        return this.studyEffective;
1777      } else if (name.equals("studyEffectivePeriod")) {
1778        this.studyEffective = new Period();
1779        return this.studyEffective;
1780      } else if (name.equals("studyEffectiveDuration")) {
1781        this.studyEffective = new Duration();
1782        return this.studyEffective;
1783      } else if (name.equals("studyEffectiveTiming")) {
1784        this.studyEffective = new Timing();
1785        return this.studyEffective;
1786      } else if (name.equals("studyEffectiveTimeFromStart")) {
1787        this.studyEffectiveTimeFromStart = new Duration();
1788        return this.studyEffectiveTimeFromStart;
1789      } else if (name.equals("studyEffectiveGroupMeasure")) {
1790        throw new FHIRException(
1791            "Cannot call addChild on a singleton property ResearchElementDefinition.studyEffectiveGroupMeasure");
1792      } else if (name.equals("participantEffectiveDescription")) {
1793        throw new FHIRException(
1794            "Cannot call addChild on a singleton property ResearchElementDefinition.participantEffectiveDescription");
1795      } else if (name.equals("participantEffectiveDateTime")) {
1796        this.participantEffective = new DateTimeType();
1797        return this.participantEffective;
1798      } else if (name.equals("participantEffectivePeriod")) {
1799        this.participantEffective = new Period();
1800        return this.participantEffective;
1801      } else if (name.equals("participantEffectiveDuration")) {
1802        this.participantEffective = new Duration();
1803        return this.participantEffective;
1804      } else if (name.equals("participantEffectiveTiming")) {
1805        this.participantEffective = new Timing();
1806        return this.participantEffective;
1807      } else if (name.equals("participantEffectiveTimeFromStart")) {
1808        this.participantEffectiveTimeFromStart = new Duration();
1809        return this.participantEffectiveTimeFromStart;
1810      } else if (name.equals("participantEffectiveGroupMeasure")) {
1811        throw new FHIRException(
1812            "Cannot call addChild on a singleton property ResearchElementDefinition.participantEffectiveGroupMeasure");
1813      } else
1814        return super.addChild(name);
1815    }
1816
1817    public ResearchElementDefinitionCharacteristicComponent copy() {
1818      ResearchElementDefinitionCharacteristicComponent dst = new ResearchElementDefinitionCharacteristicComponent();
1819      copyValues(dst);
1820      return dst;
1821    }
1822
1823    public void copyValues(ResearchElementDefinitionCharacteristicComponent dst) {
1824      super.copyValues(dst);
1825      dst.definition = definition == null ? null : definition.copy();
1826      if (usageContext != null) {
1827        dst.usageContext = new ArrayList<UsageContext>();
1828        for (UsageContext i : usageContext)
1829          dst.usageContext.add(i.copy());
1830      }
1831      ;
1832      dst.exclude = exclude == null ? null : exclude.copy();
1833      dst.unitOfMeasure = unitOfMeasure == null ? null : unitOfMeasure.copy();
1834      dst.studyEffectiveDescription = studyEffectiveDescription == null ? null : studyEffectiveDescription.copy();
1835      dst.studyEffective = studyEffective == null ? null : studyEffective.copy();
1836      dst.studyEffectiveTimeFromStart = studyEffectiveTimeFromStart == null ? null : studyEffectiveTimeFromStart.copy();
1837      dst.studyEffectiveGroupMeasure = studyEffectiveGroupMeasure == null ? null : studyEffectiveGroupMeasure.copy();
1838      dst.participantEffectiveDescription = participantEffectiveDescription == null ? null
1839          : participantEffectiveDescription.copy();
1840      dst.participantEffective = participantEffective == null ? null : participantEffective.copy();
1841      dst.participantEffectiveTimeFromStart = participantEffectiveTimeFromStart == null ? null
1842          : participantEffectiveTimeFromStart.copy();
1843      dst.participantEffectiveGroupMeasure = participantEffectiveGroupMeasure == null ? null
1844          : participantEffectiveGroupMeasure.copy();
1845    }
1846
1847    @Override
1848    public boolean equalsDeep(Base other_) {
1849      if (!super.equalsDeep(other_))
1850        return false;
1851      if (!(other_ instanceof ResearchElementDefinitionCharacteristicComponent))
1852        return false;
1853      ResearchElementDefinitionCharacteristicComponent o = (ResearchElementDefinitionCharacteristicComponent) other_;
1854      return compareDeep(definition, o.definition, true) && compareDeep(usageContext, o.usageContext, true)
1855          && compareDeep(exclude, o.exclude, true) && compareDeep(unitOfMeasure, o.unitOfMeasure, true)
1856          && compareDeep(studyEffectiveDescription, o.studyEffectiveDescription, true)
1857          && compareDeep(studyEffective, o.studyEffective, true)
1858          && compareDeep(studyEffectiveTimeFromStart, o.studyEffectiveTimeFromStart, true)
1859          && compareDeep(studyEffectiveGroupMeasure, o.studyEffectiveGroupMeasure, true)
1860          && compareDeep(participantEffectiveDescription, o.participantEffectiveDescription, true)
1861          && compareDeep(participantEffective, o.participantEffective, true)
1862          && compareDeep(participantEffectiveTimeFromStart, o.participantEffectiveTimeFromStart, true)
1863          && compareDeep(participantEffectiveGroupMeasure, o.participantEffectiveGroupMeasure, true);
1864    }
1865
1866    @Override
1867    public boolean equalsShallow(Base other_) {
1868      if (!super.equalsShallow(other_))
1869        return false;
1870      if (!(other_ instanceof ResearchElementDefinitionCharacteristicComponent))
1871        return false;
1872      ResearchElementDefinitionCharacteristicComponent o = (ResearchElementDefinitionCharacteristicComponent) other_;
1873      return compareValues(exclude, o.exclude, true)
1874          && compareValues(studyEffectiveDescription, o.studyEffectiveDescription, true)
1875          && compareValues(studyEffectiveGroupMeasure, o.studyEffectiveGroupMeasure, true)
1876          && compareValues(participantEffectiveDescription, o.participantEffectiveDescription, true)
1877          && compareValues(participantEffectiveGroupMeasure, o.participantEffectiveGroupMeasure, true);
1878    }
1879
1880    public boolean isEmpty() {
1881      return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(definition, usageContext, exclude, unitOfMeasure,
1882          studyEffectiveDescription, studyEffective, studyEffectiveTimeFromStart, studyEffectiveGroupMeasure,
1883          participantEffectiveDescription, participantEffective, participantEffectiveTimeFromStart,
1884          participantEffectiveGroupMeasure);
1885    }
1886
1887    public String fhirType() {
1888      return "ResearchElementDefinition.characteristic";
1889
1890    }
1891
1892  }
1893
1894  /**
1895   * A formal identifier that is used to identify this research element definition
1896   * when it is represented in other formats, or referenced in a specification,
1897   * model, design or an instance.
1898   */
1899  @Child(name = "identifier", type = {
1900      Identifier.class }, order = 0, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = true)
1901  @Description(shortDefinition = "Additional identifier for the research element definition", formalDefinition = "A formal identifier that is used to identify this research element definition when it is represented in other formats, or referenced in a specification, model, design or an instance.")
1902  protected List<Identifier> identifier;
1903
1904  /**
1905   * The short title provides an alternate title for use in informal descriptive
1906   * contexts where the full, formal title is not necessary.
1907   */
1908  @Child(name = "shortTitle", type = {
1909      StringType.class }, order = 1, min = 0, max = 1, modifier = false, summary = true)
1910  @Description(shortDefinition = "Title for use in informal contexts", formalDefinition = "The short title provides an alternate title for use in informal descriptive contexts where the full, formal title is not necessary.")
1911  protected StringType shortTitle;
1912
1913  /**
1914   * An explanatory or alternate title for the ResearchElementDefinition giving
1915   * additional information about its content.
1916   */
1917  @Child(name = "subtitle", type = { StringType.class }, order = 2, min = 0, max = 1, modifier = false, summary = false)
1918  @Description(shortDefinition = "Subordinate title of the ResearchElementDefinition", formalDefinition = "An explanatory or alternate title for the ResearchElementDefinition giving additional information about its content.")
1919  protected StringType subtitle;
1920
1921  /**
1922   * The intended subjects for the ResearchElementDefinition. If this element is
1923   * not provided, a Patient subject is assumed, but the subject of the
1924   * ResearchElementDefinition can be anything.
1925   */
1926  @Child(name = "subject", type = { CodeableConcept.class,
1927      Group.class }, order = 3, min = 0, max = 1, modifier = false, summary = false)
1928  @Description(shortDefinition = "E.g. Patient, Practitioner, RelatedPerson, Organization, Location, Device", formalDefinition = "The intended subjects for the ResearchElementDefinition. If this element is not provided, a Patient subject is assumed, but the subject of the ResearchElementDefinition can be anything.")
1929  @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/subject-type")
1930  protected Type subject;
1931
1932  /**
1933   * A human-readable string to clarify or explain concepts about the resource.
1934   */
1935  @Child(name = "comment", type = {
1936      StringType.class }, order = 4, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
1937  @Description(shortDefinition = "Used for footnotes or explanatory notes", formalDefinition = "A human-readable string to clarify or explain concepts about the resource.")
1938  protected List<StringType> comment;
1939
1940  /**
1941   * Explanation of why this research element definition is needed and why it has
1942   * been designed as it has.
1943   */
1944  @Child(name = "purpose", type = {
1945      MarkdownType.class }, order = 5, min = 0, max = 1, modifier = false, summary = false)
1946  @Description(shortDefinition = "Why this research element definition is defined", formalDefinition = "Explanation of why this research element definition is needed and why it has been designed as it has.")
1947  protected MarkdownType purpose;
1948
1949  /**
1950   * A detailed description, from a clinical perspective, of how the
1951   * ResearchElementDefinition is used.
1952   */
1953  @Child(name = "usage", type = { StringType.class }, order = 6, min = 0, max = 1, modifier = false, summary = false)
1954  @Description(shortDefinition = "Describes the clinical usage of the ResearchElementDefinition", formalDefinition = "A detailed description, from a clinical perspective, of how the ResearchElementDefinition is used.")
1955  protected StringType usage;
1956
1957  /**
1958   * A copyright statement relating to the research element definition and/or its
1959   * contents. Copyright statements are generally legal restrictions on the use
1960   * and publishing of the research element definition.
1961   */
1962  @Child(name = "copyright", type = {
1963      MarkdownType.class }, order = 7, min = 0, max = 1, modifier = false, summary = false)
1964  @Description(shortDefinition = "Use and/or publishing restrictions", formalDefinition = "A copyright statement relating to the research element definition and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the research element definition.")
1965  protected MarkdownType copyright;
1966
1967  /**
1968   * The date on which the resource content was approved by the publisher.
1969   * Approval happens once when the content is officially approved for usage.
1970   */
1971  @Child(name = "approvalDate", type = {
1972      DateType.class }, order = 8, min = 0, max = 1, modifier = false, summary = false)
1973  @Description(shortDefinition = "When the research element definition was approved by publisher", formalDefinition = "The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.")
1974  protected DateType approvalDate;
1975
1976  /**
1977   * The date on which the resource content was last reviewed. Review happens
1978   * periodically after approval but does not change the original approval date.
1979   */
1980  @Child(name = "lastReviewDate", type = {
1981      DateType.class }, order = 9, min = 0, max = 1, modifier = false, summary = false)
1982  @Description(shortDefinition = "When the research element definition was last reviewed", formalDefinition = "The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.")
1983  protected DateType lastReviewDate;
1984
1985  /**
1986   * The period during which the research element definition content was or is
1987   * planned to be in active use.
1988   */
1989  @Child(name = "effectivePeriod", type = {
1990      Period.class }, order = 10, min = 0, max = 1, modifier = false, summary = true)
1991  @Description(shortDefinition = "When the research element definition is expected to be used", formalDefinition = "The period during which the research element definition content was or is planned to be in active use.")
1992  protected Period effectivePeriod;
1993
1994  /**
1995   * Descriptive topics related to the content of the ResearchElementDefinition.
1996   * Topics provide a high-level categorization grouping types of
1997   * ResearchElementDefinitions that can be useful for filtering and searching.
1998   */
1999  @Child(name = "topic", type = {
2000      CodeableConcept.class }, order = 11, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
2001  @Description(shortDefinition = "The category of the ResearchElementDefinition, such as Education, Treatment, Assessment, etc.", formalDefinition = "Descriptive topics related to the content of the ResearchElementDefinition. Topics provide a high-level categorization grouping types of ResearchElementDefinitions that can be useful for filtering and searching.")
2002  @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/definition-topic")
2003  protected List<CodeableConcept> topic;
2004
2005  /**
2006   * An individiual or organization primarily involved in the creation and
2007   * maintenance of the content.
2008   */
2009  @Child(name = "author", type = {
2010      ContactDetail.class }, order = 12, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
2011  @Description(shortDefinition = "Who authored the content", formalDefinition = "An individiual or organization primarily involved in the creation and maintenance of the content.")
2012  protected List<ContactDetail> author;
2013
2014  /**
2015   * An individual or organization primarily responsible for internal coherence of
2016   * the content.
2017   */
2018  @Child(name = "editor", type = {
2019      ContactDetail.class }, order = 13, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
2020  @Description(shortDefinition = "Who edited the content", formalDefinition = "An individual or organization primarily responsible for internal coherence of the content.")
2021  protected List<ContactDetail> editor;
2022
2023  /**
2024   * An individual or organization primarily responsible for review of some aspect
2025   * of the content.
2026   */
2027  @Child(name = "reviewer", type = {
2028      ContactDetail.class }, order = 14, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
2029  @Description(shortDefinition = "Who reviewed the content", formalDefinition = "An individual or organization primarily responsible for review of some aspect of the content.")
2030  protected List<ContactDetail> reviewer;
2031
2032  /**
2033   * An individual or organization responsible for officially endorsing the
2034   * content for use in some setting.
2035   */
2036  @Child(name = "endorser", type = {
2037      ContactDetail.class }, order = 15, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
2038  @Description(shortDefinition = "Who endorsed the content", formalDefinition = "An individual or organization responsible for officially endorsing the content for use in some setting.")
2039  protected List<ContactDetail> endorser;
2040
2041  /**
2042   * Related artifacts such as additional documentation, justification, or
2043   * bibliographic references.
2044   */
2045  @Child(name = "relatedArtifact", type = {
2046      RelatedArtifact.class }, order = 16, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
2047  @Description(shortDefinition = "Additional documentation, citations, etc.", formalDefinition = "Related artifacts such as additional documentation, justification, or bibliographic references.")
2048  protected List<RelatedArtifact> relatedArtifact;
2049
2050  /**
2051   * A reference to a Library resource containing the formal logic used by the
2052   * ResearchElementDefinition.
2053   */
2054  @Child(name = "library", type = {
2055      CanonicalType.class }, order = 17, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
2056  @Description(shortDefinition = "Logic used by the ResearchElementDefinition", formalDefinition = "A reference to a Library resource containing the formal logic used by the ResearchElementDefinition.")
2057  protected List<CanonicalType> library;
2058
2059  /**
2060   * The type of research element, a population, an exposure, or an outcome.
2061   */
2062  @Child(name = "type", type = { CodeType.class }, order = 18, min = 1, max = 1, modifier = false, summary = true)
2063  @Description(shortDefinition = "population | exposure | outcome", formalDefinition = "The type of research element, a population, an exposure, or an outcome.")
2064  @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/research-element-type")
2065  protected Enumeration<ResearchElementType> type;
2066
2067  /**
2068   * The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive).
2069   */
2070  @Child(name = "variableType", type = {
2071      CodeType.class }, order = 19, min = 0, max = 1, modifier = false, summary = false)
2072  @Description(shortDefinition = "dichotomous | continuous | descriptive", formalDefinition = "The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive).")
2073  @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/variable-type")
2074  protected Enumeration<VariableType> variableType;
2075
2076  /**
2077   * A characteristic that defines the members of the research element. Multiple
2078   * characteristics are applied with "and" semantics.
2079   */
2080  @Child(name = "characteristic", type = {}, order = 20, min = 1, max = Child.MAX_UNLIMITED, modifier = false, summary = true)
2081  @Description(shortDefinition = "What defines the members of the research element", formalDefinition = "A characteristic that defines the members of the research element. Multiple characteristics are applied with \"and\" semantics.")
2082  protected List<ResearchElementDefinitionCharacteristicComponent> characteristic;
2083
2084  private static final long serialVersionUID = 1483216033L;
2085
2086  /**
2087   * Constructor
2088   */
2089  public ResearchElementDefinition() {
2090    super();
2091  }
2092
2093  /**
2094   * Constructor
2095   */
2096  public ResearchElementDefinition(Enumeration<PublicationStatus> status, Enumeration<ResearchElementType> type) {
2097    super();
2098    this.status = status;
2099    this.type = type;
2100  }
2101
2102  /**
2103   * @return {@link #url} (An absolute URI that is used to identify this research
2104   *         element definition when it is referenced in a specification, model,
2105   *         design or an instance; also called its canonical identifier. This
2106   *         SHOULD be globally unique and SHOULD be a literal address at which at
2107   *         which an authoritative instance of this research element definition
2108   *         is (or will be) published. This URL can be the target of a canonical
2109   *         reference. It SHALL remain the same when the research element
2110   *         definition is stored on different servers.). This is the underlying
2111   *         object with id, value and extensions. The accessor "getUrl" gives
2112   *         direct access to the value
2113   */
2114  public UriType getUrlElement() {
2115    if (this.url == null)
2116      if (Configuration.errorOnAutoCreate())
2117        throw new Error("Attempt to auto-create ResearchElementDefinition.url");
2118      else if (Configuration.doAutoCreate())
2119        this.url = new UriType(); // bb
2120    return this.url;
2121  }
2122
2123  public boolean hasUrlElement() {
2124    return this.url != null && !this.url.isEmpty();
2125  }
2126
2127  public boolean hasUrl() {
2128    return this.url != null && !this.url.isEmpty();
2129  }
2130
2131  /**
2132   * @param value {@link #url} (An absolute URI that is used to identify this
2133   *              research element definition when it is referenced in a
2134   *              specification, model, design or an instance; also called its
2135   *              canonical identifier. This SHOULD be globally unique and SHOULD
2136   *              be a literal address at which at which an authoritative instance
2137   *              of this research element definition is (or will be) published.
2138   *              This URL can be the target of a canonical reference. It SHALL
2139   *              remain the same when the research element definition is stored
2140   *              on different servers.). This is the underlying object with id,
2141   *              value and extensions. The accessor "getUrl" gives direct access
2142   *              to the value
2143   */
2144  public ResearchElementDefinition setUrlElement(UriType value) {
2145    this.url = value;
2146    return this;
2147  }
2148
2149  /**
2150   * @return An absolute URI that is used to identify this research element
2151   *         definition when it is referenced in a specification, model, design or
2152   *         an instance; also called its canonical identifier. This SHOULD be
2153   *         globally unique and SHOULD be a literal address at which at which an
2154   *         authoritative instance of this research element definition is (or
2155   *         will be) published. This URL can be the target of a canonical
2156   *         reference. It SHALL remain the same when the research element
2157   *         definition is stored on different servers.
2158   */
2159  public String getUrl() {
2160    return this.url == null ? null : this.url.getValue();
2161  }
2162
2163  /**
2164   * @param value An absolute URI that is used to identify this research element
2165   *              definition when it is referenced in a specification, model,
2166   *              design or an instance; also called its canonical identifier.
2167   *              This SHOULD be globally unique and SHOULD be a literal address
2168   *              at which at which an authoritative instance of this research
2169   *              element definition is (or will be) published. This URL can be
2170   *              the target of a canonical reference. It SHALL remain the same
2171   *              when the research element definition is stored on different
2172   *              servers.
2173   */
2174  public ResearchElementDefinition setUrl(String value) {
2175    if (Utilities.noString(value))
2176      this.url = null;
2177    else {
2178      if (this.url == null)
2179        this.url = new UriType();
2180      this.url.setValue(value);
2181    }
2182    return this;
2183  }
2184
2185  /**
2186   * @return {@link #identifier} (A formal identifier that is used to identify
2187   *         this research element definition when it is represented in other
2188   *         formats, or referenced in a specification, model, design or an
2189   *         instance.)
2190   */
2191  public List<Identifier> getIdentifier() {
2192    if (this.identifier == null)
2193      this.identifier = new ArrayList<Identifier>();
2194    return this.identifier;
2195  }
2196
2197  /**
2198   * @return Returns a reference to <code>this</code> for easy method chaining
2199   */
2200  public ResearchElementDefinition setIdentifier(List<Identifier> theIdentifier) {
2201    this.identifier = theIdentifier;
2202    return this;
2203  }
2204
2205  public boolean hasIdentifier() {
2206    if (this.identifier == null)
2207      return false;
2208    for (Identifier item : this.identifier)
2209      if (!item.isEmpty())
2210        return true;
2211    return false;
2212  }
2213
2214  public Identifier addIdentifier() { // 3
2215    Identifier t = new Identifier();
2216    if (this.identifier == null)
2217      this.identifier = new ArrayList<Identifier>();
2218    this.identifier.add(t);
2219    return t;
2220  }
2221
2222  public ResearchElementDefinition addIdentifier(Identifier t) { // 3
2223    if (t == null)
2224      return this;
2225    if (this.identifier == null)
2226      this.identifier = new ArrayList<Identifier>();
2227    this.identifier.add(t);
2228    return this;
2229  }
2230
2231  /**
2232   * @return The first repetition of repeating field {@link #identifier}, creating
2233   *         it if it does not already exist
2234   */
2235  public Identifier getIdentifierFirstRep() {
2236    if (getIdentifier().isEmpty()) {
2237      addIdentifier();
2238    }
2239    return getIdentifier().get(0);
2240  }
2241
2242  /**
2243   * @return {@link #version} (The identifier that is used to identify this
2244   *         version of the research element definition when it is referenced in a
2245   *         specification, model, design or instance. This is an arbitrary value
2246   *         managed by the research element definition author and is not expected
2247   *         to be globally unique. For example, it might be a timestamp (e.g.
2248   *         yyyymmdd) if a managed version is not available. There is also no
2249   *         expectation that versions can be placed in a lexicographical
2250   *         sequence. To provide a version consistent with the Decision Support
2251   *         Service specification, use the format Major.Minor.Revision (e.g.
2252   *         1.0.0). For more information on versioning knowledge assets, refer to
2253   *         the Decision Support Service specification. Note that a version is
2254   *         required for non-experimental active artifacts.). This is the
2255   *         underlying object with id, value and extensions. The accessor
2256   *         "getVersion" gives direct access to the value
2257   */
2258  public StringType getVersionElement() {
2259    if (this.version == null)
2260      if (Configuration.errorOnAutoCreate())
2261        throw new Error("Attempt to auto-create ResearchElementDefinition.version");
2262      else if (Configuration.doAutoCreate())
2263        this.version = new StringType(); // bb
2264    return this.version;
2265  }
2266
2267  public boolean hasVersionElement() {
2268    return this.version != null && !this.version.isEmpty();
2269  }
2270
2271  public boolean hasVersion() {
2272    return this.version != null && !this.version.isEmpty();
2273  }
2274
2275  /**
2276   * @param value {@link #version} (The identifier that is used to identify this
2277   *              version of the research element definition when it is referenced
2278   *              in a specification, model, design or instance. This is an
2279   *              arbitrary value managed by the research element definition
2280   *              author and is not expected to be globally unique. For example,
2281   *              it might be a timestamp (e.g. yyyymmdd) if a managed version is
2282   *              not available. There is also no expectation that versions can be
2283   *              placed in a lexicographical sequence. To provide a version
2284   *              consistent with the Decision Support Service specification, use
2285   *              the format Major.Minor.Revision (e.g. 1.0.0). For more
2286   *              information on versioning knowledge assets, refer to the
2287   *              Decision Support Service specification. Note that a version is
2288   *              required for non-experimental active artifacts.). This is the
2289   *              underlying object with id, value and extensions. The accessor
2290   *              "getVersion" gives direct access to the value
2291   */
2292  public ResearchElementDefinition setVersionElement(StringType value) {
2293    this.version = value;
2294    return this;
2295  }
2296
2297  /**
2298   * @return The identifier that is used to identify this version of the research
2299   *         element definition when it is referenced in a specification, model,
2300   *         design or instance. This is an arbitrary value managed by the
2301   *         research element definition author and is not expected to be globally
2302   *         unique. For example, it might be a timestamp (e.g. yyyymmdd) if a
2303   *         managed version is not available. There is also no expectation that
2304   *         versions can be placed in a lexicographical sequence. To provide a
2305   *         version consistent with the Decision Support Service specification,
2306   *         use the format Major.Minor.Revision (e.g. 1.0.0). For more
2307   *         information on versioning knowledge assets, refer to the Decision
2308   *         Support Service specification. Note that a version is required for
2309   *         non-experimental active artifacts.
2310   */
2311  public String getVersion() {
2312    return this.version == null ? null : this.version.getValue();
2313  }
2314
2315  /**
2316   * @param value The identifier that is used to identify this version of the
2317   *              research element definition when it is referenced in a
2318   *              specification, model, design or instance. This is an arbitrary
2319   *              value managed by the research element definition author and is
2320   *              not expected to be globally unique. For example, it might be a
2321   *              timestamp (e.g. yyyymmdd) if a managed version is not available.
2322   *              There is also no expectation that versions can be placed in a
2323   *              lexicographical sequence. To provide a version consistent with
2324   *              the Decision Support Service specification, use the format
2325   *              Major.Minor.Revision (e.g. 1.0.0). For more information on
2326   *              versioning knowledge assets, refer to the Decision Support
2327   *              Service specification. Note that a version is required for
2328   *              non-experimental active artifacts.
2329   */
2330  public ResearchElementDefinition setVersion(String value) {
2331    if (Utilities.noString(value))
2332      this.version = null;
2333    else {
2334      if (this.version == null)
2335        this.version = new StringType();
2336      this.version.setValue(value);
2337    }
2338    return this;
2339  }
2340
2341  /**
2342   * @return {@link #name} (A natural language name identifying the research
2343   *         element definition. This name should be usable as an identifier for
2344   *         the module by machine processing applications such as code
2345   *         generation.). This is the underlying object with id, value and
2346   *         extensions. The accessor "getName" gives direct access to the value
2347   */
2348  public StringType getNameElement() {
2349    if (this.name == null)
2350      if (Configuration.errorOnAutoCreate())
2351        throw new Error("Attempt to auto-create ResearchElementDefinition.name");
2352      else if (Configuration.doAutoCreate())
2353        this.name = new StringType(); // bb
2354    return this.name;
2355  }
2356
2357  public boolean hasNameElement() {
2358    return this.name != null && !this.name.isEmpty();
2359  }
2360
2361  public boolean hasName() {
2362    return this.name != null && !this.name.isEmpty();
2363  }
2364
2365  /**
2366   * @param value {@link #name} (A natural language name identifying the research
2367   *              element definition. This name should be usable as an identifier
2368   *              for the module by machine processing applications such as code
2369   *              generation.). This is the underlying object with id, value and
2370   *              extensions. The accessor "getName" gives direct access to the
2371   *              value
2372   */
2373  public ResearchElementDefinition setNameElement(StringType value) {
2374    this.name = value;
2375    return this;
2376  }
2377
2378  /**
2379   * @return A natural language name identifying the research element definition.
2380   *         This name should be usable as an identifier for the module by machine
2381   *         processing applications such as code generation.
2382   */
2383  public String getName() {
2384    return this.name == null ? null : this.name.getValue();
2385  }
2386
2387  /**
2388   * @param value A natural language name identifying the research element
2389   *              definition. This name should be usable as an identifier for the
2390   *              module by machine processing applications such as code
2391   *              generation.
2392   */
2393  public ResearchElementDefinition setName(String value) {
2394    if (Utilities.noString(value))
2395      this.name = null;
2396    else {
2397      if (this.name == null)
2398        this.name = new StringType();
2399      this.name.setValue(value);
2400    }
2401    return this;
2402  }
2403
2404  /**
2405   * @return {@link #title} (A short, descriptive, user-friendly title for the
2406   *         research element definition.). This is the underlying object with id,
2407   *         value and extensions. The accessor "getTitle" gives direct access to
2408   *         the value
2409   */
2410  public StringType getTitleElement() {
2411    if (this.title == null)
2412      if (Configuration.errorOnAutoCreate())
2413        throw new Error("Attempt to auto-create ResearchElementDefinition.title");
2414      else if (Configuration.doAutoCreate())
2415        this.title = new StringType(); // bb
2416    return this.title;
2417  }
2418
2419  public boolean hasTitleElement() {
2420    return this.title != null && !this.title.isEmpty();
2421  }
2422
2423  public boolean hasTitle() {
2424    return this.title != null && !this.title.isEmpty();
2425  }
2426
2427  /**
2428   * @param value {@link #title} (A short, descriptive, user-friendly title for
2429   *              the research element definition.). This is the underlying object
2430   *              with id, value and extensions. The accessor "getTitle" gives
2431   *              direct access to the value
2432   */
2433  public ResearchElementDefinition setTitleElement(StringType value) {
2434    this.title = value;
2435    return this;
2436  }
2437
2438  /**
2439   * @return A short, descriptive, user-friendly title for the research element
2440   *         definition.
2441   */
2442  public String getTitle() {
2443    return this.title == null ? null : this.title.getValue();
2444  }
2445
2446  /**
2447   * @param value A short, descriptive, user-friendly title for the research
2448   *              element definition.
2449   */
2450  public ResearchElementDefinition setTitle(String value) {
2451    if (Utilities.noString(value))
2452      this.title = null;
2453    else {
2454      if (this.title == null)
2455        this.title = new StringType();
2456      this.title.setValue(value);
2457    }
2458    return this;
2459  }
2460
2461  /**
2462   * @return {@link #shortTitle} (The short title provides an alternate title for
2463   *         use in informal descriptive contexts where the full, formal title is
2464   *         not necessary.). This is the underlying object with id, value and
2465   *         extensions. The accessor "getShortTitle" gives direct access to the
2466   *         value
2467   */
2468  public StringType getShortTitleElement() {
2469    if (this.shortTitle == null)
2470      if (Configuration.errorOnAutoCreate())
2471        throw new Error("Attempt to auto-create ResearchElementDefinition.shortTitle");
2472      else if (Configuration.doAutoCreate())
2473        this.shortTitle = new StringType(); // bb
2474    return this.shortTitle;
2475  }
2476
2477  public boolean hasShortTitleElement() {
2478    return this.shortTitle != null && !this.shortTitle.isEmpty();
2479  }
2480
2481  public boolean hasShortTitle() {
2482    return this.shortTitle != null && !this.shortTitle.isEmpty();
2483  }
2484
2485  /**
2486   * @param value {@link #shortTitle} (The short title provides an alternate title
2487   *              for use in informal descriptive contexts where the full, formal
2488   *              title is not necessary.). This is the underlying object with id,
2489   *              value and extensions. The accessor "getShortTitle" gives direct
2490   *              access to the value
2491   */
2492  public ResearchElementDefinition setShortTitleElement(StringType value) {
2493    this.shortTitle = value;
2494    return this;
2495  }
2496
2497  /**
2498   * @return The short title provides an alternate title for use in informal
2499   *         descriptive contexts where the full, formal title is not necessary.
2500   */
2501  public String getShortTitle() {
2502    return this.shortTitle == null ? null : this.shortTitle.getValue();
2503  }
2504
2505  /**
2506   * @param value The short title provides an alternate title for use in informal
2507   *              descriptive contexts where the full, formal title is not
2508   *              necessary.
2509   */
2510  public ResearchElementDefinition setShortTitle(String value) {
2511    if (Utilities.noString(value))
2512      this.shortTitle = null;
2513    else {
2514      if (this.shortTitle == null)
2515        this.shortTitle = new StringType();
2516      this.shortTitle.setValue(value);
2517    }
2518    return this;
2519  }
2520
2521  /**
2522   * @return {@link #subtitle} (An explanatory or alternate title for the
2523   *         ResearchElementDefinition giving additional information about its
2524   *         content.). This is the underlying object with id, value and
2525   *         extensions. The accessor "getSubtitle" gives direct access to the
2526   *         value
2527   */
2528  public StringType getSubtitleElement() {
2529    if (this.subtitle == null)
2530      if (Configuration.errorOnAutoCreate())
2531        throw new Error("Attempt to auto-create ResearchElementDefinition.subtitle");
2532      else if (Configuration.doAutoCreate())
2533        this.subtitle = new StringType(); // bb
2534    return this.subtitle;
2535  }
2536
2537  public boolean hasSubtitleElement() {
2538    return this.subtitle != null && !this.subtitle.isEmpty();
2539  }
2540
2541  public boolean hasSubtitle() {
2542    return this.subtitle != null && !this.subtitle.isEmpty();
2543  }
2544
2545  /**
2546   * @param value {@link #subtitle} (An explanatory or alternate title for the
2547   *              ResearchElementDefinition giving additional information about
2548   *              its content.). This is the underlying object with id, value and
2549   *              extensions. The accessor "getSubtitle" gives direct access to
2550   *              the value
2551   */
2552  public ResearchElementDefinition setSubtitleElement(StringType value) {
2553    this.subtitle = value;
2554    return this;
2555  }
2556
2557  /**
2558   * @return An explanatory or alternate title for the ResearchElementDefinition
2559   *         giving additional information about its content.
2560   */
2561  public String getSubtitle() {
2562    return this.subtitle == null ? null : this.subtitle.getValue();
2563  }
2564
2565  /**
2566   * @param value An explanatory or alternate title for the
2567   *              ResearchElementDefinition giving additional information about
2568   *              its content.
2569   */
2570  public ResearchElementDefinition setSubtitle(String value) {
2571    if (Utilities.noString(value))
2572      this.subtitle = null;
2573    else {
2574      if (this.subtitle == null)
2575        this.subtitle = new StringType();
2576      this.subtitle.setValue(value);
2577    }
2578    return this;
2579  }
2580
2581  /**
2582   * @return {@link #status} (The status of this research element definition.
2583   *         Enables tracking the life-cycle of the content.). This is the
2584   *         underlying object with id, value and extensions. The accessor
2585   *         "getStatus" gives direct access to the value
2586   */
2587  public Enumeration<PublicationStatus> getStatusElement() {
2588    if (this.status == null)
2589      if (Configuration.errorOnAutoCreate())
2590        throw new Error("Attempt to auto-create ResearchElementDefinition.status");
2591      else if (Configuration.doAutoCreate())
2592        this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory()); // bb
2593    return this.status;
2594  }
2595
2596  public boolean hasStatusElement() {
2597    return this.status != null && !this.status.isEmpty();
2598  }
2599
2600  public boolean hasStatus() {
2601    return this.status != null && !this.status.isEmpty();
2602  }
2603
2604  /**
2605   * @param value {@link #status} (The status of this research element definition.
2606   *              Enables tracking the life-cycle of the content.). This is the
2607   *              underlying object with id, value and extensions. The accessor
2608   *              "getStatus" gives direct access to the value
2609   */
2610  public ResearchElementDefinition setStatusElement(Enumeration<PublicationStatus> value) {
2611    this.status = value;
2612    return this;
2613  }
2614
2615  /**
2616   * @return The status of this research element definition. Enables tracking the
2617   *         life-cycle of the content.
2618   */
2619  public PublicationStatus getStatus() {
2620    return this.status == null ? null : this.status.getValue();
2621  }
2622
2623  /**
2624   * @param value The status of this research element definition. Enables tracking
2625   *              the life-cycle of the content.
2626   */
2627  public ResearchElementDefinition setStatus(PublicationStatus value) {
2628    if (this.status == null)
2629      this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory());
2630    this.status.setValue(value);
2631    return this;
2632  }
2633
2634  /**
2635   * @return {@link #experimental} (A Boolean value to indicate that this research
2636   *         element definition is authored for testing purposes (or
2637   *         education/evaluation/marketing) and is not intended to be used for
2638   *         genuine usage.). This is the underlying object with id, value and
2639   *         extensions. The accessor "getExperimental" gives direct access to the
2640   *         value
2641   */
2642  public BooleanType getExperimentalElement() {
2643    if (this.experimental == null)
2644      if (Configuration.errorOnAutoCreate())
2645        throw new Error("Attempt to auto-create ResearchElementDefinition.experimental");
2646      else if (Configuration.doAutoCreate())
2647        this.experimental = new BooleanType(); // bb
2648    return this.experimental;
2649  }
2650
2651  public boolean hasExperimentalElement() {
2652    return this.experimental != null && !this.experimental.isEmpty();
2653  }
2654
2655  public boolean hasExperimental() {
2656    return this.experimental != null && !this.experimental.isEmpty();
2657  }
2658
2659  /**
2660   * @param value {@link #experimental} (A Boolean value to indicate that this
2661   *              research element definition is authored for testing purposes (or
2662   *              education/evaluation/marketing) and is not intended to be used
2663   *              for genuine usage.). This is the underlying object with id,
2664   *              value and extensions. The accessor "getExperimental" gives
2665   *              direct access to the value
2666   */
2667  public ResearchElementDefinition setExperimentalElement(BooleanType value) {
2668    this.experimental = value;
2669    return this;
2670  }
2671
2672  /**
2673   * @return A Boolean value to indicate that this research element definition is
2674   *         authored for testing purposes (or education/evaluation/marketing) and
2675   *         is not intended to be used for genuine usage.
2676   */
2677  public boolean getExperimental() {
2678    return this.experimental == null || this.experimental.isEmpty() ? false : this.experimental.getValue();
2679  }
2680
2681  /**
2682   * @param value A Boolean value to indicate that this research element
2683   *              definition is authored for testing purposes (or
2684   *              education/evaluation/marketing) and is not intended to be used
2685   *              for genuine usage.
2686   */
2687  public ResearchElementDefinition setExperimental(boolean value) {
2688    if (this.experimental == null)
2689      this.experimental = new BooleanType();
2690    this.experimental.setValue(value);
2691    return this;
2692  }
2693
2694  /**
2695   * @return {@link #subject} (The intended subjects for the
2696   *         ResearchElementDefinition. If this element is not provided, a Patient
2697   *         subject is assumed, but the subject of the ResearchElementDefinition
2698   *         can be anything.)
2699   */
2700  public Type getSubject() {
2701    return this.subject;
2702  }
2703
2704  /**
2705   * @return {@link #subject} (The intended subjects for the
2706   *         ResearchElementDefinition. If this element is not provided, a Patient
2707   *         subject is assumed, but the subject of the ResearchElementDefinition
2708   *         can be anything.)
2709   */
2710  public CodeableConcept getSubjectCodeableConcept() throws FHIRException {
2711    if (this.subject == null)
2712      this.subject = new CodeableConcept();
2713    if (!(this.subject instanceof CodeableConcept))
2714      throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "
2715          + this.subject.getClass().getName() + " was encountered");
2716    return (CodeableConcept) this.subject;
2717  }
2718
2719  public boolean hasSubjectCodeableConcept() {
2720    return this != null && this.subject instanceof CodeableConcept;
2721  }
2722
2723  /**
2724   * @return {@link #subject} (The intended subjects for the
2725   *         ResearchElementDefinition. If this element is not provided, a Patient
2726   *         subject is assumed, but the subject of the ResearchElementDefinition
2727   *         can be anything.)
2728   */
2729  public Reference getSubjectReference() throws FHIRException {
2730    if (this.subject == null)
2731      this.subject = new Reference();
2732    if (!(this.subject instanceof Reference))
2733      throw new FHIRException("Type mismatch: the type Reference was expected, but " + this.subject.getClass().getName()
2734          + " was encountered");
2735    return (Reference) this.subject;
2736  }
2737
2738  public boolean hasSubjectReference() {
2739    return this != null && this.subject instanceof Reference;
2740  }
2741
2742  public boolean hasSubject() {
2743    return this.subject != null && !this.subject.isEmpty();
2744  }
2745
2746  /**
2747   * @param value {@link #subject} (The intended subjects for the
2748   *              ResearchElementDefinition. If this element is not provided, a
2749   *              Patient subject is assumed, but the subject of the
2750   *              ResearchElementDefinition can be anything.)
2751   */
2752  public ResearchElementDefinition setSubject(Type value) {
2753    if (value != null && !(value instanceof CodeableConcept || value instanceof Reference))
2754      throw new Error("Not the right type for ResearchElementDefinition.subject[x]: " + value.fhirType());
2755    this.subject = value;
2756    return this;
2757  }
2758
2759  /**
2760   * @return {@link #date} (The date (and optionally time) when the research
2761   *         element definition was published. The date must change when the
2762   *         business version changes and it must change if the status code
2763   *         changes. In addition, it should change when the substantive content
2764   *         of the research element definition changes.). This is the underlying
2765   *         object with id, value and extensions. The accessor "getDate" gives
2766   *         direct access to the value
2767   */
2768  public DateTimeType getDateElement() {
2769    if (this.date == null)
2770      if (Configuration.errorOnAutoCreate())
2771        throw new Error("Attempt to auto-create ResearchElementDefinition.date");
2772      else if (Configuration.doAutoCreate())
2773        this.date = new DateTimeType(); // bb
2774    return this.date;
2775  }
2776
2777  public boolean hasDateElement() {
2778    return this.date != null && !this.date.isEmpty();
2779  }
2780
2781  public boolean hasDate() {
2782    return this.date != null && !this.date.isEmpty();
2783  }
2784
2785  /**
2786   * @param value {@link #date} (The date (and optionally time) when the research
2787   *              element definition was published. The date must change when the
2788   *              business version changes and it must change if the status code
2789   *              changes. In addition, it should change when the substantive
2790   *              content of the research element definition changes.). This is
2791   *              the underlying object with id, value and extensions. The
2792   *              accessor "getDate" gives direct access to the value
2793   */
2794  public ResearchElementDefinition setDateElement(DateTimeType value) {
2795    this.date = value;
2796    return this;
2797  }
2798
2799  /**
2800   * @return The date (and optionally time) when the research element definition
2801   *         was published. The date must change when the business version changes
2802   *         and it must change if the status code changes. In addition, it should
2803   *         change when the substantive content of the research element
2804   *         definition changes.
2805   */
2806  public Date getDate() {
2807    return this.date == null ? null : this.date.getValue();
2808  }
2809
2810  /**
2811   * @param value The date (and optionally time) when the research element
2812   *              definition was published. The date must change when the business
2813   *              version changes and it must change if the status code changes.
2814   *              In addition, it should change when the substantive content of
2815   *              the research element definition changes.
2816   */
2817  public ResearchElementDefinition setDate(Date value) {
2818    if (value == null)
2819      this.date = null;
2820    else {
2821      if (this.date == null)
2822        this.date = new DateTimeType();
2823      this.date.setValue(value);
2824    }
2825    return this;
2826  }
2827
2828  /**
2829   * @return {@link #publisher} (The name of the organization or individual that
2830   *         published the research element definition.). This is the underlying
2831   *         object with id, value and extensions. The accessor "getPublisher"
2832   *         gives direct access to the value
2833   */
2834  public StringType getPublisherElement() {
2835    if (this.publisher == null)
2836      if (Configuration.errorOnAutoCreate())
2837        throw new Error("Attempt to auto-create ResearchElementDefinition.publisher");
2838      else if (Configuration.doAutoCreate())
2839        this.publisher = new StringType(); // bb
2840    return this.publisher;
2841  }
2842
2843  public boolean hasPublisherElement() {
2844    return this.publisher != null && !this.publisher.isEmpty();
2845  }
2846
2847  public boolean hasPublisher() {
2848    return this.publisher != null && !this.publisher.isEmpty();
2849  }
2850
2851  /**
2852   * @param value {@link #publisher} (The name of the organization or individual
2853   *              that published the research element definition.). This is the
2854   *              underlying object with id, value and extensions. The accessor
2855   *              "getPublisher" gives direct access to the value
2856   */
2857  public ResearchElementDefinition setPublisherElement(StringType value) {
2858    this.publisher = value;
2859    return this;
2860  }
2861
2862  /**
2863   * @return The name of the organization or individual that published the
2864   *         research element definition.
2865   */
2866  public String getPublisher() {
2867    return this.publisher == null ? null : this.publisher.getValue();
2868  }
2869
2870  /**
2871   * @param value The name of the organization or individual that published the
2872   *              research element definition.
2873   */
2874  public ResearchElementDefinition setPublisher(String value) {
2875    if (Utilities.noString(value))
2876      this.publisher = null;
2877    else {
2878      if (this.publisher == null)
2879        this.publisher = new StringType();
2880      this.publisher.setValue(value);
2881    }
2882    return this;
2883  }
2884
2885  /**
2886   * @return {@link #contact} (Contact details to assist a user in finding and
2887   *         communicating with the publisher.)
2888   */
2889  public List<ContactDetail> getContact() {
2890    if (this.contact == null)
2891      this.contact = new ArrayList<ContactDetail>();
2892    return this.contact;
2893  }
2894
2895  /**
2896   * @return Returns a reference to <code>this</code> for easy method chaining
2897   */
2898  public ResearchElementDefinition setContact(List<ContactDetail> theContact) {
2899    this.contact = theContact;
2900    return this;
2901  }
2902
2903  public boolean hasContact() {
2904    if (this.contact == null)
2905      return false;
2906    for (ContactDetail item : this.contact)
2907      if (!item.isEmpty())
2908        return true;
2909    return false;
2910  }
2911
2912  public ContactDetail addContact() { // 3
2913    ContactDetail t = new ContactDetail();
2914    if (this.contact == null)
2915      this.contact = new ArrayList<ContactDetail>();
2916    this.contact.add(t);
2917    return t;
2918  }
2919
2920  public ResearchElementDefinition addContact(ContactDetail t) { // 3
2921    if (t == null)
2922      return this;
2923    if (this.contact == null)
2924      this.contact = new ArrayList<ContactDetail>();
2925    this.contact.add(t);
2926    return this;
2927  }
2928
2929  /**
2930   * @return The first repetition of repeating field {@link #contact}, creating it
2931   *         if it does not already exist
2932   */
2933  public ContactDetail getContactFirstRep() {
2934    if (getContact().isEmpty()) {
2935      addContact();
2936    }
2937    return getContact().get(0);
2938  }
2939
2940  /**
2941   * @return {@link #description} (A free text natural language description of the
2942   *         research element definition from a consumer's perspective.). This is
2943   *         the underlying object with id, value and extensions. The accessor
2944   *         "getDescription" gives direct access to the value
2945   */
2946  public MarkdownType getDescriptionElement() {
2947    if (this.description == null)
2948      if (Configuration.errorOnAutoCreate())
2949        throw new Error("Attempt to auto-create ResearchElementDefinition.description");
2950      else if (Configuration.doAutoCreate())
2951        this.description = new MarkdownType(); // bb
2952    return this.description;
2953  }
2954
2955  public boolean hasDescriptionElement() {
2956    return this.description != null && !this.description.isEmpty();
2957  }
2958
2959  public boolean hasDescription() {
2960    return this.description != null && !this.description.isEmpty();
2961  }
2962
2963  /**
2964   * @param value {@link #description} (A free text natural language description
2965   *              of the research element definition from a consumer's
2966   *              perspective.). This is the underlying object with id, value and
2967   *              extensions. The accessor "getDescription" gives direct access to
2968   *              the value
2969   */
2970  public ResearchElementDefinition setDescriptionElement(MarkdownType value) {
2971    this.description = value;
2972    return this;
2973  }
2974
2975  /**
2976   * @return A free text natural language description of the research element
2977   *         definition from a consumer's perspective.
2978   */
2979  public String getDescription() {
2980    return this.description == null ? null : this.description.getValue();
2981  }
2982
2983  /**
2984   * @param value A free text natural language description of the research element
2985   *              definition from a consumer's perspective.
2986   */
2987  public ResearchElementDefinition setDescription(String value) {
2988    if (value == null)
2989      this.description = null;
2990    else {
2991      if (this.description == null)
2992        this.description = new MarkdownType();
2993      this.description.setValue(value);
2994    }
2995    return this;
2996  }
2997
2998  /**
2999   * @return {@link #comment} (A human-readable string to clarify or explain
3000   *         concepts about the resource.)
3001   */
3002  public List<StringType> getComment() {
3003    if (this.comment == null)
3004      this.comment = new ArrayList<StringType>();
3005    return this.comment;
3006  }
3007
3008  /**
3009   * @return Returns a reference to <code>this</code> for easy method chaining
3010   */
3011  public ResearchElementDefinition setComment(List<StringType> theComment) {
3012    this.comment = theComment;
3013    return this;
3014  }
3015
3016  public boolean hasComment() {
3017    if (this.comment == null)
3018      return false;
3019    for (StringType item : this.comment)
3020      if (!item.isEmpty())
3021        return true;
3022    return false;
3023  }
3024
3025  /**
3026   * @return {@link #comment} (A human-readable string to clarify or explain
3027   *         concepts about the resource.)
3028   */
3029  public StringType addCommentElement() {// 2
3030    StringType t = new StringType();
3031    if (this.comment == null)
3032      this.comment = new ArrayList<StringType>();
3033    this.comment.add(t);
3034    return t;
3035  }
3036
3037  /**
3038   * @param value {@link #comment} (A human-readable string to clarify or explain
3039   *              concepts about the resource.)
3040   */
3041  public ResearchElementDefinition addComment(String value) { // 1
3042    StringType t = new StringType();
3043    t.setValue(value);
3044    if (this.comment == null)
3045      this.comment = new ArrayList<StringType>();
3046    this.comment.add(t);
3047    return this;
3048  }
3049
3050  /**
3051   * @param value {@link #comment} (A human-readable string to clarify or explain
3052   *              concepts about the resource.)
3053   */
3054  public boolean hasComment(String value) {
3055    if (this.comment == null)
3056      return false;
3057    for (StringType v : this.comment)
3058      if (v.getValue().equals(value)) // string
3059        return true;
3060    return false;
3061  }
3062
3063  /**
3064   * @return {@link #useContext} (The content was developed with a focus and
3065   *         intent of supporting the contexts that are listed. These contexts may
3066   *         be general categories (gender, age, ...) or may be references to
3067   *         specific programs (insurance plans, studies, ...) and may be used to
3068   *         assist with indexing and searching for appropriate research element
3069   *         definition instances.)
3070   */
3071  public List<UsageContext> getUseContext() {
3072    if (this.useContext == null)
3073      this.useContext = new ArrayList<UsageContext>();
3074    return this.useContext;
3075  }
3076
3077  /**
3078   * @return Returns a reference to <code>this</code> for easy method chaining
3079   */
3080  public ResearchElementDefinition setUseContext(List<UsageContext> theUseContext) {
3081    this.useContext = theUseContext;
3082    return this;
3083  }
3084
3085  public boolean hasUseContext() {
3086    if (this.useContext == null)
3087      return false;
3088    for (UsageContext item : this.useContext)
3089      if (!item.isEmpty())
3090        return true;
3091    return false;
3092  }
3093
3094  public UsageContext addUseContext() { // 3
3095    UsageContext t = new UsageContext();
3096    if (this.useContext == null)
3097      this.useContext = new ArrayList<UsageContext>();
3098    this.useContext.add(t);
3099    return t;
3100  }
3101
3102  public ResearchElementDefinition addUseContext(UsageContext t) { // 3
3103    if (t == null)
3104      return this;
3105    if (this.useContext == null)
3106      this.useContext = new ArrayList<UsageContext>();
3107    this.useContext.add(t);
3108    return this;
3109  }
3110
3111  /**
3112   * @return The first repetition of repeating field {@link #useContext}, creating
3113   *         it if it does not already exist
3114   */
3115  public UsageContext getUseContextFirstRep() {
3116    if (getUseContext().isEmpty()) {
3117      addUseContext();
3118    }
3119    return getUseContext().get(0);
3120  }
3121
3122  /**
3123   * @return {@link #jurisdiction} (A legal or geographic region in which the
3124   *         research element definition is intended to be used.)
3125   */
3126  public List<CodeableConcept> getJurisdiction() {
3127    if (this.jurisdiction == null)
3128      this.jurisdiction = new ArrayList<CodeableConcept>();
3129    return this.jurisdiction;
3130  }
3131
3132  /**
3133   * @return Returns a reference to <code>this</code> for easy method chaining
3134   */
3135  public ResearchElementDefinition setJurisdiction(List<CodeableConcept> theJurisdiction) {
3136    this.jurisdiction = theJurisdiction;
3137    return this;
3138  }
3139
3140  public boolean hasJurisdiction() {
3141    if (this.jurisdiction == null)
3142      return false;
3143    for (CodeableConcept item : this.jurisdiction)
3144      if (!item.isEmpty())
3145        return true;
3146    return false;
3147  }
3148
3149  public CodeableConcept addJurisdiction() { // 3
3150    CodeableConcept t = new CodeableConcept();
3151    if (this.jurisdiction == null)
3152      this.jurisdiction = new ArrayList<CodeableConcept>();
3153    this.jurisdiction.add(t);
3154    return t;
3155  }
3156
3157  public ResearchElementDefinition addJurisdiction(CodeableConcept t) { // 3
3158    if (t == null)
3159      return this;
3160    if (this.jurisdiction == null)
3161      this.jurisdiction = new ArrayList<CodeableConcept>();
3162    this.jurisdiction.add(t);
3163    return this;
3164  }
3165
3166  /**
3167   * @return The first repetition of repeating field {@link #jurisdiction},
3168   *         creating it if it does not already exist
3169   */
3170  public CodeableConcept getJurisdictionFirstRep() {
3171    if (getJurisdiction().isEmpty()) {
3172      addJurisdiction();
3173    }
3174    return getJurisdiction().get(0);
3175  }
3176
3177  /**
3178   * @return {@link #purpose} (Explanation of why this research element definition
3179   *         is needed and why it has been designed as it has.). This is the
3180   *         underlying object with id, value and extensions. The accessor
3181   *         "getPurpose" gives direct access to the value
3182   */
3183  public MarkdownType getPurposeElement() {
3184    if (this.purpose == null)
3185      if (Configuration.errorOnAutoCreate())
3186        throw new Error("Attempt to auto-create ResearchElementDefinition.purpose");
3187      else if (Configuration.doAutoCreate())
3188        this.purpose = new MarkdownType(); // bb
3189    return this.purpose;
3190  }
3191
3192  public boolean hasPurposeElement() {
3193    return this.purpose != null && !this.purpose.isEmpty();
3194  }
3195
3196  public boolean hasPurpose() {
3197    return this.purpose != null && !this.purpose.isEmpty();
3198  }
3199
3200  /**
3201   * @param value {@link #purpose} (Explanation of why this research element
3202   *              definition is needed and why it has been designed as it has.).
3203   *              This is the underlying object with id, value and extensions. The
3204   *              accessor "getPurpose" gives direct access to the value
3205   */
3206  public ResearchElementDefinition setPurposeElement(MarkdownType value) {
3207    this.purpose = value;
3208    return this;
3209  }
3210
3211  /**
3212   * @return Explanation of why this research element definition is needed and why
3213   *         it has been designed as it has.
3214   */
3215  public String getPurpose() {
3216    return this.purpose == null ? null : this.purpose.getValue();
3217  }
3218
3219  /**
3220   * @param value Explanation of why this research element definition is needed
3221   *              and why it has been designed as it has.
3222   */
3223  public ResearchElementDefinition setPurpose(String value) {
3224    if (value == null)
3225      this.purpose = null;
3226    else {
3227      if (this.purpose == null)
3228        this.purpose = new MarkdownType();
3229      this.purpose.setValue(value);
3230    }
3231    return this;
3232  }
3233
3234  /**
3235   * @return {@link #usage} (A detailed description, from a clinical perspective,
3236   *         of how the ResearchElementDefinition is used.). This is the
3237   *         underlying object with id, value and extensions. The accessor
3238   *         "getUsage" gives direct access to the value
3239   */
3240  public StringType getUsageElement() {
3241    if (this.usage == null)
3242      if (Configuration.errorOnAutoCreate())
3243        throw new Error("Attempt to auto-create ResearchElementDefinition.usage");
3244      else if (Configuration.doAutoCreate())
3245        this.usage = new StringType(); // bb
3246    return this.usage;
3247  }
3248
3249  public boolean hasUsageElement() {
3250    return this.usage != null && !this.usage.isEmpty();
3251  }
3252
3253  public boolean hasUsage() {
3254    return this.usage != null && !this.usage.isEmpty();
3255  }
3256
3257  /**
3258   * @param value {@link #usage} (A detailed description, from a clinical
3259   *              perspective, of how the ResearchElementDefinition is used.).
3260   *              This is the underlying object with id, value and extensions. The
3261   *              accessor "getUsage" gives direct access to the value
3262   */
3263  public ResearchElementDefinition setUsageElement(StringType value) {
3264    this.usage = value;
3265    return this;
3266  }
3267
3268  /**
3269   * @return A detailed description, from a clinical perspective, of how the
3270   *         ResearchElementDefinition is used.
3271   */
3272  public String getUsage() {
3273    return this.usage == null ? null : this.usage.getValue();
3274  }
3275
3276  /**
3277   * @param value A detailed description, from a clinical perspective, of how the
3278   *              ResearchElementDefinition is used.
3279   */
3280  public ResearchElementDefinition setUsage(String value) {
3281    if (Utilities.noString(value))
3282      this.usage = null;
3283    else {
3284      if (this.usage == null)
3285        this.usage = new StringType();
3286      this.usage.setValue(value);
3287    }
3288    return this;
3289  }
3290
3291  /**
3292   * @return {@link #copyright} (A copyright statement relating to the research
3293   *         element definition and/or its contents. Copyright statements are
3294   *         generally legal restrictions on the use and publishing of the
3295   *         research element definition.). This is the underlying object with id,
3296   *         value and extensions. The accessor "getCopyright" gives direct access
3297   *         to the value
3298   */
3299  public MarkdownType getCopyrightElement() {
3300    if (this.copyright == null)
3301      if (Configuration.errorOnAutoCreate())
3302        throw new Error("Attempt to auto-create ResearchElementDefinition.copyright");
3303      else if (Configuration.doAutoCreate())
3304        this.copyright = new MarkdownType(); // bb
3305    return this.copyright;
3306  }
3307
3308  public boolean hasCopyrightElement() {
3309    return this.copyright != null && !this.copyright.isEmpty();
3310  }
3311
3312  public boolean hasCopyright() {
3313    return this.copyright != null && !this.copyright.isEmpty();
3314  }
3315
3316  /**
3317   * @param value {@link #copyright} (A copyright statement relating to the
3318   *              research element definition and/or its contents. Copyright
3319   *              statements are generally legal restrictions on the use and
3320   *              publishing of the research element definition.). This is the
3321   *              underlying object with id, value and extensions. The accessor
3322   *              "getCopyright" gives direct access to the value
3323   */
3324  public ResearchElementDefinition setCopyrightElement(MarkdownType value) {
3325    this.copyright = value;
3326    return this;
3327  }
3328
3329  /**
3330   * @return A copyright statement relating to the research element definition
3331   *         and/or its contents. Copyright statements are generally legal
3332   *         restrictions on the use and publishing of the research element
3333   *         definition.
3334   */
3335  public String getCopyright() {
3336    return this.copyright == null ? null : this.copyright.getValue();
3337  }
3338
3339  /**
3340   * @param value A copyright statement relating to the research element
3341   *              definition and/or its contents. Copyright statements are
3342   *              generally legal restrictions on the use and publishing of the
3343   *              research element definition.
3344   */
3345  public ResearchElementDefinition setCopyright(String value) {
3346    if (value == null)
3347      this.copyright = null;
3348    else {
3349      if (this.copyright == null)
3350        this.copyright = new MarkdownType();
3351      this.copyright.setValue(value);
3352    }
3353    return this;
3354  }
3355
3356  /**
3357   * @return {@link #approvalDate} (The date on which the resource content was
3358   *         approved by the publisher. Approval happens once when the content is
3359   *         officially approved for usage.). This is the underlying object with
3360   *         id, value and extensions. The accessor "getApprovalDate" gives direct
3361   *         access to the value
3362   */
3363  public DateType getApprovalDateElement() {
3364    if (this.approvalDate == null)
3365      if (Configuration.errorOnAutoCreate())
3366        throw new Error("Attempt to auto-create ResearchElementDefinition.approvalDate");
3367      else if (Configuration.doAutoCreate())
3368        this.approvalDate = new DateType(); // bb
3369    return this.approvalDate;
3370  }
3371
3372  public boolean hasApprovalDateElement() {
3373    return this.approvalDate != null && !this.approvalDate.isEmpty();
3374  }
3375
3376  public boolean hasApprovalDate() {
3377    return this.approvalDate != null && !this.approvalDate.isEmpty();
3378  }
3379
3380  /**
3381   * @param value {@link #approvalDate} (The date on which the resource content
3382   *              was approved by the publisher. Approval happens once when the
3383   *              content is officially approved for usage.). This is the
3384   *              underlying object with id, value and extensions. The accessor
3385   *              "getApprovalDate" gives direct access to the value
3386   */
3387  public ResearchElementDefinition setApprovalDateElement(DateType value) {
3388    this.approvalDate = value;
3389    return this;
3390  }
3391
3392  /**
3393   * @return The date on which the resource content was approved by the publisher.
3394   *         Approval happens once when the content is officially approved for
3395   *         usage.
3396   */
3397  public Date getApprovalDate() {
3398    return this.approvalDate == null ? null : this.approvalDate.getValue();
3399  }
3400
3401  /**
3402   * @param value The date on which the resource content was approved by the
3403   *              publisher. Approval happens once when the content is officially
3404   *              approved for usage.
3405   */
3406  public ResearchElementDefinition setApprovalDate(Date value) {
3407    if (value == null)
3408      this.approvalDate = null;
3409    else {
3410      if (this.approvalDate == null)
3411        this.approvalDate = new DateType();
3412      this.approvalDate.setValue(value);
3413    }
3414    return this;
3415  }
3416
3417  /**
3418   * @return {@link #lastReviewDate} (The date on which the resource content was
3419   *         last reviewed. Review happens periodically after approval but does
3420   *         not change the original approval date.). This is the underlying
3421   *         object with id, value and extensions. The accessor
3422   *         "getLastReviewDate" gives direct access to the value
3423   */
3424  public DateType getLastReviewDateElement() {
3425    if (this.lastReviewDate == null)
3426      if (Configuration.errorOnAutoCreate())
3427        throw new Error("Attempt to auto-create ResearchElementDefinition.lastReviewDate");
3428      else if (Configuration.doAutoCreate())
3429        this.lastReviewDate = new DateType(); // bb
3430    return this.lastReviewDate;
3431  }
3432
3433  public boolean hasLastReviewDateElement() {
3434    return this.lastReviewDate != null && !this.lastReviewDate.isEmpty();
3435  }
3436
3437  public boolean hasLastReviewDate() {
3438    return this.lastReviewDate != null && !this.lastReviewDate.isEmpty();
3439  }
3440
3441  /**
3442   * @param value {@link #lastReviewDate} (The date on which the resource content
3443   *              was last reviewed. Review happens periodically after approval
3444   *              but does not change the original approval date.). This is the
3445   *              underlying object with id, value and extensions. The accessor
3446   *              "getLastReviewDate" gives direct access to the value
3447   */
3448  public ResearchElementDefinition setLastReviewDateElement(DateType value) {
3449    this.lastReviewDate = value;
3450    return this;
3451  }
3452
3453  /**
3454   * @return The date on which the resource content was last reviewed. Review
3455   *         happens periodically after approval but does not change the original
3456   *         approval date.
3457   */
3458  public Date getLastReviewDate() {
3459    return this.lastReviewDate == null ? null : this.lastReviewDate.getValue();
3460  }
3461
3462  /**
3463   * @param value The date on which the resource content was last reviewed. Review
3464   *              happens periodically after approval but does not change the
3465   *              original approval date.
3466   */
3467  public ResearchElementDefinition setLastReviewDate(Date value) {
3468    if (value == null)
3469      this.lastReviewDate = null;
3470    else {
3471      if (this.lastReviewDate == null)
3472        this.lastReviewDate = new DateType();
3473      this.lastReviewDate.setValue(value);
3474    }
3475    return this;
3476  }
3477
3478  /**
3479   * @return {@link #effectivePeriod} (The period during which the research
3480   *         element definition content was or is planned to be in active use.)
3481   */
3482  public Period getEffectivePeriod() {
3483    if (this.effectivePeriod == null)
3484      if (Configuration.errorOnAutoCreate())
3485        throw new Error("Attempt to auto-create ResearchElementDefinition.effectivePeriod");
3486      else if (Configuration.doAutoCreate())
3487        this.effectivePeriod = new Period(); // cc
3488    return this.effectivePeriod;
3489  }
3490
3491  public boolean hasEffectivePeriod() {
3492    return this.effectivePeriod != null && !this.effectivePeriod.isEmpty();
3493  }
3494
3495  /**
3496   * @param value {@link #effectivePeriod} (The period during which the research
3497   *              element definition content was or is planned to be in active
3498   *              use.)
3499   */
3500  public ResearchElementDefinition setEffectivePeriod(Period value) {
3501    this.effectivePeriod = value;
3502    return this;
3503  }
3504
3505  /**
3506   * @return {@link #topic} (Descriptive topics related to the content of the
3507   *         ResearchElementDefinition. Topics provide a high-level categorization
3508   *         grouping types of ResearchElementDefinitions that can be useful for
3509   *         filtering and searching.)
3510   */
3511  public List<CodeableConcept> getTopic() {
3512    if (this.topic == null)
3513      this.topic = new ArrayList<CodeableConcept>();
3514    return this.topic;
3515  }
3516
3517  /**
3518   * @return Returns a reference to <code>this</code> for easy method chaining
3519   */
3520  public ResearchElementDefinition setTopic(List<CodeableConcept> theTopic) {
3521    this.topic = theTopic;
3522    return this;
3523  }
3524
3525  public boolean hasTopic() {
3526    if (this.topic == null)
3527      return false;
3528    for (CodeableConcept item : this.topic)
3529      if (!item.isEmpty())
3530        return true;
3531    return false;
3532  }
3533
3534  public CodeableConcept addTopic() { // 3
3535    CodeableConcept t = new CodeableConcept();
3536    if (this.topic == null)
3537      this.topic = new ArrayList<CodeableConcept>();
3538    this.topic.add(t);
3539    return t;
3540  }
3541
3542  public ResearchElementDefinition addTopic(CodeableConcept t) { // 3
3543    if (t == null)
3544      return this;
3545    if (this.topic == null)
3546      this.topic = new ArrayList<CodeableConcept>();
3547    this.topic.add(t);
3548    return this;
3549  }
3550
3551  /**
3552   * @return The first repetition of repeating field {@link #topic}, creating it
3553   *         if it does not already exist
3554   */
3555  public CodeableConcept getTopicFirstRep() {
3556    if (getTopic().isEmpty()) {
3557      addTopic();
3558    }
3559    return getTopic().get(0);
3560  }
3561
3562  /**
3563   * @return {@link #author} (An individiual or organization primarily involved in
3564   *         the creation and maintenance of the content.)
3565   */
3566  public List<ContactDetail> getAuthor() {
3567    if (this.author == null)
3568      this.author = new ArrayList<ContactDetail>();
3569    return this.author;
3570  }
3571
3572  /**
3573   * @return Returns a reference to <code>this</code> for easy method chaining
3574   */
3575  public ResearchElementDefinition setAuthor(List<ContactDetail> theAuthor) {
3576    this.author = theAuthor;
3577    return this;
3578  }
3579
3580  public boolean hasAuthor() {
3581    if (this.author == null)
3582      return false;
3583    for (ContactDetail item : this.author)
3584      if (!item.isEmpty())
3585        return true;
3586    return false;
3587  }
3588
3589  public ContactDetail addAuthor() { // 3
3590    ContactDetail t = new ContactDetail();
3591    if (this.author == null)
3592      this.author = new ArrayList<ContactDetail>();
3593    this.author.add(t);
3594    return t;
3595  }
3596
3597  public ResearchElementDefinition addAuthor(ContactDetail t) { // 3
3598    if (t == null)
3599      return this;
3600    if (this.author == null)
3601      this.author = new ArrayList<ContactDetail>();
3602    this.author.add(t);
3603    return this;
3604  }
3605
3606  /**
3607   * @return The first repetition of repeating field {@link #author}, creating it
3608   *         if it does not already exist
3609   */
3610  public ContactDetail getAuthorFirstRep() {
3611    if (getAuthor().isEmpty()) {
3612      addAuthor();
3613    }
3614    return getAuthor().get(0);
3615  }
3616
3617  /**
3618   * @return {@link #editor} (An individual or organization primarily responsible
3619   *         for internal coherence of the content.)
3620   */
3621  public List<ContactDetail> getEditor() {
3622    if (this.editor == null)
3623      this.editor = new ArrayList<ContactDetail>();
3624    return this.editor;
3625  }
3626
3627  /**
3628   * @return Returns a reference to <code>this</code> for easy method chaining
3629   */
3630  public ResearchElementDefinition setEditor(List<ContactDetail> theEditor) {
3631    this.editor = theEditor;
3632    return this;
3633  }
3634
3635  public boolean hasEditor() {
3636    if (this.editor == null)
3637      return false;
3638    for (ContactDetail item : this.editor)
3639      if (!item.isEmpty())
3640        return true;
3641    return false;
3642  }
3643
3644  public ContactDetail addEditor() { // 3
3645    ContactDetail t = new ContactDetail();
3646    if (this.editor == null)
3647      this.editor = new ArrayList<ContactDetail>();
3648    this.editor.add(t);
3649    return t;
3650  }
3651
3652  public ResearchElementDefinition addEditor(ContactDetail t) { // 3
3653    if (t == null)
3654      return this;
3655    if (this.editor == null)
3656      this.editor = new ArrayList<ContactDetail>();
3657    this.editor.add(t);
3658    return this;
3659  }
3660
3661  /**
3662   * @return The first repetition of repeating field {@link #editor}, creating it
3663   *         if it does not already exist
3664   */
3665  public ContactDetail getEditorFirstRep() {
3666    if (getEditor().isEmpty()) {
3667      addEditor();
3668    }
3669    return getEditor().get(0);
3670  }
3671
3672  /**
3673   * @return {@link #reviewer} (An individual or organization primarily
3674   *         responsible for review of some aspect of the content.)
3675   */
3676  public List<ContactDetail> getReviewer() {
3677    if (this.reviewer == null)
3678      this.reviewer = new ArrayList<ContactDetail>();
3679    return this.reviewer;
3680  }
3681
3682  /**
3683   * @return Returns a reference to <code>this</code> for easy method chaining
3684   */
3685  public ResearchElementDefinition setReviewer(List<ContactDetail> theReviewer) {
3686    this.reviewer = theReviewer;
3687    return this;
3688  }
3689
3690  public boolean hasReviewer() {
3691    if (this.reviewer == null)
3692      return false;
3693    for (ContactDetail item : this.reviewer)
3694      if (!item.isEmpty())
3695        return true;
3696    return false;
3697  }
3698
3699  public ContactDetail addReviewer() { // 3
3700    ContactDetail t = new ContactDetail();
3701    if (this.reviewer == null)
3702      this.reviewer = new ArrayList<ContactDetail>();
3703    this.reviewer.add(t);
3704    return t;
3705  }
3706
3707  public ResearchElementDefinition addReviewer(ContactDetail t) { // 3
3708    if (t == null)
3709      return this;
3710    if (this.reviewer == null)
3711      this.reviewer = new ArrayList<ContactDetail>();
3712    this.reviewer.add(t);
3713    return this;
3714  }
3715
3716  /**
3717   * @return The first repetition of repeating field {@link #reviewer}, creating
3718   *         it if it does not already exist
3719   */
3720  public ContactDetail getReviewerFirstRep() {
3721    if (getReviewer().isEmpty()) {
3722      addReviewer();
3723    }
3724    return getReviewer().get(0);
3725  }
3726
3727  /**
3728   * @return {@link #endorser} (An individual or organization responsible for
3729   *         officially endorsing the content for use in some setting.)
3730   */
3731  public List<ContactDetail> getEndorser() {
3732    if (this.endorser == null)
3733      this.endorser = new ArrayList<ContactDetail>();
3734    return this.endorser;
3735  }
3736
3737  /**
3738   * @return Returns a reference to <code>this</code> for easy method chaining
3739   */
3740  public ResearchElementDefinition setEndorser(List<ContactDetail> theEndorser) {
3741    this.endorser = theEndorser;
3742    return this;
3743  }
3744
3745  public boolean hasEndorser() {
3746    if (this.endorser == null)
3747      return false;
3748    for (ContactDetail item : this.endorser)
3749      if (!item.isEmpty())
3750        return true;
3751    return false;
3752  }
3753
3754  public ContactDetail addEndorser() { // 3
3755    ContactDetail t = new ContactDetail();
3756    if (this.endorser == null)
3757      this.endorser = new ArrayList<ContactDetail>();
3758    this.endorser.add(t);
3759    return t;
3760  }
3761
3762  public ResearchElementDefinition addEndorser(ContactDetail t) { // 3
3763    if (t == null)
3764      return this;
3765    if (this.endorser == null)
3766      this.endorser = new ArrayList<ContactDetail>();
3767    this.endorser.add(t);
3768    return this;
3769  }
3770
3771  /**
3772   * @return The first repetition of repeating field {@link #endorser}, creating
3773   *         it if it does not already exist
3774   */
3775  public ContactDetail getEndorserFirstRep() {
3776    if (getEndorser().isEmpty()) {
3777      addEndorser();
3778    }
3779    return getEndorser().get(0);
3780  }
3781
3782  /**
3783   * @return {@link #relatedArtifact} (Related artifacts such as additional
3784   *         documentation, justification, or bibliographic references.)
3785   */
3786  public List<RelatedArtifact> getRelatedArtifact() {
3787    if (this.relatedArtifact == null)
3788      this.relatedArtifact = new ArrayList<RelatedArtifact>();
3789    return this.relatedArtifact;
3790  }
3791
3792  /**
3793   * @return Returns a reference to <code>this</code> for easy method chaining
3794   */
3795  public ResearchElementDefinition setRelatedArtifact(List<RelatedArtifact> theRelatedArtifact) {
3796    this.relatedArtifact = theRelatedArtifact;
3797    return this;
3798  }
3799
3800  public boolean hasRelatedArtifact() {
3801    if (this.relatedArtifact == null)
3802      return false;
3803    for (RelatedArtifact item : this.relatedArtifact)
3804      if (!item.isEmpty())
3805        return true;
3806    return false;
3807  }
3808
3809  public RelatedArtifact addRelatedArtifact() { // 3
3810    RelatedArtifact t = new RelatedArtifact();
3811    if (this.relatedArtifact == null)
3812      this.relatedArtifact = new ArrayList<RelatedArtifact>();
3813    this.relatedArtifact.add(t);
3814    return t;
3815  }
3816
3817  public ResearchElementDefinition addRelatedArtifact(RelatedArtifact t) { // 3
3818    if (t == null)
3819      return this;
3820    if (this.relatedArtifact == null)
3821      this.relatedArtifact = new ArrayList<RelatedArtifact>();
3822    this.relatedArtifact.add(t);
3823    return this;
3824  }
3825
3826  /**
3827   * @return The first repetition of repeating field {@link #relatedArtifact},
3828   *         creating it if it does not already exist
3829   */
3830  public RelatedArtifact getRelatedArtifactFirstRep() {
3831    if (getRelatedArtifact().isEmpty()) {
3832      addRelatedArtifact();
3833    }
3834    return getRelatedArtifact().get(0);
3835  }
3836
3837  /**
3838   * @return {@link #library} (A reference to a Library resource containing the
3839   *         formal logic used by the ResearchElementDefinition.)
3840   */
3841  public List<CanonicalType> getLibrary() {
3842    if (this.library == null)
3843      this.library = new ArrayList<CanonicalType>();
3844    return this.library;
3845  }
3846
3847  /**
3848   * @return Returns a reference to <code>this</code> for easy method chaining
3849   */
3850  public ResearchElementDefinition setLibrary(List<CanonicalType> theLibrary) {
3851    this.library = theLibrary;
3852    return this;
3853  }
3854
3855  public boolean hasLibrary() {
3856    if (this.library == null)
3857      return false;
3858    for (CanonicalType item : this.library)
3859      if (!item.isEmpty())
3860        return true;
3861    return false;
3862  }
3863
3864  /**
3865   * @return {@link #library} (A reference to a Library resource containing the
3866   *         formal logic used by the ResearchElementDefinition.)
3867   */
3868  public CanonicalType addLibraryElement() {// 2
3869    CanonicalType t = new CanonicalType();
3870    if (this.library == null)
3871      this.library = new ArrayList<CanonicalType>();
3872    this.library.add(t);
3873    return t;
3874  }
3875
3876  /**
3877   * @param value {@link #library} (A reference to a Library resource containing
3878   *              the formal logic used by the ResearchElementDefinition.)
3879   */
3880  public ResearchElementDefinition addLibrary(String value) { // 1
3881    CanonicalType t = new CanonicalType();
3882    t.setValue(value);
3883    if (this.library == null)
3884      this.library = new ArrayList<CanonicalType>();
3885    this.library.add(t);
3886    return this;
3887  }
3888
3889  /**
3890   * @param value {@link #library} (A reference to a Library resource containing
3891   *              the formal logic used by the ResearchElementDefinition.)
3892   */
3893  public boolean hasLibrary(String value) {
3894    if (this.library == null)
3895      return false;
3896    for (CanonicalType v : this.library)
3897      if (v.getValue().equals(value)) // canonical(Library)
3898        return true;
3899    return false;
3900  }
3901
3902  /**
3903   * @return {@link #type} (The type of research element, a population, an
3904   *         exposure, or an outcome.). This is the underlying object with id,
3905   *         value and extensions. The accessor "getType" gives direct access to
3906   *         the value
3907   */
3908  public Enumeration<ResearchElementType> getTypeElement() {
3909    if (this.type == null)
3910      if (Configuration.errorOnAutoCreate())
3911        throw new Error("Attempt to auto-create ResearchElementDefinition.type");
3912      else if (Configuration.doAutoCreate())
3913        this.type = new Enumeration<ResearchElementType>(new ResearchElementTypeEnumFactory()); // bb
3914    return this.type;
3915  }
3916
3917  public boolean hasTypeElement() {
3918    return this.type != null && !this.type.isEmpty();
3919  }
3920
3921  public boolean hasType() {
3922    return this.type != null && !this.type.isEmpty();
3923  }
3924
3925  /**
3926   * @param value {@link #type} (The type of research element, a population, an
3927   *              exposure, or an outcome.). This is the underlying object with
3928   *              id, value and extensions. The accessor "getType" gives direct
3929   *              access to the value
3930   */
3931  public ResearchElementDefinition setTypeElement(Enumeration<ResearchElementType> value) {
3932    this.type = value;
3933    return this;
3934  }
3935
3936  /**
3937   * @return The type of research element, a population, an exposure, or an
3938   *         outcome.
3939   */
3940  public ResearchElementType getType() {
3941    return this.type == null ? null : this.type.getValue();
3942  }
3943
3944  /**
3945   * @param value The type of research element, a population, an exposure, or an
3946   *              outcome.
3947   */
3948  public ResearchElementDefinition setType(ResearchElementType value) {
3949    if (this.type == null)
3950      this.type = new Enumeration<ResearchElementType>(new ResearchElementTypeEnumFactory());
3951    this.type.setValue(value);
3952    return this;
3953  }
3954
3955  /**
3956   * @return {@link #variableType} (The type of the outcome (e.g. Dichotomous,
3957   *         Continuous, or Descriptive).). This is the underlying object with id,
3958   *         value and extensions. The accessor "getVariableType" gives direct
3959   *         access to the value
3960   */
3961  public Enumeration<VariableType> getVariableTypeElement() {
3962    if (this.variableType == null)
3963      if (Configuration.errorOnAutoCreate())
3964        throw new Error("Attempt to auto-create ResearchElementDefinition.variableType");
3965      else if (Configuration.doAutoCreate())
3966        this.variableType = new Enumeration<VariableType>(new VariableTypeEnumFactory()); // bb
3967    return this.variableType;
3968  }
3969
3970  public boolean hasVariableTypeElement() {
3971    return this.variableType != null && !this.variableType.isEmpty();
3972  }
3973
3974  public boolean hasVariableType() {
3975    return this.variableType != null && !this.variableType.isEmpty();
3976  }
3977
3978  /**
3979   * @param value {@link #variableType} (The type of the outcome (e.g.
3980   *              Dichotomous, Continuous, or Descriptive).). This is the
3981   *              underlying object with id, value and extensions. The accessor
3982   *              "getVariableType" gives direct access to the value
3983   */
3984  public ResearchElementDefinition setVariableTypeElement(Enumeration<VariableType> value) {
3985    this.variableType = value;
3986    return this;
3987  }
3988
3989  /**
3990   * @return The type of the outcome (e.g. Dichotomous, Continuous, or
3991   *         Descriptive).
3992   */
3993  public VariableType getVariableType() {
3994    return this.variableType == null ? null : this.variableType.getValue();
3995  }
3996
3997  /**
3998   * @param value The type of the outcome (e.g. Dichotomous, Continuous, or
3999   *              Descriptive).
4000   */
4001  public ResearchElementDefinition setVariableType(VariableType value) {
4002    if (value == null)
4003      this.variableType = null;
4004    else {
4005      if (this.variableType == null)
4006        this.variableType = new Enumeration<VariableType>(new VariableTypeEnumFactory());
4007      this.variableType.setValue(value);
4008    }
4009    return this;
4010  }
4011
4012  /**
4013   * @return {@link #characteristic} (A characteristic that defines the members of
4014   *         the research element. Multiple characteristics are applied with "and"
4015   *         semantics.)
4016   */
4017  public List<ResearchElementDefinitionCharacteristicComponent> getCharacteristic() {
4018    if (this.characteristic == null)
4019      this.characteristic = new ArrayList<ResearchElementDefinitionCharacteristicComponent>();
4020    return this.characteristic;
4021  }
4022
4023  /**
4024   * @return Returns a reference to <code>this</code> for easy method chaining
4025   */
4026  public ResearchElementDefinition setCharacteristic(
4027      List<ResearchElementDefinitionCharacteristicComponent> theCharacteristic) {
4028    this.characteristic = theCharacteristic;
4029    return this;
4030  }
4031
4032  public boolean hasCharacteristic() {
4033    if (this.characteristic == null)
4034      return false;
4035    for (ResearchElementDefinitionCharacteristicComponent item : this.characteristic)
4036      if (!item.isEmpty())
4037        return true;
4038    return false;
4039  }
4040
4041  public ResearchElementDefinitionCharacteristicComponent addCharacteristic() { // 3
4042    ResearchElementDefinitionCharacteristicComponent t = new ResearchElementDefinitionCharacteristicComponent();
4043    if (this.characteristic == null)
4044      this.characteristic = new ArrayList<ResearchElementDefinitionCharacteristicComponent>();
4045    this.characteristic.add(t);
4046    return t;
4047  }
4048
4049  public ResearchElementDefinition addCharacteristic(ResearchElementDefinitionCharacteristicComponent t) { // 3
4050    if (t == null)
4051      return this;
4052    if (this.characteristic == null)
4053      this.characteristic = new ArrayList<ResearchElementDefinitionCharacteristicComponent>();
4054    this.characteristic.add(t);
4055    return this;
4056  }
4057
4058  /**
4059   * @return The first repetition of repeating field {@link #characteristic},
4060   *         creating it if it does not already exist
4061   */
4062  public ResearchElementDefinitionCharacteristicComponent getCharacteristicFirstRep() {
4063    if (getCharacteristic().isEmpty()) {
4064      addCharacteristic();
4065    }
4066    return getCharacteristic().get(0);
4067  }
4068
4069  protected void listChildren(List<Property> children) {
4070    super.listChildren(children);
4071    children.add(new Property("url", "uri",
4072        "An absolute URI that is used to identify this research element definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which at which an authoritative instance of this research element definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the research element definition is stored on different servers.",
4073        0, 1, url));
4074    children.add(new Property("identifier", "Identifier",
4075        "A formal identifier that is used to identify this research element definition when it is represented in other formats, or referenced in a specification, model, design or an instance.",
4076        0, java.lang.Integer.MAX_VALUE, identifier));
4077    children.add(new Property("version", "string",
4078        "The identifier that is used to identify this version of the research element definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the research element definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence. To provide a version consistent with the Decision Support Service specification, use the format Major.Minor.Revision (e.g. 1.0.0). For more information on versioning knowledge assets, refer to the Decision Support Service specification. Note that a version is required for non-experimental active artifacts.",
4079        0, 1, version));
4080    children.add(new Property("name", "string",
4081        "A natural language name identifying the research element definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.",
4082        0, 1, name));
4083    children.add(new Property("title", "string",
4084        "A short, descriptive, user-friendly title for the research element definition.", 0, 1, title));
4085    children.add(new Property("shortTitle", "string",
4086        "The short title provides an alternate title for use in informal descriptive contexts where the full, formal title is not necessary.",
4087        0, 1, shortTitle));
4088    children.add(new Property("subtitle", "string",
4089        "An explanatory or alternate title for the ResearchElementDefinition giving additional information about its content.",
4090        0, 1, subtitle));
4091    children.add(new Property("status", "code",
4092        "The status of this research element definition. Enables tracking the life-cycle of the content.", 0, 1,
4093        status));
4094    children.add(new Property("experimental", "boolean",
4095        "A Boolean value to indicate that this research element definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.",
4096        0, 1, experimental));
4097    children.add(new Property("subject[x]", "CodeableConcept|Reference(Group)",
4098        "The intended subjects for the ResearchElementDefinition. If this element is not provided, a Patient subject is assumed, but the subject of the ResearchElementDefinition can be anything.",
4099        0, 1, subject));
4100    children.add(new Property("date", "dateTime",
4101        "The date  (and optionally time) when the research element definition was published. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the research element definition changes.",
4102        0, 1, date));
4103    children.add(new Property("publisher", "string",
4104        "The name of the organization or individual that published the research element definition.", 0, 1, publisher));
4105    children.add(new Property("contact", "ContactDetail",
4106        "Contact details to assist a user in finding and communicating with the publisher.", 0,
4107        java.lang.Integer.MAX_VALUE, contact));
4108    children.add(new Property("description", "markdown",
4109        "A free text natural language description of the research element definition from a consumer's perspective.", 0,
4110        1, description));
4111    children.add(
4112        new Property("comment", "string", "A human-readable string to clarify or explain concepts about the resource.",
4113            0, java.lang.Integer.MAX_VALUE, comment));
4114    children.add(new Property("useContext", "UsageContext",
4115        "The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate research element definition instances.",
4116        0, java.lang.Integer.MAX_VALUE, useContext));
4117    children.add(new Property("jurisdiction", "CodeableConcept",
4118        "A legal or geographic region in which the research element definition is intended to be used.", 0,
4119        java.lang.Integer.MAX_VALUE, jurisdiction));
4120    children.add(new Property("purpose", "markdown",
4121        "Explanation of why this research element definition is needed and why it has been designed as it has.", 0, 1,
4122        purpose));
4123    children.add(new Property("usage", "string",
4124        "A detailed description, from a clinical perspective, of how the ResearchElementDefinition is used.", 0, 1,
4125        usage));
4126    children.add(new Property("copyright", "markdown",
4127        "A copyright statement relating to the research element definition and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the research element definition.",
4128        0, 1, copyright));
4129    children.add(new Property("approvalDate", "date",
4130        "The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.",
4131        0, 1, approvalDate));
4132    children.add(new Property("lastReviewDate", "date",
4133        "The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.",
4134        0, 1, lastReviewDate));
4135    children.add(new Property("effectivePeriod", "Period",
4136        "The period during which the research element definition content was or is planned to be in active use.", 0, 1,
4137        effectivePeriod));
4138    children.add(new Property("topic", "CodeableConcept",
4139        "Descriptive topics related to the content of the ResearchElementDefinition. Topics provide a high-level categorization grouping types of ResearchElementDefinitions that can be useful for filtering and searching.",
4140        0, java.lang.Integer.MAX_VALUE, topic));
4141    children.add(new Property("author", "ContactDetail",
4142        "An individiual or organization primarily involved in the creation and maintenance of the content.", 0,
4143        java.lang.Integer.MAX_VALUE, author));
4144    children.add(new Property("editor", "ContactDetail",
4145        "An individual or organization primarily responsible for internal coherence of the content.", 0,
4146        java.lang.Integer.MAX_VALUE, editor));
4147    children.add(new Property("reviewer", "ContactDetail",
4148        "An individual or organization primarily responsible for review of some aspect of the content.", 0,
4149        java.lang.Integer.MAX_VALUE, reviewer));
4150    children.add(new Property("endorser", "ContactDetail",
4151        "An individual or organization responsible for officially endorsing the content for use in some setting.", 0,
4152        java.lang.Integer.MAX_VALUE, endorser));
4153    children.add(new Property("relatedArtifact", "RelatedArtifact",
4154        "Related artifacts such as additional documentation, justification, or bibliographic references.", 0,
4155        java.lang.Integer.MAX_VALUE, relatedArtifact));
4156    children.add(new Property("library", "canonical(Library)",
4157        "A reference to a Library resource containing the formal logic used by the ResearchElementDefinition.", 0,
4158        java.lang.Integer.MAX_VALUE, library));
4159    children.add(new Property("type", "code", "The type of research element, a population, an exposure, or an outcome.",
4160        0, 1, type));
4161    children.add(new Property("variableType", "code",
4162        "The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive).", 0, 1, variableType));
4163    children.add(new Property("characteristic", "",
4164        "A characteristic that defines the members of the research element. Multiple characteristics are applied with \"and\" semantics.",
4165        0, java.lang.Integer.MAX_VALUE, characteristic));
4166  }
4167
4168  @Override
4169  public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
4170    switch (_hash) {
4171    case 116079:
4172      /* url */ return new Property("url", "uri",
4173          "An absolute URI that is used to identify this research element definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which at which an authoritative instance of this research element definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the research element definition is stored on different servers.",
4174          0, 1, url);
4175    case -1618432855:
4176      /* identifier */ return new Property("identifier", "Identifier",
4177          "A formal identifier that is used to identify this research element definition when it is represented in other formats, or referenced in a specification, model, design or an instance.",
4178          0, java.lang.Integer.MAX_VALUE, identifier);
4179    case 351608024:
4180      /* version */ return new Property("version", "string",
4181          "The identifier that is used to identify this version of the research element definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the research element definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence. To provide a version consistent with the Decision Support Service specification, use the format Major.Minor.Revision (e.g. 1.0.0). For more information on versioning knowledge assets, refer to the Decision Support Service specification. Note that a version is required for non-experimental active artifacts.",
4182          0, 1, version);
4183    case 3373707:
4184      /* name */ return new Property("name", "string",
4185          "A natural language name identifying the research element definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.",
4186          0, 1, name);
4187    case 110371416:
4188      /* title */ return new Property("title", "string",
4189          "A short, descriptive, user-friendly title for the research element definition.", 0, 1, title);
4190    case 1555503932:
4191      /* shortTitle */ return new Property("shortTitle", "string",
4192          "The short title provides an alternate title for use in informal descriptive contexts where the full, formal title is not necessary.",
4193          0, 1, shortTitle);
4194    case -2060497896:
4195      /* subtitle */ return new Property("subtitle", "string",
4196          "An explanatory or alternate title for the ResearchElementDefinition giving additional information about its content.",
4197          0, 1, subtitle);
4198    case -892481550:
4199      /* status */ return new Property("status", "code",
4200          "The status of this research element definition. Enables tracking the life-cycle of the content.", 0, 1,
4201          status);
4202    case -404562712:
4203      /* experimental */ return new Property("experimental", "boolean",
4204          "A Boolean value to indicate that this research element definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.",
4205          0, 1, experimental);
4206    case -573640748:
4207      /* subject[x] */ return new Property("subject[x]", "CodeableConcept|Reference(Group)",
4208          "The intended subjects for the ResearchElementDefinition. If this element is not provided, a Patient subject is assumed, but the subject of the ResearchElementDefinition can be anything.",
4209          0, 1, subject);
4210    case -1867885268:
4211      /* subject */ return new Property("subject[x]", "CodeableConcept|Reference(Group)",
4212          "The intended subjects for the ResearchElementDefinition. If this element is not provided, a Patient subject is assumed, but the subject of the ResearchElementDefinition can be anything.",
4213          0, 1, subject);
4214    case -1257122603:
4215      /* subjectCodeableConcept */ return new Property("subject[x]", "CodeableConcept|Reference(Group)",
4216          "The intended subjects for the ResearchElementDefinition. If this element is not provided, a Patient subject is assumed, but the subject of the ResearchElementDefinition can be anything.",
4217          0, 1, subject);
4218    case 772938623:
4219      /* subjectReference */ return new Property("subject[x]", "CodeableConcept|Reference(Group)",
4220          "The intended subjects for the ResearchElementDefinition. If this element is not provided, a Patient subject is assumed, but the subject of the ResearchElementDefinition can be anything.",
4221          0, 1, subject);
4222    case 3076014:
4223      /* date */ return new Property("date", "dateTime",
4224          "The date  (and optionally time) when the research element definition was published. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the research element definition changes.",
4225          0, 1, date);
4226    case 1447404028:
4227      /* publisher */ return new Property("publisher", "string",
4228          "The name of the organization or individual that published the research element definition.", 0, 1,
4229          publisher);
4230    case 951526432:
4231      /* contact */ return new Property("contact", "ContactDetail",
4232          "Contact details to assist a user in finding and communicating with the publisher.", 0,
4233          java.lang.Integer.MAX_VALUE, contact);
4234    case -1724546052:
4235      /* description */ return new Property("description", "markdown",
4236          "A free text natural language description of the research element definition from a consumer's perspective.",
4237          0, 1, description);
4238    case 950398559:
4239      /* comment */ return new Property("comment", "string",
4240          "A human-readable string to clarify or explain concepts about the resource.", 0, java.lang.Integer.MAX_VALUE,
4241          comment);
4242    case -669707736:
4243      /* useContext */ return new Property("useContext", "UsageContext",
4244          "The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate research element definition instances.",
4245          0, java.lang.Integer.MAX_VALUE, useContext);
4246    case -507075711:
4247      /* jurisdiction */ return new Property("jurisdiction", "CodeableConcept",
4248          "A legal or geographic region in which the research element definition is intended to be used.", 0,
4249          java.lang.Integer.MAX_VALUE, jurisdiction);
4250    case -220463842:
4251      /* purpose */ return new Property("purpose", "markdown",
4252          "Explanation of why this research element definition is needed and why it has been designed as it has.", 0, 1,
4253          purpose);
4254    case 111574433:
4255      /* usage */ return new Property("usage", "string",
4256          "A detailed description, from a clinical perspective, of how the ResearchElementDefinition is used.", 0, 1,
4257          usage);
4258    case 1522889671:
4259      /* copyright */ return new Property("copyright", "markdown",
4260          "A copyright statement relating to the research element definition and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the research element definition.",
4261          0, 1, copyright);
4262    case 223539345:
4263      /* approvalDate */ return new Property("approvalDate", "date",
4264          "The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.",
4265          0, 1, approvalDate);
4266    case -1687512484:
4267      /* lastReviewDate */ return new Property("lastReviewDate", "date",
4268          "The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.",
4269          0, 1, lastReviewDate);
4270    case -403934648:
4271      /* effectivePeriod */ return new Property("effectivePeriod", "Period",
4272          "The period during which the research element definition content was or is planned to be in active use.", 0,
4273          1, effectivePeriod);
4274    case 110546223:
4275      /* topic */ return new Property("topic", "CodeableConcept",
4276          "Descriptive topics related to the content of the ResearchElementDefinition. Topics provide a high-level categorization grouping types of ResearchElementDefinitions that can be useful for filtering and searching.",
4277          0, java.lang.Integer.MAX_VALUE, topic);
4278    case -1406328437:
4279      /* author */ return new Property("author", "ContactDetail",
4280          "An individiual or organization primarily involved in the creation and maintenance of the content.", 0,
4281          java.lang.Integer.MAX_VALUE, author);
4282    case -1307827859:
4283      /* editor */ return new Property("editor", "ContactDetail",
4284          "An individual or organization primarily responsible for internal coherence of the content.", 0,
4285          java.lang.Integer.MAX_VALUE, editor);
4286    case -261190139:
4287      /* reviewer */ return new Property("reviewer", "ContactDetail",
4288          "An individual or organization primarily responsible for review of some aspect of the content.", 0,
4289          java.lang.Integer.MAX_VALUE, reviewer);
4290    case 1740277666:
4291      /* endorser */ return new Property("endorser", "ContactDetail",
4292          "An individual or organization responsible for officially endorsing the content for use in some setting.", 0,
4293          java.lang.Integer.MAX_VALUE, endorser);
4294    case 666807069:
4295      /* relatedArtifact */ return new Property("relatedArtifact", "RelatedArtifact",
4296          "Related artifacts such as additional documentation, justification, or bibliographic references.", 0,
4297          java.lang.Integer.MAX_VALUE, relatedArtifact);
4298    case 166208699:
4299      /* library */ return new Property("library", "canonical(Library)",
4300          "A reference to a Library resource containing the formal logic used by the ResearchElementDefinition.", 0,
4301          java.lang.Integer.MAX_VALUE, library);
4302    case 3575610:
4303      /* type */ return new Property("type", "code",
4304          "The type of research element, a population, an exposure, or an outcome.", 0, 1, type);
4305    case -372820010:
4306      /* variableType */ return new Property("variableType", "code",
4307          "The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive).", 0, 1, variableType);
4308    case 366313883:
4309      /* characteristic */ return new Property("characteristic", "",
4310          "A characteristic that defines the members of the research element. Multiple characteristics are applied with \"and\" semantics.",
4311          0, java.lang.Integer.MAX_VALUE, characteristic);
4312    default:
4313      return super.getNamedProperty(_hash, _name, _checkValid);
4314    }
4315
4316  }
4317
4318  @Override
4319  public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
4320    switch (hash) {
4321    case 116079:
4322      /* url */ return this.url == null ? new Base[0] : new Base[] { this.url }; // UriType
4323    case -1618432855:
4324      /* identifier */ return this.identifier == null ? new Base[0]
4325          : this.identifier.toArray(new Base[this.identifier.size()]); // Identifier
4326    case 351608024:
4327      /* version */ return this.version == null ? new Base[0] : new Base[] { this.version }; // StringType
4328    case 3373707:
4329      /* name */ return this.name == null ? new Base[0] : new Base[] { this.name }; // StringType
4330    case 110371416:
4331      /* title */ return this.title == null ? new Base[0] : new Base[] { this.title }; // StringType
4332    case 1555503932:
4333      /* shortTitle */ return this.shortTitle == null ? new Base[0] : new Base[] { this.shortTitle }; // StringType
4334    case -2060497896:
4335      /* subtitle */ return this.subtitle == null ? new Base[0] : new Base[] { this.subtitle }; // StringType
4336    case -892481550:
4337      /* status */ return this.status == null ? new Base[0] : new Base[] { this.status }; // Enumeration<PublicationStatus>
4338    case -404562712:
4339      /* experimental */ return this.experimental == null ? new Base[0] : new Base[] { this.experimental }; // BooleanType
4340    case -1867885268:
4341      /* subject */ return this.subject == null ? new Base[0] : new Base[] { this.subject }; // Type
4342    case 3076014:
4343      /* date */ return this.date == null ? new Base[0] : new Base[] { this.date }; // DateTimeType
4344    case 1447404028:
4345      /* publisher */ return this.publisher == null ? new Base[0] : new Base[] { this.publisher }; // StringType
4346    case 951526432:
4347      /* contact */ return this.contact == null ? new Base[0] : this.contact.toArray(new Base[this.contact.size()]); // ContactDetail
4348    case -1724546052:
4349      /* description */ return this.description == null ? new Base[0] : new Base[] { this.description }; // MarkdownType
4350    case 950398559:
4351      /* comment */ return this.comment == null ? new Base[0] : this.comment.toArray(new Base[this.comment.size()]); // StringType
4352    case -669707736:
4353      /* useContext */ return this.useContext == null ? new Base[0]
4354          : this.useContext.toArray(new Base[this.useContext.size()]); // UsageContext
4355    case -507075711:
4356      /* jurisdiction */ return this.jurisdiction == null ? new Base[0]
4357          : this.jurisdiction.toArray(new Base[this.jurisdiction.size()]); // CodeableConcept
4358    case -220463842:
4359      /* purpose */ return this.purpose == null ? new Base[0] : new Base[] { this.purpose }; // MarkdownType
4360    case 111574433:
4361      /* usage */ return this.usage == null ? new Base[0] : new Base[] { this.usage }; // StringType
4362    case 1522889671:
4363      /* copyright */ return this.copyright == null ? new Base[0] : new Base[] { this.copyright }; // MarkdownType
4364    case 223539345:
4365      /* approvalDate */ return this.approvalDate == null ? new Base[0] : new Base[] { this.approvalDate }; // DateType
4366    case -1687512484:
4367      /* lastReviewDate */ return this.lastReviewDate == null ? new Base[0] : new Base[] { this.lastReviewDate }; // DateType
4368    case -403934648:
4369      /* effectivePeriod */ return this.effectivePeriod == null ? new Base[0] : new Base[] { this.effectivePeriod }; // Period
4370    case 110546223:
4371      /* topic */ return this.topic == null ? new Base[0] : this.topic.toArray(new Base[this.topic.size()]); // CodeableConcept
4372    case -1406328437:
4373      /* author */ return this.author == null ? new Base[0] : this.author.toArray(new Base[this.author.size()]); // ContactDetail
4374    case -1307827859:
4375      /* editor */ return this.editor == null ? new Base[0] : this.editor.toArray(new Base[this.editor.size()]); // ContactDetail
4376    case -261190139:
4377      /* reviewer */ return this.reviewer == null ? new Base[0] : this.reviewer.toArray(new Base[this.reviewer.size()]); // ContactDetail
4378    case 1740277666:
4379      /* endorser */ return this.endorser == null ? new Base[0] : this.endorser.toArray(new Base[this.endorser.size()]); // ContactDetail
4380    case 666807069:
4381      /* relatedArtifact */ return this.relatedArtifact == null ? new Base[0]
4382          : this.relatedArtifact.toArray(new Base[this.relatedArtifact.size()]); // RelatedArtifact
4383    case 166208699:
4384      /* library */ return this.library == null ? new Base[0] : this.library.toArray(new Base[this.library.size()]); // CanonicalType
4385    case 3575610:
4386      /* type */ return this.type == null ? new Base[0] : new Base[] { this.type }; // Enumeration<ResearchElementType>
4387    case -372820010:
4388      /* variableType */ return this.variableType == null ? new Base[0] : new Base[] { this.variableType }; // Enumeration<VariableType>
4389    case 366313883:
4390      /* characteristic */ return this.characteristic == null ? new Base[0]
4391          : this.characteristic.toArray(new Base[this.characteristic.size()]); // ResearchElementDefinitionCharacteristicComponent
4392    default:
4393      return super.getProperty(hash, name, checkValid);
4394    }
4395
4396  }
4397
4398  @Override
4399  public Base setProperty(int hash, String name, Base value) throws FHIRException {
4400    switch (hash) {
4401    case 116079: // url
4402      this.url = castToUri(value); // UriType
4403      return value;
4404    case -1618432855: // identifier
4405      this.getIdentifier().add(castToIdentifier(value)); // Identifier
4406      return value;
4407    case 351608024: // version
4408      this.version = castToString(value); // StringType
4409      return value;
4410    case 3373707: // name
4411      this.name = castToString(value); // StringType
4412      return value;
4413    case 110371416: // title
4414      this.title = castToString(value); // StringType
4415      return value;
4416    case 1555503932: // shortTitle
4417      this.shortTitle = castToString(value); // StringType
4418      return value;
4419    case -2060497896: // subtitle
4420      this.subtitle = castToString(value); // StringType
4421      return value;
4422    case -892481550: // status
4423      value = new PublicationStatusEnumFactory().fromType(castToCode(value));
4424      this.status = (Enumeration) value; // Enumeration<PublicationStatus>
4425      return value;
4426    case -404562712: // experimental
4427      this.experimental = castToBoolean(value); // BooleanType
4428      return value;
4429    case -1867885268: // subject
4430      this.subject = castToType(value); // Type
4431      return value;
4432    case 3076014: // date
4433      this.date = castToDateTime(value); // DateTimeType
4434      return value;
4435    case 1447404028: // publisher
4436      this.publisher = castToString(value); // StringType
4437      return value;
4438    case 951526432: // contact
4439      this.getContact().add(castToContactDetail(value)); // ContactDetail
4440      return value;
4441    case -1724546052: // description
4442      this.description = castToMarkdown(value); // MarkdownType
4443      return value;
4444    case 950398559: // comment
4445      this.getComment().add(castToString(value)); // StringType
4446      return value;
4447    case -669707736: // useContext
4448      this.getUseContext().add(castToUsageContext(value)); // UsageContext
4449      return value;
4450    case -507075711: // jurisdiction
4451      this.getJurisdiction().add(castToCodeableConcept(value)); // CodeableConcept
4452      return value;
4453    case -220463842: // purpose
4454      this.purpose = castToMarkdown(value); // MarkdownType
4455      return value;
4456    case 111574433: // usage
4457      this.usage = castToString(value); // StringType
4458      return value;
4459    case 1522889671: // copyright
4460      this.copyright = castToMarkdown(value); // MarkdownType
4461      return value;
4462    case 223539345: // approvalDate
4463      this.approvalDate = castToDate(value); // DateType
4464      return value;
4465    case -1687512484: // lastReviewDate
4466      this.lastReviewDate = castToDate(value); // DateType
4467      return value;
4468    case -403934648: // effectivePeriod
4469      this.effectivePeriod = castToPeriod(value); // Period
4470      return value;
4471    case 110546223: // topic
4472      this.getTopic().add(castToCodeableConcept(value)); // CodeableConcept
4473      return value;
4474    case -1406328437: // author
4475      this.getAuthor().add(castToContactDetail(value)); // ContactDetail
4476      return value;
4477    case -1307827859: // editor
4478      this.getEditor().add(castToContactDetail(value)); // ContactDetail
4479      return value;
4480    case -261190139: // reviewer
4481      this.getReviewer().add(castToContactDetail(value)); // ContactDetail
4482      return value;
4483    case 1740277666: // endorser
4484      this.getEndorser().add(castToContactDetail(value)); // ContactDetail
4485      return value;
4486    case 666807069: // relatedArtifact
4487      this.getRelatedArtifact().add(castToRelatedArtifact(value)); // RelatedArtifact
4488      return value;
4489    case 166208699: // library
4490      this.getLibrary().add(castToCanonical(value)); // CanonicalType
4491      return value;
4492    case 3575610: // type
4493      value = new ResearchElementTypeEnumFactory().fromType(castToCode(value));
4494      this.type = (Enumeration) value; // Enumeration<ResearchElementType>
4495      return value;
4496    case -372820010: // variableType
4497      value = new VariableTypeEnumFactory().fromType(castToCode(value));
4498      this.variableType = (Enumeration) value; // Enumeration<VariableType>
4499      return value;
4500    case 366313883: // characteristic
4501      this.getCharacteristic().add((ResearchElementDefinitionCharacteristicComponent) value); // ResearchElementDefinitionCharacteristicComponent
4502      return value;
4503    default:
4504      return super.setProperty(hash, name, value);
4505    }
4506
4507  }
4508
4509  @Override
4510  public Base setProperty(String name, Base value) throws FHIRException {
4511    if (name.equals("url")) {
4512      this.url = castToUri(value); // UriType
4513    } else if (name.equals("identifier")) {
4514      this.getIdentifier().add(castToIdentifier(value));
4515    } else if (name.equals("version")) {
4516      this.version = castToString(value); // StringType
4517    } else if (name.equals("name")) {
4518      this.name = castToString(value); // StringType
4519    } else if (name.equals("title")) {
4520      this.title = castToString(value); // StringType
4521    } else if (name.equals("shortTitle")) {
4522      this.shortTitle = castToString(value); // StringType
4523    } else if (name.equals("subtitle")) {
4524      this.subtitle = castToString(value); // StringType
4525    } else if (name.equals("status")) {
4526      value = new PublicationStatusEnumFactory().fromType(castToCode(value));
4527      this.status = (Enumeration) value; // Enumeration<PublicationStatus>
4528    } else if (name.equals("experimental")) {
4529      this.experimental = castToBoolean(value); // BooleanType
4530    } else if (name.equals("subject[x]")) {
4531      this.subject = castToType(value); // Type
4532    } else if (name.equals("date")) {
4533      this.date = castToDateTime(value); // DateTimeType
4534    } else if (name.equals("publisher")) {
4535      this.publisher = castToString(value); // StringType
4536    } else if (name.equals("contact")) {
4537      this.getContact().add(castToContactDetail(value));
4538    } else if (name.equals("description")) {
4539      this.description = castToMarkdown(value); // MarkdownType
4540    } else if (name.equals("comment")) {
4541      this.getComment().add(castToString(value));
4542    } else if (name.equals("useContext")) {
4543      this.getUseContext().add(castToUsageContext(value));
4544    } else if (name.equals("jurisdiction")) {
4545      this.getJurisdiction().add(castToCodeableConcept(value));
4546    } else if (name.equals("purpose")) {
4547      this.purpose = castToMarkdown(value); // MarkdownType
4548    } else if (name.equals("usage")) {
4549      this.usage = castToString(value); // StringType
4550    } else if (name.equals("copyright")) {
4551      this.copyright = castToMarkdown(value); // MarkdownType
4552    } else if (name.equals("approvalDate")) {
4553      this.approvalDate = castToDate(value); // DateType
4554    } else if (name.equals("lastReviewDate")) {
4555      this.lastReviewDate = castToDate(value); // DateType
4556    } else if (name.equals("effectivePeriod")) {
4557      this.effectivePeriod = castToPeriod(value); // Period
4558    } else if (name.equals("topic")) {
4559      this.getTopic().add(castToCodeableConcept(value));
4560    } else if (name.equals("author")) {
4561      this.getAuthor().add(castToContactDetail(value));
4562    } else if (name.equals("editor")) {
4563      this.getEditor().add(castToContactDetail(value));
4564    } else if (name.equals("reviewer")) {
4565      this.getReviewer().add(castToContactDetail(value));
4566    } else if (name.equals("endorser")) {
4567      this.getEndorser().add(castToContactDetail(value));
4568    } else if (name.equals("relatedArtifact")) {
4569      this.getRelatedArtifact().add(castToRelatedArtifact(value));
4570    } else if (name.equals("library")) {
4571      this.getLibrary().add(castToCanonical(value));
4572    } else if (name.equals("type")) {
4573      value = new ResearchElementTypeEnumFactory().fromType(castToCode(value));
4574      this.type = (Enumeration) value; // Enumeration<ResearchElementType>
4575    } else if (name.equals("variableType")) {
4576      value = new VariableTypeEnumFactory().fromType(castToCode(value));
4577      this.variableType = (Enumeration) value; // Enumeration<VariableType>
4578    } else if (name.equals("characteristic")) {
4579      this.getCharacteristic().add((ResearchElementDefinitionCharacteristicComponent) value);
4580    } else
4581      return super.setProperty(name, value);
4582    return value;
4583  }
4584
4585  @Override
4586  public void removeChild(String name, Base value) throws FHIRException {
4587    if (name.equals("url")) {
4588      this.url = null;
4589    } else if (name.equals("identifier")) {
4590      this.getIdentifier().remove(castToIdentifier(value));
4591    } else if (name.equals("version")) {
4592      this.version = null;
4593    } else if (name.equals("name")) {
4594      this.name = null;
4595    } else if (name.equals("title")) {
4596      this.title = null;
4597    } else if (name.equals("shortTitle")) {
4598      this.shortTitle = null;
4599    } else if (name.equals("subtitle")) {
4600      this.subtitle = null;
4601    } else if (name.equals("status")) {
4602      this.status = null;
4603    } else if (name.equals("experimental")) {
4604      this.experimental = null;
4605    } else if (name.equals("subject[x]")) {
4606      this.subject = null;
4607    } else if (name.equals("date")) {
4608      this.date = null;
4609    } else if (name.equals("publisher")) {
4610      this.publisher = null;
4611    } else if (name.equals("contact")) {
4612      this.getContact().remove(castToContactDetail(value));
4613    } else if (name.equals("description")) {
4614      this.description = null;
4615    } else if (name.equals("comment")) {
4616      this.getComment().remove(castToString(value));
4617    } else if (name.equals("useContext")) {
4618      this.getUseContext().remove(castToUsageContext(value));
4619    } else if (name.equals("jurisdiction")) {
4620      this.getJurisdiction().remove(castToCodeableConcept(value));
4621    } else if (name.equals("purpose")) {
4622      this.purpose = null;
4623    } else if (name.equals("usage")) {
4624      this.usage = null;
4625    } else if (name.equals("copyright")) {
4626      this.copyright = null;
4627    } else if (name.equals("approvalDate")) {
4628      this.approvalDate = null;
4629    } else if (name.equals("lastReviewDate")) {
4630      this.lastReviewDate = null;
4631    } else if (name.equals("effectivePeriod")) {
4632      this.effectivePeriod = null;
4633    } else if (name.equals("topic")) {
4634      this.getTopic().remove(castToCodeableConcept(value));
4635    } else if (name.equals("author")) {
4636      this.getAuthor().remove(castToContactDetail(value));
4637    } else if (name.equals("editor")) {
4638      this.getEditor().remove(castToContactDetail(value));
4639    } else if (name.equals("reviewer")) {
4640      this.getReviewer().remove(castToContactDetail(value));
4641    } else if (name.equals("endorser")) {
4642      this.getEndorser().remove(castToContactDetail(value));
4643    } else if (name.equals("relatedArtifact")) {
4644      this.getRelatedArtifact().remove(castToRelatedArtifact(value));
4645    } else if (name.equals("library")) {
4646      this.getLibrary().remove(castToCanonical(value));
4647    } else if (name.equals("type")) {
4648      this.type = null;
4649    } else if (name.equals("variableType")) {
4650      this.variableType = null;
4651    } else if (name.equals("characteristic")) {
4652      this.getCharacteristic().remove((ResearchElementDefinitionCharacteristicComponent) value);
4653    } else
4654      super.removeChild(name, value);
4655    
4656  }
4657
4658  @Override
4659  public Base makeProperty(int hash, String name) throws FHIRException {
4660    switch (hash) {
4661    case 116079:
4662      return getUrlElement();
4663    case -1618432855:
4664      return addIdentifier();
4665    case 351608024:
4666      return getVersionElement();
4667    case 3373707:
4668      return getNameElement();
4669    case 110371416:
4670      return getTitleElement();
4671    case 1555503932:
4672      return getShortTitleElement();
4673    case -2060497896:
4674      return getSubtitleElement();
4675    case -892481550:
4676      return getStatusElement();
4677    case -404562712:
4678      return getExperimentalElement();
4679    case -573640748:
4680      return getSubject();
4681    case -1867885268:
4682      return getSubject();
4683    case 3076014:
4684      return getDateElement();
4685    case 1447404028:
4686      return getPublisherElement();
4687    case 951526432:
4688      return addContact();
4689    case -1724546052:
4690      return getDescriptionElement();
4691    case 950398559:
4692      return addCommentElement();
4693    case -669707736:
4694      return addUseContext();
4695    case -507075711:
4696      return addJurisdiction();
4697    case -220463842:
4698      return getPurposeElement();
4699    case 111574433:
4700      return getUsageElement();
4701    case 1522889671:
4702      return getCopyrightElement();
4703    case 223539345:
4704      return getApprovalDateElement();
4705    case -1687512484:
4706      return getLastReviewDateElement();
4707    case -403934648:
4708      return getEffectivePeriod();
4709    case 110546223:
4710      return addTopic();
4711    case -1406328437:
4712      return addAuthor();
4713    case -1307827859:
4714      return addEditor();
4715    case -261190139:
4716      return addReviewer();
4717    case 1740277666:
4718      return addEndorser();
4719    case 666807069:
4720      return addRelatedArtifact();
4721    case 166208699:
4722      return addLibraryElement();
4723    case 3575610:
4724      return getTypeElement();
4725    case -372820010:
4726      return getVariableTypeElement();
4727    case 366313883:
4728      return addCharacteristic();
4729    default:
4730      return super.makeProperty(hash, name);
4731    }
4732
4733  }
4734
4735  @Override
4736  public String[] getTypesForProperty(int hash, String name) throws FHIRException {
4737    switch (hash) {
4738    case 116079:
4739      /* url */ return new String[] { "uri" };
4740    case -1618432855:
4741      /* identifier */ return new String[] { "Identifier" };
4742    case 351608024:
4743      /* version */ return new String[] { "string" };
4744    case 3373707:
4745      /* name */ return new String[] { "string" };
4746    case 110371416:
4747      /* title */ return new String[] { "string" };
4748    case 1555503932:
4749      /* shortTitle */ return new String[] { "string" };
4750    case -2060497896:
4751      /* subtitle */ return new String[] { "string" };
4752    case -892481550:
4753      /* status */ return new String[] { "code" };
4754    case -404562712:
4755      /* experimental */ return new String[] { "boolean" };
4756    case -1867885268:
4757      /* subject */ return new String[] { "CodeableConcept", "Reference" };
4758    case 3076014:
4759      /* date */ return new String[] { "dateTime" };
4760    case 1447404028:
4761      /* publisher */ return new String[] { "string" };
4762    case 951526432:
4763      /* contact */ return new String[] { "ContactDetail" };
4764    case -1724546052:
4765      /* description */ return new String[] { "markdown" };
4766    case 950398559:
4767      /* comment */ return new String[] { "string" };
4768    case -669707736:
4769      /* useContext */ return new String[] { "UsageContext" };
4770    case -507075711:
4771      /* jurisdiction */ return new String[] { "CodeableConcept" };
4772    case -220463842:
4773      /* purpose */ return new String[] { "markdown" };
4774    case 111574433:
4775      /* usage */ return new String[] { "string" };
4776    case 1522889671:
4777      /* copyright */ return new String[] { "markdown" };
4778    case 223539345:
4779      /* approvalDate */ return new String[] { "date" };
4780    case -1687512484:
4781      /* lastReviewDate */ return new String[] { "date" };
4782    case -403934648:
4783      /* effectivePeriod */ return new String[] { "Period" };
4784    case 110546223:
4785      /* topic */ return new String[] { "CodeableConcept" };
4786    case -1406328437:
4787      /* author */ return new String[] { "ContactDetail" };
4788    case -1307827859:
4789      /* editor */ return new String[] { "ContactDetail" };
4790    case -261190139:
4791      /* reviewer */ return new String[] { "ContactDetail" };
4792    case 1740277666:
4793      /* endorser */ return new String[] { "ContactDetail" };
4794    case 666807069:
4795      /* relatedArtifact */ return new String[] { "RelatedArtifact" };
4796    case 166208699:
4797      /* library */ return new String[] { "canonical" };
4798    case 3575610:
4799      /* type */ return new String[] { "code" };
4800    case -372820010:
4801      /* variableType */ return new String[] { "code" };
4802    case 366313883:
4803      /* characteristic */ return new String[] {};
4804    default:
4805      return super.getTypesForProperty(hash, name);
4806    }
4807
4808  }
4809
4810  @Override
4811  public Base addChild(String name) throws FHIRException {
4812    if (name.equals("url")) {
4813      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.url");
4814    } else if (name.equals("identifier")) {
4815      return addIdentifier();
4816    } else if (name.equals("version")) {
4817      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.version");
4818    } else if (name.equals("name")) {
4819      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.name");
4820    } else if (name.equals("title")) {
4821      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.title");
4822    } else if (name.equals("shortTitle")) {
4823      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.shortTitle");
4824    } else if (name.equals("subtitle")) {
4825      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.subtitle");
4826    } else if (name.equals("status")) {
4827      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.status");
4828    } else if (name.equals("experimental")) {
4829      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.experimental");
4830    } else if (name.equals("subjectCodeableConcept")) {
4831      this.subject = new CodeableConcept();
4832      return this.subject;
4833    } else if (name.equals("subjectReference")) {
4834      this.subject = new Reference();
4835      return this.subject;
4836    } else if (name.equals("date")) {
4837      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.date");
4838    } else if (name.equals("publisher")) {
4839      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.publisher");
4840    } else if (name.equals("contact")) {
4841      return addContact();
4842    } else if (name.equals("description")) {
4843      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.description");
4844    } else if (name.equals("comment")) {
4845      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.comment");
4846    } else if (name.equals("useContext")) {
4847      return addUseContext();
4848    } else if (name.equals("jurisdiction")) {
4849      return addJurisdiction();
4850    } else if (name.equals("purpose")) {
4851      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.purpose");
4852    } else if (name.equals("usage")) {
4853      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.usage");
4854    } else if (name.equals("copyright")) {
4855      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.copyright");
4856    } else if (name.equals("approvalDate")) {
4857      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.approvalDate");
4858    } else if (name.equals("lastReviewDate")) {
4859      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.lastReviewDate");
4860    } else if (name.equals("effectivePeriod")) {
4861      this.effectivePeriod = new Period();
4862      return this.effectivePeriod;
4863    } else if (name.equals("topic")) {
4864      return addTopic();
4865    } else if (name.equals("author")) {
4866      return addAuthor();
4867    } else if (name.equals("editor")) {
4868      return addEditor();
4869    } else if (name.equals("reviewer")) {
4870      return addReviewer();
4871    } else if (name.equals("endorser")) {
4872      return addEndorser();
4873    } else if (name.equals("relatedArtifact")) {
4874      return addRelatedArtifact();
4875    } else if (name.equals("library")) {
4876      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.library");
4877    } else if (name.equals("type")) {
4878      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.type");
4879    } else if (name.equals("variableType")) {
4880      throw new FHIRException("Cannot call addChild on a singleton property ResearchElementDefinition.variableType");
4881    } else if (name.equals("characteristic")) {
4882      return addCharacteristic();
4883    } else
4884      return super.addChild(name);
4885  }
4886
4887  public String fhirType() {
4888    return "ResearchElementDefinition";
4889
4890  }
4891
4892  public ResearchElementDefinition copy() {
4893    ResearchElementDefinition dst = new ResearchElementDefinition();
4894    copyValues(dst);
4895    return dst;
4896  }
4897
4898  public void copyValues(ResearchElementDefinition dst) {
4899    super.copyValues(dst);
4900    dst.url = url == null ? null : url.copy();
4901    if (identifier != null) {
4902      dst.identifier = new ArrayList<Identifier>();
4903      for (Identifier i : identifier)
4904        dst.identifier.add(i.copy());
4905    }
4906    ;
4907    dst.version = version == null ? null : version.copy();
4908    dst.name = name == null ? null : name.copy();
4909    dst.title = title == null ? null : title.copy();
4910    dst.shortTitle = shortTitle == null ? null : shortTitle.copy();
4911    dst.subtitle = subtitle == null ? null : subtitle.copy();
4912    dst.status = status == null ? null : status.copy();
4913    dst.experimental = experimental == null ? null : experimental.copy();
4914    dst.subject = subject == null ? null : subject.copy();
4915    dst.date = date == null ? null : date.copy();
4916    dst.publisher = publisher == null ? null : publisher.copy();
4917    if (contact != null) {
4918      dst.contact = new ArrayList<ContactDetail>();
4919      for (ContactDetail i : contact)
4920        dst.contact.add(i.copy());
4921    }
4922    ;
4923    dst.description = description == null ? null : description.copy();
4924    if (comment != null) {
4925      dst.comment = new ArrayList<StringType>();
4926      for (StringType i : comment)
4927        dst.comment.add(i.copy());
4928    }
4929    ;
4930    if (useContext != null) {
4931      dst.useContext = new ArrayList<UsageContext>();
4932      for (UsageContext i : useContext)
4933        dst.useContext.add(i.copy());
4934    }
4935    ;
4936    if (jurisdiction != null) {
4937      dst.jurisdiction = new ArrayList<CodeableConcept>();
4938      for (CodeableConcept i : jurisdiction)
4939        dst.jurisdiction.add(i.copy());
4940    }
4941    ;
4942    dst.purpose = purpose == null ? null : purpose.copy();
4943    dst.usage = usage == null ? null : usage.copy();
4944    dst.copyright = copyright == null ? null : copyright.copy();
4945    dst.approvalDate = approvalDate == null ? null : approvalDate.copy();
4946    dst.lastReviewDate = lastReviewDate == null ? null : lastReviewDate.copy();
4947    dst.effectivePeriod = effectivePeriod == null ? null : effectivePeriod.copy();
4948    if (topic != null) {
4949      dst.topic = new ArrayList<CodeableConcept>();
4950      for (CodeableConcept i : topic)
4951        dst.topic.add(i.copy());
4952    }
4953    ;
4954    if (author != null) {
4955      dst.author = new ArrayList<ContactDetail>();
4956      for (ContactDetail i : author)
4957        dst.author.add(i.copy());
4958    }
4959    ;
4960    if (editor != null) {
4961      dst.editor = new ArrayList<ContactDetail>();
4962      for (ContactDetail i : editor)
4963        dst.editor.add(i.copy());
4964    }
4965    ;
4966    if (reviewer != null) {
4967      dst.reviewer = new ArrayList<ContactDetail>();
4968      for (ContactDetail i : reviewer)
4969        dst.reviewer.add(i.copy());
4970    }
4971    ;
4972    if (endorser != null) {
4973      dst.endorser = new ArrayList<ContactDetail>();
4974      for (ContactDetail i : endorser)
4975        dst.endorser.add(i.copy());
4976    }
4977    ;
4978    if (relatedArtifact != null) {
4979      dst.relatedArtifact = new ArrayList<RelatedArtifact>();
4980      for (RelatedArtifact i : relatedArtifact)
4981        dst.relatedArtifact.add(i.copy());
4982    }
4983    ;
4984    if (library != null) {
4985      dst.library = new ArrayList<CanonicalType>();
4986      for (CanonicalType i : library)
4987        dst.library.add(i.copy());
4988    }
4989    ;
4990    dst.type = type == null ? null : type.copy();
4991    dst.variableType = variableType == null ? null : variableType.copy();
4992    if (characteristic != null) {
4993      dst.characteristic = new ArrayList<ResearchElementDefinitionCharacteristicComponent>();
4994      for (ResearchElementDefinitionCharacteristicComponent i : characteristic)
4995        dst.characteristic.add(i.copy());
4996    }
4997    ;
4998  }
4999
5000  protected ResearchElementDefinition typedCopy() {
5001    return copy();
5002  }
5003
5004  @Override
5005  public boolean equalsDeep(Base other_) {
5006    if (!super.equalsDeep(other_))
5007      return false;
5008    if (!(other_ instanceof ResearchElementDefinition))
5009      return false;
5010    ResearchElementDefinition o = (ResearchElementDefinition) other_;
5011    return compareDeep(identifier, o.identifier, true) && compareDeep(shortTitle, o.shortTitle, true)
5012        && compareDeep(subtitle, o.subtitle, true) && compareDeep(subject, o.subject, true)
5013        && compareDeep(comment, o.comment, true) && compareDeep(purpose, o.purpose, true)
5014        && compareDeep(usage, o.usage, true) && compareDeep(copyright, o.copyright, true)
5015        && compareDeep(approvalDate, o.approvalDate, true) && compareDeep(lastReviewDate, o.lastReviewDate, true)
5016        && compareDeep(effectivePeriod, o.effectivePeriod, true) && compareDeep(topic, o.topic, true)
5017        && compareDeep(author, o.author, true) && compareDeep(editor, o.editor, true)
5018        && compareDeep(reviewer, o.reviewer, true) && compareDeep(endorser, o.endorser, true)
5019        && compareDeep(relatedArtifact, o.relatedArtifact, true) && compareDeep(library, o.library, true)
5020        && compareDeep(type, o.type, true) && compareDeep(variableType, o.variableType, true)
5021        && compareDeep(characteristic, o.characteristic, true);
5022  }
5023
5024  @Override
5025  public boolean equalsShallow(Base other_) {
5026    if (!super.equalsShallow(other_))
5027      return false;
5028    if (!(other_ instanceof ResearchElementDefinition))
5029      return false;
5030    ResearchElementDefinition o = (ResearchElementDefinition) other_;
5031    return compareValues(shortTitle, o.shortTitle, true) && compareValues(subtitle, o.subtitle, true)
5032        && compareValues(comment, o.comment, true) && compareValues(purpose, o.purpose, true)
5033        && compareValues(usage, o.usage, true) && compareValues(copyright, o.copyright, true)
5034        && compareValues(approvalDate, o.approvalDate, true) && compareValues(lastReviewDate, o.lastReviewDate, true)
5035        && compareValues(type, o.type, true) && compareValues(variableType, o.variableType, true);
5036  }
5037
5038  public boolean isEmpty() {
5039    return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(identifier, shortTitle, subtitle, subject, comment,
5040        purpose, usage, copyright, approvalDate, lastReviewDate, effectivePeriod, topic, author, editor, reviewer,
5041        endorser, relatedArtifact, library, type, variableType, characteristic);
5042  }
5043
5044  @Override
5045  public ResourceType getResourceType() {
5046    return ResourceType.ResearchElementDefinition;
5047  }
5048
5049  /**
5050   * Search parameter: <b>date</b>
5051   * <p>
5052   * Description: <b>The research element definition publication date</b><br>
5053   * Type: <b>date</b><br>
5054   * Path: <b>ResearchElementDefinition.date</b><br>
5055   * </p>
5056   */
5057  @SearchParamDefinition(name = "date", path = "ResearchElementDefinition.date", description = "The research element definition publication date", type = "date")
5058  public static final String SP_DATE = "date";
5059  /**
5060   * <b>Fluent Client</b> search parameter constant for <b>date</b>
5061   * <p>
5062   * Description: <b>The research element definition publication date</b><br>
5063   * Type: <b>date</b><br>
5064   * Path: <b>ResearchElementDefinition.date</b><br>
5065   * </p>
5066   */
5067  public static final ca.uhn.fhir.rest.gclient.DateClientParam DATE = new ca.uhn.fhir.rest.gclient.DateClientParam(
5068      SP_DATE);
5069
5070  /**
5071   * Search parameter: <b>identifier</b>
5072   * <p>
5073   * Description: <b>External identifier for the research element
5074   * definition</b><br>
5075   * Type: <b>token</b><br>
5076   * Path: <b>ResearchElementDefinition.identifier</b><br>
5077   * </p>
5078   */
5079  @SearchParamDefinition(name = "identifier", path = "ResearchElementDefinition.identifier", description = "External identifier for the research element definition", type = "token")
5080  public static final String SP_IDENTIFIER = "identifier";
5081  /**
5082   * <b>Fluent Client</b> search parameter constant for <b>identifier</b>
5083   * <p>
5084   * Description: <b>External identifier for the research element
5085   * definition</b><br>
5086   * Type: <b>token</b><br>
5087   * Path: <b>ResearchElementDefinition.identifier</b><br>
5088   * </p>
5089   */
5090  public static final ca.uhn.fhir.rest.gclient.TokenClientParam IDENTIFIER = new ca.uhn.fhir.rest.gclient.TokenClientParam(
5091      SP_IDENTIFIER);
5092
5093  /**
5094   * Search parameter: <b>successor</b>
5095   * <p>
5096   * Description: <b>What resource is being referenced</b><br>
5097   * Type: <b>reference</b><br>
5098   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
5099   * </p>
5100   */
5101  @SearchParamDefinition(name = "successor", path = "ResearchElementDefinition.relatedArtifact.where(type='successor').resource", description = "What resource is being referenced", type = "reference")
5102  public static final String SP_SUCCESSOR = "successor";
5103  /**
5104   * <b>Fluent Client</b> search parameter constant for <b>successor</b>
5105   * <p>
5106   * Description: <b>What resource is being referenced</b><br>
5107   * Type: <b>reference</b><br>
5108   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
5109   * </p>
5110   */
5111  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam SUCCESSOR = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(
5112      SP_SUCCESSOR);
5113
5114  /**
5115   * Constant for fluent queries to be used to add include statements. Specifies
5116   * the path value of "<b>ResearchElementDefinition:successor</b>".
5117   */
5118  public static final ca.uhn.fhir.model.api.Include INCLUDE_SUCCESSOR = new ca.uhn.fhir.model.api.Include(
5119      "ResearchElementDefinition:successor").toLocked();
5120
5121  /**
5122   * Search parameter: <b>context-type-value</b>
5123   * <p>
5124   * Description: <b>A use context type and value assigned to the research element
5125   * definition</b><br>
5126   * Type: <b>composite</b><br>
5127   * Path: <b></b><br>
5128   * </p>
5129   */
5130  @SearchParamDefinition(name = "context-type-value", path = "ResearchElementDefinition.useContext", description = "A use context type and value assigned to the research element definition", type = "composite", compositeOf = {
5131      "context-type", "context" })
5132  public static final String SP_CONTEXT_TYPE_VALUE = "context-type-value";
5133  /**
5134   * <b>Fluent Client</b> search parameter constant for <b>context-type-value</b>
5135   * <p>
5136   * Description: <b>A use context type and value assigned to the research element
5137   * definition</b><br>
5138   * Type: <b>composite</b><br>
5139   * Path: <b></b><br>
5140   * </p>
5141   */
5142  public static final ca.uhn.fhir.rest.gclient.CompositeClientParam<ca.uhn.fhir.rest.gclient.TokenClientParam, ca.uhn.fhir.rest.gclient.TokenClientParam> CONTEXT_TYPE_VALUE = new ca.uhn.fhir.rest.gclient.CompositeClientParam<ca.uhn.fhir.rest.gclient.TokenClientParam, ca.uhn.fhir.rest.gclient.TokenClientParam>(
5143      SP_CONTEXT_TYPE_VALUE);
5144
5145  /**
5146   * Search parameter: <b>jurisdiction</b>
5147   * <p>
5148   * Description: <b>Intended jurisdiction for the research element
5149   * definition</b><br>
5150   * Type: <b>token</b><br>
5151   * Path: <b>ResearchElementDefinition.jurisdiction</b><br>
5152   * </p>
5153   */
5154  @SearchParamDefinition(name = "jurisdiction", path = "ResearchElementDefinition.jurisdiction", description = "Intended jurisdiction for the research element definition", type = "token")
5155  public static final String SP_JURISDICTION = "jurisdiction";
5156  /**
5157   * <b>Fluent Client</b> search parameter constant for <b>jurisdiction</b>
5158   * <p>
5159   * Description: <b>Intended jurisdiction for the research element
5160   * definition</b><br>
5161   * Type: <b>token</b><br>
5162   * Path: <b>ResearchElementDefinition.jurisdiction</b><br>
5163   * </p>
5164   */
5165  public static final ca.uhn.fhir.rest.gclient.TokenClientParam JURISDICTION = new ca.uhn.fhir.rest.gclient.TokenClientParam(
5166      SP_JURISDICTION);
5167
5168  /**
5169   * Search parameter: <b>description</b>
5170   * <p>
5171   * Description: <b>The description of the research element definition</b><br>
5172   * Type: <b>string</b><br>
5173   * Path: <b>ResearchElementDefinition.description</b><br>
5174   * </p>
5175   */
5176  @SearchParamDefinition(name = "description", path = "ResearchElementDefinition.description", description = "The description of the research element definition", type = "string")
5177  public static final String SP_DESCRIPTION = "description";
5178  /**
5179   * <b>Fluent Client</b> search parameter constant for <b>description</b>
5180   * <p>
5181   * Description: <b>The description of the research element definition</b><br>
5182   * Type: <b>string</b><br>
5183   * Path: <b>ResearchElementDefinition.description</b><br>
5184   * </p>
5185   */
5186  public static final ca.uhn.fhir.rest.gclient.StringClientParam DESCRIPTION = new ca.uhn.fhir.rest.gclient.StringClientParam(
5187      SP_DESCRIPTION);
5188
5189  /**
5190   * Search parameter: <b>derived-from</b>
5191   * <p>
5192   * Description: <b>What resource is being referenced</b><br>
5193   * Type: <b>reference</b><br>
5194   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
5195   * </p>
5196   */
5197  @SearchParamDefinition(name = "derived-from", path = "ResearchElementDefinition.relatedArtifact.where(type='derived-from').resource", description = "What resource is being referenced", type = "reference")
5198  public static final String SP_DERIVED_FROM = "derived-from";
5199  /**
5200   * <b>Fluent Client</b> search parameter constant for <b>derived-from</b>
5201   * <p>
5202   * Description: <b>What resource is being referenced</b><br>
5203   * Type: <b>reference</b><br>
5204   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
5205   * </p>
5206   */
5207  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam DERIVED_FROM = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(
5208      SP_DERIVED_FROM);
5209
5210  /**
5211   * Constant for fluent queries to be used to add include statements. Specifies
5212   * the path value of "<b>ResearchElementDefinition:derived-from</b>".
5213   */
5214  public static final ca.uhn.fhir.model.api.Include INCLUDE_DERIVED_FROM = new ca.uhn.fhir.model.api.Include(
5215      "ResearchElementDefinition:derived-from").toLocked();
5216
5217  /**
5218   * Search parameter: <b>context-type</b>
5219   * <p>
5220   * Description: <b>A type of use context assigned to the research element
5221   * definition</b><br>
5222   * Type: <b>token</b><br>
5223   * Path: <b>ResearchElementDefinition.useContext.code</b><br>
5224   * </p>
5225   */
5226  @SearchParamDefinition(name = "context-type", path = "ResearchElementDefinition.useContext.code", description = "A type of use context assigned to the research element definition", type = "token")
5227  public static final String SP_CONTEXT_TYPE = "context-type";
5228  /**
5229   * <b>Fluent Client</b> search parameter constant for <b>context-type</b>
5230   * <p>
5231   * Description: <b>A type of use context assigned to the research element
5232   * definition</b><br>
5233   * Type: <b>token</b><br>
5234   * Path: <b>ResearchElementDefinition.useContext.code</b><br>
5235   * </p>
5236   */
5237  public static final ca.uhn.fhir.rest.gclient.TokenClientParam CONTEXT_TYPE = new ca.uhn.fhir.rest.gclient.TokenClientParam(
5238      SP_CONTEXT_TYPE);
5239
5240  /**
5241   * Search parameter: <b>predecessor</b>
5242   * <p>
5243   * Description: <b>What resource is being referenced</b><br>
5244   * Type: <b>reference</b><br>
5245   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
5246   * </p>
5247   */
5248  @SearchParamDefinition(name = "predecessor", path = "ResearchElementDefinition.relatedArtifact.where(type='predecessor').resource", description = "What resource is being referenced", type = "reference")
5249  public static final String SP_PREDECESSOR = "predecessor";
5250  /**
5251   * <b>Fluent Client</b> search parameter constant for <b>predecessor</b>
5252   * <p>
5253   * Description: <b>What resource is being referenced</b><br>
5254   * Type: <b>reference</b><br>
5255   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
5256   * </p>
5257   */
5258  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam PREDECESSOR = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(
5259      SP_PREDECESSOR);
5260
5261  /**
5262   * Constant for fluent queries to be used to add include statements. Specifies
5263   * the path value of "<b>ResearchElementDefinition:predecessor</b>".
5264   */
5265  public static final ca.uhn.fhir.model.api.Include INCLUDE_PREDECESSOR = new ca.uhn.fhir.model.api.Include(
5266      "ResearchElementDefinition:predecessor").toLocked();
5267
5268  /**
5269   * Search parameter: <b>title</b>
5270   * <p>
5271   * Description: <b>The human-friendly name of the research element
5272   * definition</b><br>
5273   * Type: <b>string</b><br>
5274   * Path: <b>ResearchElementDefinition.title</b><br>
5275   * </p>
5276   */
5277  @SearchParamDefinition(name = "title", path = "ResearchElementDefinition.title", description = "The human-friendly name of the research element definition", type = "string")
5278  public static final String SP_TITLE = "title";
5279  /**
5280   * <b>Fluent Client</b> search parameter constant for <b>title</b>
5281   * <p>
5282   * Description: <b>The human-friendly name of the research element
5283   * definition</b><br>
5284   * Type: <b>string</b><br>
5285   * Path: <b>ResearchElementDefinition.title</b><br>
5286   * </p>
5287   */
5288  public static final ca.uhn.fhir.rest.gclient.StringClientParam TITLE = new ca.uhn.fhir.rest.gclient.StringClientParam(
5289      SP_TITLE);
5290
5291  /**
5292   * Search parameter: <b>composed-of</b>
5293   * <p>
5294   * Description: <b>What resource is being referenced</b><br>
5295   * Type: <b>reference</b><br>
5296   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
5297   * </p>
5298   */
5299  @SearchParamDefinition(name = "composed-of", path = "ResearchElementDefinition.relatedArtifact.where(type='composed-of').resource", description = "What resource is being referenced", type = "reference")
5300  public static final String SP_COMPOSED_OF = "composed-of";
5301  /**
5302   * <b>Fluent Client</b> search parameter constant for <b>composed-of</b>
5303   * <p>
5304   * Description: <b>What resource is being referenced</b><br>
5305   * Type: <b>reference</b><br>
5306   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
5307   * </p>
5308   */
5309  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam COMPOSED_OF = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(
5310      SP_COMPOSED_OF);
5311
5312  /**
5313   * Constant for fluent queries to be used to add include statements. Specifies
5314   * the path value of "<b>ResearchElementDefinition:composed-of</b>".
5315   */
5316  public static final ca.uhn.fhir.model.api.Include INCLUDE_COMPOSED_OF = new ca.uhn.fhir.model.api.Include(
5317      "ResearchElementDefinition:composed-of").toLocked();
5318
5319  /**
5320   * Search parameter: <b>version</b>
5321   * <p>
5322   * Description: <b>The business version of the research element
5323   * definition</b><br>
5324   * Type: <b>token</b><br>
5325   * Path: <b>ResearchElementDefinition.version</b><br>
5326   * </p>
5327   */
5328  @SearchParamDefinition(name = "version", path = "ResearchElementDefinition.version", description = "The business version of the research element definition", type = "token")
5329  public static final String SP_VERSION = "version";
5330  /**
5331   * <b>Fluent Client</b> search parameter constant for <b>version</b>
5332   * <p>
5333   * Description: <b>The business version of the research element
5334   * definition</b><br>
5335   * Type: <b>token</b><br>
5336   * Path: <b>ResearchElementDefinition.version</b><br>
5337   * </p>
5338   */
5339  public static final ca.uhn.fhir.rest.gclient.TokenClientParam VERSION = new ca.uhn.fhir.rest.gclient.TokenClientParam(
5340      SP_VERSION);
5341
5342  /**
5343   * Search parameter: <b>url</b>
5344   * <p>
5345   * Description: <b>The uri that identifies the research element
5346   * definition</b><br>
5347   * Type: <b>uri</b><br>
5348   * Path: <b>ResearchElementDefinition.url</b><br>
5349   * </p>
5350   */
5351  @SearchParamDefinition(name = "url", path = "ResearchElementDefinition.url", description = "The uri that identifies the research element definition", type = "uri")
5352  public static final String SP_URL = "url";
5353  /**
5354   * <b>Fluent Client</b> search parameter constant for <b>url</b>
5355   * <p>
5356   * Description: <b>The uri that identifies the research element
5357   * definition</b><br>
5358   * Type: <b>uri</b><br>
5359   * Path: <b>ResearchElementDefinition.url</b><br>
5360   * </p>
5361   */
5362  public static final ca.uhn.fhir.rest.gclient.UriClientParam URL = new ca.uhn.fhir.rest.gclient.UriClientParam(SP_URL);
5363
5364  /**
5365   * Search parameter: <b>context-quantity</b>
5366   * <p>
5367   * Description: <b>A quantity- or range-valued use context assigned to the
5368   * research element definition</b><br>
5369   * Type: <b>quantity</b><br>
5370   * Path: <b>ResearchElementDefinition.useContext.valueQuantity,
5371   * ResearchElementDefinition.useContext.valueRange</b><br>
5372   * </p>
5373   */
5374  @SearchParamDefinition(name = "context-quantity", path = "(ResearchElementDefinition.useContext.value as Quantity) | (ResearchElementDefinition.useContext.value as Range)", description = "A quantity- or range-valued use context assigned to the research element definition", type = "quantity")
5375  public static final String SP_CONTEXT_QUANTITY = "context-quantity";
5376  /**
5377   * <b>Fluent Client</b> search parameter constant for <b>context-quantity</b>
5378   * <p>
5379   * Description: <b>A quantity- or range-valued use context assigned to the
5380   * research element definition</b><br>
5381   * Type: <b>quantity</b><br>
5382   * Path: <b>ResearchElementDefinition.useContext.valueQuantity,
5383   * ResearchElementDefinition.useContext.valueRange</b><br>
5384   * </p>
5385   */
5386  public static final ca.uhn.fhir.rest.gclient.QuantityClientParam CONTEXT_QUANTITY = new ca.uhn.fhir.rest.gclient.QuantityClientParam(
5387      SP_CONTEXT_QUANTITY);
5388
5389  /**
5390   * Search parameter: <b>effective</b>
5391   * <p>
5392   * Description: <b>The time during which the research element definition is
5393   * intended to be in use</b><br>
5394   * Type: <b>date</b><br>
5395   * Path: <b>ResearchElementDefinition.effectivePeriod</b><br>
5396   * </p>
5397   */
5398  @SearchParamDefinition(name = "effective", path = "ResearchElementDefinition.effectivePeriod", description = "The time during which the research element definition is intended to be in use", type = "date")
5399  public static final String SP_EFFECTIVE = "effective";
5400  /**
5401   * <b>Fluent Client</b> search parameter constant for <b>effective</b>
5402   * <p>
5403   * Description: <b>The time during which the research element definition is
5404   * intended to be in use</b><br>
5405   * Type: <b>date</b><br>
5406   * Path: <b>ResearchElementDefinition.effectivePeriod</b><br>
5407   * </p>
5408   */
5409  public static final ca.uhn.fhir.rest.gclient.DateClientParam EFFECTIVE = new ca.uhn.fhir.rest.gclient.DateClientParam(
5410      SP_EFFECTIVE);
5411
5412  /**
5413   * Search parameter: <b>depends-on</b>
5414   * <p>
5415   * Description: <b>What resource is being referenced</b><br>
5416   * Type: <b>reference</b><br>
5417   * Path: <b>ResearchElementDefinition.relatedArtifact.resource,
5418   * ResearchElementDefinition.library</b><br>
5419   * </p>
5420   */
5421  @SearchParamDefinition(name = "depends-on", path = "ResearchElementDefinition.relatedArtifact.where(type='depends-on').resource | ResearchElementDefinition.library", description = "What resource is being referenced", type = "reference")
5422  public static final String SP_DEPENDS_ON = "depends-on";
5423  /**
5424   * <b>Fluent Client</b> search parameter constant for <b>depends-on</b>
5425   * <p>
5426   * Description: <b>What resource is being referenced</b><br>
5427   * Type: <b>reference</b><br>
5428   * Path: <b>ResearchElementDefinition.relatedArtifact.resource,
5429   * ResearchElementDefinition.library</b><br>
5430   * </p>
5431   */
5432  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam DEPENDS_ON = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(
5433      SP_DEPENDS_ON);
5434
5435  /**
5436   * Constant for fluent queries to be used to add include statements. Specifies
5437   * the path value of "<b>ResearchElementDefinition:depends-on</b>".
5438   */
5439  public static final ca.uhn.fhir.model.api.Include INCLUDE_DEPENDS_ON = new ca.uhn.fhir.model.api.Include(
5440      "ResearchElementDefinition:depends-on").toLocked();
5441
5442  /**
5443   * Search parameter: <b>name</b>
5444   * <p>
5445   * Description: <b>Computationally friendly name of the research element
5446   * definition</b><br>
5447   * Type: <b>string</b><br>
5448   * Path: <b>ResearchElementDefinition.name</b><br>
5449   * </p>
5450   */
5451  @SearchParamDefinition(name = "name", path = "ResearchElementDefinition.name", description = "Computationally friendly name of the research element definition", type = "string")
5452  public static final String SP_NAME = "name";
5453  /**
5454   * <b>Fluent Client</b> search parameter constant for <b>name</b>
5455   * <p>
5456   * Description: <b>Computationally friendly name of the research element
5457   * definition</b><br>
5458   * Type: <b>string</b><br>
5459   * Path: <b>ResearchElementDefinition.name</b><br>
5460   * </p>
5461   */
5462  public static final ca.uhn.fhir.rest.gclient.StringClientParam NAME = new ca.uhn.fhir.rest.gclient.StringClientParam(
5463      SP_NAME);
5464
5465  /**
5466   * Search parameter: <b>context</b>
5467   * <p>
5468   * Description: <b>A use context assigned to the research element
5469   * definition</b><br>
5470   * Type: <b>token</b><br>
5471   * Path: <b>ResearchElementDefinition.useContext.valueCodeableConcept</b><br>
5472   * </p>
5473   */
5474  @SearchParamDefinition(name = "context", path = "(ResearchElementDefinition.useContext.value as CodeableConcept)", description = "A use context assigned to the research element definition", type = "token")
5475  public static final String SP_CONTEXT = "context";
5476  /**
5477   * <b>Fluent Client</b> search parameter constant for <b>context</b>
5478   * <p>
5479   * Description: <b>A use context assigned to the research element
5480   * definition</b><br>
5481   * Type: <b>token</b><br>
5482   * Path: <b>ResearchElementDefinition.useContext.valueCodeableConcept</b><br>
5483   * </p>
5484   */
5485  public static final ca.uhn.fhir.rest.gclient.TokenClientParam CONTEXT = new ca.uhn.fhir.rest.gclient.TokenClientParam(
5486      SP_CONTEXT);
5487
5488  /**
5489   * Search parameter: <b>publisher</b>
5490   * <p>
5491   * Description: <b>Name of the publisher of the research element
5492   * definition</b><br>
5493   * Type: <b>string</b><br>
5494   * Path: <b>ResearchElementDefinition.publisher</b><br>
5495   * </p>
5496   */
5497  @SearchParamDefinition(name = "publisher", path = "ResearchElementDefinition.publisher", description = "Name of the publisher of the research element definition", type = "string")
5498  public static final String SP_PUBLISHER = "publisher";
5499  /**
5500   * <b>Fluent Client</b> search parameter constant for <b>publisher</b>
5501   * <p>
5502   * Description: <b>Name of the publisher of the research element
5503   * definition</b><br>
5504   * Type: <b>string</b><br>
5505   * Path: <b>ResearchElementDefinition.publisher</b><br>
5506   * </p>
5507   */
5508  public static final ca.uhn.fhir.rest.gclient.StringClientParam PUBLISHER = new ca.uhn.fhir.rest.gclient.StringClientParam(
5509      SP_PUBLISHER);
5510
5511  /**
5512   * Search parameter: <b>topic</b>
5513   * <p>
5514   * Description: <b>Topics associated with the ResearchElementDefinition</b><br>
5515   * Type: <b>token</b><br>
5516   * Path: <b>ResearchElementDefinition.topic</b><br>
5517   * </p>
5518   */
5519  @SearchParamDefinition(name = "topic", path = "ResearchElementDefinition.topic", description = "Topics associated with the ResearchElementDefinition", type = "token")
5520  public static final String SP_TOPIC = "topic";
5521  /**
5522   * <b>Fluent Client</b> search parameter constant for <b>topic</b>
5523   * <p>
5524   * Description: <b>Topics associated with the ResearchElementDefinition</b><br>
5525   * Type: <b>token</b><br>
5526   * Path: <b>ResearchElementDefinition.topic</b><br>
5527   * </p>
5528   */
5529  public static final ca.uhn.fhir.rest.gclient.TokenClientParam TOPIC = new ca.uhn.fhir.rest.gclient.TokenClientParam(
5530      SP_TOPIC);
5531
5532  /**
5533   * Search parameter: <b>context-type-quantity</b>
5534   * <p>
5535   * Description: <b>A use context type and quantity- or range-based value
5536   * assigned to the research element definition</b><br>
5537   * Type: <b>composite</b><br>
5538   * Path: <b></b><br>
5539   * </p>
5540   */
5541  @SearchParamDefinition(name = "context-type-quantity", path = "ResearchElementDefinition.useContext", description = "A use context type and quantity- or range-based value assigned to the research element definition", type = "composite", compositeOf = {
5542      "context-type", "context-quantity" })
5543  public static final String SP_CONTEXT_TYPE_QUANTITY = "context-type-quantity";
5544  /**
5545   * <b>Fluent Client</b> search parameter constant for
5546   * <b>context-type-quantity</b>
5547   * <p>
5548   * Description: <b>A use context type and quantity- or range-based value
5549   * assigned to the research element definition</b><br>
5550   * Type: <b>composite</b><br>
5551   * Path: <b></b><br>
5552   * </p>
5553   */
5554  public static final ca.uhn.fhir.rest.gclient.CompositeClientParam<ca.uhn.fhir.rest.gclient.TokenClientParam, ca.uhn.fhir.rest.gclient.QuantityClientParam> CONTEXT_TYPE_QUANTITY = new ca.uhn.fhir.rest.gclient.CompositeClientParam<ca.uhn.fhir.rest.gclient.TokenClientParam, ca.uhn.fhir.rest.gclient.QuantityClientParam>(
5555      SP_CONTEXT_TYPE_QUANTITY);
5556
5557  /**
5558   * Search parameter: <b>status</b>
5559   * <p>
5560   * Description: <b>The current status of the research element definition</b><br>
5561   * Type: <b>token</b><br>
5562   * Path: <b>ResearchElementDefinition.status</b><br>
5563   * </p>
5564   */
5565  @SearchParamDefinition(name = "status", path = "ResearchElementDefinition.status", description = "The current status of the research element definition", type = "token")
5566  public static final String SP_STATUS = "status";
5567  /**
5568   * <b>Fluent Client</b> search parameter constant for <b>status</b>
5569   * <p>
5570   * Description: <b>The current status of the research element definition</b><br>
5571   * Type: <b>token</b><br>
5572   * Path: <b>ResearchElementDefinition.status</b><br>
5573   * </p>
5574   */
5575  public static final ca.uhn.fhir.rest.gclient.TokenClientParam STATUS = new ca.uhn.fhir.rest.gclient.TokenClientParam(
5576      SP_STATUS);
5577
5578}