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