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 Thu, Dec 27, 2018 10:06-0500 for FHIR v4.0.0
033
034import java.util.*;
035
036import org.hl7.fhir.utilities.Utilities;
037import org.hl7.fhir.r4.model.Enumerations.*;
038import ca.uhn.fhir.model.api.annotation.ResourceDef;
039import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
040import ca.uhn.fhir.model.api.annotation.Child;
041import ca.uhn.fhir.model.api.annotation.ChildOrder;
042import ca.uhn.fhir.model.api.annotation.Description;
043import ca.uhn.fhir.model.api.annotation.Block;
044import org.hl7.fhir.instance.model.api.*;
045import org.hl7.fhir.exceptions.FHIRException;
046/**
047 * The ResearchElementDefinition resource describes a "PICO" element that knowledge (evidence, assertion, recommendation) is about.
048 */
049@ResourceDef(name="ResearchElementDefinition", profile="http://hl7.org/fhir/StructureDefinition/ResearchElementDefinition")
050@ChildOrder(names={"url", "identifier", "version", "name", "title", "shortTitle", "subtitle", "status", "experimental", "subject[x]", "date", "publisher", "contact", "description", "comment", "useContext", "jurisdiction", "purpose", "usage", "copyright", "approvalDate", "lastReviewDate", "effectivePeriod", "topic", "author", "editor", "reviewer", "endorser", "relatedArtifact", "library", "type", "variableType", "characteristic"})
051public class ResearchElementDefinition extends MetadataResource {
052
053    public enum ResearchElementType {
054        /**
055         * The element defines the population that forms the basis for research.
056         */
057        POPULATION, 
058        /**
059         * The element defines an exposure within the population that is being researched.
060         */
061        EXPOSURE, 
062        /**
063         * The element defines an outcome within the population that is being researched.
064         */
065        OUTCOME, 
066        /**
067         * added to help the parsers with the generic types
068         */
069        NULL;
070        public static ResearchElementType fromCode(String codeString) throws FHIRException {
071            if (codeString == null || "".equals(codeString))
072                return null;
073        if ("population".equals(codeString))
074          return POPULATION;
075        if ("exposure".equals(codeString))
076          return EXPOSURE;
077        if ("outcome".equals(codeString))
078          return OUTCOME;
079        if (Configuration.isAcceptInvalidEnums())
080          return null;
081        else
082          throw new FHIRException("Unknown ResearchElementType code '"+codeString+"'");
083        }
084        public String toCode() {
085          switch (this) {
086            case POPULATION: return "population";
087            case EXPOSURE: return "exposure";
088            case OUTCOME: return "outcome";
089            default: return "?";
090          }
091        }
092        public String getSystem() {
093          switch (this) {
094            case POPULATION: return "http://hl7.org/fhir/research-element-type";
095            case EXPOSURE: return "http://hl7.org/fhir/research-element-type";
096            case OUTCOME: return "http://hl7.org/fhir/research-element-type";
097            default: return "?";
098          }
099        }
100        public String getDefinition() {
101          switch (this) {
102            case POPULATION: return "The element defines the population that forms the basis for research.";
103            case EXPOSURE: return "The element defines an exposure within the population that is being researched.";
104            case OUTCOME: return "The element defines an outcome within the population that is being researched.";
105            default: return "?";
106          }
107        }
108        public String getDisplay() {
109          switch (this) {
110            case POPULATION: return "Population";
111            case EXPOSURE: return "Exposure";
112            case OUTCOME: return "Outcome";
113            default: return "?";
114          }
115        }
116    }
117
118  public static class ResearchElementTypeEnumFactory implements EnumFactory<ResearchElementType> {
119    public ResearchElementType fromCode(String codeString) throws IllegalArgumentException {
120      if (codeString == null || "".equals(codeString))
121            if (codeString == null || "".equals(codeString))
122                return null;
123        if ("population".equals(codeString))
124          return ResearchElementType.POPULATION;
125        if ("exposure".equals(codeString))
126          return ResearchElementType.EXPOSURE;
127        if ("outcome".equals(codeString))
128          return ResearchElementType.OUTCOME;
129        throw new IllegalArgumentException("Unknown ResearchElementType code '"+codeString+"'");
130        }
131        public Enumeration<ResearchElementType> fromType(Base code) throws FHIRException {
132          if (code == null)
133            return null;
134          if (code.isEmpty())
135            return new Enumeration<ResearchElementType>(this);
136          String codeString = ((PrimitiveType) code).asStringValue();
137          if (codeString == null || "".equals(codeString))
138            return null;
139        if ("population".equals(codeString))
140          return new Enumeration<ResearchElementType>(this, ResearchElementType.POPULATION);
141        if ("exposure".equals(codeString))
142          return new Enumeration<ResearchElementType>(this, ResearchElementType.EXPOSURE);
143        if ("outcome".equals(codeString))
144          return new Enumeration<ResearchElementType>(this, ResearchElementType.OUTCOME);
145        throw new FHIRException("Unknown ResearchElementType code '"+codeString+"'");
146        }
147    public String toCode(ResearchElementType code) {
148      if (code == ResearchElementType.POPULATION)
149        return "population";
150      if (code == ResearchElementType.EXPOSURE)
151        return "exposure";
152      if (code == ResearchElementType.OUTCOME)
153        return "outcome";
154      return "?";
155      }
156    public String toSystem(ResearchElementType code) {
157      return code.getSystem();
158      }
159    }
160
161    public enum VariableType {
162        /**
163         * The variable is dichotomous, such as present or absent.
164         */
165        DICHOTOMOUS, 
166        /**
167         * The variable is a continuous result such as a quantity.
168         */
169        CONTINUOUS, 
170        /**
171         * The variable is described narratively rather than quantitatively.
172         */
173        DESCRIPTIVE, 
174        /**
175         * added to help the parsers with the generic types
176         */
177        NULL;
178        public static VariableType fromCode(String codeString) throws FHIRException {
179            if (codeString == null || "".equals(codeString))
180                return null;
181        if ("dichotomous".equals(codeString))
182          return DICHOTOMOUS;
183        if ("continuous".equals(codeString))
184          return CONTINUOUS;
185        if ("descriptive".equals(codeString))
186          return DESCRIPTIVE;
187        if (Configuration.isAcceptInvalidEnums())
188          return null;
189        else
190          throw new FHIRException("Unknown VariableType code '"+codeString+"'");
191        }
192        public String toCode() {
193          switch (this) {
194            case DICHOTOMOUS: return "dichotomous";
195            case CONTINUOUS: return "continuous";
196            case DESCRIPTIVE: return "descriptive";
197            default: return "?";
198          }
199        }
200        public String getSystem() {
201          switch (this) {
202            case DICHOTOMOUS: return "http://hl7.org/fhir/variable-type";
203            case CONTINUOUS: return "http://hl7.org/fhir/variable-type";
204            case DESCRIPTIVE: return "http://hl7.org/fhir/variable-type";
205            default: return "?";
206          }
207        }
208        public String getDefinition() {
209          switch (this) {
210            case DICHOTOMOUS: return "The variable is dichotomous, such as present or absent.";
211            case CONTINUOUS: return "The variable is a continuous result such as a quantity.";
212            case DESCRIPTIVE: return "The variable is described narratively rather than quantitatively.";
213            default: return "?";
214          }
215        }
216        public String getDisplay() {
217          switch (this) {
218            case DICHOTOMOUS: return "Dichotomous";
219            case CONTINUOUS: return "Continuous";
220            case DESCRIPTIVE: return "Descriptive";
221            default: return "?";
222          }
223        }
224    }
225
226  public static class VariableTypeEnumFactory implements EnumFactory<VariableType> {
227    public VariableType fromCode(String codeString) throws IllegalArgumentException {
228      if (codeString == null || "".equals(codeString))
229            if (codeString == null || "".equals(codeString))
230                return null;
231        if ("dichotomous".equals(codeString))
232          return VariableType.DICHOTOMOUS;
233        if ("continuous".equals(codeString))
234          return VariableType.CONTINUOUS;
235        if ("descriptive".equals(codeString))
236          return VariableType.DESCRIPTIVE;
237        throw new IllegalArgumentException("Unknown VariableType code '"+codeString+"'");
238        }
239        public Enumeration<VariableType> fromType(Base code) throws FHIRException {
240          if (code == null)
241            return null;
242          if (code.isEmpty())
243            return new Enumeration<VariableType>(this);
244          String codeString = ((PrimitiveType) code).asStringValue();
245          if (codeString == null || "".equals(codeString))
246            return null;
247        if ("dichotomous".equals(codeString))
248          return new Enumeration<VariableType>(this, VariableType.DICHOTOMOUS);
249        if ("continuous".equals(codeString))
250          return new Enumeration<VariableType>(this, VariableType.CONTINUOUS);
251        if ("descriptive".equals(codeString))
252          return new Enumeration<VariableType>(this, VariableType.DESCRIPTIVE);
253        throw new FHIRException("Unknown VariableType code '"+codeString+"'");
254        }
255    public String toCode(VariableType code) {
256      if (code == VariableType.DICHOTOMOUS)
257        return "dichotomous";
258      if (code == VariableType.CONTINUOUS)
259        return "continuous";
260      if (code == VariableType.DESCRIPTIVE)
261        return "descriptive";
262      return "?";
263      }
264    public String toSystem(VariableType code) {
265      return code.getSystem();
266      }
267    }
268
269    public enum GroupMeasure {
270        /**
271         * Aggregated using Mean of participant values.
272         */
273        MEAN, 
274        /**
275         * Aggregated using Median of participant values.
276         */
277        MEDIAN, 
278        /**
279         * Aggregated using Mean of study mean values.
280         */
281        MEANOFMEAN, 
282        /**
283         * Aggregated using Mean of study median values.
284         */
285        MEANOFMEDIAN, 
286        /**
287         * Aggregated using Median of study mean values.
288         */
289        MEDIANOFMEAN, 
290        /**
291         * Aggregated using Median of study median values.
292         */
293        MEDIANOFMEDIAN, 
294        /**
295         * added to help the parsers with the generic types
296         */
297        NULL;
298        public static GroupMeasure fromCode(String codeString) throws FHIRException {
299            if (codeString == null || "".equals(codeString))
300                return null;
301        if ("mean".equals(codeString))
302          return MEAN;
303        if ("median".equals(codeString))
304          return MEDIAN;
305        if ("mean-of-mean".equals(codeString))
306          return MEANOFMEAN;
307        if ("mean-of-median".equals(codeString))
308          return MEANOFMEDIAN;
309        if ("median-of-mean".equals(codeString))
310          return MEDIANOFMEAN;
311        if ("median-of-median".equals(codeString))
312          return MEDIANOFMEDIAN;
313        if (Configuration.isAcceptInvalidEnums())
314          return null;
315        else
316          throw new FHIRException("Unknown GroupMeasure code '"+codeString+"'");
317        }
318        public String toCode() {
319          switch (this) {
320            case MEAN: return "mean";
321            case MEDIAN: return "median";
322            case MEANOFMEAN: return "mean-of-mean";
323            case MEANOFMEDIAN: return "mean-of-median";
324            case MEDIANOFMEAN: return "median-of-mean";
325            case MEDIANOFMEDIAN: return "median-of-median";
326            default: return "?";
327          }
328        }
329        public String getSystem() {
330          switch (this) {
331            case MEAN: return "http://hl7.org/fhir/group-measure";
332            case MEDIAN: return "http://hl7.org/fhir/group-measure";
333            case MEANOFMEAN: return "http://hl7.org/fhir/group-measure";
334            case MEANOFMEDIAN: return "http://hl7.org/fhir/group-measure";
335            case MEDIANOFMEAN: return "http://hl7.org/fhir/group-measure";
336            case MEDIANOFMEDIAN: return "http://hl7.org/fhir/group-measure";
337            default: return "?";
338          }
339        }
340        public String getDefinition() {
341          switch (this) {
342            case MEAN: return "Aggregated using Mean of participant values.";
343            case MEDIAN: return "Aggregated using Median of participant values.";
344            case MEANOFMEAN: return "Aggregated using Mean of study mean values.";
345            case MEANOFMEDIAN: return "Aggregated using Mean of study median values.";
346            case MEDIANOFMEAN: return "Aggregated using Median of study mean values.";
347            case MEDIANOFMEDIAN: return "Aggregated using Median of study median values.";
348            default: return "?";
349          }
350        }
351        public String getDisplay() {
352          switch (this) {
353            case MEAN: return "Mean";
354            case MEDIAN: return "Median";
355            case MEANOFMEAN: return "Mean of Study Means";
356            case MEANOFMEDIAN: return "Mean of Study Medins";
357            case MEDIANOFMEAN: return "Median of Study Means";
358            case MEDIANOFMEDIAN: return "Median of Study Medians";
359            default: return "?";
360          }
361        }
362    }
363
364  public static class GroupMeasureEnumFactory implements EnumFactory<GroupMeasure> {
365    public GroupMeasure fromCode(String codeString) throws IllegalArgumentException {
366      if (codeString == null || "".equals(codeString))
367            if (codeString == null || "".equals(codeString))
368                return null;
369        if ("mean".equals(codeString))
370          return GroupMeasure.MEAN;
371        if ("median".equals(codeString))
372          return GroupMeasure.MEDIAN;
373        if ("mean-of-mean".equals(codeString))
374          return GroupMeasure.MEANOFMEAN;
375        if ("mean-of-median".equals(codeString))
376          return GroupMeasure.MEANOFMEDIAN;
377        if ("median-of-mean".equals(codeString))
378          return GroupMeasure.MEDIANOFMEAN;
379        if ("median-of-median".equals(codeString))
380          return GroupMeasure.MEDIANOFMEDIAN;
381        throw new IllegalArgumentException("Unknown GroupMeasure code '"+codeString+"'");
382        }
383        public Enumeration<GroupMeasure> fromType(Base code) throws FHIRException {
384          if (code == null)
385            return null;
386          if (code.isEmpty())
387            return new Enumeration<GroupMeasure>(this);
388          String codeString = ((PrimitiveType) code).asStringValue();
389          if (codeString == null || "".equals(codeString))
390            return null;
391        if ("mean".equals(codeString))
392          return new Enumeration<GroupMeasure>(this, GroupMeasure.MEAN);
393        if ("median".equals(codeString))
394          return new Enumeration<GroupMeasure>(this, GroupMeasure.MEDIAN);
395        if ("mean-of-mean".equals(codeString))
396          return new Enumeration<GroupMeasure>(this, GroupMeasure.MEANOFMEAN);
397        if ("mean-of-median".equals(codeString))
398          return new Enumeration<GroupMeasure>(this, GroupMeasure.MEANOFMEDIAN);
399        if ("median-of-mean".equals(codeString))
400          return new Enumeration<GroupMeasure>(this, GroupMeasure.MEDIANOFMEAN);
401        if ("median-of-median".equals(codeString))
402          return new Enumeration<GroupMeasure>(this, GroupMeasure.MEDIANOFMEDIAN);
403        throw new FHIRException("Unknown GroupMeasure code '"+codeString+"'");
404        }
405    public String toCode(GroupMeasure code) {
406      if (code == GroupMeasure.MEAN)
407        return "mean";
408      if (code == GroupMeasure.MEDIAN)
409        return "median";
410      if (code == GroupMeasure.MEANOFMEAN)
411        return "mean-of-mean";
412      if (code == GroupMeasure.MEANOFMEDIAN)
413        return "mean-of-median";
414      if (code == GroupMeasure.MEDIANOFMEAN)
415        return "median-of-mean";
416      if (code == GroupMeasure.MEDIANOFMEDIAN)
417        return "median-of-median";
418      return "?";
419      }
420    public String toSystem(GroupMeasure code) {
421      return code.getSystem();
422      }
423    }
424
425    @Block()
426    public static class ResearchElementDefinitionCharacteristicComponent extends BackboneElement implements IBaseBackboneElement {
427        /**
428         * 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).
429         */
430        @Child(name = "definition", type = {CodeableConcept.class, CanonicalType.class, Expression.class, DataRequirement.class}, order=1, min=1, max=1, modifier=false, summary=true)
431        @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)." )
432        protected Type definition;
433
434        /**
435         * Use UsageContext to define the members of the population, such as Age Ranges, Genders, Settings.
436         */
437        @Child(name = "usageContext", type = {UsageContext.class}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
438        @Description(shortDefinition="What code/value pairs define members?", formalDefinition="Use UsageContext to define the members of the population, such as Age Ranges, Genders, Settings." )
439        protected List<UsageContext> usageContext;
440
441        /**
442         * When true, members with this characteristic are excluded from the element.
443         */
444        @Child(name = "exclude", type = {BooleanType.class}, order=3, min=0, max=1, modifier=false, summary=false)
445        @Description(shortDefinition="Whether the characteristic includes or excludes members", formalDefinition="When true, members with this characteristic are excluded from the element." )
446        protected BooleanType exclude;
447
448        /**
449         * Specifies the UCUM unit for the outcome.
450         */
451        @Child(name = "unitOfMeasure", type = {CodeableConcept.class}, order=4, min=0, max=1, modifier=false, summary=false)
452        @Description(shortDefinition="What unit is the outcome described in?", formalDefinition="Specifies the UCUM unit for the outcome." )
453        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ucum-units")
454        protected CodeableConcept unitOfMeasure;
455
456        /**
457         * A narrative description of the time period the study covers.
458         */
459        @Child(name = "studyEffectiveDescription", type = {StringType.class}, order=5, min=0, max=1, modifier=false, summary=false)
460        @Description(shortDefinition="What time period does the study cover", formalDefinition="A narrative description of the time period the study covers." )
461        protected StringType studyEffectiveDescription;
462
463        /**
464         * Indicates what effective period the study covers.
465         */
466        @Child(name = "studyEffective", type = {DateTimeType.class, Period.class, Duration.class, Timing.class}, order=6, min=0, max=1, modifier=false, summary=false)
467        @Description(shortDefinition="What time period does the study cover", formalDefinition="Indicates what effective period the study covers." )
468        protected Type studyEffective;
469
470        /**
471         * Indicates duration from the study initiation.
472         */
473        @Child(name = "studyEffectiveTimeFromStart", type = {Duration.class}, order=7, min=0, max=1, modifier=false, summary=false)
474        @Description(shortDefinition="Observation time from study start", formalDefinition="Indicates duration from the study initiation." )
475        protected Duration studyEffectiveTimeFromStart;
476
477        /**
478         * Indicates how elements are aggregated within the study effective period.
479         */
480        @Child(name = "studyEffectiveGroupMeasure", type = {CodeType.class}, order=8, min=0, max=1, modifier=false, summary=false)
481        @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." )
482        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/group-measure")
483        protected Enumeration<GroupMeasure> studyEffectiveGroupMeasure;
484
485        /**
486         * A narrative description of the time period the study covers.
487         */
488        @Child(name = "participantEffectiveDescription", type = {StringType.class}, order=9, min=0, max=1, modifier=false, summary=false)
489        @Description(shortDefinition="What time period do participants cover", formalDefinition="A narrative description of the time period the study covers." )
490        protected StringType participantEffectiveDescription;
491
492        /**
493         * Indicates what effective period the study covers.
494         */
495        @Child(name = "participantEffective", type = {DateTimeType.class, Period.class, Duration.class, Timing.class}, order=10, min=0, max=1, modifier=false, summary=false)
496        @Description(shortDefinition="What time period do participants cover", formalDefinition="Indicates what effective period the study covers." )
497        protected Type participantEffective;
498
499        /**
500         * Indicates duration from the participant's study entry.
501         */
502        @Child(name = "participantEffectiveTimeFromStart", type = {Duration.class}, order=11, min=0, max=1, modifier=false, summary=false)
503        @Description(shortDefinition="Observation time from study start", formalDefinition="Indicates duration from the participant's study entry." )
504        protected Duration participantEffectiveTimeFromStart;
505
506        /**
507         * Indicates how elements are aggregated within the study effective period.
508         */
509        @Child(name = "participantEffectiveGroupMeasure", type = {CodeType.class}, order=12, min=0, max=1, modifier=false, summary=false)
510        @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." )
511        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/group-measure")
512        protected Enumeration<GroupMeasure> participantEffectiveGroupMeasure;
513
514        private static final long serialVersionUID = -1102952665L;
515
516    /**
517     * Constructor
518     */
519      public ResearchElementDefinitionCharacteristicComponent() {
520        super();
521      }
522
523    /**
524     * Constructor
525     */
526      public ResearchElementDefinitionCharacteristicComponent(Type definition) {
527        super();
528        this.definition = definition;
529      }
530
531        /**
532         * @return {@link #definition} (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).)
533         */
534        public Type getDefinition() { 
535          return this.definition;
536        }
537
538        /**
539         * @return {@link #definition} (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).)
540         */
541        public CodeableConcept getDefinitionCodeableConcept() throws FHIRException { 
542          if (this.definition == null)
543            this.definition = new CodeableConcept();
544          if (!(this.definition instanceof CodeableConcept))
545            throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "+this.definition.getClass().getName()+" was encountered");
546          return (CodeableConcept) this.definition;
547        }
548
549        public boolean hasDefinitionCodeableConcept() { 
550          return this != null && this.definition instanceof CodeableConcept;
551        }
552
553        /**
554         * @return {@link #definition} (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).)
555         */
556        public CanonicalType getDefinitionCanonicalType() throws FHIRException { 
557          if (this.definition == null)
558            this.definition = new CanonicalType();
559          if (!(this.definition instanceof CanonicalType))
560            throw new FHIRException("Type mismatch: the type CanonicalType was expected, but "+this.definition.getClass().getName()+" was encountered");
561          return (CanonicalType) this.definition;
562        }
563
564        public boolean hasDefinitionCanonicalType() { 
565          return this != null && this.definition instanceof CanonicalType;
566        }
567
568        /**
569         * @return {@link #definition} (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).)
570         */
571        public Expression getDefinitionExpression() throws FHIRException { 
572          if (this.definition == null)
573            this.definition = new Expression();
574          if (!(this.definition instanceof Expression))
575            throw new FHIRException("Type mismatch: the type Expression was expected, but "+this.definition.getClass().getName()+" was encountered");
576          return (Expression) this.definition;
577        }
578
579        public boolean hasDefinitionExpression() { 
580          return this != null && this.definition instanceof Expression;
581        }
582
583        /**
584         * @return {@link #definition} (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).)
585         */
586        public DataRequirement getDefinitionDataRequirement() throws FHIRException { 
587          if (this.definition == null)
588            this.definition = new DataRequirement();
589          if (!(this.definition instanceof DataRequirement))
590            throw new FHIRException("Type mismatch: the type DataRequirement was expected, but "+this.definition.getClass().getName()+" was encountered");
591          return (DataRequirement) this.definition;
592        }
593
594        public boolean hasDefinitionDataRequirement() { 
595          return this != null && this.definition instanceof DataRequirement;
596        }
597
598        public boolean hasDefinition() { 
599          return this.definition != null && !this.definition.isEmpty();
600        }
601
602        /**
603         * @param value {@link #definition} (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).)
604         */
605        public ResearchElementDefinitionCharacteristicComponent setDefinition(Type value) { 
606          if (value != null && !(value instanceof CodeableConcept || value instanceof CanonicalType || value instanceof Expression || value instanceof DataRequirement))
607            throw new Error("Not the right type for ResearchElementDefinition.characteristic.definition[x]: "+value.fhirType());
608          this.definition = value;
609          return this;
610        }
611
612        /**
613         * @return {@link #usageContext} (Use UsageContext to define the members of the population, such as Age Ranges, Genders, Settings.)
614         */
615        public List<UsageContext> getUsageContext() { 
616          if (this.usageContext == null)
617            this.usageContext = new ArrayList<UsageContext>();
618          return this.usageContext;
619        }
620
621        /**
622         * @return Returns a reference to <code>this</code> for easy method chaining
623         */
624        public ResearchElementDefinitionCharacteristicComponent setUsageContext(List<UsageContext> theUsageContext) { 
625          this.usageContext = theUsageContext;
626          return this;
627        }
628
629        public boolean hasUsageContext() { 
630          if (this.usageContext == null)
631            return false;
632          for (UsageContext item : this.usageContext)
633            if (!item.isEmpty())
634              return true;
635          return false;
636        }
637
638        public UsageContext addUsageContext() { //3
639          UsageContext t = new UsageContext();
640          if (this.usageContext == null)
641            this.usageContext = new ArrayList<UsageContext>();
642          this.usageContext.add(t);
643          return t;
644        }
645
646        public ResearchElementDefinitionCharacteristicComponent addUsageContext(UsageContext t) { //3
647          if (t == null)
648            return this;
649          if (this.usageContext == null)
650            this.usageContext = new ArrayList<UsageContext>();
651          this.usageContext.add(t);
652          return this;
653        }
654
655        /**
656         * @return The first repetition of repeating field {@link #usageContext}, creating it if it does not already exist
657         */
658        public UsageContext getUsageContextFirstRep() { 
659          if (getUsageContext().isEmpty()) {
660            addUsageContext();
661          }
662          return getUsageContext().get(0);
663        }
664
665        /**
666         * @return {@link #exclude} (When true, members with this characteristic are excluded from the element.). This is the underlying object with id, value and extensions. The accessor "getExclude" gives direct access to the value
667         */
668        public BooleanType getExcludeElement() { 
669          if (this.exclude == null)
670            if (Configuration.errorOnAutoCreate())
671              throw new Error("Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.exclude");
672            else if (Configuration.doAutoCreate())
673              this.exclude = new BooleanType(); // bb
674          return this.exclude;
675        }
676
677        public boolean hasExcludeElement() { 
678          return this.exclude != null && !this.exclude.isEmpty();
679        }
680
681        public boolean hasExclude() { 
682          return this.exclude != null && !this.exclude.isEmpty();
683        }
684
685        /**
686         * @param value {@link #exclude} (When true, members with this characteristic are excluded from the element.). This is the underlying object with id, value and extensions. The accessor "getExclude" gives direct access to the value
687         */
688        public ResearchElementDefinitionCharacteristicComponent setExcludeElement(BooleanType value) { 
689          this.exclude = value;
690          return this;
691        }
692
693        /**
694         * @return When true, members with this characteristic are excluded from the element.
695         */
696        public boolean getExclude() { 
697          return this.exclude == null || this.exclude.isEmpty() ? false : this.exclude.getValue();
698        }
699
700        /**
701         * @param value When true, members with this characteristic are excluded from the element.
702         */
703        public ResearchElementDefinitionCharacteristicComponent setExclude(boolean value) { 
704            if (this.exclude == null)
705              this.exclude = new BooleanType();
706            this.exclude.setValue(value);
707          return this;
708        }
709
710        /**
711         * @return {@link #unitOfMeasure} (Specifies the UCUM unit for the outcome.)
712         */
713        public CodeableConcept getUnitOfMeasure() { 
714          if (this.unitOfMeasure == null)
715            if (Configuration.errorOnAutoCreate())
716              throw new Error("Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.unitOfMeasure");
717            else if (Configuration.doAutoCreate())
718              this.unitOfMeasure = new CodeableConcept(); // cc
719          return this.unitOfMeasure;
720        }
721
722        public boolean hasUnitOfMeasure() { 
723          return this.unitOfMeasure != null && !this.unitOfMeasure.isEmpty();
724        }
725
726        /**
727         * @param value {@link #unitOfMeasure} (Specifies the UCUM unit for the outcome.)
728         */
729        public ResearchElementDefinitionCharacteristicComponent setUnitOfMeasure(CodeableConcept value) { 
730          this.unitOfMeasure = value;
731          return this;
732        }
733
734        /**
735         * @return {@link #studyEffectiveDescription} (A narrative description of the time period the study covers.). This is the underlying object with id, value and extensions. The accessor "getStudyEffectiveDescription" gives direct access to the value
736         */
737        public StringType getStudyEffectiveDescriptionElement() { 
738          if (this.studyEffectiveDescription == null)
739            if (Configuration.errorOnAutoCreate())
740              throw new Error("Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.studyEffectiveDescription");
741            else if (Configuration.doAutoCreate())
742              this.studyEffectiveDescription = new StringType(); // bb
743          return this.studyEffectiveDescription;
744        }
745
746        public boolean hasStudyEffectiveDescriptionElement() { 
747          return this.studyEffectiveDescription != null && !this.studyEffectiveDescription.isEmpty();
748        }
749
750        public boolean hasStudyEffectiveDescription() { 
751          return this.studyEffectiveDescription != null && !this.studyEffectiveDescription.isEmpty();
752        }
753
754        /**
755         * @param value {@link #studyEffectiveDescription} (A narrative description of the time period the study covers.). This is the underlying object with id, value and extensions. The accessor "getStudyEffectiveDescription" gives direct access to the value
756         */
757        public ResearchElementDefinitionCharacteristicComponent setStudyEffectiveDescriptionElement(StringType value) { 
758          this.studyEffectiveDescription = value;
759          return this;
760        }
761
762        /**
763         * @return A narrative description of the time period the study covers.
764         */
765        public String getStudyEffectiveDescription() { 
766          return this.studyEffectiveDescription == null ? null : this.studyEffectiveDescription.getValue();
767        }
768
769        /**
770         * @param value A narrative description of the time period the study covers.
771         */
772        public ResearchElementDefinitionCharacteristicComponent setStudyEffectiveDescription(String value) { 
773          if (Utilities.noString(value))
774            this.studyEffectiveDescription = null;
775          else {
776            if (this.studyEffectiveDescription == null)
777              this.studyEffectiveDescription = new StringType();
778            this.studyEffectiveDescription.setValue(value);
779          }
780          return this;
781        }
782
783        /**
784         * @return {@link #studyEffective} (Indicates what effective period the study covers.)
785         */
786        public Type getStudyEffective() { 
787          return this.studyEffective;
788        }
789
790        /**
791         * @return {@link #studyEffective} (Indicates what effective period the study covers.)
792         */
793        public DateTimeType getStudyEffectiveDateTimeType() throws FHIRException { 
794          if (this.studyEffective == null)
795            this.studyEffective = new DateTimeType();
796          if (!(this.studyEffective instanceof DateTimeType))
797            throw new FHIRException("Type mismatch: the type DateTimeType was expected, but "+this.studyEffective.getClass().getName()+" was encountered");
798          return (DateTimeType) this.studyEffective;
799        }
800
801        public boolean hasStudyEffectiveDateTimeType() { 
802          return this != null && this.studyEffective instanceof DateTimeType;
803        }
804
805        /**
806         * @return {@link #studyEffective} (Indicates what effective period the study covers.)
807         */
808        public Period getStudyEffectivePeriod() throws FHIRException { 
809          if (this.studyEffective == null)
810            this.studyEffective = new Period();
811          if (!(this.studyEffective instanceof Period))
812            throw new FHIRException("Type mismatch: the type Period was expected, but "+this.studyEffective.getClass().getName()+" was encountered");
813          return (Period) this.studyEffective;
814        }
815
816        public boolean hasStudyEffectivePeriod() { 
817          return this != null && this.studyEffective instanceof Period;
818        }
819
820        /**
821         * @return {@link #studyEffective} (Indicates what effective period the study covers.)
822         */
823        public Duration getStudyEffectiveDuration() throws FHIRException { 
824          if (this.studyEffective == null)
825            this.studyEffective = new Duration();
826          if (!(this.studyEffective instanceof Duration))
827            throw new FHIRException("Type mismatch: the type Duration was expected, but "+this.studyEffective.getClass().getName()+" was encountered");
828          return (Duration) this.studyEffective;
829        }
830
831        public boolean hasStudyEffectiveDuration() { 
832          return this != null && this.studyEffective instanceof Duration;
833        }
834
835        /**
836         * @return {@link #studyEffective} (Indicates what effective period the study covers.)
837         */
838        public Timing getStudyEffectiveTiming() throws FHIRException { 
839          if (this.studyEffective == null)
840            this.studyEffective = new Timing();
841          if (!(this.studyEffective instanceof Timing))
842            throw new FHIRException("Type mismatch: the type Timing was expected, but "+this.studyEffective.getClass().getName()+" was encountered");
843          return (Timing) this.studyEffective;
844        }
845
846        public boolean hasStudyEffectiveTiming() { 
847          return this != null && this.studyEffective instanceof Timing;
848        }
849
850        public boolean hasStudyEffective() { 
851          return this.studyEffective != null && !this.studyEffective.isEmpty();
852        }
853
854        /**
855         * @param value {@link #studyEffective} (Indicates what effective period the study covers.)
856         */
857        public ResearchElementDefinitionCharacteristicComponent setStudyEffective(Type value) { 
858          if (value != null && !(value instanceof DateTimeType || value instanceof Period || value instanceof Duration || value instanceof Timing))
859            throw new Error("Not the right type for ResearchElementDefinition.characteristic.studyEffective[x]: "+value.fhirType());
860          this.studyEffective = value;
861          return this;
862        }
863
864        /**
865         * @return {@link #studyEffectiveTimeFromStart} (Indicates duration from the study initiation.)
866         */
867        public Duration getStudyEffectiveTimeFromStart() { 
868          if (this.studyEffectiveTimeFromStart == null)
869            if (Configuration.errorOnAutoCreate())
870              throw new Error("Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.studyEffectiveTimeFromStart");
871            else if (Configuration.doAutoCreate())
872              this.studyEffectiveTimeFromStart = new Duration(); // cc
873          return this.studyEffectiveTimeFromStart;
874        }
875
876        public boolean hasStudyEffectiveTimeFromStart() { 
877          return this.studyEffectiveTimeFromStart != null && !this.studyEffectiveTimeFromStart.isEmpty();
878        }
879
880        /**
881         * @param value {@link #studyEffectiveTimeFromStart} (Indicates duration from the study initiation.)
882         */
883        public ResearchElementDefinitionCharacteristicComponent setStudyEffectiveTimeFromStart(Duration value) { 
884          this.studyEffectiveTimeFromStart = value;
885          return this;
886        }
887
888        /**
889         * @return {@link #studyEffectiveGroupMeasure} (Indicates how elements are aggregated within the study effective period.). This is the underlying object with id, value and extensions. The accessor "getStudyEffectiveGroupMeasure" gives direct access to the value
890         */
891        public Enumeration<GroupMeasure> getStudyEffectiveGroupMeasureElement() { 
892          if (this.studyEffectiveGroupMeasure == null)
893            if (Configuration.errorOnAutoCreate())
894              throw new Error("Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.studyEffectiveGroupMeasure");
895            else if (Configuration.doAutoCreate())
896              this.studyEffectiveGroupMeasure = new Enumeration<GroupMeasure>(new GroupMeasureEnumFactory()); // bb
897          return this.studyEffectiveGroupMeasure;
898        }
899
900        public boolean hasStudyEffectiveGroupMeasureElement() { 
901          return this.studyEffectiveGroupMeasure != null && !this.studyEffectiveGroupMeasure.isEmpty();
902        }
903
904        public boolean hasStudyEffectiveGroupMeasure() { 
905          return this.studyEffectiveGroupMeasure != null && !this.studyEffectiveGroupMeasure.isEmpty();
906        }
907
908        /**
909         * @param value {@link #studyEffectiveGroupMeasure} (Indicates how elements are aggregated within the study effective period.). This is the underlying object with id, value and extensions. The accessor "getStudyEffectiveGroupMeasure" gives direct access to the value
910         */
911        public ResearchElementDefinitionCharacteristicComponent setStudyEffectiveGroupMeasureElement(Enumeration<GroupMeasure> value) { 
912          this.studyEffectiveGroupMeasure = value;
913          return this;
914        }
915
916        /**
917         * @return Indicates how elements are aggregated within the study effective period.
918         */
919        public GroupMeasure getStudyEffectiveGroupMeasure() { 
920          return this.studyEffectiveGroupMeasure == null ? null : this.studyEffectiveGroupMeasure.getValue();
921        }
922
923        /**
924         * @param value Indicates how elements are aggregated within the study effective period.
925         */
926        public ResearchElementDefinitionCharacteristicComponent setStudyEffectiveGroupMeasure(GroupMeasure value) { 
927          if (value == null)
928            this.studyEffectiveGroupMeasure = null;
929          else {
930            if (this.studyEffectiveGroupMeasure == null)
931              this.studyEffectiveGroupMeasure = new Enumeration<GroupMeasure>(new GroupMeasureEnumFactory());
932            this.studyEffectiveGroupMeasure.setValue(value);
933          }
934          return this;
935        }
936
937        /**
938         * @return {@link #participantEffectiveDescription} (A narrative description of the time period the study covers.). This is the underlying object with id, value and extensions. The accessor "getParticipantEffectiveDescription" gives direct access to the value
939         */
940        public StringType getParticipantEffectiveDescriptionElement() { 
941          if (this.participantEffectiveDescription == null)
942            if (Configuration.errorOnAutoCreate())
943              throw new Error("Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.participantEffectiveDescription");
944            else if (Configuration.doAutoCreate())
945              this.participantEffectiveDescription = new StringType(); // bb
946          return this.participantEffectiveDescription;
947        }
948
949        public boolean hasParticipantEffectiveDescriptionElement() { 
950          return this.participantEffectiveDescription != null && !this.participantEffectiveDescription.isEmpty();
951        }
952
953        public boolean hasParticipantEffectiveDescription() { 
954          return this.participantEffectiveDescription != null && !this.participantEffectiveDescription.isEmpty();
955        }
956
957        /**
958         * @param value {@link #participantEffectiveDescription} (A narrative description of the time period the study covers.). This is the underlying object with id, value and extensions. The accessor "getParticipantEffectiveDescription" gives direct access to the value
959         */
960        public ResearchElementDefinitionCharacteristicComponent setParticipantEffectiveDescriptionElement(StringType value) { 
961          this.participantEffectiveDescription = value;
962          return this;
963        }
964
965        /**
966         * @return A narrative description of the time period the study covers.
967         */
968        public String getParticipantEffectiveDescription() { 
969          return this.participantEffectiveDescription == null ? null : this.participantEffectiveDescription.getValue();
970        }
971
972        /**
973         * @param value A narrative description of the time period the study covers.
974         */
975        public ResearchElementDefinitionCharacteristicComponent setParticipantEffectiveDescription(String value) { 
976          if (Utilities.noString(value))
977            this.participantEffectiveDescription = null;
978          else {
979            if (this.participantEffectiveDescription == null)
980              this.participantEffectiveDescription = new StringType();
981            this.participantEffectiveDescription.setValue(value);
982          }
983          return this;
984        }
985
986        /**
987         * @return {@link #participantEffective} (Indicates what effective period the study covers.)
988         */
989        public Type getParticipantEffective() { 
990          return this.participantEffective;
991        }
992
993        /**
994         * @return {@link #participantEffective} (Indicates what effective period the study covers.)
995         */
996        public DateTimeType getParticipantEffectiveDateTimeType() throws FHIRException { 
997          if (this.participantEffective == null)
998            this.participantEffective = new DateTimeType();
999          if (!(this.participantEffective instanceof DateTimeType))
1000            throw new FHIRException("Type mismatch: the type DateTimeType was expected, but "+this.participantEffective.getClass().getName()+" was encountered");
1001          return (DateTimeType) this.participantEffective;
1002        }
1003
1004        public boolean hasParticipantEffectiveDateTimeType() { 
1005          return this != null && this.participantEffective instanceof DateTimeType;
1006        }
1007
1008        /**
1009         * @return {@link #participantEffective} (Indicates what effective period the study covers.)
1010         */
1011        public Period getParticipantEffectivePeriod() throws FHIRException { 
1012          if (this.participantEffective == null)
1013            this.participantEffective = new Period();
1014          if (!(this.participantEffective instanceof Period))
1015            throw new FHIRException("Type mismatch: the type Period was expected, but "+this.participantEffective.getClass().getName()+" was encountered");
1016          return (Period) this.participantEffective;
1017        }
1018
1019        public boolean hasParticipantEffectivePeriod() { 
1020          return this != null && this.participantEffective instanceof Period;
1021        }
1022
1023        /**
1024         * @return {@link #participantEffective} (Indicates what effective period the study covers.)
1025         */
1026        public Duration getParticipantEffectiveDuration() throws FHIRException { 
1027          if (this.participantEffective == null)
1028            this.participantEffective = new Duration();
1029          if (!(this.participantEffective instanceof Duration))
1030            throw new FHIRException("Type mismatch: the type Duration was expected, but "+this.participantEffective.getClass().getName()+" was encountered");
1031          return (Duration) this.participantEffective;
1032        }
1033
1034        public boolean hasParticipantEffectiveDuration() { 
1035          return this != null && this.participantEffective instanceof Duration;
1036        }
1037
1038        /**
1039         * @return {@link #participantEffective} (Indicates what effective period the study covers.)
1040         */
1041        public Timing getParticipantEffectiveTiming() throws FHIRException { 
1042          if (this.participantEffective == null)
1043            this.participantEffective = new Timing();
1044          if (!(this.participantEffective instanceof Timing))
1045            throw new FHIRException("Type mismatch: the type Timing was expected, but "+this.participantEffective.getClass().getName()+" was encountered");
1046          return (Timing) this.participantEffective;
1047        }
1048
1049        public boolean hasParticipantEffectiveTiming() { 
1050          return this != null && this.participantEffective instanceof Timing;
1051        }
1052
1053        public boolean hasParticipantEffective() { 
1054          return this.participantEffective != null && !this.participantEffective.isEmpty();
1055        }
1056
1057        /**
1058         * @param value {@link #participantEffective} (Indicates what effective period the study covers.)
1059         */
1060        public ResearchElementDefinitionCharacteristicComponent setParticipantEffective(Type value) { 
1061          if (value != null && !(value instanceof DateTimeType || value instanceof Period || value instanceof Duration || value instanceof Timing))
1062            throw new Error("Not the right type for ResearchElementDefinition.characteristic.participantEffective[x]: "+value.fhirType());
1063          this.participantEffective = value;
1064          return this;
1065        }
1066
1067        /**
1068         * @return {@link #participantEffectiveTimeFromStart} (Indicates duration from the participant's study entry.)
1069         */
1070        public Duration getParticipantEffectiveTimeFromStart() { 
1071          if (this.participantEffectiveTimeFromStart == null)
1072            if (Configuration.errorOnAutoCreate())
1073              throw new Error("Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.participantEffectiveTimeFromStart");
1074            else if (Configuration.doAutoCreate())
1075              this.participantEffectiveTimeFromStart = new Duration(); // cc
1076          return this.participantEffectiveTimeFromStart;
1077        }
1078
1079        public boolean hasParticipantEffectiveTimeFromStart() { 
1080          return this.participantEffectiveTimeFromStart != null && !this.participantEffectiveTimeFromStart.isEmpty();
1081        }
1082
1083        /**
1084         * @param value {@link #participantEffectiveTimeFromStart} (Indicates duration from the participant's study entry.)
1085         */
1086        public ResearchElementDefinitionCharacteristicComponent setParticipantEffectiveTimeFromStart(Duration value) { 
1087          this.participantEffectiveTimeFromStart = value;
1088          return this;
1089        }
1090
1091        /**
1092         * @return {@link #participantEffectiveGroupMeasure} (Indicates how elements are aggregated within the study effective period.). This is the underlying object with id, value and extensions. The accessor "getParticipantEffectiveGroupMeasure" gives direct access to the value
1093         */
1094        public Enumeration<GroupMeasure> getParticipantEffectiveGroupMeasureElement() { 
1095          if (this.participantEffectiveGroupMeasure == null)
1096            if (Configuration.errorOnAutoCreate())
1097              throw new Error("Attempt to auto-create ResearchElementDefinitionCharacteristicComponent.participantEffectiveGroupMeasure");
1098            else if (Configuration.doAutoCreate())
1099              this.participantEffectiveGroupMeasure = new Enumeration<GroupMeasure>(new GroupMeasureEnumFactory()); // bb
1100          return this.participantEffectiveGroupMeasure;
1101        }
1102
1103        public boolean hasParticipantEffectiveGroupMeasureElement() { 
1104          return this.participantEffectiveGroupMeasure != null && !this.participantEffectiveGroupMeasure.isEmpty();
1105        }
1106
1107        public boolean hasParticipantEffectiveGroupMeasure() { 
1108          return this.participantEffectiveGroupMeasure != null && !this.participantEffectiveGroupMeasure.isEmpty();
1109        }
1110
1111        /**
1112         * @param value {@link #participantEffectiveGroupMeasure} (Indicates how elements are aggregated within the study effective period.). This is the underlying object with id, value and extensions. The accessor "getParticipantEffectiveGroupMeasure" gives direct access to the value
1113         */
1114        public ResearchElementDefinitionCharacteristicComponent setParticipantEffectiveGroupMeasureElement(Enumeration<GroupMeasure> value) { 
1115          this.participantEffectiveGroupMeasure = value;
1116          return this;
1117        }
1118
1119        /**
1120         * @return Indicates how elements are aggregated within the study effective period.
1121         */
1122        public GroupMeasure getParticipantEffectiveGroupMeasure() { 
1123          return this.participantEffectiveGroupMeasure == null ? null : this.participantEffectiveGroupMeasure.getValue();
1124        }
1125
1126        /**
1127         * @param value Indicates how elements are aggregated within the study effective period.
1128         */
1129        public ResearchElementDefinitionCharacteristicComponent setParticipantEffectiveGroupMeasure(GroupMeasure value) { 
1130          if (value == null)
1131            this.participantEffectiveGroupMeasure = null;
1132          else {
1133            if (this.participantEffectiveGroupMeasure == null)
1134              this.participantEffectiveGroupMeasure = new Enumeration<GroupMeasure>(new GroupMeasureEnumFactory());
1135            this.participantEffectiveGroupMeasure.setValue(value);
1136          }
1137          return this;
1138        }
1139
1140        protected void listChildren(List<Property> children) {
1141          super.listChildren(children);
1142          children.add(new Property("definition[x]", "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement", "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).", 0, 1, definition));
1143          children.add(new Property("usageContext", "UsageContext", "Use UsageContext to define the members of the population, such as Age Ranges, Genders, Settings.", 0, java.lang.Integer.MAX_VALUE, usageContext));
1144          children.add(new Property("exclude", "boolean", "When true, members with this characteristic are excluded from the element.", 0, 1, exclude));
1145          children.add(new Property("unitOfMeasure", "CodeableConcept", "Specifies the UCUM unit for the outcome.", 0, 1, unitOfMeasure));
1146          children.add(new Property("studyEffectiveDescription", "string", "A narrative description of the time period the study covers.", 0, 1, studyEffectiveDescription));
1147          children.add(new Property("studyEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, studyEffective));
1148          children.add(new Property("studyEffectiveTimeFromStart", "Duration", "Indicates duration from the study initiation.", 0, 1, studyEffectiveTimeFromStart));
1149          children.add(new Property("studyEffectiveGroupMeasure", "code", "Indicates how elements are aggregated within the study effective period.", 0, 1, studyEffectiveGroupMeasure));
1150          children.add(new Property("participantEffectiveDescription", "string", "A narrative description of the time period the study covers.", 0, 1, participantEffectiveDescription));
1151          children.add(new Property("participantEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, participantEffective));
1152          children.add(new Property("participantEffectiveTimeFromStart", "Duration", "Indicates duration from the participant's study entry.", 0, 1, participantEffectiveTimeFromStart));
1153          children.add(new Property("participantEffectiveGroupMeasure", "code", "Indicates how elements are aggregated within the study effective period.", 0, 1, participantEffectiveGroupMeasure));
1154        }
1155
1156        @Override
1157        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1158          switch (_hash) {
1159          case -1139422643: /*definition[x]*/  return new Property("definition[x]", "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement", "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).", 0, 1, definition);
1160          case -1014418093: /*definition*/  return new Property("definition[x]", "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement", "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).", 0, 1, definition);
1161          case -1446002226: /*definitionCodeableConcept*/  return new Property("definition[x]", "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement", "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).", 0, 1, definition);
1162          case 933485793: /*definitionCanonical*/  return new Property("definition[x]", "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement", "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).", 0, 1, definition);
1163          case 1463703627: /*definitionExpression*/  return new Property("definition[x]", "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement", "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).", 0, 1, definition);
1164          case -660350874: /*definitionDataRequirement*/  return new Property("definition[x]", "CodeableConcept|canonical(ValueSet)|Expression|DataRequirement", "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).", 0, 1, definition);
1165          case 907012302: /*usageContext*/  return new Property("usageContext", "UsageContext", "Use UsageContext to define the members of the population, such as Age Ranges, Genders, Settings.", 0, java.lang.Integer.MAX_VALUE, usageContext);
1166          case -1321148966: /*exclude*/  return new Property("exclude", "boolean", "When true, members with this characteristic are excluded from the element.", 0, 1, exclude);
1167          case -750257565: /*unitOfMeasure*/  return new Property("unitOfMeasure", "CodeableConcept", "Specifies the UCUM unit for the outcome.", 0, 1, unitOfMeasure);
1168          case 237553470: /*studyEffectiveDescription*/  return new Property("studyEffectiveDescription", "string", "A narrative description of the time period the study covers.", 0, 1, studyEffectiveDescription);
1169          case -1832549918: /*studyEffective[x]*/  return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, studyEffective);
1170          case -836391458: /*studyEffective*/  return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, studyEffective);
1171          case 439780249: /*studyEffectiveDateTime*/  return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, studyEffective);
1172          case -497045185: /*studyEffectivePeriod*/  return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, studyEffective);
1173          case 949985682: /*studyEffectiveDuration*/  return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, studyEffective);
1174          case -378983480: /*studyEffectiveTiming*/  return new Property("studyEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, studyEffective);
1175          case -2107828915: /*studyEffectiveTimeFromStart*/  return new Property("studyEffectiveTimeFromStart", "Duration", "Indicates duration from the study initiation.", 0, 1, studyEffectiveTimeFromStart);
1176          case 1284435677: /*studyEffectiveGroupMeasure*/  return new Property("studyEffectiveGroupMeasure", "code", "Indicates how elements are aggregated within the study effective period.", 0, 1, studyEffectiveGroupMeasure);
1177          case 1333186472: /*participantEffectiveDescription*/  return new Property("participantEffectiveDescription", "string", "A narrative description of the time period the study covers.", 0, 1, participantEffectiveDescription);
1178          case 1777308748: /*participantEffective[x]*/  return new Property("participantEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, participantEffective);
1179          case 1376306100: /*participantEffective*/  return new Property("participantEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, participantEffective);
1180          case -1721146513: /*participantEffectiveDateTime*/  return new Property("participantEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, participantEffective);
1181          case -883650923: /*participantEffectivePeriod*/  return new Property("participantEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, participantEffective);
1182          case -1210941080: /*participantEffectiveDuration*/  return new Property("participantEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, participantEffective);
1183          case -765589218: /*participantEffectiveTiming*/  return new Property("participantEffective[x]", "dateTime|Period|Duration|Timing", "Indicates what effective period the study covers.", 0, 1, participantEffective);
1184          case -1471501513: /*participantEffectiveTimeFromStart*/  return new Property("participantEffectiveTimeFromStart", "Duration", "Indicates duration from the participant's study entry.", 0, 1, participantEffectiveTimeFromStart);
1185          case 889320371: /*participantEffectiveGroupMeasure*/  return new Property("participantEffectiveGroupMeasure", "code", "Indicates how elements are aggregated within the study effective period.", 0, 1, participantEffectiveGroupMeasure);
1186          default: return super.getNamedProperty(_hash, _name, _checkValid);
1187          }
1188
1189        }
1190
1191      @Override
1192      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1193        switch (hash) {
1194        case -1014418093: /*definition*/ return this.definition == null ? new Base[0] : new Base[] {this.definition}; // Type
1195        case 907012302: /*usageContext*/ return this.usageContext == null ? new Base[0] : this.usageContext.toArray(new Base[this.usageContext.size()]); // UsageContext
1196        case -1321148966: /*exclude*/ return this.exclude == null ? new Base[0] : new Base[] {this.exclude}; // BooleanType
1197        case -750257565: /*unitOfMeasure*/ return this.unitOfMeasure == null ? new Base[0] : new Base[] {this.unitOfMeasure}; // CodeableConcept
1198        case 237553470: /*studyEffectiveDescription*/ return this.studyEffectiveDescription == null ? new Base[0] : new Base[] {this.studyEffectiveDescription}; // StringType
1199        case -836391458: /*studyEffective*/ return this.studyEffective == null ? new Base[0] : new Base[] {this.studyEffective}; // Type
1200        case -2107828915: /*studyEffectiveTimeFromStart*/ return this.studyEffectiveTimeFromStart == null ? new Base[0] : new Base[] {this.studyEffectiveTimeFromStart}; // Duration
1201        case 1284435677: /*studyEffectiveGroupMeasure*/ return this.studyEffectiveGroupMeasure == null ? new Base[0] : new Base[] {this.studyEffectiveGroupMeasure}; // Enumeration<GroupMeasure>
1202        case 1333186472: /*participantEffectiveDescription*/ return this.participantEffectiveDescription == null ? new Base[0] : new Base[] {this.participantEffectiveDescription}; // StringType
1203        case 1376306100: /*participantEffective*/ return this.participantEffective == null ? new Base[0] : new Base[] {this.participantEffective}; // Type
1204        case -1471501513: /*participantEffectiveTimeFromStart*/ return this.participantEffectiveTimeFromStart == null ? new Base[0] : new Base[] {this.participantEffectiveTimeFromStart}; // Duration
1205        case 889320371: /*participantEffectiveGroupMeasure*/ return this.participantEffectiveGroupMeasure == null ? new Base[0] : new Base[] {this.participantEffectiveGroupMeasure}; // Enumeration<GroupMeasure>
1206        default: return super.getProperty(hash, name, checkValid);
1207        }
1208
1209      }
1210
1211      @Override
1212      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1213        switch (hash) {
1214        case -1014418093: // definition
1215          this.definition = castToType(value); // Type
1216          return value;
1217        case 907012302: // usageContext
1218          this.getUsageContext().add(castToUsageContext(value)); // UsageContext
1219          return value;
1220        case -1321148966: // exclude
1221          this.exclude = castToBoolean(value); // BooleanType
1222          return value;
1223        case -750257565: // unitOfMeasure
1224          this.unitOfMeasure = castToCodeableConcept(value); // CodeableConcept
1225          return value;
1226        case 237553470: // studyEffectiveDescription
1227          this.studyEffectiveDescription = castToString(value); // StringType
1228          return value;
1229        case -836391458: // studyEffective
1230          this.studyEffective = castToType(value); // Type
1231          return value;
1232        case -2107828915: // studyEffectiveTimeFromStart
1233          this.studyEffectiveTimeFromStart = castToDuration(value); // Duration
1234          return value;
1235        case 1284435677: // studyEffectiveGroupMeasure
1236          value = new GroupMeasureEnumFactory().fromType(castToCode(value));
1237          this.studyEffectiveGroupMeasure = (Enumeration) value; // Enumeration<GroupMeasure>
1238          return value;
1239        case 1333186472: // participantEffectiveDescription
1240          this.participantEffectiveDescription = castToString(value); // StringType
1241          return value;
1242        case 1376306100: // participantEffective
1243          this.participantEffective = castToType(value); // Type
1244          return value;
1245        case -1471501513: // participantEffectiveTimeFromStart
1246          this.participantEffectiveTimeFromStart = castToDuration(value); // Duration
1247          return value;
1248        case 889320371: // participantEffectiveGroupMeasure
1249          value = new GroupMeasureEnumFactory().fromType(castToCode(value));
1250          this.participantEffectiveGroupMeasure = (Enumeration) value; // Enumeration<GroupMeasure>
1251          return value;
1252        default: return super.setProperty(hash, name, value);
1253        }
1254
1255      }
1256
1257      @Override
1258      public Base setProperty(String name, Base value) throws FHIRException {
1259        if (name.equals("definition[x]")) {
1260          this.definition = castToType(value); // Type
1261        } else if (name.equals("usageContext")) {
1262          this.getUsageContext().add(castToUsageContext(value));
1263        } else if (name.equals("exclude")) {
1264          this.exclude = castToBoolean(value); // BooleanType
1265        } else if (name.equals("unitOfMeasure")) {
1266          this.unitOfMeasure = castToCodeableConcept(value); // CodeableConcept
1267        } else if (name.equals("studyEffectiveDescription")) {
1268          this.studyEffectiveDescription = castToString(value); // StringType
1269        } else if (name.equals("studyEffective[x]")) {
1270          this.studyEffective = castToType(value); // Type
1271        } else if (name.equals("studyEffectiveTimeFromStart")) {
1272          this.studyEffectiveTimeFromStart = castToDuration(value); // Duration
1273        } else if (name.equals("studyEffectiveGroupMeasure")) {
1274          value = new GroupMeasureEnumFactory().fromType(castToCode(value));
1275          this.studyEffectiveGroupMeasure = (Enumeration) value; // Enumeration<GroupMeasure>
1276        } else if (name.equals("participantEffectiveDescription")) {
1277          this.participantEffectiveDescription = castToString(value); // StringType
1278        } else if (name.equals("participantEffective[x]")) {
1279          this.participantEffective = castToType(value); // Type
1280        } else if (name.equals("participantEffectiveTimeFromStart")) {
1281          this.participantEffectiveTimeFromStart = castToDuration(value); // Duration
1282        } else if (name.equals("participantEffectiveGroupMeasure")) {
1283          value = new GroupMeasureEnumFactory().fromType(castToCode(value));
1284          this.participantEffectiveGroupMeasure = (Enumeration) value; // Enumeration<GroupMeasure>
1285        } else
1286          return super.setProperty(name, value);
1287        return value;
1288      }
1289
1290      @Override
1291      public Base makeProperty(int hash, String name) throws FHIRException {
1292        switch (hash) {
1293        case -1139422643:  return getDefinition(); 
1294        case -1014418093:  return getDefinition(); 
1295        case 907012302:  return addUsageContext(); 
1296        case -1321148966:  return getExcludeElement();
1297        case -750257565:  return getUnitOfMeasure(); 
1298        case 237553470:  return getStudyEffectiveDescriptionElement();
1299        case -1832549918:  return getStudyEffective(); 
1300        case -836391458:  return getStudyEffective(); 
1301        case -2107828915:  return getStudyEffectiveTimeFromStart(); 
1302        case 1284435677:  return getStudyEffectiveGroupMeasureElement();
1303        case 1333186472:  return getParticipantEffectiveDescriptionElement();
1304        case 1777308748:  return getParticipantEffective(); 
1305        case 1376306100:  return getParticipantEffective(); 
1306        case -1471501513:  return getParticipantEffectiveTimeFromStart(); 
1307        case 889320371:  return getParticipantEffectiveGroupMeasureElement();
1308        default: return super.makeProperty(hash, name);
1309        }
1310
1311      }
1312
1313      @Override
1314      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1315        switch (hash) {
1316        case -1014418093: /*definition*/ return new String[] {"CodeableConcept", "canonical", "Expression", "DataRequirement"};
1317        case 907012302: /*usageContext*/ return new String[] {"UsageContext"};
1318        case -1321148966: /*exclude*/ return new String[] {"boolean"};
1319        case -750257565: /*unitOfMeasure*/ return new String[] {"CodeableConcept"};
1320        case 237553470: /*studyEffectiveDescription*/ return new String[] {"string"};
1321        case -836391458: /*studyEffective*/ return new String[] {"dateTime", "Period", "Duration", "Timing"};
1322        case -2107828915: /*studyEffectiveTimeFromStart*/ return new String[] {"Duration"};
1323        case 1284435677: /*studyEffectiveGroupMeasure*/ return new String[] {"code"};
1324        case 1333186472: /*participantEffectiveDescription*/ return new String[] {"string"};
1325        case 1376306100: /*participantEffective*/ return new String[] {"dateTime", "Period", "Duration", "Timing"};
1326        case -1471501513: /*participantEffectiveTimeFromStart*/ return new String[] {"Duration"};
1327        case 889320371: /*participantEffectiveGroupMeasure*/ return new String[] {"code"};
1328        default: return super.getTypesForProperty(hash, name);
1329        }
1330
1331      }
1332
1333      @Override
1334      public Base addChild(String name) throws FHIRException {
1335        if (name.equals("definitionCodeableConcept")) {
1336          this.definition = new CodeableConcept();
1337          return this.definition;
1338        }
1339        else if (name.equals("definitionCanonical")) {
1340          this.definition = new CanonicalType();
1341          return this.definition;
1342        }
1343        else if (name.equals("definitionExpression")) {
1344          this.definition = new Expression();
1345          return this.definition;
1346        }
1347        else if (name.equals("definitionDataRequirement")) {
1348          this.definition = new DataRequirement();
1349          return this.definition;
1350        }
1351        else if (name.equals("usageContext")) {
1352          return addUsageContext();
1353        }
1354        else if (name.equals("exclude")) {
1355          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.exclude");
1356        }
1357        else if (name.equals("unitOfMeasure")) {
1358          this.unitOfMeasure = new CodeableConcept();
1359          return this.unitOfMeasure;
1360        }
1361        else if (name.equals("studyEffectiveDescription")) {
1362          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.studyEffectiveDescription");
1363        }
1364        else if (name.equals("studyEffectiveDateTime")) {
1365          this.studyEffective = new DateTimeType();
1366          return this.studyEffective;
1367        }
1368        else if (name.equals("studyEffectivePeriod")) {
1369          this.studyEffective = new Period();
1370          return this.studyEffective;
1371        }
1372        else if (name.equals("studyEffectiveDuration")) {
1373          this.studyEffective = new Duration();
1374          return this.studyEffective;
1375        }
1376        else if (name.equals("studyEffectiveTiming")) {
1377          this.studyEffective = new Timing();
1378          return this.studyEffective;
1379        }
1380        else if (name.equals("studyEffectiveTimeFromStart")) {
1381          this.studyEffectiveTimeFromStart = new Duration();
1382          return this.studyEffectiveTimeFromStart;
1383        }
1384        else if (name.equals("studyEffectiveGroupMeasure")) {
1385          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.studyEffectiveGroupMeasure");
1386        }
1387        else if (name.equals("participantEffectiveDescription")) {
1388          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.participantEffectiveDescription");
1389        }
1390        else if (name.equals("participantEffectiveDateTime")) {
1391          this.participantEffective = new DateTimeType();
1392          return this.participantEffective;
1393        }
1394        else if (name.equals("participantEffectivePeriod")) {
1395          this.participantEffective = new Period();
1396          return this.participantEffective;
1397        }
1398        else if (name.equals("participantEffectiveDuration")) {
1399          this.participantEffective = new Duration();
1400          return this.participantEffective;
1401        }
1402        else if (name.equals("participantEffectiveTiming")) {
1403          this.participantEffective = new Timing();
1404          return this.participantEffective;
1405        }
1406        else if (name.equals("participantEffectiveTimeFromStart")) {
1407          this.participantEffectiveTimeFromStart = new Duration();
1408          return this.participantEffectiveTimeFromStart;
1409        }
1410        else if (name.equals("participantEffectiveGroupMeasure")) {
1411          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.participantEffectiveGroupMeasure");
1412        }
1413        else
1414          return super.addChild(name);
1415      }
1416
1417      public ResearchElementDefinitionCharacteristicComponent copy() {
1418        ResearchElementDefinitionCharacteristicComponent dst = new ResearchElementDefinitionCharacteristicComponent();
1419        copyValues(dst);
1420        dst.definition = definition == null ? null : definition.copy();
1421        if (usageContext != null) {
1422          dst.usageContext = new ArrayList<UsageContext>();
1423          for (UsageContext i : usageContext)
1424            dst.usageContext.add(i.copy());
1425        };
1426        dst.exclude = exclude == null ? null : exclude.copy();
1427        dst.unitOfMeasure = unitOfMeasure == null ? null : unitOfMeasure.copy();
1428        dst.studyEffectiveDescription = studyEffectiveDescription == null ? null : studyEffectiveDescription.copy();
1429        dst.studyEffective = studyEffective == null ? null : studyEffective.copy();
1430        dst.studyEffectiveTimeFromStart = studyEffectiveTimeFromStart == null ? null : studyEffectiveTimeFromStart.copy();
1431        dst.studyEffectiveGroupMeasure = studyEffectiveGroupMeasure == null ? null : studyEffectiveGroupMeasure.copy();
1432        dst.participantEffectiveDescription = participantEffectiveDescription == null ? null : participantEffectiveDescription.copy();
1433        dst.participantEffective = participantEffective == null ? null : participantEffective.copy();
1434        dst.participantEffectiveTimeFromStart = participantEffectiveTimeFromStart == null ? null : participantEffectiveTimeFromStart.copy();
1435        dst.participantEffectiveGroupMeasure = participantEffectiveGroupMeasure == null ? null : participantEffectiveGroupMeasure.copy();
1436        return dst;
1437      }
1438
1439      @Override
1440      public boolean equalsDeep(Base other_) {
1441        if (!super.equalsDeep(other_))
1442          return false;
1443        if (!(other_ instanceof ResearchElementDefinitionCharacteristicComponent))
1444          return false;
1445        ResearchElementDefinitionCharacteristicComponent o = (ResearchElementDefinitionCharacteristicComponent) other_;
1446        return compareDeep(definition, o.definition, true) && compareDeep(usageContext, o.usageContext, true)
1447           && compareDeep(exclude, o.exclude, true) && compareDeep(unitOfMeasure, o.unitOfMeasure, true) && compareDeep(studyEffectiveDescription, o.studyEffectiveDescription, true)
1448           && compareDeep(studyEffective, o.studyEffective, true) && compareDeep(studyEffectiveTimeFromStart, o.studyEffectiveTimeFromStart, true)
1449           && compareDeep(studyEffectiveGroupMeasure, o.studyEffectiveGroupMeasure, true) && compareDeep(participantEffectiveDescription, o.participantEffectiveDescription, true)
1450           && compareDeep(participantEffective, o.participantEffective, true) && compareDeep(participantEffectiveTimeFromStart, o.participantEffectiveTimeFromStart, true)
1451           && compareDeep(participantEffectiveGroupMeasure, o.participantEffectiveGroupMeasure, true);
1452      }
1453
1454      @Override
1455      public boolean equalsShallow(Base other_) {
1456        if (!super.equalsShallow(other_))
1457          return false;
1458        if (!(other_ instanceof ResearchElementDefinitionCharacteristicComponent))
1459          return false;
1460        ResearchElementDefinitionCharacteristicComponent o = (ResearchElementDefinitionCharacteristicComponent) other_;
1461        return compareValues(exclude, o.exclude, true) && compareValues(studyEffectiveDescription, o.studyEffectiveDescription, true)
1462           && compareValues(studyEffectiveGroupMeasure, o.studyEffectiveGroupMeasure, true) && compareValues(participantEffectiveDescription, o.participantEffectiveDescription, true)
1463           && compareValues(participantEffectiveGroupMeasure, o.participantEffectiveGroupMeasure, true);
1464      }
1465
1466      public boolean isEmpty() {
1467        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(definition, usageContext, exclude
1468          , unitOfMeasure, studyEffectiveDescription, studyEffective, studyEffectiveTimeFromStart
1469          , studyEffectiveGroupMeasure, participantEffectiveDescription, participantEffective, participantEffectiveTimeFromStart
1470          , participantEffectiveGroupMeasure);
1471      }
1472
1473  public String fhirType() {
1474    return "ResearchElementDefinition.characteristic";
1475
1476  }
1477
1478  }
1479
1480    /**
1481     * 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.
1482     */
1483    @Child(name = "identifier", type = {Identifier.class}, order=0, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
1484    @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." )
1485    protected List<Identifier> identifier;
1486
1487    /**
1488     * The short title provides an alternate title for use in informal descriptive contexts where the full, formal title is not necessary.
1489     */
1490    @Child(name = "shortTitle", type = {StringType.class}, order=1, min=0, max=1, modifier=false, summary=true)
1491    @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." )
1492    protected StringType shortTitle;
1493
1494    /**
1495     * An explanatory or alternate title for the ResearchElementDefinition giving additional information about its content.
1496     */
1497    @Child(name = "subtitle", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=false)
1498    @Description(shortDefinition="Subordinate title of the ResearchElementDefinition", formalDefinition="An explanatory or alternate title for the ResearchElementDefinition giving additional information about its content." )
1499    protected StringType subtitle;
1500
1501    /**
1502     * 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.
1503     */
1504    @Child(name = "subject", type = {CodeableConcept.class, Group.class}, order=3, min=0, max=1, modifier=false, summary=false)
1505    @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." )
1506    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/subject-type")
1507    protected Type subject;
1508
1509    /**
1510     * A human-readable string to clarify or explain concepts about the resource.
1511     */
1512    @Child(name = "comment", type = {StringType.class}, order=4, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1513    @Description(shortDefinition="Used for footnotes or explanatory notes", formalDefinition="A human-readable string to clarify or explain concepts about the resource." )
1514    protected List<StringType> comment;
1515
1516    /**
1517     * Explanation of why this research element definition is needed and why it has been designed as it has.
1518     */
1519    @Child(name = "purpose", type = {MarkdownType.class}, order=5, min=0, max=1, modifier=false, summary=false)
1520    @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." )
1521    protected MarkdownType purpose;
1522
1523    /**
1524     * A detailed description, from a clinical perspective, of how the ResearchElementDefinition is used.
1525     */
1526    @Child(name = "usage", type = {StringType.class}, order=6, min=0, max=1, modifier=false, summary=false)
1527    @Description(shortDefinition="Describes the clinical usage of the ResearchElementDefinition", formalDefinition="A detailed description, from a clinical perspective, of how the ResearchElementDefinition is used." )
1528    protected StringType usage;
1529
1530    /**
1531     * 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.
1532     */
1533    @Child(name = "copyright", type = {MarkdownType.class}, order=7, min=0, max=1, modifier=false, summary=false)
1534    @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." )
1535    protected MarkdownType copyright;
1536
1537    /**
1538     * The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.
1539     */
1540    @Child(name = "approvalDate", type = {DateType.class}, order=8, min=0, max=1, modifier=false, summary=false)
1541    @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." )
1542    protected DateType approvalDate;
1543
1544    /**
1545     * The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.
1546     */
1547    @Child(name = "lastReviewDate", type = {DateType.class}, order=9, min=0, max=1, modifier=false, summary=false)
1548    @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." )
1549    protected DateType lastReviewDate;
1550
1551    /**
1552     * The period during which the research element definition content was or is planned to be in active use.
1553     */
1554    @Child(name = "effectivePeriod", type = {Period.class}, order=10, min=0, max=1, modifier=false, summary=true)
1555    @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." )
1556    protected Period effectivePeriod;
1557
1558    /**
1559     * 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.
1560     */
1561    @Child(name = "topic", type = {CodeableConcept.class}, order=11, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1562    @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." )
1563    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/definition-topic")
1564    protected List<CodeableConcept> topic;
1565
1566    /**
1567     * An individiual or organization primarily involved in the creation and maintenance of the content.
1568     */
1569    @Child(name = "author", type = {ContactDetail.class}, order=12, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1570    @Description(shortDefinition="Who authored the content", formalDefinition="An individiual or organization primarily involved in the creation and maintenance of the content." )
1571    protected List<ContactDetail> author;
1572
1573    /**
1574     * An individual or organization primarily responsible for internal coherence of the content.
1575     */
1576    @Child(name = "editor", type = {ContactDetail.class}, order=13, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1577    @Description(shortDefinition="Who edited the content", formalDefinition="An individual or organization primarily responsible for internal coherence of the content." )
1578    protected List<ContactDetail> editor;
1579
1580    /**
1581     * An individual or organization primarily responsible for review of some aspect of the content.
1582     */
1583    @Child(name = "reviewer", type = {ContactDetail.class}, order=14, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1584    @Description(shortDefinition="Who reviewed the content", formalDefinition="An individual or organization primarily responsible for review of some aspect of the content." )
1585    protected List<ContactDetail> reviewer;
1586
1587    /**
1588     * An individual or organization responsible for officially endorsing the content for use in some setting.
1589     */
1590    @Child(name = "endorser", type = {ContactDetail.class}, order=15, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1591    @Description(shortDefinition="Who endorsed the content", formalDefinition="An individual or organization responsible for officially endorsing the content for use in some setting." )
1592    protected List<ContactDetail> endorser;
1593
1594    /**
1595     * Related artifacts such as additional documentation, justification, or bibliographic references.
1596     */
1597    @Child(name = "relatedArtifact", type = {RelatedArtifact.class}, order=16, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1598    @Description(shortDefinition="Additional documentation, citations, etc.", formalDefinition="Related artifacts such as additional documentation, justification, or bibliographic references." )
1599    protected List<RelatedArtifact> relatedArtifact;
1600
1601    /**
1602     * A reference to a Library resource containing the formal logic used by the ResearchElementDefinition.
1603     */
1604    @Child(name = "library", type = {CanonicalType.class}, order=17, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1605    @Description(shortDefinition="Logic used by the ResearchElementDefinition", formalDefinition="A reference to a Library resource containing the formal logic used by the ResearchElementDefinition." )
1606    protected List<CanonicalType> library;
1607
1608    /**
1609     * The type of research element, a population, an exposure, or an outcome.
1610     */
1611    @Child(name = "type", type = {CodeType.class}, order=18, min=1, max=1, modifier=false, summary=true)
1612    @Description(shortDefinition="population | exposure | outcome", formalDefinition="The type of research element, a population, an exposure, or an outcome." )
1613    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/research-element-type")
1614    protected Enumeration<ResearchElementType> type;
1615
1616    /**
1617     * The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive).
1618     */
1619    @Child(name = "variableType", type = {CodeType.class}, order=19, min=0, max=1, modifier=false, summary=false)
1620    @Description(shortDefinition="dichotomous | continuous | descriptive", formalDefinition="The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive)." )
1621    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/variable-type")
1622    protected Enumeration<VariableType> variableType;
1623
1624    /**
1625     * A characteristic that defines the members of the research element. Multiple characteristics are applied with "and" semantics.
1626     */
1627    @Child(name = "characteristic", type = {}, order=20, min=1, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
1628    @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." )
1629    protected List<ResearchElementDefinitionCharacteristicComponent> characteristic;
1630
1631    private static final long serialVersionUID = 1483216033L;
1632
1633  /**
1634   * Constructor
1635   */
1636    public ResearchElementDefinition() {
1637      super();
1638    }
1639
1640  /**
1641   * Constructor
1642   */
1643    public ResearchElementDefinition(Enumeration<PublicationStatus> status, Enumeration<ResearchElementType> type) {
1644      super();
1645      this.status = status;
1646      this.type = type;
1647    }
1648
1649    /**
1650     * @return {@link #url} (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.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
1651     */
1652    public UriType getUrlElement() { 
1653      if (this.url == null)
1654        if (Configuration.errorOnAutoCreate())
1655          throw new Error("Attempt to auto-create ResearchElementDefinition.url");
1656        else if (Configuration.doAutoCreate())
1657          this.url = new UriType(); // bb
1658      return this.url;
1659    }
1660
1661    public boolean hasUrlElement() { 
1662      return this.url != null && !this.url.isEmpty();
1663    }
1664
1665    public boolean hasUrl() { 
1666      return this.url != null && !this.url.isEmpty();
1667    }
1668
1669    /**
1670     * @param value {@link #url} (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.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
1671     */
1672    public ResearchElementDefinition setUrlElement(UriType value) { 
1673      this.url = value;
1674      return this;
1675    }
1676
1677    /**
1678     * @return 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.
1679     */
1680    public String getUrl() { 
1681      return this.url == null ? null : this.url.getValue();
1682    }
1683
1684    /**
1685     * @param value 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.
1686     */
1687    public ResearchElementDefinition setUrl(String value) { 
1688      if (Utilities.noString(value))
1689        this.url = null;
1690      else {
1691        if (this.url == null)
1692          this.url = new UriType();
1693        this.url.setValue(value);
1694      }
1695      return this;
1696    }
1697
1698    /**
1699     * @return {@link #identifier} (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.)
1700     */
1701    public List<Identifier> getIdentifier() { 
1702      if (this.identifier == null)
1703        this.identifier = new ArrayList<Identifier>();
1704      return this.identifier;
1705    }
1706
1707    /**
1708     * @return Returns a reference to <code>this</code> for easy method chaining
1709     */
1710    public ResearchElementDefinition setIdentifier(List<Identifier> theIdentifier) { 
1711      this.identifier = theIdentifier;
1712      return this;
1713    }
1714
1715    public boolean hasIdentifier() { 
1716      if (this.identifier == null)
1717        return false;
1718      for (Identifier item : this.identifier)
1719        if (!item.isEmpty())
1720          return true;
1721      return false;
1722    }
1723
1724    public Identifier addIdentifier() { //3
1725      Identifier t = new Identifier();
1726      if (this.identifier == null)
1727        this.identifier = new ArrayList<Identifier>();
1728      this.identifier.add(t);
1729      return t;
1730    }
1731
1732    public ResearchElementDefinition addIdentifier(Identifier t) { //3
1733      if (t == null)
1734        return this;
1735      if (this.identifier == null)
1736        this.identifier = new ArrayList<Identifier>();
1737      this.identifier.add(t);
1738      return this;
1739    }
1740
1741    /**
1742     * @return The first repetition of repeating field {@link #identifier}, creating it if it does not already exist
1743     */
1744    public Identifier getIdentifierFirstRep() { 
1745      if (getIdentifier().isEmpty()) {
1746        addIdentifier();
1747      }
1748      return getIdentifier().get(0);
1749    }
1750
1751    /**
1752     * @return {@link #version} (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.). This is the underlying object with id, value and extensions. The accessor "getVersion" gives direct access to the value
1753     */
1754    public StringType getVersionElement() { 
1755      if (this.version == null)
1756        if (Configuration.errorOnAutoCreate())
1757          throw new Error("Attempt to auto-create ResearchElementDefinition.version");
1758        else if (Configuration.doAutoCreate())
1759          this.version = new StringType(); // bb
1760      return this.version;
1761    }
1762
1763    public boolean hasVersionElement() { 
1764      return this.version != null && !this.version.isEmpty();
1765    }
1766
1767    public boolean hasVersion() { 
1768      return this.version != null && !this.version.isEmpty();
1769    }
1770
1771    /**
1772     * @param value {@link #version} (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.). This is the underlying object with id, value and extensions. The accessor "getVersion" gives direct access to the value
1773     */
1774    public ResearchElementDefinition setVersionElement(StringType value) { 
1775      this.version = value;
1776      return this;
1777    }
1778
1779    /**
1780     * @return 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.
1781     */
1782    public String getVersion() { 
1783      return this.version == null ? null : this.version.getValue();
1784    }
1785
1786    /**
1787     * @param value 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.
1788     */
1789    public ResearchElementDefinition setVersion(String value) { 
1790      if (Utilities.noString(value))
1791        this.version = null;
1792      else {
1793        if (this.version == null)
1794          this.version = new StringType();
1795        this.version.setValue(value);
1796      }
1797      return this;
1798    }
1799
1800    /**
1801     * @return {@link #name} (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.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
1802     */
1803    public StringType getNameElement() { 
1804      if (this.name == null)
1805        if (Configuration.errorOnAutoCreate())
1806          throw new Error("Attempt to auto-create ResearchElementDefinition.name");
1807        else if (Configuration.doAutoCreate())
1808          this.name = new StringType(); // bb
1809      return this.name;
1810    }
1811
1812    public boolean hasNameElement() { 
1813      return this.name != null && !this.name.isEmpty();
1814    }
1815
1816    public boolean hasName() { 
1817      return this.name != null && !this.name.isEmpty();
1818    }
1819
1820    /**
1821     * @param value {@link #name} (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.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
1822     */
1823    public ResearchElementDefinition setNameElement(StringType value) { 
1824      this.name = value;
1825      return this;
1826    }
1827
1828    /**
1829     * @return 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.
1830     */
1831    public String getName() { 
1832      return this.name == null ? null : this.name.getValue();
1833    }
1834
1835    /**
1836     * @param value 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.
1837     */
1838    public ResearchElementDefinition setName(String value) { 
1839      if (Utilities.noString(value))
1840        this.name = null;
1841      else {
1842        if (this.name == null)
1843          this.name = new StringType();
1844        this.name.setValue(value);
1845      }
1846      return this;
1847    }
1848
1849    /**
1850     * @return {@link #title} (A short, descriptive, user-friendly title for the research element definition.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
1851     */
1852    public StringType getTitleElement() { 
1853      if (this.title == null)
1854        if (Configuration.errorOnAutoCreate())
1855          throw new Error("Attempt to auto-create ResearchElementDefinition.title");
1856        else if (Configuration.doAutoCreate())
1857          this.title = new StringType(); // bb
1858      return this.title;
1859    }
1860
1861    public boolean hasTitleElement() { 
1862      return this.title != null && !this.title.isEmpty();
1863    }
1864
1865    public boolean hasTitle() { 
1866      return this.title != null && !this.title.isEmpty();
1867    }
1868
1869    /**
1870     * @param value {@link #title} (A short, descriptive, user-friendly title for the research element definition.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
1871     */
1872    public ResearchElementDefinition setTitleElement(StringType value) { 
1873      this.title = value;
1874      return this;
1875    }
1876
1877    /**
1878     * @return A short, descriptive, user-friendly title for the research element definition.
1879     */
1880    public String getTitle() { 
1881      return this.title == null ? null : this.title.getValue();
1882    }
1883
1884    /**
1885     * @param value A short, descriptive, user-friendly title for the research element definition.
1886     */
1887    public ResearchElementDefinition setTitle(String value) { 
1888      if (Utilities.noString(value))
1889        this.title = null;
1890      else {
1891        if (this.title == null)
1892          this.title = new StringType();
1893        this.title.setValue(value);
1894      }
1895      return this;
1896    }
1897
1898    /**
1899     * @return {@link #shortTitle} (The short title provides an alternate title for use in informal descriptive contexts where the full, formal title is not necessary.). This is the underlying object with id, value and extensions. The accessor "getShortTitle" gives direct access to the value
1900     */
1901    public StringType getShortTitleElement() { 
1902      if (this.shortTitle == null)
1903        if (Configuration.errorOnAutoCreate())
1904          throw new Error("Attempt to auto-create ResearchElementDefinition.shortTitle");
1905        else if (Configuration.doAutoCreate())
1906          this.shortTitle = new StringType(); // bb
1907      return this.shortTitle;
1908    }
1909
1910    public boolean hasShortTitleElement() { 
1911      return this.shortTitle != null && !this.shortTitle.isEmpty();
1912    }
1913
1914    public boolean hasShortTitle() { 
1915      return this.shortTitle != null && !this.shortTitle.isEmpty();
1916    }
1917
1918    /**
1919     * @param value {@link #shortTitle} (The short title provides an alternate title for use in informal descriptive contexts where the full, formal title is not necessary.). This is the underlying object with id, value and extensions. The accessor "getShortTitle" gives direct access to the value
1920     */
1921    public ResearchElementDefinition setShortTitleElement(StringType value) { 
1922      this.shortTitle = value;
1923      return this;
1924    }
1925
1926    /**
1927     * @return The short title provides an alternate title for use in informal descriptive contexts where the full, formal title is not necessary.
1928     */
1929    public String getShortTitle() { 
1930      return this.shortTitle == null ? null : this.shortTitle.getValue();
1931    }
1932
1933    /**
1934     * @param value The short title provides an alternate title for use in informal descriptive contexts where the full, formal title is not necessary.
1935     */
1936    public ResearchElementDefinition setShortTitle(String value) { 
1937      if (Utilities.noString(value))
1938        this.shortTitle = null;
1939      else {
1940        if (this.shortTitle == null)
1941          this.shortTitle = new StringType();
1942        this.shortTitle.setValue(value);
1943      }
1944      return this;
1945    }
1946
1947    /**
1948     * @return {@link #subtitle} (An explanatory or alternate title for the ResearchElementDefinition giving additional information about its content.). This is the underlying object with id, value and extensions. The accessor "getSubtitle" gives direct access to the value
1949     */
1950    public StringType getSubtitleElement() { 
1951      if (this.subtitle == null)
1952        if (Configuration.errorOnAutoCreate())
1953          throw new Error("Attempt to auto-create ResearchElementDefinition.subtitle");
1954        else if (Configuration.doAutoCreate())
1955          this.subtitle = new StringType(); // bb
1956      return this.subtitle;
1957    }
1958
1959    public boolean hasSubtitleElement() { 
1960      return this.subtitle != null && !this.subtitle.isEmpty();
1961    }
1962
1963    public boolean hasSubtitle() { 
1964      return this.subtitle != null && !this.subtitle.isEmpty();
1965    }
1966
1967    /**
1968     * @param value {@link #subtitle} (An explanatory or alternate title for the ResearchElementDefinition giving additional information about its content.). This is the underlying object with id, value and extensions. The accessor "getSubtitle" gives direct access to the value
1969     */
1970    public ResearchElementDefinition setSubtitleElement(StringType value) { 
1971      this.subtitle = value;
1972      return this;
1973    }
1974
1975    /**
1976     * @return An explanatory or alternate title for the ResearchElementDefinition giving additional information about its content.
1977     */
1978    public String getSubtitle() { 
1979      return this.subtitle == null ? null : this.subtitle.getValue();
1980    }
1981
1982    /**
1983     * @param value An explanatory or alternate title for the ResearchElementDefinition giving additional information about its content.
1984     */
1985    public ResearchElementDefinition setSubtitle(String value) { 
1986      if (Utilities.noString(value))
1987        this.subtitle = null;
1988      else {
1989        if (this.subtitle == null)
1990          this.subtitle = new StringType();
1991        this.subtitle.setValue(value);
1992      }
1993      return this;
1994    }
1995
1996    /**
1997     * @return {@link #status} (The status of this research element definition. Enables tracking the life-cycle of the content.). This is the underlying object with id, value and extensions. The accessor "getStatus" gives direct access to the value
1998     */
1999    public Enumeration<PublicationStatus> getStatusElement() { 
2000      if (this.status == null)
2001        if (Configuration.errorOnAutoCreate())
2002          throw new Error("Attempt to auto-create ResearchElementDefinition.status");
2003        else if (Configuration.doAutoCreate())
2004          this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory()); // bb
2005      return this.status;
2006    }
2007
2008    public boolean hasStatusElement() { 
2009      return this.status != null && !this.status.isEmpty();
2010    }
2011
2012    public boolean hasStatus() { 
2013      return this.status != null && !this.status.isEmpty();
2014    }
2015
2016    /**
2017     * @param value {@link #status} (The status of this research element definition. Enables tracking the life-cycle of the content.). This is the underlying object with id, value and extensions. The accessor "getStatus" gives direct access to the value
2018     */
2019    public ResearchElementDefinition setStatusElement(Enumeration<PublicationStatus> value) { 
2020      this.status = value;
2021      return this;
2022    }
2023
2024    /**
2025     * @return The status of this research element definition. Enables tracking the life-cycle of the content.
2026     */
2027    public PublicationStatus getStatus() { 
2028      return this.status == null ? null : this.status.getValue();
2029    }
2030
2031    /**
2032     * @param value The status of this research element definition. Enables tracking the life-cycle of the content.
2033     */
2034    public ResearchElementDefinition setStatus(PublicationStatus value) { 
2035        if (this.status == null)
2036          this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory());
2037        this.status.setValue(value);
2038      return this;
2039    }
2040
2041    /**
2042     * @return {@link #experimental} (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.). This is the underlying object with id, value and extensions. The accessor "getExperimental" gives direct access to the value
2043     */
2044    public BooleanType getExperimentalElement() { 
2045      if (this.experimental == null)
2046        if (Configuration.errorOnAutoCreate())
2047          throw new Error("Attempt to auto-create ResearchElementDefinition.experimental");
2048        else if (Configuration.doAutoCreate())
2049          this.experimental = new BooleanType(); // bb
2050      return this.experimental;
2051    }
2052
2053    public boolean hasExperimentalElement() { 
2054      return this.experimental != null && !this.experimental.isEmpty();
2055    }
2056
2057    public boolean hasExperimental() { 
2058      return this.experimental != null && !this.experimental.isEmpty();
2059    }
2060
2061    /**
2062     * @param value {@link #experimental} (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.). This is the underlying object with id, value and extensions. The accessor "getExperimental" gives direct access to the value
2063     */
2064    public ResearchElementDefinition setExperimentalElement(BooleanType value) { 
2065      this.experimental = value;
2066      return this;
2067    }
2068
2069    /**
2070     * @return 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.
2071     */
2072    public boolean getExperimental() { 
2073      return this.experimental == null || this.experimental.isEmpty() ? false : this.experimental.getValue();
2074    }
2075
2076    /**
2077     * @param value 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.
2078     */
2079    public ResearchElementDefinition setExperimental(boolean value) { 
2080        if (this.experimental == null)
2081          this.experimental = new BooleanType();
2082        this.experimental.setValue(value);
2083      return this;
2084    }
2085
2086    /**
2087     * @return {@link #subject} (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.)
2088     */
2089    public Type getSubject() { 
2090      return this.subject;
2091    }
2092
2093    /**
2094     * @return {@link #subject} (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.)
2095     */
2096    public CodeableConcept getSubjectCodeableConcept() throws FHIRException { 
2097      if (this.subject == null)
2098        this.subject = new CodeableConcept();
2099      if (!(this.subject instanceof CodeableConcept))
2100        throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "+this.subject.getClass().getName()+" was encountered");
2101      return (CodeableConcept) this.subject;
2102    }
2103
2104    public boolean hasSubjectCodeableConcept() { 
2105      return this != null && this.subject instanceof CodeableConcept;
2106    }
2107
2108    /**
2109     * @return {@link #subject} (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.)
2110     */
2111    public Reference getSubjectReference() throws FHIRException { 
2112      if (this.subject == null)
2113        this.subject = new Reference();
2114      if (!(this.subject instanceof Reference))
2115        throw new FHIRException("Type mismatch: the type Reference was expected, but "+this.subject.getClass().getName()+" was encountered");
2116      return (Reference) this.subject;
2117    }
2118
2119    public boolean hasSubjectReference() { 
2120      return this != null && this.subject instanceof Reference;
2121    }
2122
2123    public boolean hasSubject() { 
2124      return this.subject != null && !this.subject.isEmpty();
2125    }
2126
2127    /**
2128     * @param value {@link #subject} (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.)
2129     */
2130    public ResearchElementDefinition setSubject(Type value) { 
2131      if (value != null && !(value instanceof CodeableConcept || value instanceof Reference))
2132        throw new Error("Not the right type for ResearchElementDefinition.subject[x]: "+value.fhirType());
2133      this.subject = value;
2134      return this;
2135    }
2136
2137    /**
2138     * @return {@link #date} (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.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
2139     */
2140    public DateTimeType getDateElement() { 
2141      if (this.date == null)
2142        if (Configuration.errorOnAutoCreate())
2143          throw new Error("Attempt to auto-create ResearchElementDefinition.date");
2144        else if (Configuration.doAutoCreate())
2145          this.date = new DateTimeType(); // bb
2146      return this.date;
2147    }
2148
2149    public boolean hasDateElement() { 
2150      return this.date != null && !this.date.isEmpty();
2151    }
2152
2153    public boolean hasDate() { 
2154      return this.date != null && !this.date.isEmpty();
2155    }
2156
2157    /**
2158     * @param value {@link #date} (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.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
2159     */
2160    public ResearchElementDefinition setDateElement(DateTimeType value) { 
2161      this.date = value;
2162      return this;
2163    }
2164
2165    /**
2166     * @return 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.
2167     */
2168    public Date getDate() { 
2169      return this.date == null ? null : this.date.getValue();
2170    }
2171
2172    /**
2173     * @param value 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.
2174     */
2175    public ResearchElementDefinition setDate(Date value) { 
2176      if (value == null)
2177        this.date = null;
2178      else {
2179        if (this.date == null)
2180          this.date = new DateTimeType();
2181        this.date.setValue(value);
2182      }
2183      return this;
2184    }
2185
2186    /**
2187     * @return {@link #publisher} (The name of the organization or individual that published the research element definition.). This is the underlying object with id, value and extensions. The accessor "getPublisher" gives direct access to the value
2188     */
2189    public StringType getPublisherElement() { 
2190      if (this.publisher == null)
2191        if (Configuration.errorOnAutoCreate())
2192          throw new Error("Attempt to auto-create ResearchElementDefinition.publisher");
2193        else if (Configuration.doAutoCreate())
2194          this.publisher = new StringType(); // bb
2195      return this.publisher;
2196    }
2197
2198    public boolean hasPublisherElement() { 
2199      return this.publisher != null && !this.publisher.isEmpty();
2200    }
2201
2202    public boolean hasPublisher() { 
2203      return this.publisher != null && !this.publisher.isEmpty();
2204    }
2205
2206    /**
2207     * @param value {@link #publisher} (The name of the organization or individual that published the research element definition.). This is the underlying object with id, value and extensions. The accessor "getPublisher" gives direct access to the value
2208     */
2209    public ResearchElementDefinition setPublisherElement(StringType value) { 
2210      this.publisher = value;
2211      return this;
2212    }
2213
2214    /**
2215     * @return The name of the organization or individual that published the research element definition.
2216     */
2217    public String getPublisher() { 
2218      return this.publisher == null ? null : this.publisher.getValue();
2219    }
2220
2221    /**
2222     * @param value The name of the organization or individual that published the research element definition.
2223     */
2224    public ResearchElementDefinition setPublisher(String value) { 
2225      if (Utilities.noString(value))
2226        this.publisher = null;
2227      else {
2228        if (this.publisher == null)
2229          this.publisher = new StringType();
2230        this.publisher.setValue(value);
2231      }
2232      return this;
2233    }
2234
2235    /**
2236     * @return {@link #contact} (Contact details to assist a user in finding and communicating with the publisher.)
2237     */
2238    public List<ContactDetail> getContact() { 
2239      if (this.contact == null)
2240        this.contact = new ArrayList<ContactDetail>();
2241      return this.contact;
2242    }
2243
2244    /**
2245     * @return Returns a reference to <code>this</code> for easy method chaining
2246     */
2247    public ResearchElementDefinition setContact(List<ContactDetail> theContact) { 
2248      this.contact = theContact;
2249      return this;
2250    }
2251
2252    public boolean hasContact() { 
2253      if (this.contact == null)
2254        return false;
2255      for (ContactDetail item : this.contact)
2256        if (!item.isEmpty())
2257          return true;
2258      return false;
2259    }
2260
2261    public ContactDetail addContact() { //3
2262      ContactDetail t = new ContactDetail();
2263      if (this.contact == null)
2264        this.contact = new ArrayList<ContactDetail>();
2265      this.contact.add(t);
2266      return t;
2267    }
2268
2269    public ResearchElementDefinition addContact(ContactDetail t) { //3
2270      if (t == null)
2271        return this;
2272      if (this.contact == null)
2273        this.contact = new ArrayList<ContactDetail>();
2274      this.contact.add(t);
2275      return this;
2276    }
2277
2278    /**
2279     * @return The first repetition of repeating field {@link #contact}, creating it if it does not already exist
2280     */
2281    public ContactDetail getContactFirstRep() { 
2282      if (getContact().isEmpty()) {
2283        addContact();
2284      }
2285      return getContact().get(0);
2286    }
2287
2288    /**
2289     * @return {@link #description} (A free text natural language description of the research element definition from a consumer's perspective.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
2290     */
2291    public MarkdownType getDescriptionElement() { 
2292      if (this.description == null)
2293        if (Configuration.errorOnAutoCreate())
2294          throw new Error("Attempt to auto-create ResearchElementDefinition.description");
2295        else if (Configuration.doAutoCreate())
2296          this.description = new MarkdownType(); // bb
2297      return this.description;
2298    }
2299
2300    public boolean hasDescriptionElement() { 
2301      return this.description != null && !this.description.isEmpty();
2302    }
2303
2304    public boolean hasDescription() { 
2305      return this.description != null && !this.description.isEmpty();
2306    }
2307
2308    /**
2309     * @param value {@link #description} (A free text natural language description of the research element definition from a consumer's perspective.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
2310     */
2311    public ResearchElementDefinition setDescriptionElement(MarkdownType value) { 
2312      this.description = value;
2313      return this;
2314    }
2315
2316    /**
2317     * @return A free text natural language description of the research element definition from a consumer's perspective.
2318     */
2319    public String getDescription() { 
2320      return this.description == null ? null : this.description.getValue();
2321    }
2322
2323    /**
2324     * @param value A free text natural language description of the research element definition from a consumer's perspective.
2325     */
2326    public ResearchElementDefinition setDescription(String value) { 
2327      if (value == null)
2328        this.description = null;
2329      else {
2330        if (this.description == null)
2331          this.description = new MarkdownType();
2332        this.description.setValue(value);
2333      }
2334      return this;
2335    }
2336
2337    /**
2338     * @return {@link #comment} (A human-readable string to clarify or explain concepts about the resource.)
2339     */
2340    public List<StringType> getComment() { 
2341      if (this.comment == null)
2342        this.comment = new ArrayList<StringType>();
2343      return this.comment;
2344    }
2345
2346    /**
2347     * @return Returns a reference to <code>this</code> for easy method chaining
2348     */
2349    public ResearchElementDefinition setComment(List<StringType> theComment) { 
2350      this.comment = theComment;
2351      return this;
2352    }
2353
2354    public boolean hasComment() { 
2355      if (this.comment == null)
2356        return false;
2357      for (StringType item : this.comment)
2358        if (!item.isEmpty())
2359          return true;
2360      return false;
2361    }
2362
2363    /**
2364     * @return {@link #comment} (A human-readable string to clarify or explain concepts about the resource.)
2365     */
2366    public StringType addCommentElement() {//2 
2367      StringType t = new StringType();
2368      if (this.comment == null)
2369        this.comment = new ArrayList<StringType>();
2370      this.comment.add(t);
2371      return t;
2372    }
2373
2374    /**
2375     * @param value {@link #comment} (A human-readable string to clarify or explain concepts about the resource.)
2376     */
2377    public ResearchElementDefinition addComment(String value) { //1
2378      StringType t = new StringType();
2379      t.setValue(value);
2380      if (this.comment == null)
2381        this.comment = new ArrayList<StringType>();
2382      this.comment.add(t);
2383      return this;
2384    }
2385
2386    /**
2387     * @param value {@link #comment} (A human-readable string to clarify or explain concepts about the resource.)
2388     */
2389    public boolean hasComment(String value) { 
2390      if (this.comment == null)
2391        return false;
2392      for (StringType v : this.comment)
2393        if (v.getValue().equals(value)) // string
2394          return true;
2395      return false;
2396    }
2397
2398    /**
2399     * @return {@link #useContext} (The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate research element definition instances.)
2400     */
2401    public List<UsageContext> getUseContext() { 
2402      if (this.useContext == null)
2403        this.useContext = new ArrayList<UsageContext>();
2404      return this.useContext;
2405    }
2406
2407    /**
2408     * @return Returns a reference to <code>this</code> for easy method chaining
2409     */
2410    public ResearchElementDefinition setUseContext(List<UsageContext> theUseContext) { 
2411      this.useContext = theUseContext;
2412      return this;
2413    }
2414
2415    public boolean hasUseContext() { 
2416      if (this.useContext == null)
2417        return false;
2418      for (UsageContext item : this.useContext)
2419        if (!item.isEmpty())
2420          return true;
2421      return false;
2422    }
2423
2424    public UsageContext addUseContext() { //3
2425      UsageContext t = new UsageContext();
2426      if (this.useContext == null)
2427        this.useContext = new ArrayList<UsageContext>();
2428      this.useContext.add(t);
2429      return t;
2430    }
2431
2432    public ResearchElementDefinition addUseContext(UsageContext t) { //3
2433      if (t == null)
2434        return this;
2435      if (this.useContext == null)
2436        this.useContext = new ArrayList<UsageContext>();
2437      this.useContext.add(t);
2438      return this;
2439    }
2440
2441    /**
2442     * @return The first repetition of repeating field {@link #useContext}, creating it if it does not already exist
2443     */
2444    public UsageContext getUseContextFirstRep() { 
2445      if (getUseContext().isEmpty()) {
2446        addUseContext();
2447      }
2448      return getUseContext().get(0);
2449    }
2450
2451    /**
2452     * @return {@link #jurisdiction} (A legal or geographic region in which the research element definition is intended to be used.)
2453     */
2454    public List<CodeableConcept> getJurisdiction() { 
2455      if (this.jurisdiction == null)
2456        this.jurisdiction = new ArrayList<CodeableConcept>();
2457      return this.jurisdiction;
2458    }
2459
2460    /**
2461     * @return Returns a reference to <code>this</code> for easy method chaining
2462     */
2463    public ResearchElementDefinition setJurisdiction(List<CodeableConcept> theJurisdiction) { 
2464      this.jurisdiction = theJurisdiction;
2465      return this;
2466    }
2467
2468    public boolean hasJurisdiction() { 
2469      if (this.jurisdiction == null)
2470        return false;
2471      for (CodeableConcept item : this.jurisdiction)
2472        if (!item.isEmpty())
2473          return true;
2474      return false;
2475    }
2476
2477    public CodeableConcept addJurisdiction() { //3
2478      CodeableConcept t = new CodeableConcept();
2479      if (this.jurisdiction == null)
2480        this.jurisdiction = new ArrayList<CodeableConcept>();
2481      this.jurisdiction.add(t);
2482      return t;
2483    }
2484
2485    public ResearchElementDefinition addJurisdiction(CodeableConcept t) { //3
2486      if (t == null)
2487        return this;
2488      if (this.jurisdiction == null)
2489        this.jurisdiction = new ArrayList<CodeableConcept>();
2490      this.jurisdiction.add(t);
2491      return this;
2492    }
2493
2494    /**
2495     * @return The first repetition of repeating field {@link #jurisdiction}, creating it if it does not already exist
2496     */
2497    public CodeableConcept getJurisdictionFirstRep() { 
2498      if (getJurisdiction().isEmpty()) {
2499        addJurisdiction();
2500      }
2501      return getJurisdiction().get(0);
2502    }
2503
2504    /**
2505     * @return {@link #purpose} (Explanation of why this research element definition is needed and why it has been designed as it has.). This is the underlying object with id, value and extensions. The accessor "getPurpose" gives direct access to the value
2506     */
2507    public MarkdownType getPurposeElement() { 
2508      if (this.purpose == null)
2509        if (Configuration.errorOnAutoCreate())
2510          throw new Error("Attempt to auto-create ResearchElementDefinition.purpose");
2511        else if (Configuration.doAutoCreate())
2512          this.purpose = new MarkdownType(); // bb
2513      return this.purpose;
2514    }
2515
2516    public boolean hasPurposeElement() { 
2517      return this.purpose != null && !this.purpose.isEmpty();
2518    }
2519
2520    public boolean hasPurpose() { 
2521      return this.purpose != null && !this.purpose.isEmpty();
2522    }
2523
2524    /**
2525     * @param value {@link #purpose} (Explanation of why this research element definition is needed and why it has been designed as it has.). This is the underlying object with id, value and extensions. The accessor "getPurpose" gives direct access to the value
2526     */
2527    public ResearchElementDefinition setPurposeElement(MarkdownType value) { 
2528      this.purpose = value;
2529      return this;
2530    }
2531
2532    /**
2533     * @return Explanation of why this research element definition is needed and why it has been designed as it has.
2534     */
2535    public String getPurpose() { 
2536      return this.purpose == null ? null : this.purpose.getValue();
2537    }
2538
2539    /**
2540     * @param value Explanation of why this research element definition is needed and why it has been designed as it has.
2541     */
2542    public ResearchElementDefinition setPurpose(String value) { 
2543      if (value == null)
2544        this.purpose = null;
2545      else {
2546        if (this.purpose == null)
2547          this.purpose = new MarkdownType();
2548        this.purpose.setValue(value);
2549      }
2550      return this;
2551    }
2552
2553    /**
2554     * @return {@link #usage} (A detailed description, from a clinical perspective, of how the ResearchElementDefinition is used.). This is the underlying object with id, value and extensions. The accessor "getUsage" gives direct access to the value
2555     */
2556    public StringType getUsageElement() { 
2557      if (this.usage == null)
2558        if (Configuration.errorOnAutoCreate())
2559          throw new Error("Attempt to auto-create ResearchElementDefinition.usage");
2560        else if (Configuration.doAutoCreate())
2561          this.usage = new StringType(); // bb
2562      return this.usage;
2563    }
2564
2565    public boolean hasUsageElement() { 
2566      return this.usage != null && !this.usage.isEmpty();
2567    }
2568
2569    public boolean hasUsage() { 
2570      return this.usage != null && !this.usage.isEmpty();
2571    }
2572
2573    /**
2574     * @param value {@link #usage} (A detailed description, from a clinical perspective, of how the ResearchElementDefinition is used.). This is the underlying object with id, value and extensions. The accessor "getUsage" gives direct access to the value
2575     */
2576    public ResearchElementDefinition setUsageElement(StringType value) { 
2577      this.usage = value;
2578      return this;
2579    }
2580
2581    /**
2582     * @return A detailed description, from a clinical perspective, of how the ResearchElementDefinition is used.
2583     */
2584    public String getUsage() { 
2585      return this.usage == null ? null : this.usage.getValue();
2586    }
2587
2588    /**
2589     * @param value A detailed description, from a clinical perspective, of how the ResearchElementDefinition is used.
2590     */
2591    public ResearchElementDefinition setUsage(String value) { 
2592      if (Utilities.noString(value))
2593        this.usage = null;
2594      else {
2595        if (this.usage == null)
2596          this.usage = new StringType();
2597        this.usage.setValue(value);
2598      }
2599      return this;
2600    }
2601
2602    /**
2603     * @return {@link #copyright} (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.). This is the underlying object with id, value and extensions. The accessor "getCopyright" gives direct access to the value
2604     */
2605    public MarkdownType getCopyrightElement() { 
2606      if (this.copyright == null)
2607        if (Configuration.errorOnAutoCreate())
2608          throw new Error("Attempt to auto-create ResearchElementDefinition.copyright");
2609        else if (Configuration.doAutoCreate())
2610          this.copyright = new MarkdownType(); // bb
2611      return this.copyright;
2612    }
2613
2614    public boolean hasCopyrightElement() { 
2615      return this.copyright != null && !this.copyright.isEmpty();
2616    }
2617
2618    public boolean hasCopyright() { 
2619      return this.copyright != null && !this.copyright.isEmpty();
2620    }
2621
2622    /**
2623     * @param value {@link #copyright} (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.). This is the underlying object with id, value and extensions. The accessor "getCopyright" gives direct access to the value
2624     */
2625    public ResearchElementDefinition setCopyrightElement(MarkdownType value) { 
2626      this.copyright = value;
2627      return this;
2628    }
2629
2630    /**
2631     * @return 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.
2632     */
2633    public String getCopyright() { 
2634      return this.copyright == null ? null : this.copyright.getValue();
2635    }
2636
2637    /**
2638     * @param value 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.
2639     */
2640    public ResearchElementDefinition setCopyright(String value) { 
2641      if (value == null)
2642        this.copyright = null;
2643      else {
2644        if (this.copyright == null)
2645          this.copyright = new MarkdownType();
2646        this.copyright.setValue(value);
2647      }
2648      return this;
2649    }
2650
2651    /**
2652     * @return {@link #approvalDate} (The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.). This is the underlying object with id, value and extensions. The accessor "getApprovalDate" gives direct access to the value
2653     */
2654    public DateType getApprovalDateElement() { 
2655      if (this.approvalDate == null)
2656        if (Configuration.errorOnAutoCreate())
2657          throw new Error("Attempt to auto-create ResearchElementDefinition.approvalDate");
2658        else if (Configuration.doAutoCreate())
2659          this.approvalDate = new DateType(); // bb
2660      return this.approvalDate;
2661    }
2662
2663    public boolean hasApprovalDateElement() { 
2664      return this.approvalDate != null && !this.approvalDate.isEmpty();
2665    }
2666
2667    public boolean hasApprovalDate() { 
2668      return this.approvalDate != null && !this.approvalDate.isEmpty();
2669    }
2670
2671    /**
2672     * @param value {@link #approvalDate} (The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.). This is the underlying object with id, value and extensions. The accessor "getApprovalDate" gives direct access to the value
2673     */
2674    public ResearchElementDefinition setApprovalDateElement(DateType value) { 
2675      this.approvalDate = value;
2676      return this;
2677    }
2678
2679    /**
2680     * @return The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.
2681     */
2682    public Date getApprovalDate() { 
2683      return this.approvalDate == null ? null : this.approvalDate.getValue();
2684    }
2685
2686    /**
2687     * @param value The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.
2688     */
2689    public ResearchElementDefinition setApprovalDate(Date value) { 
2690      if (value == null)
2691        this.approvalDate = null;
2692      else {
2693        if (this.approvalDate == null)
2694          this.approvalDate = new DateType();
2695        this.approvalDate.setValue(value);
2696      }
2697      return this;
2698    }
2699
2700    /**
2701     * @return {@link #lastReviewDate} (The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.). This is the underlying object with id, value and extensions. The accessor "getLastReviewDate" gives direct access to the value
2702     */
2703    public DateType getLastReviewDateElement() { 
2704      if (this.lastReviewDate == null)
2705        if (Configuration.errorOnAutoCreate())
2706          throw new Error("Attempt to auto-create ResearchElementDefinition.lastReviewDate");
2707        else if (Configuration.doAutoCreate())
2708          this.lastReviewDate = new DateType(); // bb
2709      return this.lastReviewDate;
2710    }
2711
2712    public boolean hasLastReviewDateElement() { 
2713      return this.lastReviewDate != null && !this.lastReviewDate.isEmpty();
2714    }
2715
2716    public boolean hasLastReviewDate() { 
2717      return this.lastReviewDate != null && !this.lastReviewDate.isEmpty();
2718    }
2719
2720    /**
2721     * @param value {@link #lastReviewDate} (The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.). This is the underlying object with id, value and extensions. The accessor "getLastReviewDate" gives direct access to the value
2722     */
2723    public ResearchElementDefinition setLastReviewDateElement(DateType value) { 
2724      this.lastReviewDate = value;
2725      return this;
2726    }
2727
2728    /**
2729     * @return The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.
2730     */
2731    public Date getLastReviewDate() { 
2732      return this.lastReviewDate == null ? null : this.lastReviewDate.getValue();
2733    }
2734
2735    /**
2736     * @param value The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.
2737     */
2738    public ResearchElementDefinition setLastReviewDate(Date value) { 
2739      if (value == null)
2740        this.lastReviewDate = null;
2741      else {
2742        if (this.lastReviewDate == null)
2743          this.lastReviewDate = new DateType();
2744        this.lastReviewDate.setValue(value);
2745      }
2746      return this;
2747    }
2748
2749    /**
2750     * @return {@link #effectivePeriod} (The period during which the research element definition content was or is planned to be in active use.)
2751     */
2752    public Period getEffectivePeriod() { 
2753      if (this.effectivePeriod == null)
2754        if (Configuration.errorOnAutoCreate())
2755          throw new Error("Attempt to auto-create ResearchElementDefinition.effectivePeriod");
2756        else if (Configuration.doAutoCreate())
2757          this.effectivePeriod = new Period(); // cc
2758      return this.effectivePeriod;
2759    }
2760
2761    public boolean hasEffectivePeriod() { 
2762      return this.effectivePeriod != null && !this.effectivePeriod.isEmpty();
2763    }
2764
2765    /**
2766     * @param value {@link #effectivePeriod} (The period during which the research element definition content was or is planned to be in active use.)
2767     */
2768    public ResearchElementDefinition setEffectivePeriod(Period value) { 
2769      this.effectivePeriod = value;
2770      return this;
2771    }
2772
2773    /**
2774     * @return {@link #topic} (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.)
2775     */
2776    public List<CodeableConcept> getTopic() { 
2777      if (this.topic == null)
2778        this.topic = new ArrayList<CodeableConcept>();
2779      return this.topic;
2780    }
2781
2782    /**
2783     * @return Returns a reference to <code>this</code> for easy method chaining
2784     */
2785    public ResearchElementDefinition setTopic(List<CodeableConcept> theTopic) { 
2786      this.topic = theTopic;
2787      return this;
2788    }
2789
2790    public boolean hasTopic() { 
2791      if (this.topic == null)
2792        return false;
2793      for (CodeableConcept item : this.topic)
2794        if (!item.isEmpty())
2795          return true;
2796      return false;
2797    }
2798
2799    public CodeableConcept addTopic() { //3
2800      CodeableConcept t = new CodeableConcept();
2801      if (this.topic == null)
2802        this.topic = new ArrayList<CodeableConcept>();
2803      this.topic.add(t);
2804      return t;
2805    }
2806
2807    public ResearchElementDefinition addTopic(CodeableConcept t) { //3
2808      if (t == null)
2809        return this;
2810      if (this.topic == null)
2811        this.topic = new ArrayList<CodeableConcept>();
2812      this.topic.add(t);
2813      return this;
2814    }
2815
2816    /**
2817     * @return The first repetition of repeating field {@link #topic}, creating it if it does not already exist
2818     */
2819    public CodeableConcept getTopicFirstRep() { 
2820      if (getTopic().isEmpty()) {
2821        addTopic();
2822      }
2823      return getTopic().get(0);
2824    }
2825
2826    /**
2827     * @return {@link #author} (An individiual or organization primarily involved in the creation and maintenance of the content.)
2828     */
2829    public List<ContactDetail> getAuthor() { 
2830      if (this.author == null)
2831        this.author = new ArrayList<ContactDetail>();
2832      return this.author;
2833    }
2834
2835    /**
2836     * @return Returns a reference to <code>this</code> for easy method chaining
2837     */
2838    public ResearchElementDefinition setAuthor(List<ContactDetail> theAuthor) { 
2839      this.author = theAuthor;
2840      return this;
2841    }
2842
2843    public boolean hasAuthor() { 
2844      if (this.author == null)
2845        return false;
2846      for (ContactDetail item : this.author)
2847        if (!item.isEmpty())
2848          return true;
2849      return false;
2850    }
2851
2852    public ContactDetail addAuthor() { //3
2853      ContactDetail t = new ContactDetail();
2854      if (this.author == null)
2855        this.author = new ArrayList<ContactDetail>();
2856      this.author.add(t);
2857      return t;
2858    }
2859
2860    public ResearchElementDefinition addAuthor(ContactDetail t) { //3
2861      if (t == null)
2862        return this;
2863      if (this.author == null)
2864        this.author = new ArrayList<ContactDetail>();
2865      this.author.add(t);
2866      return this;
2867    }
2868
2869    /**
2870     * @return The first repetition of repeating field {@link #author}, creating it if it does not already exist
2871     */
2872    public ContactDetail getAuthorFirstRep() { 
2873      if (getAuthor().isEmpty()) {
2874        addAuthor();
2875      }
2876      return getAuthor().get(0);
2877    }
2878
2879    /**
2880     * @return {@link #editor} (An individual or organization primarily responsible for internal coherence of the content.)
2881     */
2882    public List<ContactDetail> getEditor() { 
2883      if (this.editor == null)
2884        this.editor = new ArrayList<ContactDetail>();
2885      return this.editor;
2886    }
2887
2888    /**
2889     * @return Returns a reference to <code>this</code> for easy method chaining
2890     */
2891    public ResearchElementDefinition setEditor(List<ContactDetail> theEditor) { 
2892      this.editor = theEditor;
2893      return this;
2894    }
2895
2896    public boolean hasEditor() { 
2897      if (this.editor == null)
2898        return false;
2899      for (ContactDetail item : this.editor)
2900        if (!item.isEmpty())
2901          return true;
2902      return false;
2903    }
2904
2905    public ContactDetail addEditor() { //3
2906      ContactDetail t = new ContactDetail();
2907      if (this.editor == null)
2908        this.editor = new ArrayList<ContactDetail>();
2909      this.editor.add(t);
2910      return t;
2911    }
2912
2913    public ResearchElementDefinition addEditor(ContactDetail t) { //3
2914      if (t == null)
2915        return this;
2916      if (this.editor == null)
2917        this.editor = new ArrayList<ContactDetail>();
2918      this.editor.add(t);
2919      return this;
2920    }
2921
2922    /**
2923     * @return The first repetition of repeating field {@link #editor}, creating it if it does not already exist
2924     */
2925    public ContactDetail getEditorFirstRep() { 
2926      if (getEditor().isEmpty()) {
2927        addEditor();
2928      }
2929      return getEditor().get(0);
2930    }
2931
2932    /**
2933     * @return {@link #reviewer} (An individual or organization primarily responsible for review of some aspect of the content.)
2934     */
2935    public List<ContactDetail> getReviewer() { 
2936      if (this.reviewer == null)
2937        this.reviewer = new ArrayList<ContactDetail>();
2938      return this.reviewer;
2939    }
2940
2941    /**
2942     * @return Returns a reference to <code>this</code> for easy method chaining
2943     */
2944    public ResearchElementDefinition setReviewer(List<ContactDetail> theReviewer) { 
2945      this.reviewer = theReviewer;
2946      return this;
2947    }
2948
2949    public boolean hasReviewer() { 
2950      if (this.reviewer == null)
2951        return false;
2952      for (ContactDetail item : this.reviewer)
2953        if (!item.isEmpty())
2954          return true;
2955      return false;
2956    }
2957
2958    public ContactDetail addReviewer() { //3
2959      ContactDetail t = new ContactDetail();
2960      if (this.reviewer == null)
2961        this.reviewer = new ArrayList<ContactDetail>();
2962      this.reviewer.add(t);
2963      return t;
2964    }
2965
2966    public ResearchElementDefinition addReviewer(ContactDetail t) { //3
2967      if (t == null)
2968        return this;
2969      if (this.reviewer == null)
2970        this.reviewer = new ArrayList<ContactDetail>();
2971      this.reviewer.add(t);
2972      return this;
2973    }
2974
2975    /**
2976     * @return The first repetition of repeating field {@link #reviewer}, creating it if it does not already exist
2977     */
2978    public ContactDetail getReviewerFirstRep() { 
2979      if (getReviewer().isEmpty()) {
2980        addReviewer();
2981      }
2982      return getReviewer().get(0);
2983    }
2984
2985    /**
2986     * @return {@link #endorser} (An individual or organization responsible for officially endorsing the content for use in some setting.)
2987     */
2988    public List<ContactDetail> getEndorser() { 
2989      if (this.endorser == null)
2990        this.endorser = new ArrayList<ContactDetail>();
2991      return this.endorser;
2992    }
2993
2994    /**
2995     * @return Returns a reference to <code>this</code> for easy method chaining
2996     */
2997    public ResearchElementDefinition setEndorser(List<ContactDetail> theEndorser) { 
2998      this.endorser = theEndorser;
2999      return this;
3000    }
3001
3002    public boolean hasEndorser() { 
3003      if (this.endorser == null)
3004        return false;
3005      for (ContactDetail item : this.endorser)
3006        if (!item.isEmpty())
3007          return true;
3008      return false;
3009    }
3010
3011    public ContactDetail addEndorser() { //3
3012      ContactDetail t = new ContactDetail();
3013      if (this.endorser == null)
3014        this.endorser = new ArrayList<ContactDetail>();
3015      this.endorser.add(t);
3016      return t;
3017    }
3018
3019    public ResearchElementDefinition addEndorser(ContactDetail t) { //3
3020      if (t == null)
3021        return this;
3022      if (this.endorser == null)
3023        this.endorser = new ArrayList<ContactDetail>();
3024      this.endorser.add(t);
3025      return this;
3026    }
3027
3028    /**
3029     * @return The first repetition of repeating field {@link #endorser}, creating it if it does not already exist
3030     */
3031    public ContactDetail getEndorserFirstRep() { 
3032      if (getEndorser().isEmpty()) {
3033        addEndorser();
3034      }
3035      return getEndorser().get(0);
3036    }
3037
3038    /**
3039     * @return {@link #relatedArtifact} (Related artifacts such as additional documentation, justification, or bibliographic references.)
3040     */
3041    public List<RelatedArtifact> getRelatedArtifact() { 
3042      if (this.relatedArtifact == null)
3043        this.relatedArtifact = new ArrayList<RelatedArtifact>();
3044      return this.relatedArtifact;
3045    }
3046
3047    /**
3048     * @return Returns a reference to <code>this</code> for easy method chaining
3049     */
3050    public ResearchElementDefinition setRelatedArtifact(List<RelatedArtifact> theRelatedArtifact) { 
3051      this.relatedArtifact = theRelatedArtifact;
3052      return this;
3053    }
3054
3055    public boolean hasRelatedArtifact() { 
3056      if (this.relatedArtifact == null)
3057        return false;
3058      for (RelatedArtifact item : this.relatedArtifact)
3059        if (!item.isEmpty())
3060          return true;
3061      return false;
3062    }
3063
3064    public RelatedArtifact addRelatedArtifact() { //3
3065      RelatedArtifact t = new RelatedArtifact();
3066      if (this.relatedArtifact == null)
3067        this.relatedArtifact = new ArrayList<RelatedArtifact>();
3068      this.relatedArtifact.add(t);
3069      return t;
3070    }
3071
3072    public ResearchElementDefinition addRelatedArtifact(RelatedArtifact t) { //3
3073      if (t == null)
3074        return this;
3075      if (this.relatedArtifact == null)
3076        this.relatedArtifact = new ArrayList<RelatedArtifact>();
3077      this.relatedArtifact.add(t);
3078      return this;
3079    }
3080
3081    /**
3082     * @return The first repetition of repeating field {@link #relatedArtifact}, creating it if it does not already exist
3083     */
3084    public RelatedArtifact getRelatedArtifactFirstRep() { 
3085      if (getRelatedArtifact().isEmpty()) {
3086        addRelatedArtifact();
3087      }
3088      return getRelatedArtifact().get(0);
3089    }
3090
3091    /**
3092     * @return {@link #library} (A reference to a Library resource containing the formal logic used by the ResearchElementDefinition.)
3093     */
3094    public List<CanonicalType> getLibrary() { 
3095      if (this.library == null)
3096        this.library = new ArrayList<CanonicalType>();
3097      return this.library;
3098    }
3099
3100    /**
3101     * @return Returns a reference to <code>this</code> for easy method chaining
3102     */
3103    public ResearchElementDefinition setLibrary(List<CanonicalType> theLibrary) { 
3104      this.library = theLibrary;
3105      return this;
3106    }
3107
3108    public boolean hasLibrary() { 
3109      if (this.library == null)
3110        return false;
3111      for (CanonicalType item : this.library)
3112        if (!item.isEmpty())
3113          return true;
3114      return false;
3115    }
3116
3117    /**
3118     * @return {@link #library} (A reference to a Library resource containing the formal logic used by the ResearchElementDefinition.)
3119     */
3120    public CanonicalType addLibraryElement() {//2 
3121      CanonicalType t = new CanonicalType();
3122      if (this.library == null)
3123        this.library = new ArrayList<CanonicalType>();
3124      this.library.add(t);
3125      return t;
3126    }
3127
3128    /**
3129     * @param value {@link #library} (A reference to a Library resource containing the formal logic used by the ResearchElementDefinition.)
3130     */
3131    public ResearchElementDefinition addLibrary(String value) { //1
3132      CanonicalType t = new CanonicalType();
3133      t.setValue(value);
3134      if (this.library == null)
3135        this.library = new ArrayList<CanonicalType>();
3136      this.library.add(t);
3137      return this;
3138    }
3139
3140    /**
3141     * @param value {@link #library} (A reference to a Library resource containing the formal logic used by the ResearchElementDefinition.)
3142     */
3143    public boolean hasLibrary(String value) { 
3144      if (this.library == null)
3145        return false;
3146      for (CanonicalType v : this.library)
3147        if (v.getValue().equals(value)) // canonical(Library)
3148          return true;
3149      return false;
3150    }
3151
3152    /**
3153     * @return {@link #type} (The type of research element, a population, an exposure, or an outcome.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
3154     */
3155    public Enumeration<ResearchElementType> getTypeElement() { 
3156      if (this.type == null)
3157        if (Configuration.errorOnAutoCreate())
3158          throw new Error("Attempt to auto-create ResearchElementDefinition.type");
3159        else if (Configuration.doAutoCreate())
3160          this.type = new Enumeration<ResearchElementType>(new ResearchElementTypeEnumFactory()); // bb
3161      return this.type;
3162    }
3163
3164    public boolean hasTypeElement() { 
3165      return this.type != null && !this.type.isEmpty();
3166    }
3167
3168    public boolean hasType() { 
3169      return this.type != null && !this.type.isEmpty();
3170    }
3171
3172    /**
3173     * @param value {@link #type} (The type of research element, a population, an exposure, or an outcome.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
3174     */
3175    public ResearchElementDefinition setTypeElement(Enumeration<ResearchElementType> value) { 
3176      this.type = value;
3177      return this;
3178    }
3179
3180    /**
3181     * @return The type of research element, a population, an exposure, or an outcome.
3182     */
3183    public ResearchElementType getType() { 
3184      return this.type == null ? null : this.type.getValue();
3185    }
3186
3187    /**
3188     * @param value The type of research element, a population, an exposure, or an outcome.
3189     */
3190    public ResearchElementDefinition setType(ResearchElementType value) { 
3191        if (this.type == null)
3192          this.type = new Enumeration<ResearchElementType>(new ResearchElementTypeEnumFactory());
3193        this.type.setValue(value);
3194      return this;
3195    }
3196
3197    /**
3198     * @return {@link #variableType} (The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive).). This is the underlying object with id, value and extensions. The accessor "getVariableType" gives direct access to the value
3199     */
3200    public Enumeration<VariableType> getVariableTypeElement() { 
3201      if (this.variableType == null)
3202        if (Configuration.errorOnAutoCreate())
3203          throw new Error("Attempt to auto-create ResearchElementDefinition.variableType");
3204        else if (Configuration.doAutoCreate())
3205          this.variableType = new Enumeration<VariableType>(new VariableTypeEnumFactory()); // bb
3206      return this.variableType;
3207    }
3208
3209    public boolean hasVariableTypeElement() { 
3210      return this.variableType != null && !this.variableType.isEmpty();
3211    }
3212
3213    public boolean hasVariableType() { 
3214      return this.variableType != null && !this.variableType.isEmpty();
3215    }
3216
3217    /**
3218     * @param value {@link #variableType} (The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive).). This is the underlying object with id, value and extensions. The accessor "getVariableType" gives direct access to the value
3219     */
3220    public ResearchElementDefinition setVariableTypeElement(Enumeration<VariableType> value) { 
3221      this.variableType = value;
3222      return this;
3223    }
3224
3225    /**
3226     * @return The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive).
3227     */
3228    public VariableType getVariableType() { 
3229      return this.variableType == null ? null : this.variableType.getValue();
3230    }
3231
3232    /**
3233     * @param value The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive).
3234     */
3235    public ResearchElementDefinition setVariableType(VariableType value) { 
3236      if (value == null)
3237        this.variableType = null;
3238      else {
3239        if (this.variableType == null)
3240          this.variableType = new Enumeration<VariableType>(new VariableTypeEnumFactory());
3241        this.variableType.setValue(value);
3242      }
3243      return this;
3244    }
3245
3246    /**
3247     * @return {@link #characteristic} (A characteristic that defines the members of the research element. Multiple characteristics are applied with "and" semantics.)
3248     */
3249    public List<ResearchElementDefinitionCharacteristicComponent> getCharacteristic() { 
3250      if (this.characteristic == null)
3251        this.characteristic = new ArrayList<ResearchElementDefinitionCharacteristicComponent>();
3252      return this.characteristic;
3253    }
3254
3255    /**
3256     * @return Returns a reference to <code>this</code> for easy method chaining
3257     */
3258    public ResearchElementDefinition setCharacteristic(List<ResearchElementDefinitionCharacteristicComponent> theCharacteristic) { 
3259      this.characteristic = theCharacteristic;
3260      return this;
3261    }
3262
3263    public boolean hasCharacteristic() { 
3264      if (this.characteristic == null)
3265        return false;
3266      for (ResearchElementDefinitionCharacteristicComponent item : this.characteristic)
3267        if (!item.isEmpty())
3268          return true;
3269      return false;
3270    }
3271
3272    public ResearchElementDefinitionCharacteristicComponent addCharacteristic() { //3
3273      ResearchElementDefinitionCharacteristicComponent t = new ResearchElementDefinitionCharacteristicComponent();
3274      if (this.characteristic == null)
3275        this.characteristic = new ArrayList<ResearchElementDefinitionCharacteristicComponent>();
3276      this.characteristic.add(t);
3277      return t;
3278    }
3279
3280    public ResearchElementDefinition addCharacteristic(ResearchElementDefinitionCharacteristicComponent t) { //3
3281      if (t == null)
3282        return this;
3283      if (this.characteristic == null)
3284        this.characteristic = new ArrayList<ResearchElementDefinitionCharacteristicComponent>();
3285      this.characteristic.add(t);
3286      return this;
3287    }
3288
3289    /**
3290     * @return The first repetition of repeating field {@link #characteristic}, creating it if it does not already exist
3291     */
3292    public ResearchElementDefinitionCharacteristicComponent getCharacteristicFirstRep() { 
3293      if (getCharacteristic().isEmpty()) {
3294        addCharacteristic();
3295      }
3296      return getCharacteristic().get(0);
3297    }
3298
3299      protected void listChildren(List<Property> children) {
3300        super.listChildren(children);
3301        children.add(new Property("url", "uri", "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.", 0, 1, url));
3302        children.add(new Property("identifier", "Identifier", "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.", 0, java.lang.Integer.MAX_VALUE, identifier));
3303        children.add(new Property("version", "string", "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.", 0, 1, version));
3304        children.add(new Property("name", "string", "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.", 0, 1, name));
3305        children.add(new Property("title", "string", "A short, descriptive, user-friendly title for the research element definition.", 0, 1, title));
3306        children.add(new Property("shortTitle", "string", "The short title provides an alternate title for use in informal descriptive contexts where the full, formal title is not necessary.", 0, 1, shortTitle));
3307        children.add(new Property("subtitle", "string", "An explanatory or alternate title for the ResearchElementDefinition giving additional information about its content.", 0, 1, subtitle));
3308        children.add(new Property("status", "code", "The status of this research element definition. Enables tracking the life-cycle of the content.", 0, 1, status));
3309        children.add(new Property("experimental", "boolean", "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.", 0, 1, experimental));
3310        children.add(new Property("subject[x]", "CodeableConcept|Reference(Group)", "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.", 0, 1, subject));
3311        children.add(new Property("date", "dateTime", "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.", 0, 1, date));
3312        children.add(new Property("publisher", "string", "The name of the organization or individual that published the research element definition.", 0, 1, publisher));
3313        children.add(new Property("contact", "ContactDetail", "Contact details to assist a user in finding and communicating with the publisher.", 0, java.lang.Integer.MAX_VALUE, contact));
3314        children.add(new Property("description", "markdown", "A free text natural language description of the research element definition from a consumer's perspective.", 0, 1, description));
3315        children.add(new Property("comment", "string", "A human-readable string to clarify or explain concepts about the resource.", 0, java.lang.Integer.MAX_VALUE, comment));
3316        children.add(new Property("useContext", "UsageContext", "The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate research element definition instances.", 0, java.lang.Integer.MAX_VALUE, useContext));
3317        children.add(new Property("jurisdiction", "CodeableConcept", "A legal or geographic region in which the research element definition is intended to be used.", 0, java.lang.Integer.MAX_VALUE, jurisdiction));
3318        children.add(new Property("purpose", "markdown", "Explanation of why this research element definition is needed and why it has been designed as it has.", 0, 1, purpose));
3319        children.add(new Property("usage", "string", "A detailed description, from a clinical perspective, of how the ResearchElementDefinition is used.", 0, 1, usage));
3320        children.add(new Property("copyright", "markdown", "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.", 0, 1, copyright));
3321        children.add(new Property("approvalDate", "date", "The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.", 0, 1, approvalDate));
3322        children.add(new Property("lastReviewDate", "date", "The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.", 0, 1, lastReviewDate));
3323        children.add(new Property("effectivePeriod", "Period", "The period during which the research element definition content was or is planned to be in active use.", 0, 1, effectivePeriod));
3324        children.add(new Property("topic", "CodeableConcept", "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.", 0, java.lang.Integer.MAX_VALUE, topic));
3325        children.add(new Property("author", "ContactDetail", "An individiual or organization primarily involved in the creation and maintenance of the content.", 0, java.lang.Integer.MAX_VALUE, author));
3326        children.add(new Property("editor", "ContactDetail", "An individual or organization primarily responsible for internal coherence of the content.", 0, java.lang.Integer.MAX_VALUE, editor));
3327        children.add(new Property("reviewer", "ContactDetail", "An individual or organization primarily responsible for review of some aspect of the content.", 0, java.lang.Integer.MAX_VALUE, reviewer));
3328        children.add(new Property("endorser", "ContactDetail", "An individual or organization responsible for officially endorsing the content for use in some setting.", 0, java.lang.Integer.MAX_VALUE, endorser));
3329        children.add(new Property("relatedArtifact", "RelatedArtifact", "Related artifacts such as additional documentation, justification, or bibliographic references.", 0, java.lang.Integer.MAX_VALUE, relatedArtifact));
3330        children.add(new Property("library", "canonical(Library)", "A reference to a Library resource containing the formal logic used by the ResearchElementDefinition.", 0, java.lang.Integer.MAX_VALUE, library));
3331        children.add(new Property("type", "code", "The type of research element, a population, an exposure, or an outcome.", 0, 1, type));
3332        children.add(new Property("variableType", "code", "The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive).", 0, 1, variableType));
3333        children.add(new Property("characteristic", "", "A characteristic that defines the members of the research element. Multiple characteristics are applied with \"and\" semantics.", 0, java.lang.Integer.MAX_VALUE, characteristic));
3334      }
3335
3336      @Override
3337      public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
3338        switch (_hash) {
3339        case 116079: /*url*/  return new Property("url", "uri", "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.", 0, 1, url);
3340        case -1618432855: /*identifier*/  return new Property("identifier", "Identifier", "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.", 0, java.lang.Integer.MAX_VALUE, identifier);
3341        case 351608024: /*version*/  return new Property("version", "string", "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.", 0, 1, version);
3342        case 3373707: /*name*/  return new Property("name", "string", "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.", 0, 1, name);
3343        case 110371416: /*title*/  return new Property("title", "string", "A short, descriptive, user-friendly title for the research element definition.", 0, 1, title);
3344        case 1555503932: /*shortTitle*/  return new Property("shortTitle", "string", "The short title provides an alternate title for use in informal descriptive contexts where the full, formal title is not necessary.", 0, 1, shortTitle);
3345        case -2060497896: /*subtitle*/  return new Property("subtitle", "string", "An explanatory or alternate title for the ResearchElementDefinition giving additional information about its content.", 0, 1, subtitle);
3346        case -892481550: /*status*/  return new Property("status", "code", "The status of this research element definition. Enables tracking the life-cycle of the content.", 0, 1, status);
3347        case -404562712: /*experimental*/  return new Property("experimental", "boolean", "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.", 0, 1, experimental);
3348        case -573640748: /*subject[x]*/  return new Property("subject[x]", "CodeableConcept|Reference(Group)", "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.", 0, 1, subject);
3349        case -1867885268: /*subject*/  return new Property("subject[x]", "CodeableConcept|Reference(Group)", "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.", 0, 1, subject);
3350        case -1257122603: /*subjectCodeableConcept*/  return new Property("subject[x]", "CodeableConcept|Reference(Group)", "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.", 0, 1, subject);
3351        case 772938623: /*subjectReference*/  return new Property("subject[x]", "CodeableConcept|Reference(Group)", "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.", 0, 1, subject);
3352        case 3076014: /*date*/  return new Property("date", "dateTime", "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.", 0, 1, date);
3353        case 1447404028: /*publisher*/  return new Property("publisher", "string", "The name of the organization or individual that published the research element definition.", 0, 1, publisher);
3354        case 951526432: /*contact*/  return new Property("contact", "ContactDetail", "Contact details to assist a user in finding and communicating with the publisher.", 0, java.lang.Integer.MAX_VALUE, contact);
3355        case -1724546052: /*description*/  return new Property("description", "markdown", "A free text natural language description of the research element definition from a consumer's perspective.", 0, 1, description);
3356        case 950398559: /*comment*/  return new Property("comment", "string", "A human-readable string to clarify or explain concepts about the resource.", 0, java.lang.Integer.MAX_VALUE, comment);
3357        case -669707736: /*useContext*/  return new Property("useContext", "UsageContext", "The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate research element definition instances.", 0, java.lang.Integer.MAX_VALUE, useContext);
3358        case -507075711: /*jurisdiction*/  return new Property("jurisdiction", "CodeableConcept", "A legal or geographic region in which the research element definition is intended to be used.", 0, java.lang.Integer.MAX_VALUE, jurisdiction);
3359        case -220463842: /*purpose*/  return new Property("purpose", "markdown", "Explanation of why this research element definition is needed and why it has been designed as it has.", 0, 1, purpose);
3360        case 111574433: /*usage*/  return new Property("usage", "string", "A detailed description, from a clinical perspective, of how the ResearchElementDefinition is used.", 0, 1, usage);
3361        case 1522889671: /*copyright*/  return new Property("copyright", "markdown", "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.", 0, 1, copyright);
3362        case 223539345: /*approvalDate*/  return new Property("approvalDate", "date", "The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.", 0, 1, approvalDate);
3363        case -1687512484: /*lastReviewDate*/  return new Property("lastReviewDate", "date", "The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.", 0, 1, lastReviewDate);
3364        case -403934648: /*effectivePeriod*/  return new Property("effectivePeriod", "Period", "The period during which the research element definition content was or is planned to be in active use.", 0, 1, effectivePeriod);
3365        case 110546223: /*topic*/  return new Property("topic", "CodeableConcept", "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.", 0, java.lang.Integer.MAX_VALUE, topic);
3366        case -1406328437: /*author*/  return new Property("author", "ContactDetail", "An individiual or organization primarily involved in the creation and maintenance of the content.", 0, java.lang.Integer.MAX_VALUE, author);
3367        case -1307827859: /*editor*/  return new Property("editor", "ContactDetail", "An individual or organization primarily responsible for internal coherence of the content.", 0, java.lang.Integer.MAX_VALUE, editor);
3368        case -261190139: /*reviewer*/  return new Property("reviewer", "ContactDetail", "An individual or organization primarily responsible for review of some aspect of the content.", 0, java.lang.Integer.MAX_VALUE, reviewer);
3369        case 1740277666: /*endorser*/  return new Property("endorser", "ContactDetail", "An individual or organization responsible for officially endorsing the content for use in some setting.", 0, java.lang.Integer.MAX_VALUE, endorser);
3370        case 666807069: /*relatedArtifact*/  return new Property("relatedArtifact", "RelatedArtifact", "Related artifacts such as additional documentation, justification, or bibliographic references.", 0, java.lang.Integer.MAX_VALUE, relatedArtifact);
3371        case 166208699: /*library*/  return new Property("library", "canonical(Library)", "A reference to a Library resource containing the formal logic used by the ResearchElementDefinition.", 0, java.lang.Integer.MAX_VALUE, library);
3372        case 3575610: /*type*/  return new Property("type", "code", "The type of research element, a population, an exposure, or an outcome.", 0, 1, type);
3373        case -372820010: /*variableType*/  return new Property("variableType", "code", "The type of the outcome (e.g. Dichotomous, Continuous, or Descriptive).", 0, 1, variableType);
3374        case 366313883: /*characteristic*/  return new Property("characteristic", "", "A characteristic that defines the members of the research element. Multiple characteristics are applied with \"and\" semantics.", 0, java.lang.Integer.MAX_VALUE, characteristic);
3375        default: return super.getNamedProperty(_hash, _name, _checkValid);
3376        }
3377
3378      }
3379
3380      @Override
3381      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
3382        switch (hash) {
3383        case 116079: /*url*/ return this.url == null ? new Base[0] : new Base[] {this.url}; // UriType
3384        case -1618432855: /*identifier*/ return this.identifier == null ? new Base[0] : this.identifier.toArray(new Base[this.identifier.size()]); // Identifier
3385        case 351608024: /*version*/ return this.version == null ? new Base[0] : new Base[] {this.version}; // StringType
3386        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // StringType
3387        case 110371416: /*title*/ return this.title == null ? new Base[0] : new Base[] {this.title}; // StringType
3388        case 1555503932: /*shortTitle*/ return this.shortTitle == null ? new Base[0] : new Base[] {this.shortTitle}; // StringType
3389        case -2060497896: /*subtitle*/ return this.subtitle == null ? new Base[0] : new Base[] {this.subtitle}; // StringType
3390        case -892481550: /*status*/ return this.status == null ? new Base[0] : new Base[] {this.status}; // Enumeration<PublicationStatus>
3391        case -404562712: /*experimental*/ return this.experimental == null ? new Base[0] : new Base[] {this.experimental}; // BooleanType
3392        case -1867885268: /*subject*/ return this.subject == null ? new Base[0] : new Base[] {this.subject}; // Type
3393        case 3076014: /*date*/ return this.date == null ? new Base[0] : new Base[] {this.date}; // DateTimeType
3394        case 1447404028: /*publisher*/ return this.publisher == null ? new Base[0] : new Base[] {this.publisher}; // StringType
3395        case 951526432: /*contact*/ return this.contact == null ? new Base[0] : this.contact.toArray(new Base[this.contact.size()]); // ContactDetail
3396        case -1724546052: /*description*/ return this.description == null ? new Base[0] : new Base[] {this.description}; // MarkdownType
3397        case 950398559: /*comment*/ return this.comment == null ? new Base[0] : this.comment.toArray(new Base[this.comment.size()]); // StringType
3398        case -669707736: /*useContext*/ return this.useContext == null ? new Base[0] : this.useContext.toArray(new Base[this.useContext.size()]); // UsageContext
3399        case -507075711: /*jurisdiction*/ return this.jurisdiction == null ? new Base[0] : this.jurisdiction.toArray(new Base[this.jurisdiction.size()]); // CodeableConcept
3400        case -220463842: /*purpose*/ return this.purpose == null ? new Base[0] : new Base[] {this.purpose}; // MarkdownType
3401        case 111574433: /*usage*/ return this.usage == null ? new Base[0] : new Base[] {this.usage}; // StringType
3402        case 1522889671: /*copyright*/ return this.copyright == null ? new Base[0] : new Base[] {this.copyright}; // MarkdownType
3403        case 223539345: /*approvalDate*/ return this.approvalDate == null ? new Base[0] : new Base[] {this.approvalDate}; // DateType
3404        case -1687512484: /*lastReviewDate*/ return this.lastReviewDate == null ? new Base[0] : new Base[] {this.lastReviewDate}; // DateType
3405        case -403934648: /*effectivePeriod*/ return this.effectivePeriod == null ? new Base[0] : new Base[] {this.effectivePeriod}; // Period
3406        case 110546223: /*topic*/ return this.topic == null ? new Base[0] : this.topic.toArray(new Base[this.topic.size()]); // CodeableConcept
3407        case -1406328437: /*author*/ return this.author == null ? new Base[0] : this.author.toArray(new Base[this.author.size()]); // ContactDetail
3408        case -1307827859: /*editor*/ return this.editor == null ? new Base[0] : this.editor.toArray(new Base[this.editor.size()]); // ContactDetail
3409        case -261190139: /*reviewer*/ return this.reviewer == null ? new Base[0] : this.reviewer.toArray(new Base[this.reviewer.size()]); // ContactDetail
3410        case 1740277666: /*endorser*/ return this.endorser == null ? new Base[0] : this.endorser.toArray(new Base[this.endorser.size()]); // ContactDetail
3411        case 666807069: /*relatedArtifact*/ return this.relatedArtifact == null ? new Base[0] : this.relatedArtifact.toArray(new Base[this.relatedArtifact.size()]); // RelatedArtifact
3412        case 166208699: /*library*/ return this.library == null ? new Base[0] : this.library.toArray(new Base[this.library.size()]); // CanonicalType
3413        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // Enumeration<ResearchElementType>
3414        case -372820010: /*variableType*/ return this.variableType == null ? new Base[0] : new Base[] {this.variableType}; // Enumeration<VariableType>
3415        case 366313883: /*characteristic*/ return this.characteristic == null ? new Base[0] : this.characteristic.toArray(new Base[this.characteristic.size()]); // ResearchElementDefinitionCharacteristicComponent
3416        default: return super.getProperty(hash, name, checkValid);
3417        }
3418
3419      }
3420
3421      @Override
3422      public Base setProperty(int hash, String name, Base value) throws FHIRException {
3423        switch (hash) {
3424        case 116079: // url
3425          this.url = castToUri(value); // UriType
3426          return value;
3427        case -1618432855: // identifier
3428          this.getIdentifier().add(castToIdentifier(value)); // Identifier
3429          return value;
3430        case 351608024: // version
3431          this.version = castToString(value); // StringType
3432          return value;
3433        case 3373707: // name
3434          this.name = castToString(value); // StringType
3435          return value;
3436        case 110371416: // title
3437          this.title = castToString(value); // StringType
3438          return value;
3439        case 1555503932: // shortTitle
3440          this.shortTitle = castToString(value); // StringType
3441          return value;
3442        case -2060497896: // subtitle
3443          this.subtitle = castToString(value); // StringType
3444          return value;
3445        case -892481550: // status
3446          value = new PublicationStatusEnumFactory().fromType(castToCode(value));
3447          this.status = (Enumeration) value; // Enumeration<PublicationStatus>
3448          return value;
3449        case -404562712: // experimental
3450          this.experimental = castToBoolean(value); // BooleanType
3451          return value;
3452        case -1867885268: // subject
3453          this.subject = castToType(value); // Type
3454          return value;
3455        case 3076014: // date
3456          this.date = castToDateTime(value); // DateTimeType
3457          return value;
3458        case 1447404028: // publisher
3459          this.publisher = castToString(value); // StringType
3460          return value;
3461        case 951526432: // contact
3462          this.getContact().add(castToContactDetail(value)); // ContactDetail
3463          return value;
3464        case -1724546052: // description
3465          this.description = castToMarkdown(value); // MarkdownType
3466          return value;
3467        case 950398559: // comment
3468          this.getComment().add(castToString(value)); // StringType
3469          return value;
3470        case -669707736: // useContext
3471          this.getUseContext().add(castToUsageContext(value)); // UsageContext
3472          return value;
3473        case -507075711: // jurisdiction
3474          this.getJurisdiction().add(castToCodeableConcept(value)); // CodeableConcept
3475          return value;
3476        case -220463842: // purpose
3477          this.purpose = castToMarkdown(value); // MarkdownType
3478          return value;
3479        case 111574433: // usage
3480          this.usage = castToString(value); // StringType
3481          return value;
3482        case 1522889671: // copyright
3483          this.copyright = castToMarkdown(value); // MarkdownType
3484          return value;
3485        case 223539345: // approvalDate
3486          this.approvalDate = castToDate(value); // DateType
3487          return value;
3488        case -1687512484: // lastReviewDate
3489          this.lastReviewDate = castToDate(value); // DateType
3490          return value;
3491        case -403934648: // effectivePeriod
3492          this.effectivePeriod = castToPeriod(value); // Period
3493          return value;
3494        case 110546223: // topic
3495          this.getTopic().add(castToCodeableConcept(value)); // CodeableConcept
3496          return value;
3497        case -1406328437: // author
3498          this.getAuthor().add(castToContactDetail(value)); // ContactDetail
3499          return value;
3500        case -1307827859: // editor
3501          this.getEditor().add(castToContactDetail(value)); // ContactDetail
3502          return value;
3503        case -261190139: // reviewer
3504          this.getReviewer().add(castToContactDetail(value)); // ContactDetail
3505          return value;
3506        case 1740277666: // endorser
3507          this.getEndorser().add(castToContactDetail(value)); // ContactDetail
3508          return value;
3509        case 666807069: // relatedArtifact
3510          this.getRelatedArtifact().add(castToRelatedArtifact(value)); // RelatedArtifact
3511          return value;
3512        case 166208699: // library
3513          this.getLibrary().add(castToCanonical(value)); // CanonicalType
3514          return value;
3515        case 3575610: // type
3516          value = new ResearchElementTypeEnumFactory().fromType(castToCode(value));
3517          this.type = (Enumeration) value; // Enumeration<ResearchElementType>
3518          return value;
3519        case -372820010: // variableType
3520          value = new VariableTypeEnumFactory().fromType(castToCode(value));
3521          this.variableType = (Enumeration) value; // Enumeration<VariableType>
3522          return value;
3523        case 366313883: // characteristic
3524          this.getCharacteristic().add((ResearchElementDefinitionCharacteristicComponent) value); // ResearchElementDefinitionCharacteristicComponent
3525          return value;
3526        default: return super.setProperty(hash, name, value);
3527        }
3528
3529      }
3530
3531      @Override
3532      public Base setProperty(String name, Base value) throws FHIRException {
3533        if (name.equals("url")) {
3534          this.url = castToUri(value); // UriType
3535        } else if (name.equals("identifier")) {
3536          this.getIdentifier().add(castToIdentifier(value));
3537        } else if (name.equals("version")) {
3538          this.version = castToString(value); // StringType
3539        } else if (name.equals("name")) {
3540          this.name = castToString(value); // StringType
3541        } else if (name.equals("title")) {
3542          this.title = castToString(value); // StringType
3543        } else if (name.equals("shortTitle")) {
3544          this.shortTitle = castToString(value); // StringType
3545        } else if (name.equals("subtitle")) {
3546          this.subtitle = castToString(value); // StringType
3547        } else if (name.equals("status")) {
3548          value = new PublicationStatusEnumFactory().fromType(castToCode(value));
3549          this.status = (Enumeration) value; // Enumeration<PublicationStatus>
3550        } else if (name.equals("experimental")) {
3551          this.experimental = castToBoolean(value); // BooleanType
3552        } else if (name.equals("subject[x]")) {
3553          this.subject = castToType(value); // Type
3554        } else if (name.equals("date")) {
3555          this.date = castToDateTime(value); // DateTimeType
3556        } else if (name.equals("publisher")) {
3557          this.publisher = castToString(value); // StringType
3558        } else if (name.equals("contact")) {
3559          this.getContact().add(castToContactDetail(value));
3560        } else if (name.equals("description")) {
3561          this.description = castToMarkdown(value); // MarkdownType
3562        } else if (name.equals("comment")) {
3563          this.getComment().add(castToString(value));
3564        } else if (name.equals("useContext")) {
3565          this.getUseContext().add(castToUsageContext(value));
3566        } else if (name.equals("jurisdiction")) {
3567          this.getJurisdiction().add(castToCodeableConcept(value));
3568        } else if (name.equals("purpose")) {
3569          this.purpose = castToMarkdown(value); // MarkdownType
3570        } else if (name.equals("usage")) {
3571          this.usage = castToString(value); // StringType
3572        } else if (name.equals("copyright")) {
3573          this.copyright = castToMarkdown(value); // MarkdownType
3574        } else if (name.equals("approvalDate")) {
3575          this.approvalDate = castToDate(value); // DateType
3576        } else if (name.equals("lastReviewDate")) {
3577          this.lastReviewDate = castToDate(value); // DateType
3578        } else if (name.equals("effectivePeriod")) {
3579          this.effectivePeriod = castToPeriod(value); // Period
3580        } else if (name.equals("topic")) {
3581          this.getTopic().add(castToCodeableConcept(value));
3582        } else if (name.equals("author")) {
3583          this.getAuthor().add(castToContactDetail(value));
3584        } else if (name.equals("editor")) {
3585          this.getEditor().add(castToContactDetail(value));
3586        } else if (name.equals("reviewer")) {
3587          this.getReviewer().add(castToContactDetail(value));
3588        } else if (name.equals("endorser")) {
3589          this.getEndorser().add(castToContactDetail(value));
3590        } else if (name.equals("relatedArtifact")) {
3591          this.getRelatedArtifact().add(castToRelatedArtifact(value));
3592        } else if (name.equals("library")) {
3593          this.getLibrary().add(castToCanonical(value));
3594        } else if (name.equals("type")) {
3595          value = new ResearchElementTypeEnumFactory().fromType(castToCode(value));
3596          this.type = (Enumeration) value; // Enumeration<ResearchElementType>
3597        } else if (name.equals("variableType")) {
3598          value = new VariableTypeEnumFactory().fromType(castToCode(value));
3599          this.variableType = (Enumeration) value; // Enumeration<VariableType>
3600        } else if (name.equals("characteristic")) {
3601          this.getCharacteristic().add((ResearchElementDefinitionCharacteristicComponent) value);
3602        } else
3603          return super.setProperty(name, value);
3604        return value;
3605      }
3606
3607      @Override
3608      public Base makeProperty(int hash, String name) throws FHIRException {
3609        switch (hash) {
3610        case 116079:  return getUrlElement();
3611        case -1618432855:  return addIdentifier(); 
3612        case 351608024:  return getVersionElement();
3613        case 3373707:  return getNameElement();
3614        case 110371416:  return getTitleElement();
3615        case 1555503932:  return getShortTitleElement();
3616        case -2060497896:  return getSubtitleElement();
3617        case -892481550:  return getStatusElement();
3618        case -404562712:  return getExperimentalElement();
3619        case -573640748:  return getSubject(); 
3620        case -1867885268:  return getSubject(); 
3621        case 3076014:  return getDateElement();
3622        case 1447404028:  return getPublisherElement();
3623        case 951526432:  return addContact(); 
3624        case -1724546052:  return getDescriptionElement();
3625        case 950398559:  return addCommentElement();
3626        case -669707736:  return addUseContext(); 
3627        case -507075711:  return addJurisdiction(); 
3628        case -220463842:  return getPurposeElement();
3629        case 111574433:  return getUsageElement();
3630        case 1522889671:  return getCopyrightElement();
3631        case 223539345:  return getApprovalDateElement();
3632        case -1687512484:  return getLastReviewDateElement();
3633        case -403934648:  return getEffectivePeriod(); 
3634        case 110546223:  return addTopic(); 
3635        case -1406328437:  return addAuthor(); 
3636        case -1307827859:  return addEditor(); 
3637        case -261190139:  return addReviewer(); 
3638        case 1740277666:  return addEndorser(); 
3639        case 666807069:  return addRelatedArtifact(); 
3640        case 166208699:  return addLibraryElement();
3641        case 3575610:  return getTypeElement();
3642        case -372820010:  return getVariableTypeElement();
3643        case 366313883:  return addCharacteristic(); 
3644        default: return super.makeProperty(hash, name);
3645        }
3646
3647      }
3648
3649      @Override
3650      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
3651        switch (hash) {
3652        case 116079: /*url*/ return new String[] {"uri"};
3653        case -1618432855: /*identifier*/ return new String[] {"Identifier"};
3654        case 351608024: /*version*/ return new String[] {"string"};
3655        case 3373707: /*name*/ return new String[] {"string"};
3656        case 110371416: /*title*/ return new String[] {"string"};
3657        case 1555503932: /*shortTitle*/ return new String[] {"string"};
3658        case -2060497896: /*subtitle*/ return new String[] {"string"};
3659        case -892481550: /*status*/ return new String[] {"code"};
3660        case -404562712: /*experimental*/ return new String[] {"boolean"};
3661        case -1867885268: /*subject*/ return new String[] {"CodeableConcept", "Reference"};
3662        case 3076014: /*date*/ return new String[] {"dateTime"};
3663        case 1447404028: /*publisher*/ return new String[] {"string"};
3664        case 951526432: /*contact*/ return new String[] {"ContactDetail"};
3665        case -1724546052: /*description*/ return new String[] {"markdown"};
3666        case 950398559: /*comment*/ return new String[] {"string"};
3667        case -669707736: /*useContext*/ return new String[] {"UsageContext"};
3668        case -507075711: /*jurisdiction*/ return new String[] {"CodeableConcept"};
3669        case -220463842: /*purpose*/ return new String[] {"markdown"};
3670        case 111574433: /*usage*/ return new String[] {"string"};
3671        case 1522889671: /*copyright*/ return new String[] {"markdown"};
3672        case 223539345: /*approvalDate*/ return new String[] {"date"};
3673        case -1687512484: /*lastReviewDate*/ return new String[] {"date"};
3674        case -403934648: /*effectivePeriod*/ return new String[] {"Period"};
3675        case 110546223: /*topic*/ return new String[] {"CodeableConcept"};
3676        case -1406328437: /*author*/ return new String[] {"ContactDetail"};
3677        case -1307827859: /*editor*/ return new String[] {"ContactDetail"};
3678        case -261190139: /*reviewer*/ return new String[] {"ContactDetail"};
3679        case 1740277666: /*endorser*/ return new String[] {"ContactDetail"};
3680        case 666807069: /*relatedArtifact*/ return new String[] {"RelatedArtifact"};
3681        case 166208699: /*library*/ return new String[] {"canonical"};
3682        case 3575610: /*type*/ return new String[] {"code"};
3683        case -372820010: /*variableType*/ return new String[] {"code"};
3684        case 366313883: /*characteristic*/ return new String[] {};
3685        default: return super.getTypesForProperty(hash, name);
3686        }
3687
3688      }
3689
3690      @Override
3691      public Base addChild(String name) throws FHIRException {
3692        if (name.equals("url")) {
3693          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.url");
3694        }
3695        else if (name.equals("identifier")) {
3696          return addIdentifier();
3697        }
3698        else if (name.equals("version")) {
3699          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.version");
3700        }
3701        else if (name.equals("name")) {
3702          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.name");
3703        }
3704        else if (name.equals("title")) {
3705          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.title");
3706        }
3707        else if (name.equals("shortTitle")) {
3708          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.shortTitle");
3709        }
3710        else if (name.equals("subtitle")) {
3711          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.subtitle");
3712        }
3713        else if (name.equals("status")) {
3714          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.status");
3715        }
3716        else if (name.equals("experimental")) {
3717          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.experimental");
3718        }
3719        else if (name.equals("subjectCodeableConcept")) {
3720          this.subject = new CodeableConcept();
3721          return this.subject;
3722        }
3723        else if (name.equals("subjectReference")) {
3724          this.subject = new Reference();
3725          return this.subject;
3726        }
3727        else if (name.equals("date")) {
3728          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.date");
3729        }
3730        else if (name.equals("publisher")) {
3731          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.publisher");
3732        }
3733        else if (name.equals("contact")) {
3734          return addContact();
3735        }
3736        else if (name.equals("description")) {
3737          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.description");
3738        }
3739        else if (name.equals("comment")) {
3740          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.comment");
3741        }
3742        else if (name.equals("useContext")) {
3743          return addUseContext();
3744        }
3745        else if (name.equals("jurisdiction")) {
3746          return addJurisdiction();
3747        }
3748        else if (name.equals("purpose")) {
3749          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.purpose");
3750        }
3751        else if (name.equals("usage")) {
3752          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.usage");
3753        }
3754        else if (name.equals("copyright")) {
3755          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.copyright");
3756        }
3757        else if (name.equals("approvalDate")) {
3758          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.approvalDate");
3759        }
3760        else if (name.equals("lastReviewDate")) {
3761          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.lastReviewDate");
3762        }
3763        else if (name.equals("effectivePeriod")) {
3764          this.effectivePeriod = new Period();
3765          return this.effectivePeriod;
3766        }
3767        else if (name.equals("topic")) {
3768          return addTopic();
3769        }
3770        else if (name.equals("author")) {
3771          return addAuthor();
3772        }
3773        else if (name.equals("editor")) {
3774          return addEditor();
3775        }
3776        else if (name.equals("reviewer")) {
3777          return addReviewer();
3778        }
3779        else if (name.equals("endorser")) {
3780          return addEndorser();
3781        }
3782        else if (name.equals("relatedArtifact")) {
3783          return addRelatedArtifact();
3784        }
3785        else if (name.equals("library")) {
3786          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.library");
3787        }
3788        else if (name.equals("type")) {
3789          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.type");
3790        }
3791        else if (name.equals("variableType")) {
3792          throw new FHIRException("Cannot call addChild on a primitive type ResearchElementDefinition.variableType");
3793        }
3794        else if (name.equals("characteristic")) {
3795          return addCharacteristic();
3796        }
3797        else
3798          return super.addChild(name);
3799      }
3800
3801  public String fhirType() {
3802    return "ResearchElementDefinition";
3803
3804  }
3805
3806      public ResearchElementDefinition copy() {
3807        ResearchElementDefinition dst = new ResearchElementDefinition();
3808        copyValues(dst);
3809        dst.url = url == null ? null : url.copy();
3810        if (identifier != null) {
3811          dst.identifier = new ArrayList<Identifier>();
3812          for (Identifier i : identifier)
3813            dst.identifier.add(i.copy());
3814        };
3815        dst.version = version == null ? null : version.copy();
3816        dst.name = name == null ? null : name.copy();
3817        dst.title = title == null ? null : title.copy();
3818        dst.shortTitle = shortTitle == null ? null : shortTitle.copy();
3819        dst.subtitle = subtitle == null ? null : subtitle.copy();
3820        dst.status = status == null ? null : status.copy();
3821        dst.experimental = experimental == null ? null : experimental.copy();
3822        dst.subject = subject == null ? null : subject.copy();
3823        dst.date = date == null ? null : date.copy();
3824        dst.publisher = publisher == null ? null : publisher.copy();
3825        if (contact != null) {
3826          dst.contact = new ArrayList<ContactDetail>();
3827          for (ContactDetail i : contact)
3828            dst.contact.add(i.copy());
3829        };
3830        dst.description = description == null ? null : description.copy();
3831        if (comment != null) {
3832          dst.comment = new ArrayList<StringType>();
3833          for (StringType i : comment)
3834            dst.comment.add(i.copy());
3835        };
3836        if (useContext != null) {
3837          dst.useContext = new ArrayList<UsageContext>();
3838          for (UsageContext i : useContext)
3839            dst.useContext.add(i.copy());
3840        };
3841        if (jurisdiction != null) {
3842          dst.jurisdiction = new ArrayList<CodeableConcept>();
3843          for (CodeableConcept i : jurisdiction)
3844            dst.jurisdiction.add(i.copy());
3845        };
3846        dst.purpose = purpose == null ? null : purpose.copy();
3847        dst.usage = usage == null ? null : usage.copy();
3848        dst.copyright = copyright == null ? null : copyright.copy();
3849        dst.approvalDate = approvalDate == null ? null : approvalDate.copy();
3850        dst.lastReviewDate = lastReviewDate == null ? null : lastReviewDate.copy();
3851        dst.effectivePeriod = effectivePeriod == null ? null : effectivePeriod.copy();
3852        if (topic != null) {
3853          dst.topic = new ArrayList<CodeableConcept>();
3854          for (CodeableConcept i : topic)
3855            dst.topic.add(i.copy());
3856        };
3857        if (author != null) {
3858          dst.author = new ArrayList<ContactDetail>();
3859          for (ContactDetail i : author)
3860            dst.author.add(i.copy());
3861        };
3862        if (editor != null) {
3863          dst.editor = new ArrayList<ContactDetail>();
3864          for (ContactDetail i : editor)
3865            dst.editor.add(i.copy());
3866        };
3867        if (reviewer != null) {
3868          dst.reviewer = new ArrayList<ContactDetail>();
3869          for (ContactDetail i : reviewer)
3870            dst.reviewer.add(i.copy());
3871        };
3872        if (endorser != null) {
3873          dst.endorser = new ArrayList<ContactDetail>();
3874          for (ContactDetail i : endorser)
3875            dst.endorser.add(i.copy());
3876        };
3877        if (relatedArtifact != null) {
3878          dst.relatedArtifact = new ArrayList<RelatedArtifact>();
3879          for (RelatedArtifact i : relatedArtifact)
3880            dst.relatedArtifact.add(i.copy());
3881        };
3882        if (library != null) {
3883          dst.library = new ArrayList<CanonicalType>();
3884          for (CanonicalType i : library)
3885            dst.library.add(i.copy());
3886        };
3887        dst.type = type == null ? null : type.copy();
3888        dst.variableType = variableType == null ? null : variableType.copy();
3889        if (characteristic != null) {
3890          dst.characteristic = new ArrayList<ResearchElementDefinitionCharacteristicComponent>();
3891          for (ResearchElementDefinitionCharacteristicComponent i : characteristic)
3892            dst.characteristic.add(i.copy());
3893        };
3894        return dst;
3895      }
3896
3897      protected ResearchElementDefinition typedCopy() {
3898        return copy();
3899      }
3900
3901      @Override
3902      public boolean equalsDeep(Base other_) {
3903        if (!super.equalsDeep(other_))
3904          return false;
3905        if (!(other_ instanceof ResearchElementDefinition))
3906          return false;
3907        ResearchElementDefinition o = (ResearchElementDefinition) other_;
3908        return compareDeep(identifier, o.identifier, true) && compareDeep(shortTitle, o.shortTitle, true)
3909           && compareDeep(subtitle, o.subtitle, true) && compareDeep(subject, o.subject, true) && compareDeep(comment, o.comment, true)
3910           && compareDeep(purpose, o.purpose, true) && compareDeep(usage, o.usage, true) && compareDeep(copyright, o.copyright, true)
3911           && compareDeep(approvalDate, o.approvalDate, true) && compareDeep(lastReviewDate, o.lastReviewDate, true)
3912           && compareDeep(effectivePeriod, o.effectivePeriod, true) && compareDeep(topic, o.topic, true) && compareDeep(author, o.author, true)
3913           && compareDeep(editor, o.editor, true) && compareDeep(reviewer, o.reviewer, true) && compareDeep(endorser, o.endorser, true)
3914           && compareDeep(relatedArtifact, o.relatedArtifact, true) && compareDeep(library, o.library, true)
3915           && compareDeep(type, o.type, true) && compareDeep(variableType, o.variableType, true) && compareDeep(characteristic, o.characteristic, true)
3916          ;
3917      }
3918
3919      @Override
3920      public boolean equalsShallow(Base other_) {
3921        if (!super.equalsShallow(other_))
3922          return false;
3923        if (!(other_ instanceof ResearchElementDefinition))
3924          return false;
3925        ResearchElementDefinition o = (ResearchElementDefinition) other_;
3926        return compareValues(shortTitle, o.shortTitle, true) && compareValues(subtitle, o.subtitle, true) && compareValues(comment, o.comment, true)
3927           && compareValues(purpose, o.purpose, true) && compareValues(usage, o.usage, true) && compareValues(copyright, o.copyright, true)
3928           && compareValues(approvalDate, o.approvalDate, true) && compareValues(lastReviewDate, o.lastReviewDate, true)
3929           && compareValues(type, o.type, true) && compareValues(variableType, o.variableType, true);
3930      }
3931
3932      public boolean isEmpty() {
3933        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(identifier, shortTitle, subtitle
3934          , subject, comment, purpose, usage, copyright, approvalDate, lastReviewDate, effectivePeriod
3935          , topic, author, editor, reviewer, endorser, relatedArtifact, library, type
3936          , variableType, characteristic);
3937      }
3938
3939  @Override
3940  public ResourceType getResourceType() {
3941    return ResourceType.ResearchElementDefinition;
3942   }
3943
3944 /**
3945   * Search parameter: <b>date</b>
3946   * <p>
3947   * Description: <b>The research element definition publication date</b><br>
3948   * Type: <b>date</b><br>
3949   * Path: <b>ResearchElementDefinition.date</b><br>
3950   * </p>
3951   */
3952  @SearchParamDefinition(name="date", path="ResearchElementDefinition.date", description="The research element definition publication date", type="date" )
3953  public static final String SP_DATE = "date";
3954 /**
3955   * <b>Fluent Client</b> search parameter constant for <b>date</b>
3956   * <p>
3957   * Description: <b>The research element definition publication date</b><br>
3958   * Type: <b>date</b><br>
3959   * Path: <b>ResearchElementDefinition.date</b><br>
3960   * </p>
3961   */
3962  public static final ca.uhn.fhir.rest.gclient.DateClientParam DATE = new ca.uhn.fhir.rest.gclient.DateClientParam(SP_DATE);
3963
3964 /**
3965   * Search parameter: <b>identifier</b>
3966   * <p>
3967   * Description: <b>External identifier for the research element definition</b><br>
3968   * Type: <b>token</b><br>
3969   * Path: <b>ResearchElementDefinition.identifier</b><br>
3970   * </p>
3971   */
3972  @SearchParamDefinition(name="identifier", path="ResearchElementDefinition.identifier", description="External identifier for the research element definition", type="token" )
3973  public static final String SP_IDENTIFIER = "identifier";
3974 /**
3975   * <b>Fluent Client</b> search parameter constant for <b>identifier</b>
3976   * <p>
3977   * Description: <b>External identifier for the research element definition</b><br>
3978   * Type: <b>token</b><br>
3979   * Path: <b>ResearchElementDefinition.identifier</b><br>
3980   * </p>
3981   */
3982  public static final ca.uhn.fhir.rest.gclient.TokenClientParam IDENTIFIER = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_IDENTIFIER);
3983
3984 /**
3985   * Search parameter: <b>successor</b>
3986   * <p>
3987   * Description: <b>What resource is being referenced</b><br>
3988   * Type: <b>reference</b><br>
3989   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
3990   * </p>
3991   */
3992  @SearchParamDefinition(name="successor", path="ResearchElementDefinition.relatedArtifact.where(type='successor').resource", description="What resource is being referenced", type="reference" )
3993  public static final String SP_SUCCESSOR = "successor";
3994 /**
3995   * <b>Fluent Client</b> search parameter constant for <b>successor</b>
3996   * <p>
3997   * Description: <b>What resource is being referenced</b><br>
3998   * Type: <b>reference</b><br>
3999   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
4000   * </p>
4001   */
4002  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam SUCCESSOR = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_SUCCESSOR);
4003
4004/**
4005   * Constant for fluent queries to be used to add include statements. Specifies
4006   * the path value of "<b>ResearchElementDefinition:successor</b>".
4007   */
4008  public static final ca.uhn.fhir.model.api.Include INCLUDE_SUCCESSOR = new ca.uhn.fhir.model.api.Include("ResearchElementDefinition:successor").toLocked();
4009
4010 /**
4011   * Search parameter: <b>context-type-value</b>
4012   * <p>
4013   * Description: <b>A use context type and value assigned to the research element definition</b><br>
4014   * Type: <b>composite</b><br>
4015   * Path: <b></b><br>
4016   * </p>
4017   */
4018  @SearchParamDefinition(name="context-type-value", path="ResearchElementDefinition.useContext", description="A use context type and value assigned to the research element definition", type="composite", compositeOf={"context-type", "context"} )
4019  public static final String SP_CONTEXT_TYPE_VALUE = "context-type-value";
4020 /**
4021   * <b>Fluent Client</b> search parameter constant for <b>context-type-value</b>
4022   * <p>
4023   * Description: <b>A use context type and value assigned to the research element definition</b><br>
4024   * Type: <b>composite</b><br>
4025   * Path: <b></b><br>
4026   * </p>
4027   */
4028  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>(SP_CONTEXT_TYPE_VALUE);
4029
4030 /**
4031   * Search parameter: <b>jurisdiction</b>
4032   * <p>
4033   * Description: <b>Intended jurisdiction for the research element definition</b><br>
4034   * Type: <b>token</b><br>
4035   * Path: <b>ResearchElementDefinition.jurisdiction</b><br>
4036   * </p>
4037   */
4038  @SearchParamDefinition(name="jurisdiction", path="ResearchElementDefinition.jurisdiction", description="Intended jurisdiction for the research element definition", type="token" )
4039  public static final String SP_JURISDICTION = "jurisdiction";
4040 /**
4041   * <b>Fluent Client</b> search parameter constant for <b>jurisdiction</b>
4042   * <p>
4043   * Description: <b>Intended jurisdiction for the research element definition</b><br>
4044   * Type: <b>token</b><br>
4045   * Path: <b>ResearchElementDefinition.jurisdiction</b><br>
4046   * </p>
4047   */
4048  public static final ca.uhn.fhir.rest.gclient.TokenClientParam JURISDICTION = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_JURISDICTION);
4049
4050 /**
4051   * Search parameter: <b>description</b>
4052   * <p>
4053   * Description: <b>The description of the research element definition</b><br>
4054   * Type: <b>string</b><br>
4055   * Path: <b>ResearchElementDefinition.description</b><br>
4056   * </p>
4057   */
4058  @SearchParamDefinition(name="description", path="ResearchElementDefinition.description", description="The description of the research element definition", type="string" )
4059  public static final String SP_DESCRIPTION = "description";
4060 /**
4061   * <b>Fluent Client</b> search parameter constant for <b>description</b>
4062   * <p>
4063   * Description: <b>The description of the research element definition</b><br>
4064   * Type: <b>string</b><br>
4065   * Path: <b>ResearchElementDefinition.description</b><br>
4066   * </p>
4067   */
4068  public static final ca.uhn.fhir.rest.gclient.StringClientParam DESCRIPTION = new ca.uhn.fhir.rest.gclient.StringClientParam(SP_DESCRIPTION);
4069
4070 /**
4071   * Search parameter: <b>derived-from</b>
4072   * <p>
4073   * Description: <b>What resource is being referenced</b><br>
4074   * Type: <b>reference</b><br>
4075   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
4076   * </p>
4077   */
4078  @SearchParamDefinition(name="derived-from", path="ResearchElementDefinition.relatedArtifact.where(type='derived-from').resource", description="What resource is being referenced", type="reference" )
4079  public static final String SP_DERIVED_FROM = "derived-from";
4080 /**
4081   * <b>Fluent Client</b> search parameter constant for <b>derived-from</b>
4082   * <p>
4083   * Description: <b>What resource is being referenced</b><br>
4084   * Type: <b>reference</b><br>
4085   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
4086   * </p>
4087   */
4088  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam DERIVED_FROM = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_DERIVED_FROM);
4089
4090/**
4091   * Constant for fluent queries to be used to add include statements. Specifies
4092   * the path value of "<b>ResearchElementDefinition:derived-from</b>".
4093   */
4094  public static final ca.uhn.fhir.model.api.Include INCLUDE_DERIVED_FROM = new ca.uhn.fhir.model.api.Include("ResearchElementDefinition:derived-from").toLocked();
4095
4096 /**
4097   * Search parameter: <b>context-type</b>
4098   * <p>
4099   * Description: <b>A type of use context assigned to the research element definition</b><br>
4100   * Type: <b>token</b><br>
4101   * Path: <b>ResearchElementDefinition.useContext.code</b><br>
4102   * </p>
4103   */
4104  @SearchParamDefinition(name="context-type", path="ResearchElementDefinition.useContext.code", description="A type of use context assigned to the research element definition", type="token" )
4105  public static final String SP_CONTEXT_TYPE = "context-type";
4106 /**
4107   * <b>Fluent Client</b> search parameter constant for <b>context-type</b>
4108   * <p>
4109   * Description: <b>A type of use context assigned to the research element definition</b><br>
4110   * Type: <b>token</b><br>
4111   * Path: <b>ResearchElementDefinition.useContext.code</b><br>
4112   * </p>
4113   */
4114  public static final ca.uhn.fhir.rest.gclient.TokenClientParam CONTEXT_TYPE = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_CONTEXT_TYPE);
4115
4116 /**
4117   * Search parameter: <b>predecessor</b>
4118   * <p>
4119   * Description: <b>What resource is being referenced</b><br>
4120   * Type: <b>reference</b><br>
4121   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
4122   * </p>
4123   */
4124  @SearchParamDefinition(name="predecessor", path="ResearchElementDefinition.relatedArtifact.where(type='predecessor').resource", description="What resource is being referenced", type="reference" )
4125  public static final String SP_PREDECESSOR = "predecessor";
4126 /**
4127   * <b>Fluent Client</b> search parameter constant for <b>predecessor</b>
4128   * <p>
4129   * Description: <b>What resource is being referenced</b><br>
4130   * Type: <b>reference</b><br>
4131   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
4132   * </p>
4133   */
4134  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam PREDECESSOR = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_PREDECESSOR);
4135
4136/**
4137   * Constant for fluent queries to be used to add include statements. Specifies
4138   * the path value of "<b>ResearchElementDefinition:predecessor</b>".
4139   */
4140  public static final ca.uhn.fhir.model.api.Include INCLUDE_PREDECESSOR = new ca.uhn.fhir.model.api.Include("ResearchElementDefinition:predecessor").toLocked();
4141
4142 /**
4143   * Search parameter: <b>title</b>
4144   * <p>
4145   * Description: <b>The human-friendly name of the research element definition</b><br>
4146   * Type: <b>string</b><br>
4147   * Path: <b>ResearchElementDefinition.title</b><br>
4148   * </p>
4149   */
4150  @SearchParamDefinition(name="title", path="ResearchElementDefinition.title", description="The human-friendly name of the research element definition", type="string" )
4151  public static final String SP_TITLE = "title";
4152 /**
4153   * <b>Fluent Client</b> search parameter constant for <b>title</b>
4154   * <p>
4155   * Description: <b>The human-friendly name of the research element definition</b><br>
4156   * Type: <b>string</b><br>
4157   * Path: <b>ResearchElementDefinition.title</b><br>
4158   * </p>
4159   */
4160  public static final ca.uhn.fhir.rest.gclient.StringClientParam TITLE = new ca.uhn.fhir.rest.gclient.StringClientParam(SP_TITLE);
4161
4162 /**
4163   * Search parameter: <b>composed-of</b>
4164   * <p>
4165   * Description: <b>What resource is being referenced</b><br>
4166   * Type: <b>reference</b><br>
4167   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
4168   * </p>
4169   */
4170  @SearchParamDefinition(name="composed-of", path="ResearchElementDefinition.relatedArtifact.where(type='composed-of').resource", description="What resource is being referenced", type="reference" )
4171  public static final String SP_COMPOSED_OF = "composed-of";
4172 /**
4173   * <b>Fluent Client</b> search parameter constant for <b>composed-of</b>
4174   * <p>
4175   * Description: <b>What resource is being referenced</b><br>
4176   * Type: <b>reference</b><br>
4177   * Path: <b>ResearchElementDefinition.relatedArtifact.resource</b><br>
4178   * </p>
4179   */
4180  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam COMPOSED_OF = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_COMPOSED_OF);
4181
4182/**
4183   * Constant for fluent queries to be used to add include statements. Specifies
4184   * the path value of "<b>ResearchElementDefinition:composed-of</b>".
4185   */
4186  public static final ca.uhn.fhir.model.api.Include INCLUDE_COMPOSED_OF = new ca.uhn.fhir.model.api.Include("ResearchElementDefinition:composed-of").toLocked();
4187
4188 /**
4189   * Search parameter: <b>version</b>
4190   * <p>
4191   * Description: <b>The business version of the research element definition</b><br>
4192   * Type: <b>token</b><br>
4193   * Path: <b>ResearchElementDefinition.version</b><br>
4194   * </p>
4195   */
4196  @SearchParamDefinition(name="version", path="ResearchElementDefinition.version", description="The business version of the research element definition", type="token" )
4197  public static final String SP_VERSION = "version";
4198 /**
4199   * <b>Fluent Client</b> search parameter constant for <b>version</b>
4200   * <p>
4201   * Description: <b>The business version of the research element definition</b><br>
4202   * Type: <b>token</b><br>
4203   * Path: <b>ResearchElementDefinition.version</b><br>
4204   * </p>
4205   */
4206  public static final ca.uhn.fhir.rest.gclient.TokenClientParam VERSION = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_VERSION);
4207
4208 /**
4209   * Search parameter: <b>url</b>
4210   * <p>
4211   * Description: <b>The uri that identifies the research element definition</b><br>
4212   * Type: <b>uri</b><br>
4213   * Path: <b>ResearchElementDefinition.url</b><br>
4214   * </p>
4215   */
4216  @SearchParamDefinition(name="url", path="ResearchElementDefinition.url", description="The uri that identifies the research element definition", type="uri" )
4217  public static final String SP_URL = "url";
4218 /**
4219   * <b>Fluent Client</b> search parameter constant for <b>url</b>
4220   * <p>
4221   * Description: <b>The uri that identifies the research element definition</b><br>
4222   * Type: <b>uri</b><br>
4223   * Path: <b>ResearchElementDefinition.url</b><br>
4224   * </p>
4225   */
4226  public static final ca.uhn.fhir.rest.gclient.UriClientParam URL = new ca.uhn.fhir.rest.gclient.UriClientParam(SP_URL);
4227
4228 /**
4229   * Search parameter: <b>context-quantity</b>
4230   * <p>
4231   * Description: <b>A quantity- or range-valued use context assigned to the research element definition</b><br>
4232   * Type: <b>quantity</b><br>
4233   * Path: <b>ResearchElementDefinition.useContext.valueQuantity, ResearchElementDefinition.useContext.valueRange</b><br>
4234   * </p>
4235   */
4236  @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" )
4237  public static final String SP_CONTEXT_QUANTITY = "context-quantity";
4238 /**
4239   * <b>Fluent Client</b> search parameter constant for <b>context-quantity</b>
4240   * <p>
4241   * Description: <b>A quantity- or range-valued use context assigned to the research element definition</b><br>
4242   * Type: <b>quantity</b><br>
4243   * Path: <b>ResearchElementDefinition.useContext.valueQuantity, ResearchElementDefinition.useContext.valueRange</b><br>
4244   * </p>
4245   */
4246  public static final ca.uhn.fhir.rest.gclient.QuantityClientParam CONTEXT_QUANTITY = new ca.uhn.fhir.rest.gclient.QuantityClientParam(SP_CONTEXT_QUANTITY);
4247
4248 /**
4249   * Search parameter: <b>effective</b>
4250   * <p>
4251   * Description: <b>The time during which the research element definition is intended to be in use</b><br>
4252   * Type: <b>date</b><br>
4253   * Path: <b>ResearchElementDefinition.effectivePeriod</b><br>
4254   * </p>
4255   */
4256  @SearchParamDefinition(name="effective", path="ResearchElementDefinition.effectivePeriod", description="The time during which the research element definition is intended to be in use", type="date" )
4257  public static final String SP_EFFECTIVE = "effective";
4258 /**
4259   * <b>Fluent Client</b> search parameter constant for <b>effective</b>
4260   * <p>
4261   * Description: <b>The time during which the research element definition is intended to be in use</b><br>
4262   * Type: <b>date</b><br>
4263   * Path: <b>ResearchElementDefinition.effectivePeriod</b><br>
4264   * </p>
4265   */
4266  public static final ca.uhn.fhir.rest.gclient.DateClientParam EFFECTIVE = new ca.uhn.fhir.rest.gclient.DateClientParam(SP_EFFECTIVE);
4267
4268 /**
4269   * Search parameter: <b>depends-on</b>
4270   * <p>
4271   * Description: <b>What resource is being referenced</b><br>
4272   * Type: <b>reference</b><br>
4273   * Path: <b>ResearchElementDefinition.relatedArtifact.resource, ResearchElementDefinition.library</b><br>
4274   * </p>
4275   */
4276  @SearchParamDefinition(name="depends-on", path="ResearchElementDefinition.relatedArtifact.where(type='depends-on').resource | ResearchElementDefinition.library", description="What resource is being referenced", type="reference" )
4277  public static final String SP_DEPENDS_ON = "depends-on";
4278 /**
4279   * <b>Fluent Client</b> search parameter constant for <b>depends-on</b>
4280   * <p>
4281   * Description: <b>What resource is being referenced</b><br>
4282   * Type: <b>reference</b><br>
4283   * Path: <b>ResearchElementDefinition.relatedArtifact.resource, ResearchElementDefinition.library</b><br>
4284   * </p>
4285   */
4286  public static final ca.uhn.fhir.rest.gclient.ReferenceClientParam DEPENDS_ON = new ca.uhn.fhir.rest.gclient.ReferenceClientParam(SP_DEPENDS_ON);
4287
4288/**
4289   * Constant for fluent queries to be used to add include statements. Specifies
4290   * the path value of "<b>ResearchElementDefinition:depends-on</b>".
4291   */
4292  public static final ca.uhn.fhir.model.api.Include INCLUDE_DEPENDS_ON = new ca.uhn.fhir.model.api.Include("ResearchElementDefinition:depends-on").toLocked();
4293
4294 /**
4295   * Search parameter: <b>name</b>
4296   * <p>
4297   * Description: <b>Computationally friendly name of the research element definition</b><br>
4298   * Type: <b>string</b><br>
4299   * Path: <b>ResearchElementDefinition.name</b><br>
4300   * </p>
4301   */
4302  @SearchParamDefinition(name="name", path="ResearchElementDefinition.name", description="Computationally friendly name of the research element definition", type="string" )
4303  public static final String SP_NAME = "name";
4304 /**
4305   * <b>Fluent Client</b> search parameter constant for <b>name</b>
4306   * <p>
4307   * Description: <b>Computationally friendly name of the research element definition</b><br>
4308   * Type: <b>string</b><br>
4309   * Path: <b>ResearchElementDefinition.name</b><br>
4310   * </p>
4311   */
4312  public static final ca.uhn.fhir.rest.gclient.StringClientParam NAME = new ca.uhn.fhir.rest.gclient.StringClientParam(SP_NAME);
4313
4314 /**
4315   * Search parameter: <b>context</b>
4316   * <p>
4317   * Description: <b>A use context assigned to the research element definition</b><br>
4318   * Type: <b>token</b><br>
4319   * Path: <b>ResearchElementDefinition.useContext.valueCodeableConcept</b><br>
4320   * </p>
4321   */
4322  @SearchParamDefinition(name="context", path="(ResearchElementDefinition.useContext.value as CodeableConcept)", description="A use context assigned to the research element definition", type="token" )
4323  public static final String SP_CONTEXT = "context";
4324 /**
4325   * <b>Fluent Client</b> search parameter constant for <b>context</b>
4326   * <p>
4327   * Description: <b>A use context assigned to the research element definition</b><br>
4328   * Type: <b>token</b><br>
4329   * Path: <b>ResearchElementDefinition.useContext.valueCodeableConcept</b><br>
4330   * </p>
4331   */
4332  public static final ca.uhn.fhir.rest.gclient.TokenClientParam CONTEXT = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_CONTEXT);
4333
4334 /**
4335   * Search parameter: <b>publisher</b>
4336   * <p>
4337   * Description: <b>Name of the publisher of the research element definition</b><br>
4338   * Type: <b>string</b><br>
4339   * Path: <b>ResearchElementDefinition.publisher</b><br>
4340   * </p>
4341   */
4342  @SearchParamDefinition(name="publisher", path="ResearchElementDefinition.publisher", description="Name of the publisher of the research element definition", type="string" )
4343  public static final String SP_PUBLISHER = "publisher";
4344 /**
4345   * <b>Fluent Client</b> search parameter constant for <b>publisher</b>
4346   * <p>
4347   * Description: <b>Name of the publisher of the research element definition</b><br>
4348   * Type: <b>string</b><br>
4349   * Path: <b>ResearchElementDefinition.publisher</b><br>
4350   * </p>
4351   */
4352  public static final ca.uhn.fhir.rest.gclient.StringClientParam PUBLISHER = new ca.uhn.fhir.rest.gclient.StringClientParam(SP_PUBLISHER);
4353
4354 /**
4355   * Search parameter: <b>topic</b>
4356   * <p>
4357   * Description: <b>Topics associated with the ResearchElementDefinition</b><br>
4358   * Type: <b>token</b><br>
4359   * Path: <b>ResearchElementDefinition.topic</b><br>
4360   * </p>
4361   */
4362  @SearchParamDefinition(name="topic", path="ResearchElementDefinition.topic", description="Topics associated with the ResearchElementDefinition", type="token" )
4363  public static final String SP_TOPIC = "topic";
4364 /**
4365   * <b>Fluent Client</b> search parameter constant for <b>topic</b>
4366   * <p>
4367   * Description: <b>Topics associated with the ResearchElementDefinition</b><br>
4368   * Type: <b>token</b><br>
4369   * Path: <b>ResearchElementDefinition.topic</b><br>
4370   * </p>
4371   */
4372  public static final ca.uhn.fhir.rest.gclient.TokenClientParam TOPIC = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_TOPIC);
4373
4374 /**
4375   * Search parameter: <b>context-type-quantity</b>
4376   * <p>
4377   * Description: <b>A use context type and quantity- or range-based value assigned to the research element definition</b><br>
4378   * Type: <b>composite</b><br>
4379   * Path: <b></b><br>
4380   * </p>
4381   */
4382  @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={"context-type", "context-quantity"} )
4383  public static final String SP_CONTEXT_TYPE_QUANTITY = "context-type-quantity";
4384 /**
4385   * <b>Fluent Client</b> search parameter constant for <b>context-type-quantity</b>
4386   * <p>
4387   * Description: <b>A use context type and quantity- or range-based value assigned to the research element definition</b><br>
4388   * Type: <b>composite</b><br>
4389   * Path: <b></b><br>
4390   * </p>
4391   */
4392  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>(SP_CONTEXT_TYPE_QUANTITY);
4393
4394 /**
4395   * Search parameter: <b>status</b>
4396   * <p>
4397   * Description: <b>The current status of the research element definition</b><br>
4398   * Type: <b>token</b><br>
4399   * Path: <b>ResearchElementDefinition.status</b><br>
4400   * </p>
4401   */
4402  @SearchParamDefinition(name="status", path="ResearchElementDefinition.status", description="The current status of the research element definition", type="token" )
4403  public static final String SP_STATUS = "status";
4404 /**
4405   * <b>Fluent Client</b> search parameter constant for <b>status</b>
4406   * <p>
4407   * Description: <b>The current status of the research element definition</b><br>
4408   * Type: <b>token</b><br>
4409   * Path: <b>ResearchElementDefinition.status</b><br>
4410   * </p>
4411   */
4412  public static final ca.uhn.fhir.rest.gclient.TokenClientParam STATUS = new ca.uhn.fhir.rest.gclient.TokenClientParam(SP_STATUS);
4413
4414
4415}
4416