001package org.hl7.fhir.r5.model;
002
003
004/*
005  Copyright (c) 2011+, HL7, Inc.
006  All rights reserved.
007  
008  Redistribution and use in source and binary forms, with or without modification, \
009  are permitted provided that the following conditions are met:
010  
011   * Redistributions of source code must retain the above copyright notice, this \
012     list of conditions and the following disclaimer.
013   * Redistributions in binary form must reproduce the above copyright notice, \
014     this list of conditions and the following disclaimer in the documentation \
015     and/or other materials provided with the distribution.
016   * Neither the name of HL7 nor the names of its contributors may be used to 
017     endorse or promote products derived from this software without specific 
018     prior written permission.
019  
020  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \
021  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \
022  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \
023  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \
024  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT \
025  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR \
026  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \
027  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \
028  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \
029  POSSIBILITY OF SUCH DAMAGE.
030  */
031
032// Generated on Fri, Jul 15, 2022 11:20+1000 for FHIR v5.0.0-snapshot2
033
034import java.util.ArrayList;
035import java.util.Date;
036import java.util.List;
037import org.hl7.fhir.utilities.Utilities;
038import org.hl7.fhir.r5.model.Enumerations.*;
039import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
040import org.hl7.fhir.exceptions.FHIRException;
041import org.hl7.fhir.instance.model.api.ICompositeType;
042import ca.uhn.fhir.model.api.annotation.ResourceDef;
043import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
044import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
045import ca.uhn.fhir.model.api.annotation.Child;
046import ca.uhn.fhir.model.api.annotation.ChildOrder;
047import ca.uhn.fhir.model.api.annotation.Description;
048import ca.uhn.fhir.model.api.annotation.Block;
049
050/**
051 * Nucleic acids are defined by three distinct elements: the base, sugar and linkage. Individual substance/moiety IDs will be created for each of these elements. The nucleotide sequence will be always entered in the 5?-3? direction.
052 */
053@ResourceDef(name="SubstanceNucleicAcid", profile="http://hl7.org/fhir/StructureDefinition/SubstanceNucleicAcid")
054public class SubstanceNucleicAcid extends DomainResource {
055
056    @Block()
057    public static class SubstanceNucleicAcidSubunitComponent extends BackboneElement implements IBaseBackboneElement {
058        /**
059         * Index of linear sequences of nucleic acids in order of decreasing length. Sequences of the same length will be ordered by molecular weight. Subunits that have identical sequences will be repeated and have sequential subscripts.
060         */
061        @Child(name = "subunit", type = {IntegerType.class}, order=1, min=0, max=1, modifier=false, summary=true)
062        @Description(shortDefinition="Index of linear sequences of nucleic acids in order of decreasing length. Sequences of the same length will be ordered by molecular weight. Subunits that have identical sequences will be repeated and have sequential subscripts", formalDefinition="Index of linear sequences of nucleic acids in order of decreasing length. Sequences of the same length will be ordered by molecular weight. Subunits that have identical sequences will be repeated and have sequential subscripts." )
063        protected IntegerType subunit;
064
065        /**
066         * Actual nucleotide sequence notation from 5' to 3' end using standard single letter codes. In addition to the base sequence, sugar and type of phosphate or non-phosphate linkage should also be captured.
067         */
068        @Child(name = "sequence", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=true)
069        @Description(shortDefinition="Actual nucleotide sequence notation from 5' to 3' end using standard single letter codes. In addition to the base sequence, sugar and type of phosphate or non-phosphate linkage should also be captured", formalDefinition="Actual nucleotide sequence notation from 5' to 3' end using standard single letter codes. In addition to the base sequence, sugar and type of phosphate or non-phosphate linkage should also be captured." )
070        protected StringType sequence;
071
072        /**
073         * The length of the sequence shall be captured.
074         */
075        @Child(name = "length", type = {IntegerType.class}, order=3, min=0, max=1, modifier=false, summary=true)
076        @Description(shortDefinition="The length of the sequence shall be captured", formalDefinition="The length of the sequence shall be captured." )
077        protected IntegerType length;
078
079        /**
080         * (TBC).
081         */
082        @Child(name = "sequenceAttachment", type = {Attachment.class}, order=4, min=0, max=1, modifier=false, summary=true)
083        @Description(shortDefinition="(TBC)", formalDefinition="(TBC)." )
084        protected Attachment sequenceAttachment;
085
086        /**
087         * The nucleotide present at the 5? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the first position in the sequence. A separate representation would be redundant.
088         */
089        @Child(name = "fivePrime", type = {CodeableConcept.class}, order=5, min=0, max=1, modifier=false, summary=true)
090        @Description(shortDefinition="The nucleotide present at the 5? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the first position in the sequence. A separate representation would be redundant", formalDefinition="The nucleotide present at the 5? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the first position in the sequence. A separate representation would be redundant." )
091        protected CodeableConcept fivePrime;
092
093        /**
094         * The nucleotide present at the 3? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the last position in the sequence. A separate representation would be redundant.
095         */
096        @Child(name = "threePrime", type = {CodeableConcept.class}, order=6, min=0, max=1, modifier=false, summary=true)
097        @Description(shortDefinition="The nucleotide present at the 3? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the last position in the sequence. A separate representation would be redundant", formalDefinition="The nucleotide present at the 3? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the last position in the sequence. A separate representation would be redundant." )
098        protected CodeableConcept threePrime;
099
100        /**
101         * The linkages between sugar residues will also be captured.
102         */
103        @Child(name = "linkage", type = {}, order=7, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
104        @Description(shortDefinition="The linkages between sugar residues will also be captured", formalDefinition="The linkages between sugar residues will also be captured." )
105        protected List<SubstanceNucleicAcidSubunitLinkageComponent> linkage;
106
107        /**
108         * 5.3.6.8.1 Sugar ID (Mandatory).
109         */
110        @Child(name = "sugar", type = {}, order=8, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
111        @Description(shortDefinition="5.3.6.8.1 Sugar ID (Mandatory)", formalDefinition="5.3.6.8.1 Sugar ID (Mandatory)." )
112        protected List<SubstanceNucleicAcidSubunitSugarComponent> sugar;
113
114        private static final long serialVersionUID = 1835593659L;
115
116    /**
117     * Constructor
118     */
119      public SubstanceNucleicAcidSubunitComponent() {
120        super();
121      }
122
123        /**
124         * @return {@link #subunit} (Index of linear sequences of nucleic acids in order of decreasing length. Sequences of the same length will be ordered by molecular weight. Subunits that have identical sequences will be repeated and have sequential subscripts.). This is the underlying object with id, value and extensions. The accessor "getSubunit" gives direct access to the value
125         */
126        public IntegerType getSubunitElement() { 
127          if (this.subunit == null)
128            if (Configuration.errorOnAutoCreate())
129              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitComponent.subunit");
130            else if (Configuration.doAutoCreate())
131              this.subunit = new IntegerType(); // bb
132          return this.subunit;
133        }
134
135        public boolean hasSubunitElement() { 
136          return this.subunit != null && !this.subunit.isEmpty();
137        }
138
139        public boolean hasSubunit() { 
140          return this.subunit != null && !this.subunit.isEmpty();
141        }
142
143        /**
144         * @param value {@link #subunit} (Index of linear sequences of nucleic acids in order of decreasing length. Sequences of the same length will be ordered by molecular weight. Subunits that have identical sequences will be repeated and have sequential subscripts.). This is the underlying object with id, value and extensions. The accessor "getSubunit" gives direct access to the value
145         */
146        public SubstanceNucleicAcidSubunitComponent setSubunitElement(IntegerType value) { 
147          this.subunit = value;
148          return this;
149        }
150
151        /**
152         * @return Index of linear sequences of nucleic acids in order of decreasing length. Sequences of the same length will be ordered by molecular weight. Subunits that have identical sequences will be repeated and have sequential subscripts.
153         */
154        public int getSubunit() { 
155          return this.subunit == null || this.subunit.isEmpty() ? 0 : this.subunit.getValue();
156        }
157
158        /**
159         * @param value Index of linear sequences of nucleic acids in order of decreasing length. Sequences of the same length will be ordered by molecular weight. Subunits that have identical sequences will be repeated and have sequential subscripts.
160         */
161        public SubstanceNucleicAcidSubunitComponent setSubunit(int value) { 
162            if (this.subunit == null)
163              this.subunit = new IntegerType();
164            this.subunit.setValue(value);
165          return this;
166        }
167
168        /**
169         * @return {@link #sequence} (Actual nucleotide sequence notation from 5' to 3' end using standard single letter codes. In addition to the base sequence, sugar and type of phosphate or non-phosphate linkage should also be captured.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
170         */
171        public StringType getSequenceElement() { 
172          if (this.sequence == null)
173            if (Configuration.errorOnAutoCreate())
174              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitComponent.sequence");
175            else if (Configuration.doAutoCreate())
176              this.sequence = new StringType(); // bb
177          return this.sequence;
178        }
179
180        public boolean hasSequenceElement() { 
181          return this.sequence != null && !this.sequence.isEmpty();
182        }
183
184        public boolean hasSequence() { 
185          return this.sequence != null && !this.sequence.isEmpty();
186        }
187
188        /**
189         * @param value {@link #sequence} (Actual nucleotide sequence notation from 5' to 3' end using standard single letter codes. In addition to the base sequence, sugar and type of phosphate or non-phosphate linkage should also be captured.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
190         */
191        public SubstanceNucleicAcidSubunitComponent setSequenceElement(StringType value) { 
192          this.sequence = value;
193          return this;
194        }
195
196        /**
197         * @return Actual nucleotide sequence notation from 5' to 3' end using standard single letter codes. In addition to the base sequence, sugar and type of phosphate or non-phosphate linkage should also be captured.
198         */
199        public String getSequence() { 
200          return this.sequence == null ? null : this.sequence.getValue();
201        }
202
203        /**
204         * @param value Actual nucleotide sequence notation from 5' to 3' end using standard single letter codes. In addition to the base sequence, sugar and type of phosphate or non-phosphate linkage should also be captured.
205         */
206        public SubstanceNucleicAcidSubunitComponent setSequence(String value) { 
207          if (Utilities.noString(value))
208            this.sequence = null;
209          else {
210            if (this.sequence == null)
211              this.sequence = new StringType();
212            this.sequence.setValue(value);
213          }
214          return this;
215        }
216
217        /**
218         * @return {@link #length} (The length of the sequence shall be captured.). This is the underlying object with id, value and extensions. The accessor "getLength" gives direct access to the value
219         */
220        public IntegerType getLengthElement() { 
221          if (this.length == null)
222            if (Configuration.errorOnAutoCreate())
223              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitComponent.length");
224            else if (Configuration.doAutoCreate())
225              this.length = new IntegerType(); // bb
226          return this.length;
227        }
228
229        public boolean hasLengthElement() { 
230          return this.length != null && !this.length.isEmpty();
231        }
232
233        public boolean hasLength() { 
234          return this.length != null && !this.length.isEmpty();
235        }
236
237        /**
238         * @param value {@link #length} (The length of the sequence shall be captured.). This is the underlying object with id, value and extensions. The accessor "getLength" gives direct access to the value
239         */
240        public SubstanceNucleicAcidSubunitComponent setLengthElement(IntegerType value) { 
241          this.length = value;
242          return this;
243        }
244
245        /**
246         * @return The length of the sequence shall be captured.
247         */
248        public int getLength() { 
249          return this.length == null || this.length.isEmpty() ? 0 : this.length.getValue();
250        }
251
252        /**
253         * @param value The length of the sequence shall be captured.
254         */
255        public SubstanceNucleicAcidSubunitComponent setLength(int value) { 
256            if (this.length == null)
257              this.length = new IntegerType();
258            this.length.setValue(value);
259          return this;
260        }
261
262        /**
263         * @return {@link #sequenceAttachment} ((TBC).)
264         */
265        public Attachment getSequenceAttachment() { 
266          if (this.sequenceAttachment == null)
267            if (Configuration.errorOnAutoCreate())
268              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitComponent.sequenceAttachment");
269            else if (Configuration.doAutoCreate())
270              this.sequenceAttachment = new Attachment(); // cc
271          return this.sequenceAttachment;
272        }
273
274        public boolean hasSequenceAttachment() { 
275          return this.sequenceAttachment != null && !this.sequenceAttachment.isEmpty();
276        }
277
278        /**
279         * @param value {@link #sequenceAttachment} ((TBC).)
280         */
281        public SubstanceNucleicAcidSubunitComponent setSequenceAttachment(Attachment value) { 
282          this.sequenceAttachment = value;
283          return this;
284        }
285
286        /**
287         * @return {@link #fivePrime} (The nucleotide present at the 5? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the first position in the sequence. A separate representation would be redundant.)
288         */
289        public CodeableConcept getFivePrime() { 
290          if (this.fivePrime == null)
291            if (Configuration.errorOnAutoCreate())
292              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitComponent.fivePrime");
293            else if (Configuration.doAutoCreate())
294              this.fivePrime = new CodeableConcept(); // cc
295          return this.fivePrime;
296        }
297
298        public boolean hasFivePrime() { 
299          return this.fivePrime != null && !this.fivePrime.isEmpty();
300        }
301
302        /**
303         * @param value {@link #fivePrime} (The nucleotide present at the 5? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the first position in the sequence. A separate representation would be redundant.)
304         */
305        public SubstanceNucleicAcidSubunitComponent setFivePrime(CodeableConcept value) { 
306          this.fivePrime = value;
307          return this;
308        }
309
310        /**
311         * @return {@link #threePrime} (The nucleotide present at the 3? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the last position in the sequence. A separate representation would be redundant.)
312         */
313        public CodeableConcept getThreePrime() { 
314          if (this.threePrime == null)
315            if (Configuration.errorOnAutoCreate())
316              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitComponent.threePrime");
317            else if (Configuration.doAutoCreate())
318              this.threePrime = new CodeableConcept(); // cc
319          return this.threePrime;
320        }
321
322        public boolean hasThreePrime() { 
323          return this.threePrime != null && !this.threePrime.isEmpty();
324        }
325
326        /**
327         * @param value {@link #threePrime} (The nucleotide present at the 3? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the last position in the sequence. A separate representation would be redundant.)
328         */
329        public SubstanceNucleicAcidSubunitComponent setThreePrime(CodeableConcept value) { 
330          this.threePrime = value;
331          return this;
332        }
333
334        /**
335         * @return {@link #linkage} (The linkages between sugar residues will also be captured.)
336         */
337        public List<SubstanceNucleicAcidSubunitLinkageComponent> getLinkage() { 
338          if (this.linkage == null)
339            this.linkage = new ArrayList<SubstanceNucleicAcidSubunitLinkageComponent>();
340          return this.linkage;
341        }
342
343        /**
344         * @return Returns a reference to <code>this</code> for easy method chaining
345         */
346        public SubstanceNucleicAcidSubunitComponent setLinkage(List<SubstanceNucleicAcidSubunitLinkageComponent> theLinkage) { 
347          this.linkage = theLinkage;
348          return this;
349        }
350
351        public boolean hasLinkage() { 
352          if (this.linkage == null)
353            return false;
354          for (SubstanceNucleicAcidSubunitLinkageComponent item : this.linkage)
355            if (!item.isEmpty())
356              return true;
357          return false;
358        }
359
360        public SubstanceNucleicAcidSubunitLinkageComponent addLinkage() { //3
361          SubstanceNucleicAcidSubunitLinkageComponent t = new SubstanceNucleicAcidSubunitLinkageComponent();
362          if (this.linkage == null)
363            this.linkage = new ArrayList<SubstanceNucleicAcidSubunitLinkageComponent>();
364          this.linkage.add(t);
365          return t;
366        }
367
368        public SubstanceNucleicAcidSubunitComponent addLinkage(SubstanceNucleicAcidSubunitLinkageComponent t) { //3
369          if (t == null)
370            return this;
371          if (this.linkage == null)
372            this.linkage = new ArrayList<SubstanceNucleicAcidSubunitLinkageComponent>();
373          this.linkage.add(t);
374          return this;
375        }
376
377        /**
378         * @return The first repetition of repeating field {@link #linkage}, creating it if it does not already exist {3}
379         */
380        public SubstanceNucleicAcidSubunitLinkageComponent getLinkageFirstRep() { 
381          if (getLinkage().isEmpty()) {
382            addLinkage();
383          }
384          return getLinkage().get(0);
385        }
386
387        /**
388         * @return {@link #sugar} (5.3.6.8.1 Sugar ID (Mandatory).)
389         */
390        public List<SubstanceNucleicAcidSubunitSugarComponent> getSugar() { 
391          if (this.sugar == null)
392            this.sugar = new ArrayList<SubstanceNucleicAcidSubunitSugarComponent>();
393          return this.sugar;
394        }
395
396        /**
397         * @return Returns a reference to <code>this</code> for easy method chaining
398         */
399        public SubstanceNucleicAcidSubunitComponent setSugar(List<SubstanceNucleicAcidSubunitSugarComponent> theSugar) { 
400          this.sugar = theSugar;
401          return this;
402        }
403
404        public boolean hasSugar() { 
405          if (this.sugar == null)
406            return false;
407          for (SubstanceNucleicAcidSubunitSugarComponent item : this.sugar)
408            if (!item.isEmpty())
409              return true;
410          return false;
411        }
412
413        public SubstanceNucleicAcidSubunitSugarComponent addSugar() { //3
414          SubstanceNucleicAcidSubunitSugarComponent t = new SubstanceNucleicAcidSubunitSugarComponent();
415          if (this.sugar == null)
416            this.sugar = new ArrayList<SubstanceNucleicAcidSubunitSugarComponent>();
417          this.sugar.add(t);
418          return t;
419        }
420
421        public SubstanceNucleicAcidSubunitComponent addSugar(SubstanceNucleicAcidSubunitSugarComponent t) { //3
422          if (t == null)
423            return this;
424          if (this.sugar == null)
425            this.sugar = new ArrayList<SubstanceNucleicAcidSubunitSugarComponent>();
426          this.sugar.add(t);
427          return this;
428        }
429
430        /**
431         * @return The first repetition of repeating field {@link #sugar}, creating it if it does not already exist {3}
432         */
433        public SubstanceNucleicAcidSubunitSugarComponent getSugarFirstRep() { 
434          if (getSugar().isEmpty()) {
435            addSugar();
436          }
437          return getSugar().get(0);
438        }
439
440        protected void listChildren(List<Property> children) {
441          super.listChildren(children);
442          children.add(new Property("subunit", "integer", "Index of linear sequences of nucleic acids in order of decreasing length. Sequences of the same length will be ordered by molecular weight. Subunits that have identical sequences will be repeated and have sequential subscripts.", 0, 1, subunit));
443          children.add(new Property("sequence", "string", "Actual nucleotide sequence notation from 5' to 3' end using standard single letter codes. In addition to the base sequence, sugar and type of phosphate or non-phosphate linkage should also be captured.", 0, 1, sequence));
444          children.add(new Property("length", "integer", "The length of the sequence shall be captured.", 0, 1, length));
445          children.add(new Property("sequenceAttachment", "Attachment", "(TBC).", 0, 1, sequenceAttachment));
446          children.add(new Property("fivePrime", "CodeableConcept", "The nucleotide present at the 5? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the first position in the sequence. A separate representation would be redundant.", 0, 1, fivePrime));
447          children.add(new Property("threePrime", "CodeableConcept", "The nucleotide present at the 3? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the last position in the sequence. A separate representation would be redundant.", 0, 1, threePrime));
448          children.add(new Property("linkage", "", "The linkages between sugar residues will also be captured.", 0, java.lang.Integer.MAX_VALUE, linkage));
449          children.add(new Property("sugar", "", "5.3.6.8.1 Sugar ID (Mandatory).", 0, java.lang.Integer.MAX_VALUE, sugar));
450        }
451
452        @Override
453        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
454          switch (_hash) {
455          case -1867548732: /*subunit*/  return new Property("subunit", "integer", "Index of linear sequences of nucleic acids in order of decreasing length. Sequences of the same length will be ordered by molecular weight. Subunits that have identical sequences will be repeated and have sequential subscripts.", 0, 1, subunit);
456          case 1349547969: /*sequence*/  return new Property("sequence", "string", "Actual nucleotide sequence notation from 5' to 3' end using standard single letter codes. In addition to the base sequence, sugar and type of phosphate or non-phosphate linkage should also be captured.", 0, 1, sequence);
457          case -1106363674: /*length*/  return new Property("length", "integer", "The length of the sequence shall be captured.", 0, 1, length);
458          case 364621764: /*sequenceAttachment*/  return new Property("sequenceAttachment", "Attachment", "(TBC).", 0, 1, sequenceAttachment);
459          case -1045091603: /*fivePrime*/  return new Property("fivePrime", "CodeableConcept", "The nucleotide present at the 5? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the first position in the sequence. A separate representation would be redundant.", 0, 1, fivePrime);
460          case -1088032895: /*threePrime*/  return new Property("threePrime", "CodeableConcept", "The nucleotide present at the 3? terminal shall be specified based on a controlled vocabulary. Since the sequence is represented from the 5' to the 3' end, the 5? prime nucleotide is the letter at the last position in the sequence. A separate representation would be redundant.", 0, 1, threePrime);
461          case 177082053: /*linkage*/  return new Property("linkage", "", "The linkages between sugar residues will also be captured.", 0, java.lang.Integer.MAX_VALUE, linkage);
462          case 109792566: /*sugar*/  return new Property("sugar", "", "5.3.6.8.1 Sugar ID (Mandatory).", 0, java.lang.Integer.MAX_VALUE, sugar);
463          default: return super.getNamedProperty(_hash, _name, _checkValid);
464          }
465
466        }
467
468      @Override
469      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
470        switch (hash) {
471        case -1867548732: /*subunit*/ return this.subunit == null ? new Base[0] : new Base[] {this.subunit}; // IntegerType
472        case 1349547969: /*sequence*/ return this.sequence == null ? new Base[0] : new Base[] {this.sequence}; // StringType
473        case -1106363674: /*length*/ return this.length == null ? new Base[0] : new Base[] {this.length}; // IntegerType
474        case 364621764: /*sequenceAttachment*/ return this.sequenceAttachment == null ? new Base[0] : new Base[] {this.sequenceAttachment}; // Attachment
475        case -1045091603: /*fivePrime*/ return this.fivePrime == null ? new Base[0] : new Base[] {this.fivePrime}; // CodeableConcept
476        case -1088032895: /*threePrime*/ return this.threePrime == null ? new Base[0] : new Base[] {this.threePrime}; // CodeableConcept
477        case 177082053: /*linkage*/ return this.linkage == null ? new Base[0] : this.linkage.toArray(new Base[this.linkage.size()]); // SubstanceNucleicAcidSubunitLinkageComponent
478        case 109792566: /*sugar*/ return this.sugar == null ? new Base[0] : this.sugar.toArray(new Base[this.sugar.size()]); // SubstanceNucleicAcidSubunitSugarComponent
479        default: return super.getProperty(hash, name, checkValid);
480        }
481
482      }
483
484      @Override
485      public Base setProperty(int hash, String name, Base value) throws FHIRException {
486        switch (hash) {
487        case -1867548732: // subunit
488          this.subunit = TypeConvertor.castToInteger(value); // IntegerType
489          return value;
490        case 1349547969: // sequence
491          this.sequence = TypeConvertor.castToString(value); // StringType
492          return value;
493        case -1106363674: // length
494          this.length = TypeConvertor.castToInteger(value); // IntegerType
495          return value;
496        case 364621764: // sequenceAttachment
497          this.sequenceAttachment = TypeConvertor.castToAttachment(value); // Attachment
498          return value;
499        case -1045091603: // fivePrime
500          this.fivePrime = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
501          return value;
502        case -1088032895: // threePrime
503          this.threePrime = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
504          return value;
505        case 177082053: // linkage
506          this.getLinkage().add((SubstanceNucleicAcidSubunitLinkageComponent) value); // SubstanceNucleicAcidSubunitLinkageComponent
507          return value;
508        case 109792566: // sugar
509          this.getSugar().add((SubstanceNucleicAcidSubunitSugarComponent) value); // SubstanceNucleicAcidSubunitSugarComponent
510          return value;
511        default: return super.setProperty(hash, name, value);
512        }
513
514      }
515
516      @Override
517      public Base setProperty(String name, Base value) throws FHIRException {
518        if (name.equals("subunit")) {
519          this.subunit = TypeConvertor.castToInteger(value); // IntegerType
520        } else if (name.equals("sequence")) {
521          this.sequence = TypeConvertor.castToString(value); // StringType
522        } else if (name.equals("length")) {
523          this.length = TypeConvertor.castToInteger(value); // IntegerType
524        } else if (name.equals("sequenceAttachment")) {
525          this.sequenceAttachment = TypeConvertor.castToAttachment(value); // Attachment
526        } else if (name.equals("fivePrime")) {
527          this.fivePrime = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
528        } else if (name.equals("threePrime")) {
529          this.threePrime = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
530        } else if (name.equals("linkage")) {
531          this.getLinkage().add((SubstanceNucleicAcidSubunitLinkageComponent) value);
532        } else if (name.equals("sugar")) {
533          this.getSugar().add((SubstanceNucleicAcidSubunitSugarComponent) value);
534        } else
535          return super.setProperty(name, value);
536        return value;
537      }
538
539      @Override
540      public Base makeProperty(int hash, String name) throws FHIRException {
541        switch (hash) {
542        case -1867548732:  return getSubunitElement();
543        case 1349547969:  return getSequenceElement();
544        case -1106363674:  return getLengthElement();
545        case 364621764:  return getSequenceAttachment();
546        case -1045091603:  return getFivePrime();
547        case -1088032895:  return getThreePrime();
548        case 177082053:  return addLinkage(); 
549        case 109792566:  return addSugar(); 
550        default: return super.makeProperty(hash, name);
551        }
552
553      }
554
555      @Override
556      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
557        switch (hash) {
558        case -1867548732: /*subunit*/ return new String[] {"integer"};
559        case 1349547969: /*sequence*/ return new String[] {"string"};
560        case -1106363674: /*length*/ return new String[] {"integer"};
561        case 364621764: /*sequenceAttachment*/ return new String[] {"Attachment"};
562        case -1045091603: /*fivePrime*/ return new String[] {"CodeableConcept"};
563        case -1088032895: /*threePrime*/ return new String[] {"CodeableConcept"};
564        case 177082053: /*linkage*/ return new String[] {};
565        case 109792566: /*sugar*/ return new String[] {};
566        default: return super.getTypesForProperty(hash, name);
567        }
568
569      }
570
571      @Override
572      public Base addChild(String name) throws FHIRException {
573        if (name.equals("subunit")) {
574          throw new FHIRException("Cannot call addChild on a primitive type SubstanceNucleicAcid.subunit.subunit");
575        }
576        else if (name.equals("sequence")) {
577          throw new FHIRException("Cannot call addChild on a primitive type SubstanceNucleicAcid.subunit.sequence");
578        }
579        else if (name.equals("length")) {
580          throw new FHIRException("Cannot call addChild on a primitive type SubstanceNucleicAcid.subunit.length");
581        }
582        else if (name.equals("sequenceAttachment")) {
583          this.sequenceAttachment = new Attachment();
584          return this.sequenceAttachment;
585        }
586        else if (name.equals("fivePrime")) {
587          this.fivePrime = new CodeableConcept();
588          return this.fivePrime;
589        }
590        else if (name.equals("threePrime")) {
591          this.threePrime = new CodeableConcept();
592          return this.threePrime;
593        }
594        else if (name.equals("linkage")) {
595          return addLinkage();
596        }
597        else if (name.equals("sugar")) {
598          return addSugar();
599        }
600        else
601          return super.addChild(name);
602      }
603
604      public SubstanceNucleicAcidSubunitComponent copy() {
605        SubstanceNucleicAcidSubunitComponent dst = new SubstanceNucleicAcidSubunitComponent();
606        copyValues(dst);
607        return dst;
608      }
609
610      public void copyValues(SubstanceNucleicAcidSubunitComponent dst) {
611        super.copyValues(dst);
612        dst.subunit = subunit == null ? null : subunit.copy();
613        dst.sequence = sequence == null ? null : sequence.copy();
614        dst.length = length == null ? null : length.copy();
615        dst.sequenceAttachment = sequenceAttachment == null ? null : sequenceAttachment.copy();
616        dst.fivePrime = fivePrime == null ? null : fivePrime.copy();
617        dst.threePrime = threePrime == null ? null : threePrime.copy();
618        if (linkage != null) {
619          dst.linkage = new ArrayList<SubstanceNucleicAcidSubunitLinkageComponent>();
620          for (SubstanceNucleicAcidSubunitLinkageComponent i : linkage)
621            dst.linkage.add(i.copy());
622        };
623        if (sugar != null) {
624          dst.sugar = new ArrayList<SubstanceNucleicAcidSubunitSugarComponent>();
625          for (SubstanceNucleicAcidSubunitSugarComponent i : sugar)
626            dst.sugar.add(i.copy());
627        };
628      }
629
630      @Override
631      public boolean equalsDeep(Base other_) {
632        if (!super.equalsDeep(other_))
633          return false;
634        if (!(other_ instanceof SubstanceNucleicAcidSubunitComponent))
635          return false;
636        SubstanceNucleicAcidSubunitComponent o = (SubstanceNucleicAcidSubunitComponent) other_;
637        return compareDeep(subunit, o.subunit, true) && compareDeep(sequence, o.sequence, true) && compareDeep(length, o.length, true)
638           && compareDeep(sequenceAttachment, o.sequenceAttachment, true) && compareDeep(fivePrime, o.fivePrime, true)
639           && compareDeep(threePrime, o.threePrime, true) && compareDeep(linkage, o.linkage, true) && compareDeep(sugar, o.sugar, true)
640          ;
641      }
642
643      @Override
644      public boolean equalsShallow(Base other_) {
645        if (!super.equalsShallow(other_))
646          return false;
647        if (!(other_ instanceof SubstanceNucleicAcidSubunitComponent))
648          return false;
649        SubstanceNucleicAcidSubunitComponent o = (SubstanceNucleicAcidSubunitComponent) other_;
650        return compareValues(subunit, o.subunit, true) && compareValues(sequence, o.sequence, true) && compareValues(length, o.length, true)
651          ;
652      }
653
654      public boolean isEmpty() {
655        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(subunit, sequence, length
656          , sequenceAttachment, fivePrime, threePrime, linkage, sugar);
657      }
658
659  public String fhirType() {
660    return "SubstanceNucleicAcid.subunit";
661
662  }
663
664  }
665
666    @Block()
667    public static class SubstanceNucleicAcidSubunitLinkageComponent extends BackboneElement implements IBaseBackboneElement {
668        /**
669         * The entity that links the sugar residues together should also be captured for nearly all naturally occurring nucleic acid the linkage is a phosphate group. For many synthetic oligonucleotides phosphorothioate linkages are often seen. Linkage connectivity is assumed to be 3?-5?. If the linkage is either 3?-3? or 5?-5? this should be specified.
670         */
671        @Child(name = "connectivity", type = {StringType.class}, order=1, min=0, max=1, modifier=false, summary=true)
672        @Description(shortDefinition="The entity that links the sugar residues together should also be captured for nearly all naturally occurring nucleic acid the linkage is a phosphate group. For many synthetic oligonucleotides phosphorothioate linkages are often seen. Linkage connectivity is assumed to be 3?-5?. If the linkage is either 3?-3? or 5?-5? this should be specified", formalDefinition="The entity that links the sugar residues together should also be captured for nearly all naturally occurring nucleic acid the linkage is a phosphate group. For many synthetic oligonucleotides phosphorothioate linkages are often seen. Linkage connectivity is assumed to be 3?-5?. If the linkage is either 3?-3? or 5?-5? this should be specified." )
673        protected StringType connectivity;
674
675        /**
676         * Each linkage will be registered as a fragment and have an ID.
677         */
678        @Child(name = "identifier", type = {Identifier.class}, order=2, min=0, max=1, modifier=false, summary=true)
679        @Description(shortDefinition="Each linkage will be registered as a fragment and have an ID", formalDefinition="Each linkage will be registered as a fragment and have an ID." )
680        protected Identifier identifier;
681
682        /**
683         * Each linkage will be registered as a fragment and have at least one name. A single name shall be assigned to each linkage.
684         */
685        @Child(name = "name", type = {StringType.class}, order=3, min=0, max=1, modifier=false, summary=true)
686        @Description(shortDefinition="Each linkage will be registered as a fragment and have at least one name. A single name shall be assigned to each linkage", formalDefinition="Each linkage will be registered as a fragment and have at least one name. A single name shall be assigned to each linkage." )
687        protected StringType name;
688
689        /**
690         * Residues shall be captured as described in 5.3.6.8.3.
691         */
692        @Child(name = "residueSite", type = {StringType.class}, order=4, min=0, max=1, modifier=false, summary=true)
693        @Description(shortDefinition="Residues shall be captured as described in 5.3.6.8.3", formalDefinition="Residues shall be captured as described in 5.3.6.8.3." )
694        protected StringType residueSite;
695
696        private static final long serialVersionUID = 1392155799L;
697
698    /**
699     * Constructor
700     */
701      public SubstanceNucleicAcidSubunitLinkageComponent() {
702        super();
703      }
704
705        /**
706         * @return {@link #connectivity} (The entity that links the sugar residues together should also be captured for nearly all naturally occurring nucleic acid the linkage is a phosphate group. For many synthetic oligonucleotides phosphorothioate linkages are often seen. Linkage connectivity is assumed to be 3?-5?. If the linkage is either 3?-3? or 5?-5? this should be specified.). This is the underlying object with id, value and extensions. The accessor "getConnectivity" gives direct access to the value
707         */
708        public StringType getConnectivityElement() { 
709          if (this.connectivity == null)
710            if (Configuration.errorOnAutoCreate())
711              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitLinkageComponent.connectivity");
712            else if (Configuration.doAutoCreate())
713              this.connectivity = new StringType(); // bb
714          return this.connectivity;
715        }
716
717        public boolean hasConnectivityElement() { 
718          return this.connectivity != null && !this.connectivity.isEmpty();
719        }
720
721        public boolean hasConnectivity() { 
722          return this.connectivity != null && !this.connectivity.isEmpty();
723        }
724
725        /**
726         * @param value {@link #connectivity} (The entity that links the sugar residues together should also be captured for nearly all naturally occurring nucleic acid the linkage is a phosphate group. For many synthetic oligonucleotides phosphorothioate linkages are often seen. Linkage connectivity is assumed to be 3?-5?. If the linkage is either 3?-3? or 5?-5? this should be specified.). This is the underlying object with id, value and extensions. The accessor "getConnectivity" gives direct access to the value
727         */
728        public SubstanceNucleicAcidSubunitLinkageComponent setConnectivityElement(StringType value) { 
729          this.connectivity = value;
730          return this;
731        }
732
733        /**
734         * @return The entity that links the sugar residues together should also be captured for nearly all naturally occurring nucleic acid the linkage is a phosphate group. For many synthetic oligonucleotides phosphorothioate linkages are often seen. Linkage connectivity is assumed to be 3?-5?. If the linkage is either 3?-3? or 5?-5? this should be specified.
735         */
736        public String getConnectivity() { 
737          return this.connectivity == null ? null : this.connectivity.getValue();
738        }
739
740        /**
741         * @param value The entity that links the sugar residues together should also be captured for nearly all naturally occurring nucleic acid the linkage is a phosphate group. For many synthetic oligonucleotides phosphorothioate linkages are often seen. Linkage connectivity is assumed to be 3?-5?. If the linkage is either 3?-3? or 5?-5? this should be specified.
742         */
743        public SubstanceNucleicAcidSubunitLinkageComponent setConnectivity(String value) { 
744          if (Utilities.noString(value))
745            this.connectivity = null;
746          else {
747            if (this.connectivity == null)
748              this.connectivity = new StringType();
749            this.connectivity.setValue(value);
750          }
751          return this;
752        }
753
754        /**
755         * @return {@link #identifier} (Each linkage will be registered as a fragment and have an ID.)
756         */
757        public Identifier getIdentifier() { 
758          if (this.identifier == null)
759            if (Configuration.errorOnAutoCreate())
760              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitLinkageComponent.identifier");
761            else if (Configuration.doAutoCreate())
762              this.identifier = new Identifier(); // cc
763          return this.identifier;
764        }
765
766        public boolean hasIdentifier() { 
767          return this.identifier != null && !this.identifier.isEmpty();
768        }
769
770        /**
771         * @param value {@link #identifier} (Each linkage will be registered as a fragment and have an ID.)
772         */
773        public SubstanceNucleicAcidSubunitLinkageComponent setIdentifier(Identifier value) { 
774          this.identifier = value;
775          return this;
776        }
777
778        /**
779         * @return {@link #name} (Each linkage will be registered as a fragment and have at least one name. A single name shall be assigned to each linkage.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
780         */
781        public StringType getNameElement() { 
782          if (this.name == null)
783            if (Configuration.errorOnAutoCreate())
784              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitLinkageComponent.name");
785            else if (Configuration.doAutoCreate())
786              this.name = new StringType(); // bb
787          return this.name;
788        }
789
790        public boolean hasNameElement() { 
791          return this.name != null && !this.name.isEmpty();
792        }
793
794        public boolean hasName() { 
795          return this.name != null && !this.name.isEmpty();
796        }
797
798        /**
799         * @param value {@link #name} (Each linkage will be registered as a fragment and have at least one name. A single name shall be assigned to each linkage.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
800         */
801        public SubstanceNucleicAcidSubunitLinkageComponent setNameElement(StringType value) { 
802          this.name = value;
803          return this;
804        }
805
806        /**
807         * @return Each linkage will be registered as a fragment and have at least one name. A single name shall be assigned to each linkage.
808         */
809        public String getName() { 
810          return this.name == null ? null : this.name.getValue();
811        }
812
813        /**
814         * @param value Each linkage will be registered as a fragment and have at least one name. A single name shall be assigned to each linkage.
815         */
816        public SubstanceNucleicAcidSubunitLinkageComponent setName(String value) { 
817          if (Utilities.noString(value))
818            this.name = null;
819          else {
820            if (this.name == null)
821              this.name = new StringType();
822            this.name.setValue(value);
823          }
824          return this;
825        }
826
827        /**
828         * @return {@link #residueSite} (Residues shall be captured as described in 5.3.6.8.3.). This is the underlying object with id, value and extensions. The accessor "getResidueSite" gives direct access to the value
829         */
830        public StringType getResidueSiteElement() { 
831          if (this.residueSite == null)
832            if (Configuration.errorOnAutoCreate())
833              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitLinkageComponent.residueSite");
834            else if (Configuration.doAutoCreate())
835              this.residueSite = new StringType(); // bb
836          return this.residueSite;
837        }
838
839        public boolean hasResidueSiteElement() { 
840          return this.residueSite != null && !this.residueSite.isEmpty();
841        }
842
843        public boolean hasResidueSite() { 
844          return this.residueSite != null && !this.residueSite.isEmpty();
845        }
846
847        /**
848         * @param value {@link #residueSite} (Residues shall be captured as described in 5.3.6.8.3.). This is the underlying object with id, value and extensions. The accessor "getResidueSite" gives direct access to the value
849         */
850        public SubstanceNucleicAcidSubunitLinkageComponent setResidueSiteElement(StringType value) { 
851          this.residueSite = value;
852          return this;
853        }
854
855        /**
856         * @return Residues shall be captured as described in 5.3.6.8.3.
857         */
858        public String getResidueSite() { 
859          return this.residueSite == null ? null : this.residueSite.getValue();
860        }
861
862        /**
863         * @param value Residues shall be captured as described in 5.3.6.8.3.
864         */
865        public SubstanceNucleicAcidSubunitLinkageComponent setResidueSite(String value) { 
866          if (Utilities.noString(value))
867            this.residueSite = null;
868          else {
869            if (this.residueSite == null)
870              this.residueSite = new StringType();
871            this.residueSite.setValue(value);
872          }
873          return this;
874        }
875
876        protected void listChildren(List<Property> children) {
877          super.listChildren(children);
878          children.add(new Property("connectivity", "string", "The entity that links the sugar residues together should also be captured for nearly all naturally occurring nucleic acid the linkage is a phosphate group. For many synthetic oligonucleotides phosphorothioate linkages are often seen. Linkage connectivity is assumed to be 3?-5?. If the linkage is either 3?-3? or 5?-5? this should be specified.", 0, 1, connectivity));
879          children.add(new Property("identifier", "Identifier", "Each linkage will be registered as a fragment and have an ID.", 0, 1, identifier));
880          children.add(new Property("name", "string", "Each linkage will be registered as a fragment and have at least one name. A single name shall be assigned to each linkage.", 0, 1, name));
881          children.add(new Property("residueSite", "string", "Residues shall be captured as described in 5.3.6.8.3.", 0, 1, residueSite));
882        }
883
884        @Override
885        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
886          switch (_hash) {
887          case 1923312055: /*connectivity*/  return new Property("connectivity", "string", "The entity that links the sugar residues together should also be captured for nearly all naturally occurring nucleic acid the linkage is a phosphate group. For many synthetic oligonucleotides phosphorothioate linkages are often seen. Linkage connectivity is assumed to be 3?-5?. If the linkage is either 3?-3? or 5?-5? this should be specified.", 0, 1, connectivity);
888          case -1618432855: /*identifier*/  return new Property("identifier", "Identifier", "Each linkage will be registered as a fragment and have an ID.", 0, 1, identifier);
889          case 3373707: /*name*/  return new Property("name", "string", "Each linkage will be registered as a fragment and have at least one name. A single name shall be assigned to each linkage.", 0, 1, name);
890          case 1547124594: /*residueSite*/  return new Property("residueSite", "string", "Residues shall be captured as described in 5.3.6.8.3.", 0, 1, residueSite);
891          default: return super.getNamedProperty(_hash, _name, _checkValid);
892          }
893
894        }
895
896      @Override
897      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
898        switch (hash) {
899        case 1923312055: /*connectivity*/ return this.connectivity == null ? new Base[0] : new Base[] {this.connectivity}; // StringType
900        case -1618432855: /*identifier*/ return this.identifier == null ? new Base[0] : new Base[] {this.identifier}; // Identifier
901        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // StringType
902        case 1547124594: /*residueSite*/ return this.residueSite == null ? new Base[0] : new Base[] {this.residueSite}; // StringType
903        default: return super.getProperty(hash, name, checkValid);
904        }
905
906      }
907
908      @Override
909      public Base setProperty(int hash, String name, Base value) throws FHIRException {
910        switch (hash) {
911        case 1923312055: // connectivity
912          this.connectivity = TypeConvertor.castToString(value); // StringType
913          return value;
914        case -1618432855: // identifier
915          this.identifier = TypeConvertor.castToIdentifier(value); // Identifier
916          return value;
917        case 3373707: // name
918          this.name = TypeConvertor.castToString(value); // StringType
919          return value;
920        case 1547124594: // residueSite
921          this.residueSite = TypeConvertor.castToString(value); // StringType
922          return value;
923        default: return super.setProperty(hash, name, value);
924        }
925
926      }
927
928      @Override
929      public Base setProperty(String name, Base value) throws FHIRException {
930        if (name.equals("connectivity")) {
931          this.connectivity = TypeConvertor.castToString(value); // StringType
932        } else if (name.equals("identifier")) {
933          this.identifier = TypeConvertor.castToIdentifier(value); // Identifier
934        } else if (name.equals("name")) {
935          this.name = TypeConvertor.castToString(value); // StringType
936        } else if (name.equals("residueSite")) {
937          this.residueSite = TypeConvertor.castToString(value); // StringType
938        } else
939          return super.setProperty(name, value);
940        return value;
941      }
942
943      @Override
944      public Base makeProperty(int hash, String name) throws FHIRException {
945        switch (hash) {
946        case 1923312055:  return getConnectivityElement();
947        case -1618432855:  return getIdentifier();
948        case 3373707:  return getNameElement();
949        case 1547124594:  return getResidueSiteElement();
950        default: return super.makeProperty(hash, name);
951        }
952
953      }
954
955      @Override
956      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
957        switch (hash) {
958        case 1923312055: /*connectivity*/ return new String[] {"string"};
959        case -1618432855: /*identifier*/ return new String[] {"Identifier"};
960        case 3373707: /*name*/ return new String[] {"string"};
961        case 1547124594: /*residueSite*/ return new String[] {"string"};
962        default: return super.getTypesForProperty(hash, name);
963        }
964
965      }
966
967      @Override
968      public Base addChild(String name) throws FHIRException {
969        if (name.equals("connectivity")) {
970          throw new FHIRException("Cannot call addChild on a primitive type SubstanceNucleicAcid.subunit.linkage.connectivity");
971        }
972        else if (name.equals("identifier")) {
973          this.identifier = new Identifier();
974          return this.identifier;
975        }
976        else if (name.equals("name")) {
977          throw new FHIRException("Cannot call addChild on a primitive type SubstanceNucleicAcid.subunit.linkage.name");
978        }
979        else if (name.equals("residueSite")) {
980          throw new FHIRException("Cannot call addChild on a primitive type SubstanceNucleicAcid.subunit.linkage.residueSite");
981        }
982        else
983          return super.addChild(name);
984      }
985
986      public SubstanceNucleicAcidSubunitLinkageComponent copy() {
987        SubstanceNucleicAcidSubunitLinkageComponent dst = new SubstanceNucleicAcidSubunitLinkageComponent();
988        copyValues(dst);
989        return dst;
990      }
991
992      public void copyValues(SubstanceNucleicAcidSubunitLinkageComponent dst) {
993        super.copyValues(dst);
994        dst.connectivity = connectivity == null ? null : connectivity.copy();
995        dst.identifier = identifier == null ? null : identifier.copy();
996        dst.name = name == null ? null : name.copy();
997        dst.residueSite = residueSite == null ? null : residueSite.copy();
998      }
999
1000      @Override
1001      public boolean equalsDeep(Base other_) {
1002        if (!super.equalsDeep(other_))
1003          return false;
1004        if (!(other_ instanceof SubstanceNucleicAcidSubunitLinkageComponent))
1005          return false;
1006        SubstanceNucleicAcidSubunitLinkageComponent o = (SubstanceNucleicAcidSubunitLinkageComponent) other_;
1007        return compareDeep(connectivity, o.connectivity, true) && compareDeep(identifier, o.identifier, true)
1008           && compareDeep(name, o.name, true) && compareDeep(residueSite, o.residueSite, true);
1009      }
1010
1011      @Override
1012      public boolean equalsShallow(Base other_) {
1013        if (!super.equalsShallow(other_))
1014          return false;
1015        if (!(other_ instanceof SubstanceNucleicAcidSubunitLinkageComponent))
1016          return false;
1017        SubstanceNucleicAcidSubunitLinkageComponent o = (SubstanceNucleicAcidSubunitLinkageComponent) other_;
1018        return compareValues(connectivity, o.connectivity, true) && compareValues(name, o.name, true) && compareValues(residueSite, o.residueSite, true)
1019          ;
1020      }
1021
1022      public boolean isEmpty() {
1023        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(connectivity, identifier, name
1024          , residueSite);
1025      }
1026
1027  public String fhirType() {
1028    return "SubstanceNucleicAcid.subunit.linkage";
1029
1030  }
1031
1032  }
1033
1034    @Block()
1035    public static class SubstanceNucleicAcidSubunitSugarComponent extends BackboneElement implements IBaseBackboneElement {
1036        /**
1037         * The Substance ID of the sugar or sugar-like component that make up the nucleotide.
1038         */
1039        @Child(name = "identifier", type = {Identifier.class}, order=1, min=0, max=1, modifier=false, summary=true)
1040        @Description(shortDefinition="The Substance ID of the sugar or sugar-like component that make up the nucleotide", formalDefinition="The Substance ID of the sugar or sugar-like component that make up the nucleotide." )
1041        protected Identifier identifier;
1042
1043        /**
1044         * The name of the sugar or sugar-like component that make up the nucleotide.
1045         */
1046        @Child(name = "name", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=true)
1047        @Description(shortDefinition="The name of the sugar or sugar-like component that make up the nucleotide", formalDefinition="The name of the sugar or sugar-like component that make up the nucleotide." )
1048        protected StringType name;
1049
1050        /**
1051         * The residues that contain a given sugar will be captured. The order of given residues will be captured in the 5?-3?direction consistent with the base sequences listed above.
1052         */
1053        @Child(name = "residueSite", type = {StringType.class}, order=3, min=0, max=1, modifier=false, summary=true)
1054        @Description(shortDefinition="The residues that contain a given sugar will be captured. The order of given residues will be captured in the 5?-3?direction consistent with the base sequences listed above", formalDefinition="The residues that contain a given sugar will be captured. The order of given residues will be captured in the 5?-3?direction consistent with the base sequences listed above." )
1055        protected StringType residueSite;
1056
1057        private static final long serialVersionUID = 1933713781L;
1058
1059    /**
1060     * Constructor
1061     */
1062      public SubstanceNucleicAcidSubunitSugarComponent() {
1063        super();
1064      }
1065
1066        /**
1067         * @return {@link #identifier} (The Substance ID of the sugar or sugar-like component that make up the nucleotide.)
1068         */
1069        public Identifier getIdentifier() { 
1070          if (this.identifier == null)
1071            if (Configuration.errorOnAutoCreate())
1072              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitSugarComponent.identifier");
1073            else if (Configuration.doAutoCreate())
1074              this.identifier = new Identifier(); // cc
1075          return this.identifier;
1076        }
1077
1078        public boolean hasIdentifier() { 
1079          return this.identifier != null && !this.identifier.isEmpty();
1080        }
1081
1082        /**
1083         * @param value {@link #identifier} (The Substance ID of the sugar or sugar-like component that make up the nucleotide.)
1084         */
1085        public SubstanceNucleicAcidSubunitSugarComponent setIdentifier(Identifier value) { 
1086          this.identifier = value;
1087          return this;
1088        }
1089
1090        /**
1091         * @return {@link #name} (The name of the sugar or sugar-like component that make up the nucleotide.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
1092         */
1093        public StringType getNameElement() { 
1094          if (this.name == null)
1095            if (Configuration.errorOnAutoCreate())
1096              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitSugarComponent.name");
1097            else if (Configuration.doAutoCreate())
1098              this.name = new StringType(); // bb
1099          return this.name;
1100        }
1101
1102        public boolean hasNameElement() { 
1103          return this.name != null && !this.name.isEmpty();
1104        }
1105
1106        public boolean hasName() { 
1107          return this.name != null && !this.name.isEmpty();
1108        }
1109
1110        /**
1111         * @param value {@link #name} (The name of the sugar or sugar-like component that make up the nucleotide.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
1112         */
1113        public SubstanceNucleicAcidSubunitSugarComponent setNameElement(StringType value) { 
1114          this.name = value;
1115          return this;
1116        }
1117
1118        /**
1119         * @return The name of the sugar or sugar-like component that make up the nucleotide.
1120         */
1121        public String getName() { 
1122          return this.name == null ? null : this.name.getValue();
1123        }
1124
1125        /**
1126         * @param value The name of the sugar or sugar-like component that make up the nucleotide.
1127         */
1128        public SubstanceNucleicAcidSubunitSugarComponent setName(String value) { 
1129          if (Utilities.noString(value))
1130            this.name = null;
1131          else {
1132            if (this.name == null)
1133              this.name = new StringType();
1134            this.name.setValue(value);
1135          }
1136          return this;
1137        }
1138
1139        /**
1140         * @return {@link #residueSite} (The residues that contain a given sugar will be captured. The order of given residues will be captured in the 5?-3?direction consistent with the base sequences listed above.). This is the underlying object with id, value and extensions. The accessor "getResidueSite" gives direct access to the value
1141         */
1142        public StringType getResidueSiteElement() { 
1143          if (this.residueSite == null)
1144            if (Configuration.errorOnAutoCreate())
1145              throw new Error("Attempt to auto-create SubstanceNucleicAcidSubunitSugarComponent.residueSite");
1146            else if (Configuration.doAutoCreate())
1147              this.residueSite = new StringType(); // bb
1148          return this.residueSite;
1149        }
1150
1151        public boolean hasResidueSiteElement() { 
1152          return this.residueSite != null && !this.residueSite.isEmpty();
1153        }
1154
1155        public boolean hasResidueSite() { 
1156          return this.residueSite != null && !this.residueSite.isEmpty();
1157        }
1158
1159        /**
1160         * @param value {@link #residueSite} (The residues that contain a given sugar will be captured. The order of given residues will be captured in the 5?-3?direction consistent with the base sequences listed above.). This is the underlying object with id, value and extensions. The accessor "getResidueSite" gives direct access to the value
1161         */
1162        public SubstanceNucleicAcidSubunitSugarComponent setResidueSiteElement(StringType value) { 
1163          this.residueSite = value;
1164          return this;
1165        }
1166
1167        /**
1168         * @return The residues that contain a given sugar will be captured. The order of given residues will be captured in the 5?-3?direction consistent with the base sequences listed above.
1169         */
1170        public String getResidueSite() { 
1171          return this.residueSite == null ? null : this.residueSite.getValue();
1172        }
1173
1174        /**
1175         * @param value The residues that contain a given sugar will be captured. The order of given residues will be captured in the 5?-3?direction consistent with the base sequences listed above.
1176         */
1177        public SubstanceNucleicAcidSubunitSugarComponent setResidueSite(String value) { 
1178          if (Utilities.noString(value))
1179            this.residueSite = null;
1180          else {
1181            if (this.residueSite == null)
1182              this.residueSite = new StringType();
1183            this.residueSite.setValue(value);
1184          }
1185          return this;
1186        }
1187
1188        protected void listChildren(List<Property> children) {
1189          super.listChildren(children);
1190          children.add(new Property("identifier", "Identifier", "The Substance ID of the sugar or sugar-like component that make up the nucleotide.", 0, 1, identifier));
1191          children.add(new Property("name", "string", "The name of the sugar or sugar-like component that make up the nucleotide.", 0, 1, name));
1192          children.add(new Property("residueSite", "string", "The residues that contain a given sugar will be captured. The order of given residues will be captured in the 5?-3?direction consistent with the base sequences listed above.", 0, 1, residueSite));
1193        }
1194
1195        @Override
1196        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1197          switch (_hash) {
1198          case -1618432855: /*identifier*/  return new Property("identifier", "Identifier", "The Substance ID of the sugar or sugar-like component that make up the nucleotide.", 0, 1, identifier);
1199          case 3373707: /*name*/  return new Property("name", "string", "The name of the sugar or sugar-like component that make up the nucleotide.", 0, 1, name);
1200          case 1547124594: /*residueSite*/  return new Property("residueSite", "string", "The residues that contain a given sugar will be captured. The order of given residues will be captured in the 5?-3?direction consistent with the base sequences listed above.", 0, 1, residueSite);
1201          default: return super.getNamedProperty(_hash, _name, _checkValid);
1202          }
1203
1204        }
1205
1206      @Override
1207      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1208        switch (hash) {
1209        case -1618432855: /*identifier*/ return this.identifier == null ? new Base[0] : new Base[] {this.identifier}; // Identifier
1210        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // StringType
1211        case 1547124594: /*residueSite*/ return this.residueSite == null ? new Base[0] : new Base[] {this.residueSite}; // StringType
1212        default: return super.getProperty(hash, name, checkValid);
1213        }
1214
1215      }
1216
1217      @Override
1218      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1219        switch (hash) {
1220        case -1618432855: // identifier
1221          this.identifier = TypeConvertor.castToIdentifier(value); // Identifier
1222          return value;
1223        case 3373707: // name
1224          this.name = TypeConvertor.castToString(value); // StringType
1225          return value;
1226        case 1547124594: // residueSite
1227          this.residueSite = TypeConvertor.castToString(value); // StringType
1228          return value;
1229        default: return super.setProperty(hash, name, value);
1230        }
1231
1232      }
1233
1234      @Override
1235      public Base setProperty(String name, Base value) throws FHIRException {
1236        if (name.equals("identifier")) {
1237          this.identifier = TypeConvertor.castToIdentifier(value); // Identifier
1238        } else if (name.equals("name")) {
1239          this.name = TypeConvertor.castToString(value); // StringType
1240        } else if (name.equals("residueSite")) {
1241          this.residueSite = TypeConvertor.castToString(value); // StringType
1242        } else
1243          return super.setProperty(name, value);
1244        return value;
1245      }
1246
1247      @Override
1248      public Base makeProperty(int hash, String name) throws FHIRException {
1249        switch (hash) {
1250        case -1618432855:  return getIdentifier();
1251        case 3373707:  return getNameElement();
1252        case 1547124594:  return getResidueSiteElement();
1253        default: return super.makeProperty(hash, name);
1254        }
1255
1256      }
1257
1258      @Override
1259      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1260        switch (hash) {
1261        case -1618432855: /*identifier*/ return new String[] {"Identifier"};
1262        case 3373707: /*name*/ return new String[] {"string"};
1263        case 1547124594: /*residueSite*/ return new String[] {"string"};
1264        default: return super.getTypesForProperty(hash, name);
1265        }
1266
1267      }
1268
1269      @Override
1270      public Base addChild(String name) throws FHIRException {
1271        if (name.equals("identifier")) {
1272          this.identifier = new Identifier();
1273          return this.identifier;
1274        }
1275        else if (name.equals("name")) {
1276          throw new FHIRException("Cannot call addChild on a primitive type SubstanceNucleicAcid.subunit.sugar.name");
1277        }
1278        else if (name.equals("residueSite")) {
1279          throw new FHIRException("Cannot call addChild on a primitive type SubstanceNucleicAcid.subunit.sugar.residueSite");
1280        }
1281        else
1282          return super.addChild(name);
1283      }
1284
1285      public SubstanceNucleicAcidSubunitSugarComponent copy() {
1286        SubstanceNucleicAcidSubunitSugarComponent dst = new SubstanceNucleicAcidSubunitSugarComponent();
1287        copyValues(dst);
1288        return dst;
1289      }
1290
1291      public void copyValues(SubstanceNucleicAcidSubunitSugarComponent dst) {
1292        super.copyValues(dst);
1293        dst.identifier = identifier == null ? null : identifier.copy();
1294        dst.name = name == null ? null : name.copy();
1295        dst.residueSite = residueSite == null ? null : residueSite.copy();
1296      }
1297
1298      @Override
1299      public boolean equalsDeep(Base other_) {
1300        if (!super.equalsDeep(other_))
1301          return false;
1302        if (!(other_ instanceof SubstanceNucleicAcidSubunitSugarComponent))
1303          return false;
1304        SubstanceNucleicAcidSubunitSugarComponent o = (SubstanceNucleicAcidSubunitSugarComponent) other_;
1305        return compareDeep(identifier, o.identifier, true) && compareDeep(name, o.name, true) && compareDeep(residueSite, o.residueSite, true)
1306          ;
1307      }
1308
1309      @Override
1310      public boolean equalsShallow(Base other_) {
1311        if (!super.equalsShallow(other_))
1312          return false;
1313        if (!(other_ instanceof SubstanceNucleicAcidSubunitSugarComponent))
1314          return false;
1315        SubstanceNucleicAcidSubunitSugarComponent o = (SubstanceNucleicAcidSubunitSugarComponent) other_;
1316        return compareValues(name, o.name, true) && compareValues(residueSite, o.residueSite, true);
1317      }
1318
1319      public boolean isEmpty() {
1320        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(identifier, name, residueSite
1321          );
1322      }
1323
1324  public String fhirType() {
1325    return "SubstanceNucleicAcid.subunit.sugar";
1326
1327  }
1328
1329  }
1330
1331    /**
1332     * The type of the sequence shall be specified based on a controlled vocabulary.
1333     */
1334    @Child(name = "sequenceType", type = {CodeableConcept.class}, order=0, min=0, max=1, modifier=false, summary=true)
1335    @Description(shortDefinition="The type of the sequence shall be specified based on a controlled vocabulary", formalDefinition="The type of the sequence shall be specified based on a controlled vocabulary." )
1336    protected CodeableConcept sequenceType;
1337
1338    /**
1339     * The number of linear sequences of nucleotides linked through phosphodiester bonds shall be described. Subunits would be strands of nucleic acids that are tightly associated typically through Watson-Crick base pairing. NOTE: If not specified in the reference source, the assumption is that there is 1 subunit.
1340     */
1341    @Child(name = "numberOfSubunits", type = {IntegerType.class}, order=1, min=0, max=1, modifier=false, summary=true)
1342    @Description(shortDefinition="The number of linear sequences of nucleotides linked through phosphodiester bonds shall be described. Subunits would be strands of nucleic acids that are tightly associated typically through Watson-Crick base pairing. NOTE: If not specified in the reference source, the assumption is that there is 1 subunit", formalDefinition="The number of linear sequences of nucleotides linked through phosphodiester bonds shall be described. Subunits would be strands of nucleic acids that are tightly associated typically through Watson-Crick base pairing. NOTE: If not specified in the reference source, the assumption is that there is 1 subunit." )
1343    protected IntegerType numberOfSubunits;
1344
1345    /**
1346     * The area of hybridisation shall be described if applicable for double stranded RNA or DNA. The number associated with the subunit followed by the number associated to the residue shall be specified in increasing order. The underscore ?? shall be used as separator as follows: ?Subunitnumber Residue?.
1347     */
1348    @Child(name = "areaOfHybridisation", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=true)
1349    @Description(shortDefinition="The area of hybridisation shall be described if applicable for double stranded RNA or DNA. The number associated with the subunit followed by the number associated to the residue shall be specified in increasing order. The underscore ?? shall be used as separator as follows: ?Subunitnumber Residue?", formalDefinition="The area of hybridisation shall be described if applicable for double stranded RNA or DNA. The number associated with the subunit followed by the number associated to the residue shall be specified in increasing order. The underscore ?? shall be used as separator as follows: ?Subunitnumber Residue?." )
1350    protected StringType areaOfHybridisation;
1351
1352    /**
1353     * (TBC).
1354     */
1355    @Child(name = "oligoNucleotideType", type = {CodeableConcept.class}, order=3, min=0, max=1, modifier=false, summary=true)
1356    @Description(shortDefinition="(TBC)", formalDefinition="(TBC)." )
1357    protected CodeableConcept oligoNucleotideType;
1358
1359    /**
1360     * Subunits are listed in order of decreasing length; sequences of the same length will be ordered by molecular weight; subunits that have identical sequences will be repeated multiple times.
1361     */
1362    @Child(name = "subunit", type = {}, order=4, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
1363    @Description(shortDefinition="Subunits are listed in order of decreasing length; sequences of the same length will be ordered by molecular weight; subunits that have identical sequences will be repeated multiple times", formalDefinition="Subunits are listed in order of decreasing length; sequences of the same length will be ordered by molecular weight; subunits that have identical sequences will be repeated multiple times." )
1364    protected List<SubstanceNucleicAcidSubunitComponent> subunit;
1365
1366    private static final long serialVersionUID = -1906822433L;
1367
1368  /**
1369   * Constructor
1370   */
1371    public SubstanceNucleicAcid() {
1372      super();
1373    }
1374
1375    /**
1376     * @return {@link #sequenceType} (The type of the sequence shall be specified based on a controlled vocabulary.)
1377     */
1378    public CodeableConcept getSequenceType() { 
1379      if (this.sequenceType == null)
1380        if (Configuration.errorOnAutoCreate())
1381          throw new Error("Attempt to auto-create SubstanceNucleicAcid.sequenceType");
1382        else if (Configuration.doAutoCreate())
1383          this.sequenceType = new CodeableConcept(); // cc
1384      return this.sequenceType;
1385    }
1386
1387    public boolean hasSequenceType() { 
1388      return this.sequenceType != null && !this.sequenceType.isEmpty();
1389    }
1390
1391    /**
1392     * @param value {@link #sequenceType} (The type of the sequence shall be specified based on a controlled vocabulary.)
1393     */
1394    public SubstanceNucleicAcid setSequenceType(CodeableConcept value) { 
1395      this.sequenceType = value;
1396      return this;
1397    }
1398
1399    /**
1400     * @return {@link #numberOfSubunits} (The number of linear sequences of nucleotides linked through phosphodiester bonds shall be described. Subunits would be strands of nucleic acids that are tightly associated typically through Watson-Crick base pairing. NOTE: If not specified in the reference source, the assumption is that there is 1 subunit.). This is the underlying object with id, value and extensions. The accessor "getNumberOfSubunits" gives direct access to the value
1401     */
1402    public IntegerType getNumberOfSubunitsElement() { 
1403      if (this.numberOfSubunits == null)
1404        if (Configuration.errorOnAutoCreate())
1405          throw new Error("Attempt to auto-create SubstanceNucleicAcid.numberOfSubunits");
1406        else if (Configuration.doAutoCreate())
1407          this.numberOfSubunits = new IntegerType(); // bb
1408      return this.numberOfSubunits;
1409    }
1410
1411    public boolean hasNumberOfSubunitsElement() { 
1412      return this.numberOfSubunits != null && !this.numberOfSubunits.isEmpty();
1413    }
1414
1415    public boolean hasNumberOfSubunits() { 
1416      return this.numberOfSubunits != null && !this.numberOfSubunits.isEmpty();
1417    }
1418
1419    /**
1420     * @param value {@link #numberOfSubunits} (The number of linear sequences of nucleotides linked through phosphodiester bonds shall be described. Subunits would be strands of nucleic acids that are tightly associated typically through Watson-Crick base pairing. NOTE: If not specified in the reference source, the assumption is that there is 1 subunit.). This is the underlying object with id, value and extensions. The accessor "getNumberOfSubunits" gives direct access to the value
1421     */
1422    public SubstanceNucleicAcid setNumberOfSubunitsElement(IntegerType value) { 
1423      this.numberOfSubunits = value;
1424      return this;
1425    }
1426
1427    /**
1428     * @return The number of linear sequences of nucleotides linked through phosphodiester bonds shall be described. Subunits would be strands of nucleic acids that are tightly associated typically through Watson-Crick base pairing. NOTE: If not specified in the reference source, the assumption is that there is 1 subunit.
1429     */
1430    public int getNumberOfSubunits() { 
1431      return this.numberOfSubunits == null || this.numberOfSubunits.isEmpty() ? 0 : this.numberOfSubunits.getValue();
1432    }
1433
1434    /**
1435     * @param value The number of linear sequences of nucleotides linked through phosphodiester bonds shall be described. Subunits would be strands of nucleic acids that are tightly associated typically through Watson-Crick base pairing. NOTE: If not specified in the reference source, the assumption is that there is 1 subunit.
1436     */
1437    public SubstanceNucleicAcid setNumberOfSubunits(int value) { 
1438        if (this.numberOfSubunits == null)
1439          this.numberOfSubunits = new IntegerType();
1440        this.numberOfSubunits.setValue(value);
1441      return this;
1442    }
1443
1444    /**
1445     * @return {@link #areaOfHybridisation} (The area of hybridisation shall be described if applicable for double stranded RNA or DNA. The number associated with the subunit followed by the number associated to the residue shall be specified in increasing order. The underscore ?? shall be used as separator as follows: ?Subunitnumber Residue?.). This is the underlying object with id, value and extensions. The accessor "getAreaOfHybridisation" gives direct access to the value
1446     */
1447    public StringType getAreaOfHybridisationElement() { 
1448      if (this.areaOfHybridisation == null)
1449        if (Configuration.errorOnAutoCreate())
1450          throw new Error("Attempt to auto-create SubstanceNucleicAcid.areaOfHybridisation");
1451        else if (Configuration.doAutoCreate())
1452          this.areaOfHybridisation = new StringType(); // bb
1453      return this.areaOfHybridisation;
1454    }
1455
1456    public boolean hasAreaOfHybridisationElement() { 
1457      return this.areaOfHybridisation != null && !this.areaOfHybridisation.isEmpty();
1458    }
1459
1460    public boolean hasAreaOfHybridisation() { 
1461      return this.areaOfHybridisation != null && !this.areaOfHybridisation.isEmpty();
1462    }
1463
1464    /**
1465     * @param value {@link #areaOfHybridisation} (The area of hybridisation shall be described if applicable for double stranded RNA or DNA. The number associated with the subunit followed by the number associated to the residue shall be specified in increasing order. The underscore ?? shall be used as separator as follows: ?Subunitnumber Residue?.). This is the underlying object with id, value and extensions. The accessor "getAreaOfHybridisation" gives direct access to the value
1466     */
1467    public SubstanceNucleicAcid setAreaOfHybridisationElement(StringType value) { 
1468      this.areaOfHybridisation = value;
1469      return this;
1470    }
1471
1472    /**
1473     * @return The area of hybridisation shall be described if applicable for double stranded RNA or DNA. The number associated with the subunit followed by the number associated to the residue shall be specified in increasing order. The underscore ?? shall be used as separator as follows: ?Subunitnumber Residue?.
1474     */
1475    public String getAreaOfHybridisation() { 
1476      return this.areaOfHybridisation == null ? null : this.areaOfHybridisation.getValue();
1477    }
1478
1479    /**
1480     * @param value The area of hybridisation shall be described if applicable for double stranded RNA or DNA. The number associated with the subunit followed by the number associated to the residue shall be specified in increasing order. The underscore ?? shall be used as separator as follows: ?Subunitnumber Residue?.
1481     */
1482    public SubstanceNucleicAcid setAreaOfHybridisation(String value) { 
1483      if (Utilities.noString(value))
1484        this.areaOfHybridisation = null;
1485      else {
1486        if (this.areaOfHybridisation == null)
1487          this.areaOfHybridisation = new StringType();
1488        this.areaOfHybridisation.setValue(value);
1489      }
1490      return this;
1491    }
1492
1493    /**
1494     * @return {@link #oligoNucleotideType} ((TBC).)
1495     */
1496    public CodeableConcept getOligoNucleotideType() { 
1497      if (this.oligoNucleotideType == null)
1498        if (Configuration.errorOnAutoCreate())
1499          throw new Error("Attempt to auto-create SubstanceNucleicAcid.oligoNucleotideType");
1500        else if (Configuration.doAutoCreate())
1501          this.oligoNucleotideType = new CodeableConcept(); // cc
1502      return this.oligoNucleotideType;
1503    }
1504
1505    public boolean hasOligoNucleotideType() { 
1506      return this.oligoNucleotideType != null && !this.oligoNucleotideType.isEmpty();
1507    }
1508
1509    /**
1510     * @param value {@link #oligoNucleotideType} ((TBC).)
1511     */
1512    public SubstanceNucleicAcid setOligoNucleotideType(CodeableConcept value) { 
1513      this.oligoNucleotideType = value;
1514      return this;
1515    }
1516
1517    /**
1518     * @return {@link #subunit} (Subunits are listed in order of decreasing length; sequences of the same length will be ordered by molecular weight; subunits that have identical sequences will be repeated multiple times.)
1519     */
1520    public List<SubstanceNucleicAcidSubunitComponent> getSubunit() { 
1521      if (this.subunit == null)
1522        this.subunit = new ArrayList<SubstanceNucleicAcidSubunitComponent>();
1523      return this.subunit;
1524    }
1525
1526    /**
1527     * @return Returns a reference to <code>this</code> for easy method chaining
1528     */
1529    public SubstanceNucleicAcid setSubunit(List<SubstanceNucleicAcidSubunitComponent> theSubunit) { 
1530      this.subunit = theSubunit;
1531      return this;
1532    }
1533
1534    public boolean hasSubunit() { 
1535      if (this.subunit == null)
1536        return false;
1537      for (SubstanceNucleicAcidSubunitComponent item : this.subunit)
1538        if (!item.isEmpty())
1539          return true;
1540      return false;
1541    }
1542
1543    public SubstanceNucleicAcidSubunitComponent addSubunit() { //3
1544      SubstanceNucleicAcidSubunitComponent t = new SubstanceNucleicAcidSubunitComponent();
1545      if (this.subunit == null)
1546        this.subunit = new ArrayList<SubstanceNucleicAcidSubunitComponent>();
1547      this.subunit.add(t);
1548      return t;
1549    }
1550
1551    public SubstanceNucleicAcid addSubunit(SubstanceNucleicAcidSubunitComponent t) { //3
1552      if (t == null)
1553        return this;
1554      if (this.subunit == null)
1555        this.subunit = new ArrayList<SubstanceNucleicAcidSubunitComponent>();
1556      this.subunit.add(t);
1557      return this;
1558    }
1559
1560    /**
1561     * @return The first repetition of repeating field {@link #subunit}, creating it if it does not already exist {3}
1562     */
1563    public SubstanceNucleicAcidSubunitComponent getSubunitFirstRep() { 
1564      if (getSubunit().isEmpty()) {
1565        addSubunit();
1566      }
1567      return getSubunit().get(0);
1568    }
1569
1570      protected void listChildren(List<Property> children) {
1571        super.listChildren(children);
1572        children.add(new Property("sequenceType", "CodeableConcept", "The type of the sequence shall be specified based on a controlled vocabulary.", 0, 1, sequenceType));
1573        children.add(new Property("numberOfSubunits", "integer", "The number of linear sequences of nucleotides linked through phosphodiester bonds shall be described. Subunits would be strands of nucleic acids that are tightly associated typically through Watson-Crick base pairing. NOTE: If not specified in the reference source, the assumption is that there is 1 subunit.", 0, 1, numberOfSubunits));
1574        children.add(new Property("areaOfHybridisation", "string", "The area of hybridisation shall be described if applicable for double stranded RNA or DNA. The number associated with the subunit followed by the number associated to the residue shall be specified in increasing order. The underscore ?? shall be used as separator as follows: ?Subunitnumber Residue?.", 0, 1, areaOfHybridisation));
1575        children.add(new Property("oligoNucleotideType", "CodeableConcept", "(TBC).", 0, 1, oligoNucleotideType));
1576        children.add(new Property("subunit", "", "Subunits are listed in order of decreasing length; sequences of the same length will be ordered by molecular weight; subunits that have identical sequences will be repeated multiple times.", 0, java.lang.Integer.MAX_VALUE, subunit));
1577      }
1578
1579      @Override
1580      public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1581        switch (_hash) {
1582        case 807711387: /*sequenceType*/  return new Property("sequenceType", "CodeableConcept", "The type of the sequence shall be specified based on a controlled vocabulary.", 0, 1, sequenceType);
1583        case -847111089: /*numberOfSubunits*/  return new Property("numberOfSubunits", "integer", "The number of linear sequences of nucleotides linked through phosphodiester bonds shall be described. Subunits would be strands of nucleic acids that are tightly associated typically through Watson-Crick base pairing. NOTE: If not specified in the reference source, the assumption is that there is 1 subunit.", 0, 1, numberOfSubunits);
1584        case -617269845: /*areaOfHybridisation*/  return new Property("areaOfHybridisation", "string", "The area of hybridisation shall be described if applicable for double stranded RNA or DNA. The number associated with the subunit followed by the number associated to the residue shall be specified in increasing order. The underscore ?? shall be used as separator as follows: ?Subunitnumber Residue?.", 0, 1, areaOfHybridisation);
1585        case -1526251938: /*oligoNucleotideType*/  return new Property("oligoNucleotideType", "CodeableConcept", "(TBC).", 0, 1, oligoNucleotideType);
1586        case -1867548732: /*subunit*/  return new Property("subunit", "", "Subunits are listed in order of decreasing length; sequences of the same length will be ordered by molecular weight; subunits that have identical sequences will be repeated multiple times.", 0, java.lang.Integer.MAX_VALUE, subunit);
1587        default: return super.getNamedProperty(_hash, _name, _checkValid);
1588        }
1589
1590      }
1591
1592      @Override
1593      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1594        switch (hash) {
1595        case 807711387: /*sequenceType*/ return this.sequenceType == null ? new Base[0] : new Base[] {this.sequenceType}; // CodeableConcept
1596        case -847111089: /*numberOfSubunits*/ return this.numberOfSubunits == null ? new Base[0] : new Base[] {this.numberOfSubunits}; // IntegerType
1597        case -617269845: /*areaOfHybridisation*/ return this.areaOfHybridisation == null ? new Base[0] : new Base[] {this.areaOfHybridisation}; // StringType
1598        case -1526251938: /*oligoNucleotideType*/ return this.oligoNucleotideType == null ? new Base[0] : new Base[] {this.oligoNucleotideType}; // CodeableConcept
1599        case -1867548732: /*subunit*/ return this.subunit == null ? new Base[0] : this.subunit.toArray(new Base[this.subunit.size()]); // SubstanceNucleicAcidSubunitComponent
1600        default: return super.getProperty(hash, name, checkValid);
1601        }
1602
1603      }
1604
1605      @Override
1606      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1607        switch (hash) {
1608        case 807711387: // sequenceType
1609          this.sequenceType = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1610          return value;
1611        case -847111089: // numberOfSubunits
1612          this.numberOfSubunits = TypeConvertor.castToInteger(value); // IntegerType
1613          return value;
1614        case -617269845: // areaOfHybridisation
1615          this.areaOfHybridisation = TypeConvertor.castToString(value); // StringType
1616          return value;
1617        case -1526251938: // oligoNucleotideType
1618          this.oligoNucleotideType = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1619          return value;
1620        case -1867548732: // subunit
1621          this.getSubunit().add((SubstanceNucleicAcidSubunitComponent) value); // SubstanceNucleicAcidSubunitComponent
1622          return value;
1623        default: return super.setProperty(hash, name, value);
1624        }
1625
1626      }
1627
1628      @Override
1629      public Base setProperty(String name, Base value) throws FHIRException {
1630        if (name.equals("sequenceType")) {
1631          this.sequenceType = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1632        } else if (name.equals("numberOfSubunits")) {
1633          this.numberOfSubunits = TypeConvertor.castToInteger(value); // IntegerType
1634        } else if (name.equals("areaOfHybridisation")) {
1635          this.areaOfHybridisation = TypeConvertor.castToString(value); // StringType
1636        } else if (name.equals("oligoNucleotideType")) {
1637          this.oligoNucleotideType = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1638        } else if (name.equals("subunit")) {
1639          this.getSubunit().add((SubstanceNucleicAcidSubunitComponent) value);
1640        } else
1641          return super.setProperty(name, value);
1642        return value;
1643      }
1644
1645      @Override
1646      public Base makeProperty(int hash, String name) throws FHIRException {
1647        switch (hash) {
1648        case 807711387:  return getSequenceType();
1649        case -847111089:  return getNumberOfSubunitsElement();
1650        case -617269845:  return getAreaOfHybridisationElement();
1651        case -1526251938:  return getOligoNucleotideType();
1652        case -1867548732:  return addSubunit(); 
1653        default: return super.makeProperty(hash, name);
1654        }
1655
1656      }
1657
1658      @Override
1659      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1660        switch (hash) {
1661        case 807711387: /*sequenceType*/ return new String[] {"CodeableConcept"};
1662        case -847111089: /*numberOfSubunits*/ return new String[] {"integer"};
1663        case -617269845: /*areaOfHybridisation*/ return new String[] {"string"};
1664        case -1526251938: /*oligoNucleotideType*/ return new String[] {"CodeableConcept"};
1665        case -1867548732: /*subunit*/ return new String[] {};
1666        default: return super.getTypesForProperty(hash, name);
1667        }
1668
1669      }
1670
1671      @Override
1672      public Base addChild(String name) throws FHIRException {
1673        if (name.equals("sequenceType")) {
1674          this.sequenceType = new CodeableConcept();
1675          return this.sequenceType;
1676        }
1677        else if (name.equals("numberOfSubunits")) {
1678          throw new FHIRException("Cannot call addChild on a primitive type SubstanceNucleicAcid.numberOfSubunits");
1679        }
1680        else if (name.equals("areaOfHybridisation")) {
1681          throw new FHIRException("Cannot call addChild on a primitive type SubstanceNucleicAcid.areaOfHybridisation");
1682        }
1683        else if (name.equals("oligoNucleotideType")) {
1684          this.oligoNucleotideType = new CodeableConcept();
1685          return this.oligoNucleotideType;
1686        }
1687        else if (name.equals("subunit")) {
1688          return addSubunit();
1689        }
1690        else
1691          return super.addChild(name);
1692      }
1693
1694  public String fhirType() {
1695    return "SubstanceNucleicAcid";
1696
1697  }
1698
1699      public SubstanceNucleicAcid copy() {
1700        SubstanceNucleicAcid dst = new SubstanceNucleicAcid();
1701        copyValues(dst);
1702        return dst;
1703      }
1704
1705      public void copyValues(SubstanceNucleicAcid dst) {
1706        super.copyValues(dst);
1707        dst.sequenceType = sequenceType == null ? null : sequenceType.copy();
1708        dst.numberOfSubunits = numberOfSubunits == null ? null : numberOfSubunits.copy();
1709        dst.areaOfHybridisation = areaOfHybridisation == null ? null : areaOfHybridisation.copy();
1710        dst.oligoNucleotideType = oligoNucleotideType == null ? null : oligoNucleotideType.copy();
1711        if (subunit != null) {
1712          dst.subunit = new ArrayList<SubstanceNucleicAcidSubunitComponent>();
1713          for (SubstanceNucleicAcidSubunitComponent i : subunit)
1714            dst.subunit.add(i.copy());
1715        };
1716      }
1717
1718      protected SubstanceNucleicAcid typedCopy() {
1719        return copy();
1720      }
1721
1722      @Override
1723      public boolean equalsDeep(Base other_) {
1724        if (!super.equalsDeep(other_))
1725          return false;
1726        if (!(other_ instanceof SubstanceNucleicAcid))
1727          return false;
1728        SubstanceNucleicAcid o = (SubstanceNucleicAcid) other_;
1729        return compareDeep(sequenceType, o.sequenceType, true) && compareDeep(numberOfSubunits, o.numberOfSubunits, true)
1730           && compareDeep(areaOfHybridisation, o.areaOfHybridisation, true) && compareDeep(oligoNucleotideType, o.oligoNucleotideType, true)
1731           && compareDeep(subunit, o.subunit, true);
1732      }
1733
1734      @Override
1735      public boolean equalsShallow(Base other_) {
1736        if (!super.equalsShallow(other_))
1737          return false;
1738        if (!(other_ instanceof SubstanceNucleicAcid))
1739          return false;
1740        SubstanceNucleicAcid o = (SubstanceNucleicAcid) other_;
1741        return compareValues(numberOfSubunits, o.numberOfSubunits, true) && compareValues(areaOfHybridisation, o.areaOfHybridisation, true)
1742          ;
1743      }
1744
1745      public boolean isEmpty() {
1746        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequenceType, numberOfSubunits
1747          , areaOfHybridisation, oligoNucleotideType, subunit);
1748      }
1749
1750  @Override
1751  public ResourceType getResourceType() {
1752    return ResourceType.SubstanceNucleicAcid;
1753   }
1754
1755
1756}
1757