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 Tue, Dec 28, 2021 07:16+1100 for FHIR v5.0.0-snapshot1
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 * Properties of a substance specific to it being a polymer.
052 */
053@ResourceDef(name="SubstancePolymer", profile="http://hl7.org/fhir/StructureDefinition/SubstancePolymer")
054public class SubstancePolymer extends DomainResource {
055
056    @Block()
057    public static class SubstancePolymerMonomerSetComponent extends BackboneElement implements IBaseBackboneElement {
058        /**
059         * Captures the type of ratio to the entire polymer, e.g. Monomer/Polymer ratio, SRU/Polymer Ratio.
060         */
061        @Child(name = "ratioType", type = {CodeableConcept.class}, order=1, min=0, max=1, modifier=false, summary=true)
062        @Description(shortDefinition="Captures the type of ratio to the entire polymer, e.g. Monomer/Polymer ratio, SRU/Polymer Ratio", formalDefinition="Captures the type of ratio to the entire polymer, e.g. Monomer/Polymer ratio, SRU/Polymer Ratio." )
063        protected CodeableConcept ratioType;
064
065        /**
066         * The starting materials - monomer(s) used in the synthesis of the polymer.
067         */
068        @Child(name = "startingMaterial", type = {}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
069        @Description(shortDefinition="The starting materials - monomer(s) used in the synthesis of the polymer", formalDefinition="The starting materials - monomer(s) used in the synthesis of the polymer." )
070        protected List<SubstancePolymerMonomerSetStartingMaterialComponent> startingMaterial;
071
072        private static final long serialVersionUID = -933825014L;
073
074    /**
075     * Constructor
076     */
077      public SubstancePolymerMonomerSetComponent() {
078        super();
079      }
080
081        /**
082         * @return {@link #ratioType} (Captures the type of ratio to the entire polymer, e.g. Monomer/Polymer ratio, SRU/Polymer Ratio.)
083         */
084        public CodeableConcept getRatioType() { 
085          if (this.ratioType == null)
086            if (Configuration.errorOnAutoCreate())
087              throw new Error("Attempt to auto-create SubstancePolymerMonomerSetComponent.ratioType");
088            else if (Configuration.doAutoCreate())
089              this.ratioType = new CodeableConcept(); // cc
090          return this.ratioType;
091        }
092
093        public boolean hasRatioType() { 
094          return this.ratioType != null && !this.ratioType.isEmpty();
095        }
096
097        /**
098         * @param value {@link #ratioType} (Captures the type of ratio to the entire polymer, e.g. Monomer/Polymer ratio, SRU/Polymer Ratio.)
099         */
100        public SubstancePolymerMonomerSetComponent setRatioType(CodeableConcept value) { 
101          this.ratioType = value;
102          return this;
103        }
104
105        /**
106         * @return {@link #startingMaterial} (The starting materials - monomer(s) used in the synthesis of the polymer.)
107         */
108        public List<SubstancePolymerMonomerSetStartingMaterialComponent> getStartingMaterial() { 
109          if (this.startingMaterial == null)
110            this.startingMaterial = new ArrayList<SubstancePolymerMonomerSetStartingMaterialComponent>();
111          return this.startingMaterial;
112        }
113
114        /**
115         * @return Returns a reference to <code>this</code> for easy method chaining
116         */
117        public SubstancePolymerMonomerSetComponent setStartingMaterial(List<SubstancePolymerMonomerSetStartingMaterialComponent> theStartingMaterial) { 
118          this.startingMaterial = theStartingMaterial;
119          return this;
120        }
121
122        public boolean hasStartingMaterial() { 
123          if (this.startingMaterial == null)
124            return false;
125          for (SubstancePolymerMonomerSetStartingMaterialComponent item : this.startingMaterial)
126            if (!item.isEmpty())
127              return true;
128          return false;
129        }
130
131        public SubstancePolymerMonomerSetStartingMaterialComponent addStartingMaterial() { //3
132          SubstancePolymerMonomerSetStartingMaterialComponent t = new SubstancePolymerMonomerSetStartingMaterialComponent();
133          if (this.startingMaterial == null)
134            this.startingMaterial = new ArrayList<SubstancePolymerMonomerSetStartingMaterialComponent>();
135          this.startingMaterial.add(t);
136          return t;
137        }
138
139        public SubstancePolymerMonomerSetComponent addStartingMaterial(SubstancePolymerMonomerSetStartingMaterialComponent t) { //3
140          if (t == null)
141            return this;
142          if (this.startingMaterial == null)
143            this.startingMaterial = new ArrayList<SubstancePolymerMonomerSetStartingMaterialComponent>();
144          this.startingMaterial.add(t);
145          return this;
146        }
147
148        /**
149         * @return The first repetition of repeating field {@link #startingMaterial}, creating it if it does not already exist {3}
150         */
151        public SubstancePolymerMonomerSetStartingMaterialComponent getStartingMaterialFirstRep() { 
152          if (getStartingMaterial().isEmpty()) {
153            addStartingMaterial();
154          }
155          return getStartingMaterial().get(0);
156        }
157
158        protected void listChildren(List<Property> children) {
159          super.listChildren(children);
160          children.add(new Property("ratioType", "CodeableConcept", "Captures the type of ratio to the entire polymer, e.g. Monomer/Polymer ratio, SRU/Polymer Ratio.", 0, 1, ratioType));
161          children.add(new Property("startingMaterial", "", "The starting materials - monomer(s) used in the synthesis of the polymer.", 0, java.lang.Integer.MAX_VALUE, startingMaterial));
162        }
163
164        @Override
165        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
166          switch (_hash) {
167          case 344937957: /*ratioType*/  return new Property("ratioType", "CodeableConcept", "Captures the type of ratio to the entire polymer, e.g. Monomer/Polymer ratio, SRU/Polymer Ratio.", 0, 1, ratioType);
168          case 442919303: /*startingMaterial*/  return new Property("startingMaterial", "", "The starting materials - monomer(s) used in the synthesis of the polymer.", 0, java.lang.Integer.MAX_VALUE, startingMaterial);
169          default: return super.getNamedProperty(_hash, _name, _checkValid);
170          }
171
172        }
173
174      @Override
175      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
176        switch (hash) {
177        case 344937957: /*ratioType*/ return this.ratioType == null ? new Base[0] : new Base[] {this.ratioType}; // CodeableConcept
178        case 442919303: /*startingMaterial*/ return this.startingMaterial == null ? new Base[0] : this.startingMaterial.toArray(new Base[this.startingMaterial.size()]); // SubstancePolymerMonomerSetStartingMaterialComponent
179        default: return super.getProperty(hash, name, checkValid);
180        }
181
182      }
183
184      @Override
185      public Base setProperty(int hash, String name, Base value) throws FHIRException {
186        switch (hash) {
187        case 344937957: // ratioType
188          this.ratioType = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
189          return value;
190        case 442919303: // startingMaterial
191          this.getStartingMaterial().add((SubstancePolymerMonomerSetStartingMaterialComponent) value); // SubstancePolymerMonomerSetStartingMaterialComponent
192          return value;
193        default: return super.setProperty(hash, name, value);
194        }
195
196      }
197
198      @Override
199      public Base setProperty(String name, Base value) throws FHIRException {
200        if (name.equals("ratioType")) {
201          this.ratioType = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
202        } else if (name.equals("startingMaterial")) {
203          this.getStartingMaterial().add((SubstancePolymerMonomerSetStartingMaterialComponent) value);
204        } else
205          return super.setProperty(name, value);
206        return value;
207      }
208
209      @Override
210      public Base makeProperty(int hash, String name) throws FHIRException {
211        switch (hash) {
212        case 344937957:  return getRatioType();
213        case 442919303:  return addStartingMaterial(); 
214        default: return super.makeProperty(hash, name);
215        }
216
217      }
218
219      @Override
220      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
221        switch (hash) {
222        case 344937957: /*ratioType*/ return new String[] {"CodeableConcept"};
223        case 442919303: /*startingMaterial*/ return new String[] {};
224        default: return super.getTypesForProperty(hash, name);
225        }
226
227      }
228
229      @Override
230      public Base addChild(String name) throws FHIRException {
231        if (name.equals("ratioType")) {
232          this.ratioType = new CodeableConcept();
233          return this.ratioType;
234        }
235        else if (name.equals("startingMaterial")) {
236          return addStartingMaterial();
237        }
238        else
239          return super.addChild(name);
240      }
241
242      public SubstancePolymerMonomerSetComponent copy() {
243        SubstancePolymerMonomerSetComponent dst = new SubstancePolymerMonomerSetComponent();
244        copyValues(dst);
245        return dst;
246      }
247
248      public void copyValues(SubstancePolymerMonomerSetComponent dst) {
249        super.copyValues(dst);
250        dst.ratioType = ratioType == null ? null : ratioType.copy();
251        if (startingMaterial != null) {
252          dst.startingMaterial = new ArrayList<SubstancePolymerMonomerSetStartingMaterialComponent>();
253          for (SubstancePolymerMonomerSetStartingMaterialComponent i : startingMaterial)
254            dst.startingMaterial.add(i.copy());
255        };
256      }
257
258      @Override
259      public boolean equalsDeep(Base other_) {
260        if (!super.equalsDeep(other_))
261          return false;
262        if (!(other_ instanceof SubstancePolymerMonomerSetComponent))
263          return false;
264        SubstancePolymerMonomerSetComponent o = (SubstancePolymerMonomerSetComponent) other_;
265        return compareDeep(ratioType, o.ratioType, true) && compareDeep(startingMaterial, o.startingMaterial, true)
266          ;
267      }
268
269      @Override
270      public boolean equalsShallow(Base other_) {
271        if (!super.equalsShallow(other_))
272          return false;
273        if (!(other_ instanceof SubstancePolymerMonomerSetComponent))
274          return false;
275        SubstancePolymerMonomerSetComponent o = (SubstancePolymerMonomerSetComponent) other_;
276        return true;
277      }
278
279      public boolean isEmpty() {
280        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(ratioType, startingMaterial
281          );
282      }
283
284  public String fhirType() {
285    return "SubstancePolymer.monomerSet";
286
287  }
288
289  }
290
291    @Block()
292    public static class SubstancePolymerMonomerSetStartingMaterialComponent extends BackboneElement implements IBaseBackboneElement {
293        /**
294         * The type of substance for this starting material.
295         */
296        @Child(name = "code", type = {CodeableConcept.class}, order=1, min=0, max=1, modifier=false, summary=true)
297        @Description(shortDefinition="The type of substance for this starting material", formalDefinition="The type of substance for this starting material." )
298        protected CodeableConcept code;
299
300        /**
301         * Substance high level category, e.g. chemical substance.
302         */
303        @Child(name = "category", type = {CodeableConcept.class}, order=2, min=0, max=1, modifier=false, summary=true)
304        @Description(shortDefinition="Substance high level category, e.g. chemical substance", formalDefinition="Substance high level category, e.g. chemical substance." )
305        protected CodeableConcept category;
306
307        /**
308         * Used to specify whether the attribute described is a defining element for the unique identification of the polymer.
309         */
310        @Child(name = "isDefining", type = {BooleanType.class}, order=3, min=0, max=1, modifier=false, summary=true)
311        @Description(shortDefinition="Used to specify whether the attribute described is a defining element for the unique identification of the polymer", formalDefinition="Used to specify whether the attribute described is a defining element for the unique identification of the polymer." )
312        protected BooleanType isDefining;
313
314        /**
315         * A percentage.
316         */
317        @Child(name = "amount", type = {Quantity.class}, order=4, min=0, max=1, modifier=false, summary=true)
318        @Description(shortDefinition="A percentage", formalDefinition="A percentage." )
319        protected Quantity amount;
320
321        private static final long serialVersionUID = -1199515148L;
322
323    /**
324     * Constructor
325     */
326      public SubstancePolymerMonomerSetStartingMaterialComponent() {
327        super();
328      }
329
330        /**
331         * @return {@link #code} (The type of substance for this starting material.)
332         */
333        public CodeableConcept getCode() { 
334          if (this.code == null)
335            if (Configuration.errorOnAutoCreate())
336              throw new Error("Attempt to auto-create SubstancePolymerMonomerSetStartingMaterialComponent.code");
337            else if (Configuration.doAutoCreate())
338              this.code = new CodeableConcept(); // cc
339          return this.code;
340        }
341
342        public boolean hasCode() { 
343          return this.code != null && !this.code.isEmpty();
344        }
345
346        /**
347         * @param value {@link #code} (The type of substance for this starting material.)
348         */
349        public SubstancePolymerMonomerSetStartingMaterialComponent setCode(CodeableConcept value) { 
350          this.code = value;
351          return this;
352        }
353
354        /**
355         * @return {@link #category} (Substance high level category, e.g. chemical substance.)
356         */
357        public CodeableConcept getCategory() { 
358          if (this.category == null)
359            if (Configuration.errorOnAutoCreate())
360              throw new Error("Attempt to auto-create SubstancePolymerMonomerSetStartingMaterialComponent.category");
361            else if (Configuration.doAutoCreate())
362              this.category = new CodeableConcept(); // cc
363          return this.category;
364        }
365
366        public boolean hasCategory() { 
367          return this.category != null && !this.category.isEmpty();
368        }
369
370        /**
371         * @param value {@link #category} (Substance high level category, e.g. chemical substance.)
372         */
373        public SubstancePolymerMonomerSetStartingMaterialComponent setCategory(CodeableConcept value) { 
374          this.category = value;
375          return this;
376        }
377
378        /**
379         * @return {@link #isDefining} (Used to specify whether the attribute described is a defining element for the unique identification of the polymer.). This is the underlying object with id, value and extensions. The accessor "getIsDefining" gives direct access to the value
380         */
381        public BooleanType getIsDefiningElement() { 
382          if (this.isDefining == null)
383            if (Configuration.errorOnAutoCreate())
384              throw new Error("Attempt to auto-create SubstancePolymerMonomerSetStartingMaterialComponent.isDefining");
385            else if (Configuration.doAutoCreate())
386              this.isDefining = new BooleanType(); // bb
387          return this.isDefining;
388        }
389
390        public boolean hasIsDefiningElement() { 
391          return this.isDefining != null && !this.isDefining.isEmpty();
392        }
393
394        public boolean hasIsDefining() { 
395          return this.isDefining != null && !this.isDefining.isEmpty();
396        }
397
398        /**
399         * @param value {@link #isDefining} (Used to specify whether the attribute described is a defining element for the unique identification of the polymer.). This is the underlying object with id, value and extensions. The accessor "getIsDefining" gives direct access to the value
400         */
401        public SubstancePolymerMonomerSetStartingMaterialComponent setIsDefiningElement(BooleanType value) { 
402          this.isDefining = value;
403          return this;
404        }
405
406        /**
407         * @return Used to specify whether the attribute described is a defining element for the unique identification of the polymer.
408         */
409        public boolean getIsDefining() { 
410          return this.isDefining == null || this.isDefining.isEmpty() ? false : this.isDefining.getValue();
411        }
412
413        /**
414         * @param value Used to specify whether the attribute described is a defining element for the unique identification of the polymer.
415         */
416        public SubstancePolymerMonomerSetStartingMaterialComponent setIsDefining(boolean value) { 
417            if (this.isDefining == null)
418              this.isDefining = new BooleanType();
419            this.isDefining.setValue(value);
420          return this;
421        }
422
423        /**
424         * @return {@link #amount} (A percentage.)
425         */
426        public Quantity getAmount() { 
427          if (this.amount == null)
428            if (Configuration.errorOnAutoCreate())
429              throw new Error("Attempt to auto-create SubstancePolymerMonomerSetStartingMaterialComponent.amount");
430            else if (Configuration.doAutoCreate())
431              this.amount = new Quantity(); // cc
432          return this.amount;
433        }
434
435        public boolean hasAmount() { 
436          return this.amount != null && !this.amount.isEmpty();
437        }
438
439        /**
440         * @param value {@link #amount} (A percentage.)
441         */
442        public SubstancePolymerMonomerSetStartingMaterialComponent setAmount(Quantity value) { 
443          this.amount = value;
444          return this;
445        }
446
447        protected void listChildren(List<Property> children) {
448          super.listChildren(children);
449          children.add(new Property("code", "CodeableConcept", "The type of substance for this starting material.", 0, 1, code));
450          children.add(new Property("category", "CodeableConcept", "Substance high level category, e.g. chemical substance.", 0, 1, category));
451          children.add(new Property("isDefining", "boolean", "Used to specify whether the attribute described is a defining element for the unique identification of the polymer.", 0, 1, isDefining));
452          children.add(new Property("amount", "Quantity", "A percentage.", 0, 1, amount));
453        }
454
455        @Override
456        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
457          switch (_hash) {
458          case 3059181: /*code*/  return new Property("code", "CodeableConcept", "The type of substance for this starting material.", 0, 1, code);
459          case 50511102: /*category*/  return new Property("category", "CodeableConcept", "Substance high level category, e.g. chemical substance.", 0, 1, category);
460          case -141812990: /*isDefining*/  return new Property("isDefining", "boolean", "Used to specify whether the attribute described is a defining element for the unique identification of the polymer.", 0, 1, isDefining);
461          case -1413853096: /*amount*/  return new Property("amount", "Quantity", "A percentage.", 0, 1, amount);
462          default: return super.getNamedProperty(_hash, _name, _checkValid);
463          }
464
465        }
466
467      @Override
468      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
469        switch (hash) {
470        case 3059181: /*code*/ return this.code == null ? new Base[0] : new Base[] {this.code}; // CodeableConcept
471        case 50511102: /*category*/ return this.category == null ? new Base[0] : new Base[] {this.category}; // CodeableConcept
472        case -141812990: /*isDefining*/ return this.isDefining == null ? new Base[0] : new Base[] {this.isDefining}; // BooleanType
473        case -1413853096: /*amount*/ return this.amount == null ? new Base[0] : new Base[] {this.amount}; // Quantity
474        default: return super.getProperty(hash, name, checkValid);
475        }
476
477      }
478
479      @Override
480      public Base setProperty(int hash, String name, Base value) throws FHIRException {
481        switch (hash) {
482        case 3059181: // code
483          this.code = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
484          return value;
485        case 50511102: // category
486          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
487          return value;
488        case -141812990: // isDefining
489          this.isDefining = TypeConvertor.castToBoolean(value); // BooleanType
490          return value;
491        case -1413853096: // amount
492          this.amount = TypeConvertor.castToQuantity(value); // Quantity
493          return value;
494        default: return super.setProperty(hash, name, value);
495        }
496
497      }
498
499      @Override
500      public Base setProperty(String name, Base value) throws FHIRException {
501        if (name.equals("code")) {
502          this.code = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
503        } else if (name.equals("category")) {
504          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
505        } else if (name.equals("isDefining")) {
506          this.isDefining = TypeConvertor.castToBoolean(value); // BooleanType
507        } else if (name.equals("amount")) {
508          this.amount = TypeConvertor.castToQuantity(value); // Quantity
509        } else
510          return super.setProperty(name, value);
511        return value;
512      }
513
514      @Override
515      public Base makeProperty(int hash, String name) throws FHIRException {
516        switch (hash) {
517        case 3059181:  return getCode();
518        case 50511102:  return getCategory();
519        case -141812990:  return getIsDefiningElement();
520        case -1413853096:  return getAmount();
521        default: return super.makeProperty(hash, name);
522        }
523
524      }
525
526      @Override
527      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
528        switch (hash) {
529        case 3059181: /*code*/ return new String[] {"CodeableConcept"};
530        case 50511102: /*category*/ return new String[] {"CodeableConcept"};
531        case -141812990: /*isDefining*/ return new String[] {"boolean"};
532        case -1413853096: /*amount*/ return new String[] {"Quantity"};
533        default: return super.getTypesForProperty(hash, name);
534        }
535
536      }
537
538      @Override
539      public Base addChild(String name) throws FHIRException {
540        if (name.equals("code")) {
541          this.code = new CodeableConcept();
542          return this.code;
543        }
544        else if (name.equals("category")) {
545          this.category = new CodeableConcept();
546          return this.category;
547        }
548        else if (name.equals("isDefining")) {
549          throw new FHIRException("Cannot call addChild on a primitive type SubstancePolymer.monomerSet.startingMaterial.isDefining");
550        }
551        else if (name.equals("amount")) {
552          this.amount = new Quantity();
553          return this.amount;
554        }
555        else
556          return super.addChild(name);
557      }
558
559      public SubstancePolymerMonomerSetStartingMaterialComponent copy() {
560        SubstancePolymerMonomerSetStartingMaterialComponent dst = new SubstancePolymerMonomerSetStartingMaterialComponent();
561        copyValues(dst);
562        return dst;
563      }
564
565      public void copyValues(SubstancePolymerMonomerSetStartingMaterialComponent dst) {
566        super.copyValues(dst);
567        dst.code = code == null ? null : code.copy();
568        dst.category = category == null ? null : category.copy();
569        dst.isDefining = isDefining == null ? null : isDefining.copy();
570        dst.amount = amount == null ? null : amount.copy();
571      }
572
573      @Override
574      public boolean equalsDeep(Base other_) {
575        if (!super.equalsDeep(other_))
576          return false;
577        if (!(other_ instanceof SubstancePolymerMonomerSetStartingMaterialComponent))
578          return false;
579        SubstancePolymerMonomerSetStartingMaterialComponent o = (SubstancePolymerMonomerSetStartingMaterialComponent) other_;
580        return compareDeep(code, o.code, true) && compareDeep(category, o.category, true) && compareDeep(isDefining, o.isDefining, true)
581           && compareDeep(amount, o.amount, true);
582      }
583
584      @Override
585      public boolean equalsShallow(Base other_) {
586        if (!super.equalsShallow(other_))
587          return false;
588        if (!(other_ instanceof SubstancePolymerMonomerSetStartingMaterialComponent))
589          return false;
590        SubstancePolymerMonomerSetStartingMaterialComponent o = (SubstancePolymerMonomerSetStartingMaterialComponent) other_;
591        return compareValues(isDefining, o.isDefining, true);
592      }
593
594      public boolean isEmpty() {
595        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(code, category, isDefining
596          , amount);
597      }
598
599  public String fhirType() {
600    return "SubstancePolymer.monomerSet.startingMaterial";
601
602  }
603
604  }
605
606    @Block()
607    public static class SubstancePolymerRepeatComponent extends BackboneElement implements IBaseBackboneElement {
608        /**
609         * A representation of an (average) molecular formula from a polymer.
610         */
611        @Child(name = "averageMolecularFormula", type = {StringType.class}, order=1, min=0, max=1, modifier=false, summary=true)
612        @Description(shortDefinition="A representation of an (average) molecular formula from a polymer", formalDefinition="A representation of an (average) molecular formula from a polymer." )
613        protected StringType averageMolecularFormula;
614
615        /**
616         * How the quantitative amount of Structural Repeat Units is captured (e.g. Exact, Numeric, Average).
617         */
618        @Child(name = "repeatUnitAmountType", type = {CodeableConcept.class}, order=2, min=0, max=1, modifier=false, summary=true)
619        @Description(shortDefinition="How the quantitative amount of Structural Repeat Units is captured (e.g. Exact, Numeric, Average)", formalDefinition="How the quantitative amount of Structural Repeat Units is captured (e.g. Exact, Numeric, Average)." )
620        protected CodeableConcept repeatUnitAmountType;
621
622        /**
623         * An SRU - Structural Repeat Unit.
624         */
625        @Child(name = "repeatUnit", type = {}, order=3, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
626        @Description(shortDefinition="An SRU - Structural Repeat Unit", formalDefinition="An SRU - Structural Repeat Unit." )
627        protected List<SubstancePolymerRepeatRepeatUnitComponent> repeatUnit;
628
629        private static final long serialVersionUID = -366644176L;
630
631    /**
632     * Constructor
633     */
634      public SubstancePolymerRepeatComponent() {
635        super();
636      }
637
638        /**
639         * @return {@link #averageMolecularFormula} (A representation of an (average) molecular formula from a polymer.). This is the underlying object with id, value and extensions. The accessor "getAverageMolecularFormula" gives direct access to the value
640         */
641        public StringType getAverageMolecularFormulaElement() { 
642          if (this.averageMolecularFormula == null)
643            if (Configuration.errorOnAutoCreate())
644              throw new Error("Attempt to auto-create SubstancePolymerRepeatComponent.averageMolecularFormula");
645            else if (Configuration.doAutoCreate())
646              this.averageMolecularFormula = new StringType(); // bb
647          return this.averageMolecularFormula;
648        }
649
650        public boolean hasAverageMolecularFormulaElement() { 
651          return this.averageMolecularFormula != null && !this.averageMolecularFormula.isEmpty();
652        }
653
654        public boolean hasAverageMolecularFormula() { 
655          return this.averageMolecularFormula != null && !this.averageMolecularFormula.isEmpty();
656        }
657
658        /**
659         * @param value {@link #averageMolecularFormula} (A representation of an (average) molecular formula from a polymer.). This is the underlying object with id, value and extensions. The accessor "getAverageMolecularFormula" gives direct access to the value
660         */
661        public SubstancePolymerRepeatComponent setAverageMolecularFormulaElement(StringType value) { 
662          this.averageMolecularFormula = value;
663          return this;
664        }
665
666        /**
667         * @return A representation of an (average) molecular formula from a polymer.
668         */
669        public String getAverageMolecularFormula() { 
670          return this.averageMolecularFormula == null ? null : this.averageMolecularFormula.getValue();
671        }
672
673        /**
674         * @param value A representation of an (average) molecular formula from a polymer.
675         */
676        public SubstancePolymerRepeatComponent setAverageMolecularFormula(String value) { 
677          if (Utilities.noString(value))
678            this.averageMolecularFormula = null;
679          else {
680            if (this.averageMolecularFormula == null)
681              this.averageMolecularFormula = new StringType();
682            this.averageMolecularFormula.setValue(value);
683          }
684          return this;
685        }
686
687        /**
688         * @return {@link #repeatUnitAmountType} (How the quantitative amount of Structural Repeat Units is captured (e.g. Exact, Numeric, Average).)
689         */
690        public CodeableConcept getRepeatUnitAmountType() { 
691          if (this.repeatUnitAmountType == null)
692            if (Configuration.errorOnAutoCreate())
693              throw new Error("Attempt to auto-create SubstancePolymerRepeatComponent.repeatUnitAmountType");
694            else if (Configuration.doAutoCreate())
695              this.repeatUnitAmountType = new CodeableConcept(); // cc
696          return this.repeatUnitAmountType;
697        }
698
699        public boolean hasRepeatUnitAmountType() { 
700          return this.repeatUnitAmountType != null && !this.repeatUnitAmountType.isEmpty();
701        }
702
703        /**
704         * @param value {@link #repeatUnitAmountType} (How the quantitative amount of Structural Repeat Units is captured (e.g. Exact, Numeric, Average).)
705         */
706        public SubstancePolymerRepeatComponent setRepeatUnitAmountType(CodeableConcept value) { 
707          this.repeatUnitAmountType = value;
708          return this;
709        }
710
711        /**
712         * @return {@link #repeatUnit} (An SRU - Structural Repeat Unit.)
713         */
714        public List<SubstancePolymerRepeatRepeatUnitComponent> getRepeatUnit() { 
715          if (this.repeatUnit == null)
716            this.repeatUnit = new ArrayList<SubstancePolymerRepeatRepeatUnitComponent>();
717          return this.repeatUnit;
718        }
719
720        /**
721         * @return Returns a reference to <code>this</code> for easy method chaining
722         */
723        public SubstancePolymerRepeatComponent setRepeatUnit(List<SubstancePolymerRepeatRepeatUnitComponent> theRepeatUnit) { 
724          this.repeatUnit = theRepeatUnit;
725          return this;
726        }
727
728        public boolean hasRepeatUnit() { 
729          if (this.repeatUnit == null)
730            return false;
731          for (SubstancePolymerRepeatRepeatUnitComponent item : this.repeatUnit)
732            if (!item.isEmpty())
733              return true;
734          return false;
735        }
736
737        public SubstancePolymerRepeatRepeatUnitComponent addRepeatUnit() { //3
738          SubstancePolymerRepeatRepeatUnitComponent t = new SubstancePolymerRepeatRepeatUnitComponent();
739          if (this.repeatUnit == null)
740            this.repeatUnit = new ArrayList<SubstancePolymerRepeatRepeatUnitComponent>();
741          this.repeatUnit.add(t);
742          return t;
743        }
744
745        public SubstancePolymerRepeatComponent addRepeatUnit(SubstancePolymerRepeatRepeatUnitComponent t) { //3
746          if (t == null)
747            return this;
748          if (this.repeatUnit == null)
749            this.repeatUnit = new ArrayList<SubstancePolymerRepeatRepeatUnitComponent>();
750          this.repeatUnit.add(t);
751          return this;
752        }
753
754        /**
755         * @return The first repetition of repeating field {@link #repeatUnit}, creating it if it does not already exist {3}
756         */
757        public SubstancePolymerRepeatRepeatUnitComponent getRepeatUnitFirstRep() { 
758          if (getRepeatUnit().isEmpty()) {
759            addRepeatUnit();
760          }
761          return getRepeatUnit().get(0);
762        }
763
764        protected void listChildren(List<Property> children) {
765          super.listChildren(children);
766          children.add(new Property("averageMolecularFormula", "string", "A representation of an (average) molecular formula from a polymer.", 0, 1, averageMolecularFormula));
767          children.add(new Property("repeatUnitAmountType", "CodeableConcept", "How the quantitative amount of Structural Repeat Units is captured (e.g. Exact, Numeric, Average).", 0, 1, repeatUnitAmountType));
768          children.add(new Property("repeatUnit", "", "An SRU - Structural Repeat Unit.", 0, java.lang.Integer.MAX_VALUE, repeatUnit));
769        }
770
771        @Override
772        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
773          switch (_hash) {
774          case 111461715: /*averageMolecularFormula*/  return new Property("averageMolecularFormula", "string", "A representation of an (average) molecular formula from a polymer.", 0, 1, averageMolecularFormula);
775          case -1994025263: /*repeatUnitAmountType*/  return new Property("repeatUnitAmountType", "CodeableConcept", "How the quantitative amount of Structural Repeat Units is captured (e.g. Exact, Numeric, Average).", 0, 1, repeatUnitAmountType);
776          case 1159607743: /*repeatUnit*/  return new Property("repeatUnit", "", "An SRU - Structural Repeat Unit.", 0, java.lang.Integer.MAX_VALUE, repeatUnit);
777          default: return super.getNamedProperty(_hash, _name, _checkValid);
778          }
779
780        }
781
782      @Override
783      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
784        switch (hash) {
785        case 111461715: /*averageMolecularFormula*/ return this.averageMolecularFormula == null ? new Base[0] : new Base[] {this.averageMolecularFormula}; // StringType
786        case -1994025263: /*repeatUnitAmountType*/ return this.repeatUnitAmountType == null ? new Base[0] : new Base[] {this.repeatUnitAmountType}; // CodeableConcept
787        case 1159607743: /*repeatUnit*/ return this.repeatUnit == null ? new Base[0] : this.repeatUnit.toArray(new Base[this.repeatUnit.size()]); // SubstancePolymerRepeatRepeatUnitComponent
788        default: return super.getProperty(hash, name, checkValid);
789        }
790
791      }
792
793      @Override
794      public Base setProperty(int hash, String name, Base value) throws FHIRException {
795        switch (hash) {
796        case 111461715: // averageMolecularFormula
797          this.averageMolecularFormula = TypeConvertor.castToString(value); // StringType
798          return value;
799        case -1994025263: // repeatUnitAmountType
800          this.repeatUnitAmountType = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
801          return value;
802        case 1159607743: // repeatUnit
803          this.getRepeatUnit().add((SubstancePolymerRepeatRepeatUnitComponent) value); // SubstancePolymerRepeatRepeatUnitComponent
804          return value;
805        default: return super.setProperty(hash, name, value);
806        }
807
808      }
809
810      @Override
811      public Base setProperty(String name, Base value) throws FHIRException {
812        if (name.equals("averageMolecularFormula")) {
813          this.averageMolecularFormula = TypeConvertor.castToString(value); // StringType
814        } else if (name.equals("repeatUnitAmountType")) {
815          this.repeatUnitAmountType = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
816        } else if (name.equals("repeatUnit")) {
817          this.getRepeatUnit().add((SubstancePolymerRepeatRepeatUnitComponent) value);
818        } else
819          return super.setProperty(name, value);
820        return value;
821      }
822
823      @Override
824      public Base makeProperty(int hash, String name) throws FHIRException {
825        switch (hash) {
826        case 111461715:  return getAverageMolecularFormulaElement();
827        case -1994025263:  return getRepeatUnitAmountType();
828        case 1159607743:  return addRepeatUnit(); 
829        default: return super.makeProperty(hash, name);
830        }
831
832      }
833
834      @Override
835      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
836        switch (hash) {
837        case 111461715: /*averageMolecularFormula*/ return new String[] {"string"};
838        case -1994025263: /*repeatUnitAmountType*/ return new String[] {"CodeableConcept"};
839        case 1159607743: /*repeatUnit*/ return new String[] {};
840        default: return super.getTypesForProperty(hash, name);
841        }
842
843      }
844
845      @Override
846      public Base addChild(String name) throws FHIRException {
847        if (name.equals("averageMolecularFormula")) {
848          throw new FHIRException("Cannot call addChild on a primitive type SubstancePolymer.repeat.averageMolecularFormula");
849        }
850        else if (name.equals("repeatUnitAmountType")) {
851          this.repeatUnitAmountType = new CodeableConcept();
852          return this.repeatUnitAmountType;
853        }
854        else if (name.equals("repeatUnit")) {
855          return addRepeatUnit();
856        }
857        else
858          return super.addChild(name);
859      }
860
861      public SubstancePolymerRepeatComponent copy() {
862        SubstancePolymerRepeatComponent dst = new SubstancePolymerRepeatComponent();
863        copyValues(dst);
864        return dst;
865      }
866
867      public void copyValues(SubstancePolymerRepeatComponent dst) {
868        super.copyValues(dst);
869        dst.averageMolecularFormula = averageMolecularFormula == null ? null : averageMolecularFormula.copy();
870        dst.repeatUnitAmountType = repeatUnitAmountType == null ? null : repeatUnitAmountType.copy();
871        if (repeatUnit != null) {
872          dst.repeatUnit = new ArrayList<SubstancePolymerRepeatRepeatUnitComponent>();
873          for (SubstancePolymerRepeatRepeatUnitComponent i : repeatUnit)
874            dst.repeatUnit.add(i.copy());
875        };
876      }
877
878      @Override
879      public boolean equalsDeep(Base other_) {
880        if (!super.equalsDeep(other_))
881          return false;
882        if (!(other_ instanceof SubstancePolymerRepeatComponent))
883          return false;
884        SubstancePolymerRepeatComponent o = (SubstancePolymerRepeatComponent) other_;
885        return compareDeep(averageMolecularFormula, o.averageMolecularFormula, true) && compareDeep(repeatUnitAmountType, o.repeatUnitAmountType, true)
886           && compareDeep(repeatUnit, o.repeatUnit, true);
887      }
888
889      @Override
890      public boolean equalsShallow(Base other_) {
891        if (!super.equalsShallow(other_))
892          return false;
893        if (!(other_ instanceof SubstancePolymerRepeatComponent))
894          return false;
895        SubstancePolymerRepeatComponent o = (SubstancePolymerRepeatComponent) other_;
896        return compareValues(averageMolecularFormula, o.averageMolecularFormula, true);
897      }
898
899      public boolean isEmpty() {
900        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(averageMolecularFormula, repeatUnitAmountType
901          , repeatUnit);
902      }
903
904  public String fhirType() {
905    return "SubstancePolymer.repeat";
906
907  }
908
909  }
910
911    @Block()
912    public static class SubstancePolymerRepeatRepeatUnitComponent extends BackboneElement implements IBaseBackboneElement {
913        /**
914         * Structural repeat units are essential elements for defining polymers.
915         */
916        @Child(name = "unit", type = {StringType.class}, order=1, min=0, max=1, modifier=false, summary=true)
917        @Description(shortDefinition="Structural repeat units are essential elements for defining polymers", formalDefinition="Structural repeat units are essential elements for defining polymers." )
918        protected StringType unit;
919
920        /**
921         * The orientation of the polymerisation, e.g. head-tail, head-head, random.
922         */
923        @Child(name = "orientation", type = {CodeableConcept.class}, order=2, min=0, max=1, modifier=false, summary=true)
924        @Description(shortDefinition="The orientation of the polymerisation, e.g. head-tail, head-head, random", formalDefinition="The orientation of the polymerisation, e.g. head-tail, head-head, random." )
925        protected CodeableConcept orientation;
926
927        /**
928         * Number of repeats of this unit.
929         */
930        @Child(name = "amount", type = {IntegerType.class}, order=3, min=0, max=1, modifier=false, summary=true)
931        @Description(shortDefinition="Number of repeats of this unit", formalDefinition="Number of repeats of this unit." )
932        protected IntegerType amount;
933
934        /**
935         * Applies to homopolymer and block co-polymers where the degree of polymerisation within a block can be described.
936         */
937        @Child(name = "degreeOfPolymerisation", type = {}, order=4, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
938        @Description(shortDefinition="Applies to homopolymer and block co-polymers where the degree of polymerisation within a block can be described", formalDefinition="Applies to homopolymer and block co-polymers where the degree of polymerisation within a block can be described." )
939        protected List<SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent> degreeOfPolymerisation;
940
941        /**
942         * A graphical structure for this SRU.
943         */
944        @Child(name = "structuralRepresentation", type = {}, order=5, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
945        @Description(shortDefinition="A graphical structure for this SRU", formalDefinition="A graphical structure for this SRU." )
946        protected List<SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent> structuralRepresentation;
947
948        private static final long serialVersionUID = 727054044L;
949
950    /**
951     * Constructor
952     */
953      public SubstancePolymerRepeatRepeatUnitComponent() {
954        super();
955      }
956
957        /**
958         * @return {@link #unit} (Structural repeat units are essential elements for defining polymers.). This is the underlying object with id, value and extensions. The accessor "getUnit" gives direct access to the value
959         */
960        public StringType getUnitElement() { 
961          if (this.unit == null)
962            if (Configuration.errorOnAutoCreate())
963              throw new Error("Attempt to auto-create SubstancePolymerRepeatRepeatUnitComponent.unit");
964            else if (Configuration.doAutoCreate())
965              this.unit = new StringType(); // bb
966          return this.unit;
967        }
968
969        public boolean hasUnitElement() { 
970          return this.unit != null && !this.unit.isEmpty();
971        }
972
973        public boolean hasUnit() { 
974          return this.unit != null && !this.unit.isEmpty();
975        }
976
977        /**
978         * @param value {@link #unit} (Structural repeat units are essential elements for defining polymers.). This is the underlying object with id, value and extensions. The accessor "getUnit" gives direct access to the value
979         */
980        public SubstancePolymerRepeatRepeatUnitComponent setUnitElement(StringType value) { 
981          this.unit = value;
982          return this;
983        }
984
985        /**
986         * @return Structural repeat units are essential elements for defining polymers.
987         */
988        public String getUnit() { 
989          return this.unit == null ? null : this.unit.getValue();
990        }
991
992        /**
993         * @param value Structural repeat units are essential elements for defining polymers.
994         */
995        public SubstancePolymerRepeatRepeatUnitComponent setUnit(String value) { 
996          if (Utilities.noString(value))
997            this.unit = null;
998          else {
999            if (this.unit == null)
1000              this.unit = new StringType();
1001            this.unit.setValue(value);
1002          }
1003          return this;
1004        }
1005
1006        /**
1007         * @return {@link #orientation} (The orientation of the polymerisation, e.g. head-tail, head-head, random.)
1008         */
1009        public CodeableConcept getOrientation() { 
1010          if (this.orientation == null)
1011            if (Configuration.errorOnAutoCreate())
1012              throw new Error("Attempt to auto-create SubstancePolymerRepeatRepeatUnitComponent.orientation");
1013            else if (Configuration.doAutoCreate())
1014              this.orientation = new CodeableConcept(); // cc
1015          return this.orientation;
1016        }
1017
1018        public boolean hasOrientation() { 
1019          return this.orientation != null && !this.orientation.isEmpty();
1020        }
1021
1022        /**
1023         * @param value {@link #orientation} (The orientation of the polymerisation, e.g. head-tail, head-head, random.)
1024         */
1025        public SubstancePolymerRepeatRepeatUnitComponent setOrientation(CodeableConcept value) { 
1026          this.orientation = value;
1027          return this;
1028        }
1029
1030        /**
1031         * @return {@link #amount} (Number of repeats of this unit.). This is the underlying object with id, value and extensions. The accessor "getAmount" gives direct access to the value
1032         */
1033        public IntegerType getAmountElement() { 
1034          if (this.amount == null)
1035            if (Configuration.errorOnAutoCreate())
1036              throw new Error("Attempt to auto-create SubstancePolymerRepeatRepeatUnitComponent.amount");
1037            else if (Configuration.doAutoCreate())
1038              this.amount = new IntegerType(); // bb
1039          return this.amount;
1040        }
1041
1042        public boolean hasAmountElement() { 
1043          return this.amount != null && !this.amount.isEmpty();
1044        }
1045
1046        public boolean hasAmount() { 
1047          return this.amount != null && !this.amount.isEmpty();
1048        }
1049
1050        /**
1051         * @param value {@link #amount} (Number of repeats of this unit.). This is the underlying object with id, value and extensions. The accessor "getAmount" gives direct access to the value
1052         */
1053        public SubstancePolymerRepeatRepeatUnitComponent setAmountElement(IntegerType value) { 
1054          this.amount = value;
1055          return this;
1056        }
1057
1058        /**
1059         * @return Number of repeats of this unit.
1060         */
1061        public int getAmount() { 
1062          return this.amount == null || this.amount.isEmpty() ? 0 : this.amount.getValue();
1063        }
1064
1065        /**
1066         * @param value Number of repeats of this unit.
1067         */
1068        public SubstancePolymerRepeatRepeatUnitComponent setAmount(int value) { 
1069            if (this.amount == null)
1070              this.amount = new IntegerType();
1071            this.amount.setValue(value);
1072          return this;
1073        }
1074
1075        /**
1076         * @return {@link #degreeOfPolymerisation} (Applies to homopolymer and block co-polymers where the degree of polymerisation within a block can be described.)
1077         */
1078        public List<SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent> getDegreeOfPolymerisation() { 
1079          if (this.degreeOfPolymerisation == null)
1080            this.degreeOfPolymerisation = new ArrayList<SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent>();
1081          return this.degreeOfPolymerisation;
1082        }
1083
1084        /**
1085         * @return Returns a reference to <code>this</code> for easy method chaining
1086         */
1087        public SubstancePolymerRepeatRepeatUnitComponent setDegreeOfPolymerisation(List<SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent> theDegreeOfPolymerisation) { 
1088          this.degreeOfPolymerisation = theDegreeOfPolymerisation;
1089          return this;
1090        }
1091
1092        public boolean hasDegreeOfPolymerisation() { 
1093          if (this.degreeOfPolymerisation == null)
1094            return false;
1095          for (SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent item : this.degreeOfPolymerisation)
1096            if (!item.isEmpty())
1097              return true;
1098          return false;
1099        }
1100
1101        public SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent addDegreeOfPolymerisation() { //3
1102          SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent t = new SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent();
1103          if (this.degreeOfPolymerisation == null)
1104            this.degreeOfPolymerisation = new ArrayList<SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent>();
1105          this.degreeOfPolymerisation.add(t);
1106          return t;
1107        }
1108
1109        public SubstancePolymerRepeatRepeatUnitComponent addDegreeOfPolymerisation(SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent t) { //3
1110          if (t == null)
1111            return this;
1112          if (this.degreeOfPolymerisation == null)
1113            this.degreeOfPolymerisation = new ArrayList<SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent>();
1114          this.degreeOfPolymerisation.add(t);
1115          return this;
1116        }
1117
1118        /**
1119         * @return The first repetition of repeating field {@link #degreeOfPolymerisation}, creating it if it does not already exist {3}
1120         */
1121        public SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent getDegreeOfPolymerisationFirstRep() { 
1122          if (getDegreeOfPolymerisation().isEmpty()) {
1123            addDegreeOfPolymerisation();
1124          }
1125          return getDegreeOfPolymerisation().get(0);
1126        }
1127
1128        /**
1129         * @return {@link #structuralRepresentation} (A graphical structure for this SRU.)
1130         */
1131        public List<SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent> getStructuralRepresentation() { 
1132          if (this.structuralRepresentation == null)
1133            this.structuralRepresentation = new ArrayList<SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent>();
1134          return this.structuralRepresentation;
1135        }
1136
1137        /**
1138         * @return Returns a reference to <code>this</code> for easy method chaining
1139         */
1140        public SubstancePolymerRepeatRepeatUnitComponent setStructuralRepresentation(List<SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent> theStructuralRepresentation) { 
1141          this.structuralRepresentation = theStructuralRepresentation;
1142          return this;
1143        }
1144
1145        public boolean hasStructuralRepresentation() { 
1146          if (this.structuralRepresentation == null)
1147            return false;
1148          for (SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent item : this.structuralRepresentation)
1149            if (!item.isEmpty())
1150              return true;
1151          return false;
1152        }
1153
1154        public SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent addStructuralRepresentation() { //3
1155          SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent t = new SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent();
1156          if (this.structuralRepresentation == null)
1157            this.structuralRepresentation = new ArrayList<SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent>();
1158          this.structuralRepresentation.add(t);
1159          return t;
1160        }
1161
1162        public SubstancePolymerRepeatRepeatUnitComponent addStructuralRepresentation(SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent t) { //3
1163          if (t == null)
1164            return this;
1165          if (this.structuralRepresentation == null)
1166            this.structuralRepresentation = new ArrayList<SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent>();
1167          this.structuralRepresentation.add(t);
1168          return this;
1169        }
1170
1171        /**
1172         * @return The first repetition of repeating field {@link #structuralRepresentation}, creating it if it does not already exist {3}
1173         */
1174        public SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent getStructuralRepresentationFirstRep() { 
1175          if (getStructuralRepresentation().isEmpty()) {
1176            addStructuralRepresentation();
1177          }
1178          return getStructuralRepresentation().get(0);
1179        }
1180
1181        protected void listChildren(List<Property> children) {
1182          super.listChildren(children);
1183          children.add(new Property("unit", "string", "Structural repeat units are essential elements for defining polymers.", 0, 1, unit));
1184          children.add(new Property("orientation", "CodeableConcept", "The orientation of the polymerisation, e.g. head-tail, head-head, random.", 0, 1, orientation));
1185          children.add(new Property("amount", "integer", "Number of repeats of this unit.", 0, 1, amount));
1186          children.add(new Property("degreeOfPolymerisation", "", "Applies to homopolymer and block co-polymers where the degree of polymerisation within a block can be described.", 0, java.lang.Integer.MAX_VALUE, degreeOfPolymerisation));
1187          children.add(new Property("structuralRepresentation", "", "A graphical structure for this SRU.", 0, java.lang.Integer.MAX_VALUE, structuralRepresentation));
1188        }
1189
1190        @Override
1191        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1192          switch (_hash) {
1193          case 3594628: /*unit*/  return new Property("unit", "string", "Structural repeat units are essential elements for defining polymers.", 0, 1, unit);
1194          case -1439500848: /*orientation*/  return new Property("orientation", "CodeableConcept", "The orientation of the polymerisation, e.g. head-tail, head-head, random.", 0, 1, orientation);
1195          case -1413853096: /*amount*/  return new Property("amount", "integer", "Number of repeats of this unit.", 0, 1, amount);
1196          case -159251872: /*degreeOfPolymerisation*/  return new Property("degreeOfPolymerisation", "", "Applies to homopolymer and block co-polymers where the degree of polymerisation within a block can be described.", 0, java.lang.Integer.MAX_VALUE, degreeOfPolymerisation);
1197          case 14311178: /*structuralRepresentation*/  return new Property("structuralRepresentation", "", "A graphical structure for this SRU.", 0, java.lang.Integer.MAX_VALUE, structuralRepresentation);
1198          default: return super.getNamedProperty(_hash, _name, _checkValid);
1199          }
1200
1201        }
1202
1203      @Override
1204      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1205        switch (hash) {
1206        case 3594628: /*unit*/ return this.unit == null ? new Base[0] : new Base[] {this.unit}; // StringType
1207        case -1439500848: /*orientation*/ return this.orientation == null ? new Base[0] : new Base[] {this.orientation}; // CodeableConcept
1208        case -1413853096: /*amount*/ return this.amount == null ? new Base[0] : new Base[] {this.amount}; // IntegerType
1209        case -159251872: /*degreeOfPolymerisation*/ return this.degreeOfPolymerisation == null ? new Base[0] : this.degreeOfPolymerisation.toArray(new Base[this.degreeOfPolymerisation.size()]); // SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent
1210        case 14311178: /*structuralRepresentation*/ return this.structuralRepresentation == null ? new Base[0] : this.structuralRepresentation.toArray(new Base[this.structuralRepresentation.size()]); // SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent
1211        default: return super.getProperty(hash, name, checkValid);
1212        }
1213
1214      }
1215
1216      @Override
1217      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1218        switch (hash) {
1219        case 3594628: // unit
1220          this.unit = TypeConvertor.castToString(value); // StringType
1221          return value;
1222        case -1439500848: // orientation
1223          this.orientation = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1224          return value;
1225        case -1413853096: // amount
1226          this.amount = TypeConvertor.castToInteger(value); // IntegerType
1227          return value;
1228        case -159251872: // degreeOfPolymerisation
1229          this.getDegreeOfPolymerisation().add((SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent) value); // SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent
1230          return value;
1231        case 14311178: // structuralRepresentation
1232          this.getStructuralRepresentation().add((SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent) value); // SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent
1233          return value;
1234        default: return super.setProperty(hash, name, value);
1235        }
1236
1237      }
1238
1239      @Override
1240      public Base setProperty(String name, Base value) throws FHIRException {
1241        if (name.equals("unit")) {
1242          this.unit = TypeConvertor.castToString(value); // StringType
1243        } else if (name.equals("orientation")) {
1244          this.orientation = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1245        } else if (name.equals("amount")) {
1246          this.amount = TypeConvertor.castToInteger(value); // IntegerType
1247        } else if (name.equals("degreeOfPolymerisation")) {
1248          this.getDegreeOfPolymerisation().add((SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent) value);
1249        } else if (name.equals("structuralRepresentation")) {
1250          this.getStructuralRepresentation().add((SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent) value);
1251        } else
1252          return super.setProperty(name, value);
1253        return value;
1254      }
1255
1256      @Override
1257      public Base makeProperty(int hash, String name) throws FHIRException {
1258        switch (hash) {
1259        case 3594628:  return getUnitElement();
1260        case -1439500848:  return getOrientation();
1261        case -1413853096:  return getAmountElement();
1262        case -159251872:  return addDegreeOfPolymerisation(); 
1263        case 14311178:  return addStructuralRepresentation(); 
1264        default: return super.makeProperty(hash, name);
1265        }
1266
1267      }
1268
1269      @Override
1270      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1271        switch (hash) {
1272        case 3594628: /*unit*/ return new String[] {"string"};
1273        case -1439500848: /*orientation*/ return new String[] {"CodeableConcept"};
1274        case -1413853096: /*amount*/ return new String[] {"integer"};
1275        case -159251872: /*degreeOfPolymerisation*/ return new String[] {};
1276        case 14311178: /*structuralRepresentation*/ return new String[] {};
1277        default: return super.getTypesForProperty(hash, name);
1278        }
1279
1280      }
1281
1282      @Override
1283      public Base addChild(String name) throws FHIRException {
1284        if (name.equals("unit")) {
1285          throw new FHIRException("Cannot call addChild on a primitive type SubstancePolymer.repeat.repeatUnit.unit");
1286        }
1287        else if (name.equals("orientation")) {
1288          this.orientation = new CodeableConcept();
1289          return this.orientation;
1290        }
1291        else if (name.equals("amount")) {
1292          throw new FHIRException("Cannot call addChild on a primitive type SubstancePolymer.repeat.repeatUnit.amount");
1293        }
1294        else if (name.equals("degreeOfPolymerisation")) {
1295          return addDegreeOfPolymerisation();
1296        }
1297        else if (name.equals("structuralRepresentation")) {
1298          return addStructuralRepresentation();
1299        }
1300        else
1301          return super.addChild(name);
1302      }
1303
1304      public SubstancePolymerRepeatRepeatUnitComponent copy() {
1305        SubstancePolymerRepeatRepeatUnitComponent dst = new SubstancePolymerRepeatRepeatUnitComponent();
1306        copyValues(dst);
1307        return dst;
1308      }
1309
1310      public void copyValues(SubstancePolymerRepeatRepeatUnitComponent dst) {
1311        super.copyValues(dst);
1312        dst.unit = unit == null ? null : unit.copy();
1313        dst.orientation = orientation == null ? null : orientation.copy();
1314        dst.amount = amount == null ? null : amount.copy();
1315        if (degreeOfPolymerisation != null) {
1316          dst.degreeOfPolymerisation = new ArrayList<SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent>();
1317          for (SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent i : degreeOfPolymerisation)
1318            dst.degreeOfPolymerisation.add(i.copy());
1319        };
1320        if (structuralRepresentation != null) {
1321          dst.structuralRepresentation = new ArrayList<SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent>();
1322          for (SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent i : structuralRepresentation)
1323            dst.structuralRepresentation.add(i.copy());
1324        };
1325      }
1326
1327      @Override
1328      public boolean equalsDeep(Base other_) {
1329        if (!super.equalsDeep(other_))
1330          return false;
1331        if (!(other_ instanceof SubstancePolymerRepeatRepeatUnitComponent))
1332          return false;
1333        SubstancePolymerRepeatRepeatUnitComponent o = (SubstancePolymerRepeatRepeatUnitComponent) other_;
1334        return compareDeep(unit, o.unit, true) && compareDeep(orientation, o.orientation, true) && compareDeep(amount, o.amount, true)
1335           && compareDeep(degreeOfPolymerisation, o.degreeOfPolymerisation, true) && compareDeep(structuralRepresentation, o.structuralRepresentation, true)
1336          ;
1337      }
1338
1339      @Override
1340      public boolean equalsShallow(Base other_) {
1341        if (!super.equalsShallow(other_))
1342          return false;
1343        if (!(other_ instanceof SubstancePolymerRepeatRepeatUnitComponent))
1344          return false;
1345        SubstancePolymerRepeatRepeatUnitComponent o = (SubstancePolymerRepeatRepeatUnitComponent) other_;
1346        return compareValues(unit, o.unit, true) && compareValues(amount, o.amount, true);
1347      }
1348
1349      public boolean isEmpty() {
1350        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(unit, orientation, amount
1351          , degreeOfPolymerisation, structuralRepresentation);
1352      }
1353
1354  public String fhirType() {
1355    return "SubstancePolymer.repeat.repeatUnit";
1356
1357  }
1358
1359  }
1360
1361    @Block()
1362    public static class SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent extends BackboneElement implements IBaseBackboneElement {
1363        /**
1364         * The type of the degree of polymerisation shall be described, e.g. SRU/Polymer Ratio.
1365         */
1366        @Child(name = "type", type = {CodeableConcept.class}, order=1, min=0, max=1, modifier=false, summary=true)
1367        @Description(shortDefinition="The type of the degree of polymerisation shall be described, e.g. SRU/Polymer Ratio", formalDefinition="The type of the degree of polymerisation shall be described, e.g. SRU/Polymer Ratio." )
1368        protected CodeableConcept type;
1369
1370        /**
1371         * An average amount of polymerisation.
1372         */
1373        @Child(name = "average", type = {IntegerType.class}, order=2, min=0, max=1, modifier=false, summary=true)
1374        @Description(shortDefinition="An average amount of polymerisation", formalDefinition="An average amount of polymerisation." )
1375        protected IntegerType average;
1376
1377        /**
1378         * A low expected limit of the amount.
1379         */
1380        @Child(name = "low", type = {IntegerType.class}, order=3, min=0, max=1, modifier=false, summary=true)
1381        @Description(shortDefinition="A low expected limit of the amount", formalDefinition="A low expected limit of the amount." )
1382        protected IntegerType low;
1383
1384        /**
1385         * A high expected limit of the amount.
1386         */
1387        @Child(name = "high", type = {IntegerType.class}, order=4, min=0, max=1, modifier=false, summary=true)
1388        @Description(shortDefinition="A high expected limit of the amount", formalDefinition="A high expected limit of the amount." )
1389        protected IntegerType high;
1390
1391        private static final long serialVersionUID = -1950663748L;
1392
1393    /**
1394     * Constructor
1395     */
1396      public SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent() {
1397        super();
1398      }
1399
1400        /**
1401         * @return {@link #type} (The type of the degree of polymerisation shall be described, e.g. SRU/Polymer Ratio.)
1402         */
1403        public CodeableConcept getType() { 
1404          if (this.type == null)
1405            if (Configuration.errorOnAutoCreate())
1406              throw new Error("Attempt to auto-create SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent.type");
1407            else if (Configuration.doAutoCreate())
1408              this.type = new CodeableConcept(); // cc
1409          return this.type;
1410        }
1411
1412        public boolean hasType() { 
1413          return this.type != null && !this.type.isEmpty();
1414        }
1415
1416        /**
1417         * @param value {@link #type} (The type of the degree of polymerisation shall be described, e.g. SRU/Polymer Ratio.)
1418         */
1419        public SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent setType(CodeableConcept value) { 
1420          this.type = value;
1421          return this;
1422        }
1423
1424        /**
1425         * @return {@link #average} (An average amount of polymerisation.). This is the underlying object with id, value and extensions. The accessor "getAverage" gives direct access to the value
1426         */
1427        public IntegerType getAverageElement() { 
1428          if (this.average == null)
1429            if (Configuration.errorOnAutoCreate())
1430              throw new Error("Attempt to auto-create SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent.average");
1431            else if (Configuration.doAutoCreate())
1432              this.average = new IntegerType(); // bb
1433          return this.average;
1434        }
1435
1436        public boolean hasAverageElement() { 
1437          return this.average != null && !this.average.isEmpty();
1438        }
1439
1440        public boolean hasAverage() { 
1441          return this.average != null && !this.average.isEmpty();
1442        }
1443
1444        /**
1445         * @param value {@link #average} (An average amount of polymerisation.). This is the underlying object with id, value and extensions. The accessor "getAverage" gives direct access to the value
1446         */
1447        public SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent setAverageElement(IntegerType value) { 
1448          this.average = value;
1449          return this;
1450        }
1451
1452        /**
1453         * @return An average amount of polymerisation.
1454         */
1455        public int getAverage() { 
1456          return this.average == null || this.average.isEmpty() ? 0 : this.average.getValue();
1457        }
1458
1459        /**
1460         * @param value An average amount of polymerisation.
1461         */
1462        public SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent setAverage(int value) { 
1463            if (this.average == null)
1464              this.average = new IntegerType();
1465            this.average.setValue(value);
1466          return this;
1467        }
1468
1469        /**
1470         * @return {@link #low} (A low expected limit of the amount.). This is the underlying object with id, value and extensions. The accessor "getLow" gives direct access to the value
1471         */
1472        public IntegerType getLowElement() { 
1473          if (this.low == null)
1474            if (Configuration.errorOnAutoCreate())
1475              throw new Error("Attempt to auto-create SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent.low");
1476            else if (Configuration.doAutoCreate())
1477              this.low = new IntegerType(); // bb
1478          return this.low;
1479        }
1480
1481        public boolean hasLowElement() { 
1482          return this.low != null && !this.low.isEmpty();
1483        }
1484
1485        public boolean hasLow() { 
1486          return this.low != null && !this.low.isEmpty();
1487        }
1488
1489        /**
1490         * @param value {@link #low} (A low expected limit of the amount.). This is the underlying object with id, value and extensions. The accessor "getLow" gives direct access to the value
1491         */
1492        public SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent setLowElement(IntegerType value) { 
1493          this.low = value;
1494          return this;
1495        }
1496
1497        /**
1498         * @return A low expected limit of the amount.
1499         */
1500        public int getLow() { 
1501          return this.low == null || this.low.isEmpty() ? 0 : this.low.getValue();
1502        }
1503
1504        /**
1505         * @param value A low expected limit of the amount.
1506         */
1507        public SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent setLow(int value) { 
1508            if (this.low == null)
1509              this.low = new IntegerType();
1510            this.low.setValue(value);
1511          return this;
1512        }
1513
1514        /**
1515         * @return {@link #high} (A high expected limit of the amount.). This is the underlying object with id, value and extensions. The accessor "getHigh" gives direct access to the value
1516         */
1517        public IntegerType getHighElement() { 
1518          if (this.high == null)
1519            if (Configuration.errorOnAutoCreate())
1520              throw new Error("Attempt to auto-create SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent.high");
1521            else if (Configuration.doAutoCreate())
1522              this.high = new IntegerType(); // bb
1523          return this.high;
1524        }
1525
1526        public boolean hasHighElement() { 
1527          return this.high != null && !this.high.isEmpty();
1528        }
1529
1530        public boolean hasHigh() { 
1531          return this.high != null && !this.high.isEmpty();
1532        }
1533
1534        /**
1535         * @param value {@link #high} (A high expected limit of the amount.). This is the underlying object with id, value and extensions. The accessor "getHigh" gives direct access to the value
1536         */
1537        public SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent setHighElement(IntegerType value) { 
1538          this.high = value;
1539          return this;
1540        }
1541
1542        /**
1543         * @return A high expected limit of the amount.
1544         */
1545        public int getHigh() { 
1546          return this.high == null || this.high.isEmpty() ? 0 : this.high.getValue();
1547        }
1548
1549        /**
1550         * @param value A high expected limit of the amount.
1551         */
1552        public SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent setHigh(int value) { 
1553            if (this.high == null)
1554              this.high = new IntegerType();
1555            this.high.setValue(value);
1556          return this;
1557        }
1558
1559        protected void listChildren(List<Property> children) {
1560          super.listChildren(children);
1561          children.add(new Property("type", "CodeableConcept", "The type of the degree of polymerisation shall be described, e.g. SRU/Polymer Ratio.", 0, 1, type));
1562          children.add(new Property("average", "integer", "An average amount of polymerisation.", 0, 1, average));
1563          children.add(new Property("low", "integer", "A low expected limit of the amount.", 0, 1, low));
1564          children.add(new Property("high", "integer", "A high expected limit of the amount.", 0, 1, high));
1565        }
1566
1567        @Override
1568        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1569          switch (_hash) {
1570          case 3575610: /*type*/  return new Property("type", "CodeableConcept", "The type of the degree of polymerisation shall be described, e.g. SRU/Polymer Ratio.", 0, 1, type);
1571          case -631448035: /*average*/  return new Property("average", "integer", "An average amount of polymerisation.", 0, 1, average);
1572          case 107348: /*low*/  return new Property("low", "integer", "A low expected limit of the amount.", 0, 1, low);
1573          case 3202466: /*high*/  return new Property("high", "integer", "A high expected limit of the amount.", 0, 1, high);
1574          default: return super.getNamedProperty(_hash, _name, _checkValid);
1575          }
1576
1577        }
1578
1579      @Override
1580      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1581        switch (hash) {
1582        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // CodeableConcept
1583        case -631448035: /*average*/ return this.average == null ? new Base[0] : new Base[] {this.average}; // IntegerType
1584        case 107348: /*low*/ return this.low == null ? new Base[0] : new Base[] {this.low}; // IntegerType
1585        case 3202466: /*high*/ return this.high == null ? new Base[0] : new Base[] {this.high}; // IntegerType
1586        default: return super.getProperty(hash, name, checkValid);
1587        }
1588
1589      }
1590
1591      @Override
1592      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1593        switch (hash) {
1594        case 3575610: // type
1595          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1596          return value;
1597        case -631448035: // average
1598          this.average = TypeConvertor.castToInteger(value); // IntegerType
1599          return value;
1600        case 107348: // low
1601          this.low = TypeConvertor.castToInteger(value); // IntegerType
1602          return value;
1603        case 3202466: // high
1604          this.high = TypeConvertor.castToInteger(value); // IntegerType
1605          return value;
1606        default: return super.setProperty(hash, name, value);
1607        }
1608
1609      }
1610
1611      @Override
1612      public Base setProperty(String name, Base value) throws FHIRException {
1613        if (name.equals("type")) {
1614          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1615        } else if (name.equals("average")) {
1616          this.average = TypeConvertor.castToInteger(value); // IntegerType
1617        } else if (name.equals("low")) {
1618          this.low = TypeConvertor.castToInteger(value); // IntegerType
1619        } else if (name.equals("high")) {
1620          this.high = TypeConvertor.castToInteger(value); // IntegerType
1621        } else
1622          return super.setProperty(name, value);
1623        return value;
1624      }
1625
1626      @Override
1627      public Base makeProperty(int hash, String name) throws FHIRException {
1628        switch (hash) {
1629        case 3575610:  return getType();
1630        case -631448035:  return getAverageElement();
1631        case 107348:  return getLowElement();
1632        case 3202466:  return getHighElement();
1633        default: return super.makeProperty(hash, name);
1634        }
1635
1636      }
1637
1638      @Override
1639      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1640        switch (hash) {
1641        case 3575610: /*type*/ return new String[] {"CodeableConcept"};
1642        case -631448035: /*average*/ return new String[] {"integer"};
1643        case 107348: /*low*/ return new String[] {"integer"};
1644        case 3202466: /*high*/ return new String[] {"integer"};
1645        default: return super.getTypesForProperty(hash, name);
1646        }
1647
1648      }
1649
1650      @Override
1651      public Base addChild(String name) throws FHIRException {
1652        if (name.equals("type")) {
1653          this.type = new CodeableConcept();
1654          return this.type;
1655        }
1656        else if (name.equals("average")) {
1657          throw new FHIRException("Cannot call addChild on a primitive type SubstancePolymer.repeat.repeatUnit.degreeOfPolymerisation.average");
1658        }
1659        else if (name.equals("low")) {
1660          throw new FHIRException("Cannot call addChild on a primitive type SubstancePolymer.repeat.repeatUnit.degreeOfPolymerisation.low");
1661        }
1662        else if (name.equals("high")) {
1663          throw new FHIRException("Cannot call addChild on a primitive type SubstancePolymer.repeat.repeatUnit.degreeOfPolymerisation.high");
1664        }
1665        else
1666          return super.addChild(name);
1667      }
1668
1669      public SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent copy() {
1670        SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent dst = new SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent();
1671        copyValues(dst);
1672        return dst;
1673      }
1674
1675      public void copyValues(SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent dst) {
1676        super.copyValues(dst);
1677        dst.type = type == null ? null : type.copy();
1678        dst.average = average == null ? null : average.copy();
1679        dst.low = low == null ? null : low.copy();
1680        dst.high = high == null ? null : high.copy();
1681      }
1682
1683      @Override
1684      public boolean equalsDeep(Base other_) {
1685        if (!super.equalsDeep(other_))
1686          return false;
1687        if (!(other_ instanceof SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent))
1688          return false;
1689        SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent o = (SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent) other_;
1690        return compareDeep(type, o.type, true) && compareDeep(average, o.average, true) && compareDeep(low, o.low, true)
1691           && compareDeep(high, o.high, true);
1692      }
1693
1694      @Override
1695      public boolean equalsShallow(Base other_) {
1696        if (!super.equalsShallow(other_))
1697          return false;
1698        if (!(other_ instanceof SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent))
1699          return false;
1700        SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent o = (SubstancePolymerRepeatRepeatUnitDegreeOfPolymerisationComponent) other_;
1701        return compareValues(average, o.average, true) && compareValues(low, o.low, true) && compareValues(high, o.high, true)
1702          ;
1703      }
1704
1705      public boolean isEmpty() {
1706        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(type, average, low, high
1707          );
1708      }
1709
1710  public String fhirType() {
1711    return "SubstancePolymer.repeat.repeatUnit.degreeOfPolymerisation";
1712
1713  }
1714
1715  }
1716
1717    @Block()
1718    public static class SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent extends BackboneElement implements IBaseBackboneElement {
1719        /**
1720         * The type of structure (e.g. Full, Partial, Representative).
1721         */
1722        @Child(name = "type", type = {CodeableConcept.class}, order=1, min=0, max=1, modifier=false, summary=true)
1723        @Description(shortDefinition="The type of structure (e.g. Full, Partial, Representative)", formalDefinition="The type of structure (e.g. Full, Partial, Representative)." )
1724        protected CodeableConcept type;
1725
1726        /**
1727         * The structural representation as text string in a standard format e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.
1728         */
1729        @Child(name = "representation", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=true)
1730        @Description(shortDefinition="The structural representation as text string in a standard format e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF", formalDefinition="The structural representation as text string in a standard format e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF." )
1731        protected StringType representation;
1732
1733        /**
1734         * The format of the representation e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.
1735         */
1736        @Child(name = "format", type = {CodeableConcept.class}, order=3, min=0, max=1, modifier=false, summary=true)
1737        @Description(shortDefinition="The format of the representation e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF", formalDefinition="The format of the representation e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF." )
1738        protected CodeableConcept format;
1739
1740        /**
1741         * An attached file with the structural representation.
1742         */
1743        @Child(name = "attachment", type = {Attachment.class}, order=4, min=0, max=1, modifier=false, summary=true)
1744        @Description(shortDefinition="An attached file with the structural representation", formalDefinition="An attached file with the structural representation." )
1745        protected Attachment attachment;
1746
1747        private static final long serialVersionUID = -1385695515L;
1748
1749    /**
1750     * Constructor
1751     */
1752      public SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent() {
1753        super();
1754      }
1755
1756        /**
1757         * @return {@link #type} (The type of structure (e.g. Full, Partial, Representative).)
1758         */
1759        public CodeableConcept getType() { 
1760          if (this.type == null)
1761            if (Configuration.errorOnAutoCreate())
1762              throw new Error("Attempt to auto-create SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent.type");
1763            else if (Configuration.doAutoCreate())
1764              this.type = new CodeableConcept(); // cc
1765          return this.type;
1766        }
1767
1768        public boolean hasType() { 
1769          return this.type != null && !this.type.isEmpty();
1770        }
1771
1772        /**
1773         * @param value {@link #type} (The type of structure (e.g. Full, Partial, Representative).)
1774         */
1775        public SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent setType(CodeableConcept value) { 
1776          this.type = value;
1777          return this;
1778        }
1779
1780        /**
1781         * @return {@link #representation} (The structural representation as text string in a standard format e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.). This is the underlying object with id, value and extensions. The accessor "getRepresentation" gives direct access to the value
1782         */
1783        public StringType getRepresentationElement() { 
1784          if (this.representation == null)
1785            if (Configuration.errorOnAutoCreate())
1786              throw new Error("Attempt to auto-create SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent.representation");
1787            else if (Configuration.doAutoCreate())
1788              this.representation = new StringType(); // bb
1789          return this.representation;
1790        }
1791
1792        public boolean hasRepresentationElement() { 
1793          return this.representation != null && !this.representation.isEmpty();
1794        }
1795
1796        public boolean hasRepresentation() { 
1797          return this.representation != null && !this.representation.isEmpty();
1798        }
1799
1800        /**
1801         * @param value {@link #representation} (The structural representation as text string in a standard format e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.). This is the underlying object with id, value and extensions. The accessor "getRepresentation" gives direct access to the value
1802         */
1803        public SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent setRepresentationElement(StringType value) { 
1804          this.representation = value;
1805          return this;
1806        }
1807
1808        /**
1809         * @return The structural representation as text string in a standard format e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.
1810         */
1811        public String getRepresentation() { 
1812          return this.representation == null ? null : this.representation.getValue();
1813        }
1814
1815        /**
1816         * @param value The structural representation as text string in a standard format e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.
1817         */
1818        public SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent setRepresentation(String value) { 
1819          if (Utilities.noString(value))
1820            this.representation = null;
1821          else {
1822            if (this.representation == null)
1823              this.representation = new StringType();
1824            this.representation.setValue(value);
1825          }
1826          return this;
1827        }
1828
1829        /**
1830         * @return {@link #format} (The format of the representation e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.)
1831         */
1832        public CodeableConcept getFormat() { 
1833          if (this.format == null)
1834            if (Configuration.errorOnAutoCreate())
1835              throw new Error("Attempt to auto-create SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent.format");
1836            else if (Configuration.doAutoCreate())
1837              this.format = new CodeableConcept(); // cc
1838          return this.format;
1839        }
1840
1841        public boolean hasFormat() { 
1842          return this.format != null && !this.format.isEmpty();
1843        }
1844
1845        /**
1846         * @param value {@link #format} (The format of the representation e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.)
1847         */
1848        public SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent setFormat(CodeableConcept value) { 
1849          this.format = value;
1850          return this;
1851        }
1852
1853        /**
1854         * @return {@link #attachment} (An attached file with the structural representation.)
1855         */
1856        public Attachment getAttachment() { 
1857          if (this.attachment == null)
1858            if (Configuration.errorOnAutoCreate())
1859              throw new Error("Attempt to auto-create SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent.attachment");
1860            else if (Configuration.doAutoCreate())
1861              this.attachment = new Attachment(); // cc
1862          return this.attachment;
1863        }
1864
1865        public boolean hasAttachment() { 
1866          return this.attachment != null && !this.attachment.isEmpty();
1867        }
1868
1869        /**
1870         * @param value {@link #attachment} (An attached file with the structural representation.)
1871         */
1872        public SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent setAttachment(Attachment value) { 
1873          this.attachment = value;
1874          return this;
1875        }
1876
1877        protected void listChildren(List<Property> children) {
1878          super.listChildren(children);
1879          children.add(new Property("type", "CodeableConcept", "The type of structure (e.g. Full, Partial, Representative).", 0, 1, type));
1880          children.add(new Property("representation", "string", "The structural representation as text string in a standard format e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.", 0, 1, representation));
1881          children.add(new Property("format", "CodeableConcept", "The format of the representation e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.", 0, 1, format));
1882          children.add(new Property("attachment", "Attachment", "An attached file with the structural representation.", 0, 1, attachment));
1883        }
1884
1885        @Override
1886        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1887          switch (_hash) {
1888          case 3575610: /*type*/  return new Property("type", "CodeableConcept", "The type of structure (e.g. Full, Partial, Representative).", 0, 1, type);
1889          case -671065907: /*representation*/  return new Property("representation", "string", "The structural representation as text string in a standard format e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.", 0, 1, representation);
1890          case -1268779017: /*format*/  return new Property("format", "CodeableConcept", "The format of the representation e.g. InChI, SMILES, MOLFILE, CDX, SDF, PDB, mmCIF.", 0, 1, format);
1891          case -1963501277: /*attachment*/  return new Property("attachment", "Attachment", "An attached file with the structural representation.", 0, 1, attachment);
1892          default: return super.getNamedProperty(_hash, _name, _checkValid);
1893          }
1894
1895        }
1896
1897      @Override
1898      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1899        switch (hash) {
1900        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // CodeableConcept
1901        case -671065907: /*representation*/ return this.representation == null ? new Base[0] : new Base[] {this.representation}; // StringType
1902        case -1268779017: /*format*/ return this.format == null ? new Base[0] : new Base[] {this.format}; // CodeableConcept
1903        case -1963501277: /*attachment*/ return this.attachment == null ? new Base[0] : new Base[] {this.attachment}; // Attachment
1904        default: return super.getProperty(hash, name, checkValid);
1905        }
1906
1907      }
1908
1909      @Override
1910      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1911        switch (hash) {
1912        case 3575610: // type
1913          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1914          return value;
1915        case -671065907: // representation
1916          this.representation = TypeConvertor.castToString(value); // StringType
1917          return value;
1918        case -1268779017: // format
1919          this.format = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1920          return value;
1921        case -1963501277: // attachment
1922          this.attachment = TypeConvertor.castToAttachment(value); // Attachment
1923          return value;
1924        default: return super.setProperty(hash, name, value);
1925        }
1926
1927      }
1928
1929      @Override
1930      public Base setProperty(String name, Base value) throws FHIRException {
1931        if (name.equals("type")) {
1932          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1933        } else if (name.equals("representation")) {
1934          this.representation = TypeConvertor.castToString(value); // StringType
1935        } else if (name.equals("format")) {
1936          this.format = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1937        } else if (name.equals("attachment")) {
1938          this.attachment = TypeConvertor.castToAttachment(value); // Attachment
1939        } else
1940          return super.setProperty(name, value);
1941        return value;
1942      }
1943
1944      @Override
1945      public Base makeProperty(int hash, String name) throws FHIRException {
1946        switch (hash) {
1947        case 3575610:  return getType();
1948        case -671065907:  return getRepresentationElement();
1949        case -1268779017:  return getFormat();
1950        case -1963501277:  return getAttachment();
1951        default: return super.makeProperty(hash, name);
1952        }
1953
1954      }
1955
1956      @Override
1957      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1958        switch (hash) {
1959        case 3575610: /*type*/ return new String[] {"CodeableConcept"};
1960        case -671065907: /*representation*/ return new String[] {"string"};
1961        case -1268779017: /*format*/ return new String[] {"CodeableConcept"};
1962        case -1963501277: /*attachment*/ return new String[] {"Attachment"};
1963        default: return super.getTypesForProperty(hash, name);
1964        }
1965
1966      }
1967
1968      @Override
1969      public Base addChild(String name) throws FHIRException {
1970        if (name.equals("type")) {
1971          this.type = new CodeableConcept();
1972          return this.type;
1973        }
1974        else if (name.equals("representation")) {
1975          throw new FHIRException("Cannot call addChild on a primitive type SubstancePolymer.repeat.repeatUnit.structuralRepresentation.representation");
1976        }
1977        else if (name.equals("format")) {
1978          this.format = new CodeableConcept();
1979          return this.format;
1980        }
1981        else if (name.equals("attachment")) {
1982          this.attachment = new Attachment();
1983          return this.attachment;
1984        }
1985        else
1986          return super.addChild(name);
1987      }
1988
1989      public SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent copy() {
1990        SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent dst = new SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent();
1991        copyValues(dst);
1992        return dst;
1993      }
1994
1995      public void copyValues(SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent dst) {
1996        super.copyValues(dst);
1997        dst.type = type == null ? null : type.copy();
1998        dst.representation = representation == null ? null : representation.copy();
1999        dst.format = format == null ? null : format.copy();
2000        dst.attachment = attachment == null ? null : attachment.copy();
2001      }
2002
2003      @Override
2004      public boolean equalsDeep(Base other_) {
2005        if (!super.equalsDeep(other_))
2006          return false;
2007        if (!(other_ instanceof SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent))
2008          return false;
2009        SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent o = (SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent) other_;
2010        return compareDeep(type, o.type, true) && compareDeep(representation, o.representation, true) && compareDeep(format, o.format, true)
2011           && compareDeep(attachment, o.attachment, true);
2012      }
2013
2014      @Override
2015      public boolean equalsShallow(Base other_) {
2016        if (!super.equalsShallow(other_))
2017          return false;
2018        if (!(other_ instanceof SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent))
2019          return false;
2020        SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent o = (SubstancePolymerRepeatRepeatUnitStructuralRepresentationComponent) other_;
2021        return compareValues(representation, o.representation, true);
2022      }
2023
2024      public boolean isEmpty() {
2025        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(type, representation, format
2026          , attachment);
2027      }
2028
2029  public String fhirType() {
2030    return "SubstancePolymer.repeat.repeatUnit.structuralRepresentation";
2031
2032  }
2033
2034  }
2035
2036    /**
2037     * A business idenfier for this polymer, but typically this is handled by a SubstanceDefinition identifier.
2038     */
2039    @Child(name = "identifier", type = {Identifier.class}, order=0, min=0, max=1, modifier=false, summary=true)
2040    @Description(shortDefinition="A business idenfier for this polymer, but typically this is handled by a SubstanceDefinition identifier", formalDefinition="A business idenfier for this polymer, but typically this is handled by a SubstanceDefinition identifier." )
2041    protected Identifier identifier;
2042
2043    /**
2044     * Overall type of the polymer.
2045     */
2046    @Child(name = "class", type = {CodeableConcept.class}, order=1, min=0, max=1, modifier=false, summary=true)
2047    @Description(shortDefinition="Overall type of the polymer", formalDefinition="Overall type of the polymer." )
2048    protected CodeableConcept class_;
2049
2050    /**
2051     * Polymer geometry, e.g. linear, branched, cross-linked, network or dendritic.
2052     */
2053    @Child(name = "geometry", type = {CodeableConcept.class}, order=2, min=0, max=1, modifier=false, summary=true)
2054    @Description(shortDefinition="Polymer geometry, e.g. linear, branched, cross-linked, network or dendritic", formalDefinition="Polymer geometry, e.g. linear, branched, cross-linked, network or dendritic." )
2055    protected CodeableConcept geometry;
2056
2057    /**
2058     * Descrtibes the copolymer sequence type (polymer connectivity).
2059     */
2060    @Child(name = "copolymerConnectivity", type = {CodeableConcept.class}, order=3, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
2061    @Description(shortDefinition="Descrtibes the copolymer sequence type (polymer connectivity)", formalDefinition="Descrtibes the copolymer sequence type (polymer connectivity)." )
2062    protected List<CodeableConcept> copolymerConnectivity;
2063
2064    /**
2065     * Todo - this is intended to connect to a repeating full modification structure, also used by Protein and Nucleic Acid . String is just a placeholder.
2066     */
2067    @Child(name = "modification", type = {StringType.class}, order=4, min=0, max=1, modifier=false, summary=true)
2068    @Description(shortDefinition="Todo - this is intended to connect to a repeating full modification structure, also used by Protein and Nucleic Acid . String is just a placeholder", formalDefinition="Todo - this is intended to connect to a repeating full modification structure, also used by Protein and Nucleic Acid . String is just a placeholder." )
2069    protected StringType modification;
2070
2071    /**
2072     * Todo.
2073     */
2074    @Child(name = "monomerSet", type = {}, order=5, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
2075    @Description(shortDefinition="Todo", formalDefinition="Todo." )
2076    protected List<SubstancePolymerMonomerSetComponent> monomerSet;
2077
2078    /**
2079     * Specifies and quantifies the repeated units and their configuration.
2080     */
2081    @Child(name = "repeat", type = {}, order=6, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
2082    @Description(shortDefinition="Specifies and quantifies the repeated units and their configuration", formalDefinition="Specifies and quantifies the repeated units and their configuration." )
2083    protected List<SubstancePolymerRepeatComponent> repeat;
2084
2085    private static final long serialVersionUID = 11937102L;
2086
2087  /**
2088   * Constructor
2089   */
2090    public SubstancePolymer() {
2091      super();
2092    }
2093
2094    /**
2095     * @return {@link #identifier} (A business idenfier for this polymer, but typically this is handled by a SubstanceDefinition identifier.)
2096     */
2097    public Identifier getIdentifier() { 
2098      if (this.identifier == null)
2099        if (Configuration.errorOnAutoCreate())
2100          throw new Error("Attempt to auto-create SubstancePolymer.identifier");
2101        else if (Configuration.doAutoCreate())
2102          this.identifier = new Identifier(); // cc
2103      return this.identifier;
2104    }
2105
2106    public boolean hasIdentifier() { 
2107      return this.identifier != null && !this.identifier.isEmpty();
2108    }
2109
2110    /**
2111     * @param value {@link #identifier} (A business idenfier for this polymer, but typically this is handled by a SubstanceDefinition identifier.)
2112     */
2113    public SubstancePolymer setIdentifier(Identifier value) { 
2114      this.identifier = value;
2115      return this;
2116    }
2117
2118    /**
2119     * @return {@link #class_} (Overall type of the polymer.)
2120     */
2121    public CodeableConcept getClass_() { 
2122      if (this.class_ == null)
2123        if (Configuration.errorOnAutoCreate())
2124          throw new Error("Attempt to auto-create SubstancePolymer.class_");
2125        else if (Configuration.doAutoCreate())
2126          this.class_ = new CodeableConcept(); // cc
2127      return this.class_;
2128    }
2129
2130    public boolean hasClass_() { 
2131      return this.class_ != null && !this.class_.isEmpty();
2132    }
2133
2134    /**
2135     * @param value {@link #class_} (Overall type of the polymer.)
2136     */
2137    public SubstancePolymer setClass_(CodeableConcept value) { 
2138      this.class_ = value;
2139      return this;
2140    }
2141
2142    /**
2143     * @return {@link #geometry} (Polymer geometry, e.g. linear, branched, cross-linked, network or dendritic.)
2144     */
2145    public CodeableConcept getGeometry() { 
2146      if (this.geometry == null)
2147        if (Configuration.errorOnAutoCreate())
2148          throw new Error("Attempt to auto-create SubstancePolymer.geometry");
2149        else if (Configuration.doAutoCreate())
2150          this.geometry = new CodeableConcept(); // cc
2151      return this.geometry;
2152    }
2153
2154    public boolean hasGeometry() { 
2155      return this.geometry != null && !this.geometry.isEmpty();
2156    }
2157
2158    /**
2159     * @param value {@link #geometry} (Polymer geometry, e.g. linear, branched, cross-linked, network or dendritic.)
2160     */
2161    public SubstancePolymer setGeometry(CodeableConcept value) { 
2162      this.geometry = value;
2163      return this;
2164    }
2165
2166    /**
2167     * @return {@link #copolymerConnectivity} (Descrtibes the copolymer sequence type (polymer connectivity).)
2168     */
2169    public List<CodeableConcept> getCopolymerConnectivity() { 
2170      if (this.copolymerConnectivity == null)
2171        this.copolymerConnectivity = new ArrayList<CodeableConcept>();
2172      return this.copolymerConnectivity;
2173    }
2174
2175    /**
2176     * @return Returns a reference to <code>this</code> for easy method chaining
2177     */
2178    public SubstancePolymer setCopolymerConnectivity(List<CodeableConcept> theCopolymerConnectivity) { 
2179      this.copolymerConnectivity = theCopolymerConnectivity;
2180      return this;
2181    }
2182
2183    public boolean hasCopolymerConnectivity() { 
2184      if (this.copolymerConnectivity == null)
2185        return false;
2186      for (CodeableConcept item : this.copolymerConnectivity)
2187        if (!item.isEmpty())
2188          return true;
2189      return false;
2190    }
2191
2192    public CodeableConcept addCopolymerConnectivity() { //3
2193      CodeableConcept t = new CodeableConcept();
2194      if (this.copolymerConnectivity == null)
2195        this.copolymerConnectivity = new ArrayList<CodeableConcept>();
2196      this.copolymerConnectivity.add(t);
2197      return t;
2198    }
2199
2200    public SubstancePolymer addCopolymerConnectivity(CodeableConcept t) { //3
2201      if (t == null)
2202        return this;
2203      if (this.copolymerConnectivity == null)
2204        this.copolymerConnectivity = new ArrayList<CodeableConcept>();
2205      this.copolymerConnectivity.add(t);
2206      return this;
2207    }
2208
2209    /**
2210     * @return The first repetition of repeating field {@link #copolymerConnectivity}, creating it if it does not already exist {3}
2211     */
2212    public CodeableConcept getCopolymerConnectivityFirstRep() { 
2213      if (getCopolymerConnectivity().isEmpty()) {
2214        addCopolymerConnectivity();
2215      }
2216      return getCopolymerConnectivity().get(0);
2217    }
2218
2219    /**
2220     * @return {@link #modification} (Todo - this is intended to connect to a repeating full modification structure, also used by Protein and Nucleic Acid . String is just a placeholder.). This is the underlying object with id, value and extensions. The accessor "getModification" gives direct access to the value
2221     */
2222    public StringType getModificationElement() { 
2223      if (this.modification == null)
2224        if (Configuration.errorOnAutoCreate())
2225          throw new Error("Attempt to auto-create SubstancePolymer.modification");
2226        else if (Configuration.doAutoCreate())
2227          this.modification = new StringType(); // bb
2228      return this.modification;
2229    }
2230
2231    public boolean hasModificationElement() { 
2232      return this.modification != null && !this.modification.isEmpty();
2233    }
2234
2235    public boolean hasModification() { 
2236      return this.modification != null && !this.modification.isEmpty();
2237    }
2238
2239    /**
2240     * @param value {@link #modification} (Todo - this is intended to connect to a repeating full modification structure, also used by Protein and Nucleic Acid . String is just a placeholder.). This is the underlying object with id, value and extensions. The accessor "getModification" gives direct access to the value
2241     */
2242    public SubstancePolymer setModificationElement(StringType value) { 
2243      this.modification = value;
2244      return this;
2245    }
2246
2247    /**
2248     * @return Todo - this is intended to connect to a repeating full modification structure, also used by Protein and Nucleic Acid . String is just a placeholder.
2249     */
2250    public String getModification() { 
2251      return this.modification == null ? null : this.modification.getValue();
2252    }
2253
2254    /**
2255     * @param value Todo - this is intended to connect to a repeating full modification structure, also used by Protein and Nucleic Acid . String is just a placeholder.
2256     */
2257    public SubstancePolymer setModification(String value) { 
2258      if (Utilities.noString(value))
2259        this.modification = null;
2260      else {
2261        if (this.modification == null)
2262          this.modification = new StringType();
2263        this.modification.setValue(value);
2264      }
2265      return this;
2266    }
2267
2268    /**
2269     * @return {@link #monomerSet} (Todo.)
2270     */
2271    public List<SubstancePolymerMonomerSetComponent> getMonomerSet() { 
2272      if (this.monomerSet == null)
2273        this.monomerSet = new ArrayList<SubstancePolymerMonomerSetComponent>();
2274      return this.monomerSet;
2275    }
2276
2277    /**
2278     * @return Returns a reference to <code>this</code> for easy method chaining
2279     */
2280    public SubstancePolymer setMonomerSet(List<SubstancePolymerMonomerSetComponent> theMonomerSet) { 
2281      this.monomerSet = theMonomerSet;
2282      return this;
2283    }
2284
2285    public boolean hasMonomerSet() { 
2286      if (this.monomerSet == null)
2287        return false;
2288      for (SubstancePolymerMonomerSetComponent item : this.monomerSet)
2289        if (!item.isEmpty())
2290          return true;
2291      return false;
2292    }
2293
2294    public SubstancePolymerMonomerSetComponent addMonomerSet() { //3
2295      SubstancePolymerMonomerSetComponent t = new SubstancePolymerMonomerSetComponent();
2296      if (this.monomerSet == null)
2297        this.monomerSet = new ArrayList<SubstancePolymerMonomerSetComponent>();
2298      this.monomerSet.add(t);
2299      return t;
2300    }
2301
2302    public SubstancePolymer addMonomerSet(SubstancePolymerMonomerSetComponent t) { //3
2303      if (t == null)
2304        return this;
2305      if (this.monomerSet == null)
2306        this.monomerSet = new ArrayList<SubstancePolymerMonomerSetComponent>();
2307      this.monomerSet.add(t);
2308      return this;
2309    }
2310
2311    /**
2312     * @return The first repetition of repeating field {@link #monomerSet}, creating it if it does not already exist {3}
2313     */
2314    public SubstancePolymerMonomerSetComponent getMonomerSetFirstRep() { 
2315      if (getMonomerSet().isEmpty()) {
2316        addMonomerSet();
2317      }
2318      return getMonomerSet().get(0);
2319    }
2320
2321    /**
2322     * @return {@link #repeat} (Specifies and quantifies the repeated units and their configuration.)
2323     */
2324    public List<SubstancePolymerRepeatComponent> getRepeat() { 
2325      if (this.repeat == null)
2326        this.repeat = new ArrayList<SubstancePolymerRepeatComponent>();
2327      return this.repeat;
2328    }
2329
2330    /**
2331     * @return Returns a reference to <code>this</code> for easy method chaining
2332     */
2333    public SubstancePolymer setRepeat(List<SubstancePolymerRepeatComponent> theRepeat) { 
2334      this.repeat = theRepeat;
2335      return this;
2336    }
2337
2338    public boolean hasRepeat() { 
2339      if (this.repeat == null)
2340        return false;
2341      for (SubstancePolymerRepeatComponent item : this.repeat)
2342        if (!item.isEmpty())
2343          return true;
2344      return false;
2345    }
2346
2347    public SubstancePolymerRepeatComponent addRepeat() { //3
2348      SubstancePolymerRepeatComponent t = new SubstancePolymerRepeatComponent();
2349      if (this.repeat == null)
2350        this.repeat = new ArrayList<SubstancePolymerRepeatComponent>();
2351      this.repeat.add(t);
2352      return t;
2353    }
2354
2355    public SubstancePolymer addRepeat(SubstancePolymerRepeatComponent t) { //3
2356      if (t == null)
2357        return this;
2358      if (this.repeat == null)
2359        this.repeat = new ArrayList<SubstancePolymerRepeatComponent>();
2360      this.repeat.add(t);
2361      return this;
2362    }
2363
2364    /**
2365     * @return The first repetition of repeating field {@link #repeat}, creating it if it does not already exist {3}
2366     */
2367    public SubstancePolymerRepeatComponent getRepeatFirstRep() { 
2368      if (getRepeat().isEmpty()) {
2369        addRepeat();
2370      }
2371      return getRepeat().get(0);
2372    }
2373
2374      protected void listChildren(List<Property> children) {
2375        super.listChildren(children);
2376        children.add(new Property("identifier", "Identifier", "A business idenfier for this polymer, but typically this is handled by a SubstanceDefinition identifier.", 0, 1, identifier));
2377        children.add(new Property("class", "CodeableConcept", "Overall type of the polymer.", 0, 1, class_));
2378        children.add(new Property("geometry", "CodeableConcept", "Polymer geometry, e.g. linear, branched, cross-linked, network or dendritic.", 0, 1, geometry));
2379        children.add(new Property("copolymerConnectivity", "CodeableConcept", "Descrtibes the copolymer sequence type (polymer connectivity).", 0, java.lang.Integer.MAX_VALUE, copolymerConnectivity));
2380        children.add(new Property("modification", "string", "Todo - this is intended to connect to a repeating full modification structure, also used by Protein and Nucleic Acid . String is just a placeholder.", 0, 1, modification));
2381        children.add(new Property("monomerSet", "", "Todo.", 0, java.lang.Integer.MAX_VALUE, monomerSet));
2382        children.add(new Property("repeat", "", "Specifies and quantifies the repeated units and their configuration.", 0, java.lang.Integer.MAX_VALUE, repeat));
2383      }
2384
2385      @Override
2386      public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2387        switch (_hash) {
2388        case -1618432855: /*identifier*/  return new Property("identifier", "Identifier", "A business idenfier for this polymer, but typically this is handled by a SubstanceDefinition identifier.", 0, 1, identifier);
2389        case 94742904: /*class*/  return new Property("class", "CodeableConcept", "Overall type of the polymer.", 0, 1, class_);
2390        case 1846020210: /*geometry*/  return new Property("geometry", "CodeableConcept", "Polymer geometry, e.g. linear, branched, cross-linked, network or dendritic.", 0, 1, geometry);
2391        case 997107577: /*copolymerConnectivity*/  return new Property("copolymerConnectivity", "CodeableConcept", "Descrtibes the copolymer sequence type (polymer connectivity).", 0, java.lang.Integer.MAX_VALUE, copolymerConnectivity);
2392        case -684600932: /*modification*/  return new Property("modification", "string", "Todo - this is intended to connect to a repeating full modification structure, also used by Protein and Nucleic Acid . String is just a placeholder.", 0, 1, modification);
2393        case -1622483765: /*monomerSet*/  return new Property("monomerSet", "", "Todo.", 0, java.lang.Integer.MAX_VALUE, monomerSet);
2394        case -934531685: /*repeat*/  return new Property("repeat", "", "Specifies and quantifies the repeated units and their configuration.", 0, java.lang.Integer.MAX_VALUE, repeat);
2395        default: return super.getNamedProperty(_hash, _name, _checkValid);
2396        }
2397
2398      }
2399
2400      @Override
2401      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2402        switch (hash) {
2403        case -1618432855: /*identifier*/ return this.identifier == null ? new Base[0] : new Base[] {this.identifier}; // Identifier
2404        case 94742904: /*class*/ return this.class_ == null ? new Base[0] : new Base[] {this.class_}; // CodeableConcept
2405        case 1846020210: /*geometry*/ return this.geometry == null ? new Base[0] : new Base[] {this.geometry}; // CodeableConcept
2406        case 997107577: /*copolymerConnectivity*/ return this.copolymerConnectivity == null ? new Base[0] : this.copolymerConnectivity.toArray(new Base[this.copolymerConnectivity.size()]); // CodeableConcept
2407        case -684600932: /*modification*/ return this.modification == null ? new Base[0] : new Base[] {this.modification}; // StringType
2408        case -1622483765: /*monomerSet*/ return this.monomerSet == null ? new Base[0] : this.monomerSet.toArray(new Base[this.monomerSet.size()]); // SubstancePolymerMonomerSetComponent
2409        case -934531685: /*repeat*/ return this.repeat == null ? new Base[0] : this.repeat.toArray(new Base[this.repeat.size()]); // SubstancePolymerRepeatComponent
2410        default: return super.getProperty(hash, name, checkValid);
2411        }
2412
2413      }
2414
2415      @Override
2416      public Base setProperty(int hash, String name, Base value) throws FHIRException {
2417        switch (hash) {
2418        case -1618432855: // identifier
2419          this.identifier = TypeConvertor.castToIdentifier(value); // Identifier
2420          return value;
2421        case 94742904: // class
2422          this.class_ = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
2423          return value;
2424        case 1846020210: // geometry
2425          this.geometry = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
2426          return value;
2427        case 997107577: // copolymerConnectivity
2428          this.getCopolymerConnectivity().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
2429          return value;
2430        case -684600932: // modification
2431          this.modification = TypeConvertor.castToString(value); // StringType
2432          return value;
2433        case -1622483765: // monomerSet
2434          this.getMonomerSet().add((SubstancePolymerMonomerSetComponent) value); // SubstancePolymerMonomerSetComponent
2435          return value;
2436        case -934531685: // repeat
2437          this.getRepeat().add((SubstancePolymerRepeatComponent) value); // SubstancePolymerRepeatComponent
2438          return value;
2439        default: return super.setProperty(hash, name, value);
2440        }
2441
2442      }
2443
2444      @Override
2445      public Base setProperty(String name, Base value) throws FHIRException {
2446        if (name.equals("identifier")) {
2447          this.identifier = TypeConvertor.castToIdentifier(value); // Identifier
2448        } else if (name.equals("class")) {
2449          this.class_ = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
2450        } else if (name.equals("geometry")) {
2451          this.geometry = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
2452        } else if (name.equals("copolymerConnectivity")) {
2453          this.getCopolymerConnectivity().add(TypeConvertor.castToCodeableConcept(value));
2454        } else if (name.equals("modification")) {
2455          this.modification = TypeConvertor.castToString(value); // StringType
2456        } else if (name.equals("monomerSet")) {
2457          this.getMonomerSet().add((SubstancePolymerMonomerSetComponent) value);
2458        } else if (name.equals("repeat")) {
2459          this.getRepeat().add((SubstancePolymerRepeatComponent) value);
2460        } else
2461          return super.setProperty(name, value);
2462        return value;
2463      }
2464
2465      @Override
2466      public Base makeProperty(int hash, String name) throws FHIRException {
2467        switch (hash) {
2468        case -1618432855:  return getIdentifier();
2469        case 94742904:  return getClass_();
2470        case 1846020210:  return getGeometry();
2471        case 997107577:  return addCopolymerConnectivity(); 
2472        case -684600932:  return getModificationElement();
2473        case -1622483765:  return addMonomerSet(); 
2474        case -934531685:  return addRepeat(); 
2475        default: return super.makeProperty(hash, name);
2476        }
2477
2478      }
2479
2480      @Override
2481      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2482        switch (hash) {
2483        case -1618432855: /*identifier*/ return new String[] {"Identifier"};
2484        case 94742904: /*class*/ return new String[] {"CodeableConcept"};
2485        case 1846020210: /*geometry*/ return new String[] {"CodeableConcept"};
2486        case 997107577: /*copolymerConnectivity*/ return new String[] {"CodeableConcept"};
2487        case -684600932: /*modification*/ return new String[] {"string"};
2488        case -1622483765: /*monomerSet*/ return new String[] {};
2489        case -934531685: /*repeat*/ return new String[] {};
2490        default: return super.getTypesForProperty(hash, name);
2491        }
2492
2493      }
2494
2495      @Override
2496      public Base addChild(String name) throws FHIRException {
2497        if (name.equals("identifier")) {
2498          this.identifier = new Identifier();
2499          return this.identifier;
2500        }
2501        else if (name.equals("class")) {
2502          this.class_ = new CodeableConcept();
2503          return this.class_;
2504        }
2505        else if (name.equals("geometry")) {
2506          this.geometry = new CodeableConcept();
2507          return this.geometry;
2508        }
2509        else if (name.equals("copolymerConnectivity")) {
2510          return addCopolymerConnectivity();
2511        }
2512        else if (name.equals("modification")) {
2513          throw new FHIRException("Cannot call addChild on a primitive type SubstancePolymer.modification");
2514        }
2515        else if (name.equals("monomerSet")) {
2516          return addMonomerSet();
2517        }
2518        else if (name.equals("repeat")) {
2519          return addRepeat();
2520        }
2521        else
2522          return super.addChild(name);
2523      }
2524
2525  public String fhirType() {
2526    return "SubstancePolymer";
2527
2528  }
2529
2530      public SubstancePolymer copy() {
2531        SubstancePolymer dst = new SubstancePolymer();
2532        copyValues(dst);
2533        return dst;
2534      }
2535
2536      public void copyValues(SubstancePolymer dst) {
2537        super.copyValues(dst);
2538        dst.identifier = identifier == null ? null : identifier.copy();
2539        dst.class_ = class_ == null ? null : class_.copy();
2540        dst.geometry = geometry == null ? null : geometry.copy();
2541        if (copolymerConnectivity != null) {
2542          dst.copolymerConnectivity = new ArrayList<CodeableConcept>();
2543          for (CodeableConcept i : copolymerConnectivity)
2544            dst.copolymerConnectivity.add(i.copy());
2545        };
2546        dst.modification = modification == null ? null : modification.copy();
2547        if (monomerSet != null) {
2548          dst.monomerSet = new ArrayList<SubstancePolymerMonomerSetComponent>();
2549          for (SubstancePolymerMonomerSetComponent i : monomerSet)
2550            dst.monomerSet.add(i.copy());
2551        };
2552        if (repeat != null) {
2553          dst.repeat = new ArrayList<SubstancePolymerRepeatComponent>();
2554          for (SubstancePolymerRepeatComponent i : repeat)
2555            dst.repeat.add(i.copy());
2556        };
2557      }
2558
2559      protected SubstancePolymer typedCopy() {
2560        return copy();
2561      }
2562
2563      @Override
2564      public boolean equalsDeep(Base other_) {
2565        if (!super.equalsDeep(other_))
2566          return false;
2567        if (!(other_ instanceof SubstancePolymer))
2568          return false;
2569        SubstancePolymer o = (SubstancePolymer) other_;
2570        return compareDeep(identifier, o.identifier, true) && compareDeep(class_, o.class_, true) && compareDeep(geometry, o.geometry, true)
2571           && compareDeep(copolymerConnectivity, o.copolymerConnectivity, true) && compareDeep(modification, o.modification, true)
2572           && compareDeep(monomerSet, o.monomerSet, true) && compareDeep(repeat, o.repeat, true);
2573      }
2574
2575      @Override
2576      public boolean equalsShallow(Base other_) {
2577        if (!super.equalsShallow(other_))
2578          return false;
2579        if (!(other_ instanceof SubstancePolymer))
2580          return false;
2581        SubstancePolymer o = (SubstancePolymer) other_;
2582        return compareValues(modification, o.modification, true);
2583      }
2584
2585      public boolean isEmpty() {
2586        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(identifier, class_, geometry
2587          , copolymerConnectivity, modification, monomerSet, repeat);
2588      }
2589
2590  @Override
2591  public ResourceType getResourceType() {
2592    return ResourceType.SubstancePolymer;
2593   }
2594
2595
2596}
2597