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