001package org.hl7.fhir.r4.model;
002
003/*
004  Copyright (c) 2011+, HL7, Inc.
005  All rights reserved.
006  
007  Redistribution and use in source and binary forms, with or without modification, 
008  are permitted provided that the following conditions are met:
009  
010   * Redistributions of source code must retain the above copyright notice, this 
011     list of conditions and the following disclaimer.
012   * Redistributions in binary form must reproduce the above copyright notice, 
013     this list of conditions and the following disclaimer in the documentation 
014     and/or other materials provided with the distribution.
015   * Neither the name of HL7 nor the names of its contributors may be used to 
016     endorse or promote products derived from this software without specific 
017     prior written permission.
018  
019  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
020  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
021  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
022  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
023  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
024  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
025  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
026  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
027  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
028  POSSIBILITY OF SUCH DAMAGE.
029  
030*/
031
032// Generated on Tue, May 12, 2020 07:26+1000 for FHIR v4.0.1
033import java.util.ArrayList;
034import java.util.List;
035
036import org.hl7.fhir.exceptions.FHIRException;
037import org.hl7.fhir.instance.model.api.ICompositeType;
038
039import ca.uhn.fhir.model.api.annotation.Child;
040import ca.uhn.fhir.model.api.annotation.DatatypeDef;
041import ca.uhn.fhir.model.api.annotation.Description;
042
043/**
044 * The shelf-life and storage information for a medicinal product item or
045 * container can be described using this class.
046 */
047@DatatypeDef(name = "ProductShelfLife")
048public class ProductShelfLife extends BackboneType implements ICompositeType {
049
050  /**
051   * Unique identifier for the packaged Medicinal Product.
052   */
053  @Child(name = "identifier", type = {
054      Identifier.class }, order = 0, min = 0, max = 1, modifier = false, summary = true)
055  @Description(shortDefinition = "Unique identifier for the packaged Medicinal Product", formalDefinition = "Unique identifier for the packaged Medicinal Product.")
056  protected Identifier identifier;
057
058  /**
059   * This describes the shelf life, taking into account various scenarios such as
060   * shelf life of the packaged Medicinal Product itself, shelf life after
061   * transformation where necessary and shelf life after the first opening of a
062   * bottle, etc. The shelf life type shall be specified using an appropriate
063   * controlled vocabulary The controlled term and the controlled term identifier
064   * shall be specified.
065   */
066  @Child(name = "type", type = { CodeableConcept.class }, order = 1, min = 1, max = 1, modifier = false, summary = true)
067  @Description(shortDefinition = "This describes the shelf life, taking into account various scenarios such as shelf life of the packaged Medicinal Product itself, shelf life after transformation where necessary and shelf life after the first opening of a bottle, etc. The shelf life type shall be specified using an appropriate controlled vocabulary The controlled term and the controlled term identifier shall be specified", formalDefinition = "This describes the shelf life, taking into account various scenarios such as shelf life of the packaged Medicinal Product itself, shelf life after transformation where necessary and shelf life after the first opening of a bottle, etc. The shelf life type shall be specified using an appropriate controlled vocabulary The controlled term and the controlled term identifier shall be specified.")
068  protected CodeableConcept type;
069
070  /**
071   * The shelf life time period can be specified using a numerical value for the
072   * period of time and its unit of time measurement The unit of measurement shall
073   * be specified in accordance with ISO 11240 and the resulting terminology The
074   * symbol and the symbol identifier shall be used.
075   */
076  @Child(name = "period", type = { Quantity.class }, order = 2, min = 1, max = 1, modifier = false, summary = true)
077  @Description(shortDefinition = "The shelf life time period can be specified using a numerical value for the period of time and its unit of time measurement The unit of measurement shall be specified in accordance with ISO 11240 and the resulting terminology The symbol and the symbol identifier shall be used", formalDefinition = "The shelf life time period can be specified using a numerical value for the period of time and its unit of time measurement The unit of measurement shall be specified in accordance with ISO 11240 and the resulting terminology The symbol and the symbol identifier shall be used.")
078  protected Quantity period;
079
080  /**
081   * Special precautions for storage, if any, can be specified using an
082   * appropriate controlled vocabulary The controlled term and the controlled term
083   * identifier shall be specified.
084   */
085  @Child(name = "specialPrecautionsForStorage", type = {
086      CodeableConcept.class }, order = 3, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = true)
087  @Description(shortDefinition = "Special precautions for storage, if any, can be specified using an appropriate controlled vocabulary The controlled term and the controlled term identifier shall be specified", formalDefinition = "Special precautions for storage, if any, can be specified using an appropriate controlled vocabulary The controlled term and the controlled term identifier shall be specified.")
088  protected List<CodeableConcept> specialPrecautionsForStorage;
089
090  private static final long serialVersionUID = -1561196410L;
091
092  /**
093   * Constructor
094   */
095  public ProductShelfLife() {
096    super();
097  }
098
099  /**
100   * Constructor
101   */
102  public ProductShelfLife(CodeableConcept type, Quantity period) {
103    super();
104    this.type = type;
105    this.period = period;
106  }
107
108  /**
109   * @return {@link #identifier} (Unique identifier for the packaged Medicinal
110   *         Product.)
111   */
112  public Identifier getIdentifier() {
113    if (this.identifier == null)
114      if (Configuration.errorOnAutoCreate())
115        throw new Error("Attempt to auto-create ProductShelfLife.identifier");
116      else if (Configuration.doAutoCreate())
117        this.identifier = new Identifier(); // cc
118    return this.identifier;
119  }
120
121  public boolean hasIdentifier() {
122    return this.identifier != null && !this.identifier.isEmpty();
123  }
124
125  /**
126   * @param value {@link #identifier} (Unique identifier for the packaged
127   *              Medicinal Product.)
128   */
129  public ProductShelfLife setIdentifier(Identifier value) {
130    this.identifier = value;
131    return this;
132  }
133
134  /**
135   * @return {@link #type} (This describes the shelf life, taking into account
136   *         various scenarios such as shelf life of the packaged Medicinal
137   *         Product itself, shelf life after transformation where necessary and
138   *         shelf life after the first opening of a bottle, etc. The shelf life
139   *         type shall be specified using an appropriate controlled vocabulary
140   *         The controlled term and the controlled term identifier shall be
141   *         specified.)
142   */
143  public CodeableConcept getType() {
144    if (this.type == null)
145      if (Configuration.errorOnAutoCreate())
146        throw new Error("Attempt to auto-create ProductShelfLife.type");
147      else if (Configuration.doAutoCreate())
148        this.type = new CodeableConcept(); // cc
149    return this.type;
150  }
151
152  public boolean hasType() {
153    return this.type != null && !this.type.isEmpty();
154  }
155
156  /**
157   * @param value {@link #type} (This describes the shelf life, taking into
158   *              account various scenarios such as shelf life of the packaged
159   *              Medicinal Product itself, shelf life after transformation where
160   *              necessary and shelf life after the first opening of a bottle,
161   *              etc. The shelf life type shall be specified using an appropriate
162   *              controlled vocabulary The controlled term and the controlled
163   *              term identifier shall be specified.)
164   */
165  public ProductShelfLife setType(CodeableConcept value) {
166    this.type = value;
167    return this;
168  }
169
170  /**
171   * @return {@link #period} (The shelf life time period can be specified using a
172   *         numerical value for the period of time and its unit of time
173   *         measurement The unit of measurement shall be specified in accordance
174   *         with ISO 11240 and the resulting terminology The symbol and the
175   *         symbol identifier shall be used.)
176   */
177  public Quantity getPeriod() {
178    if (this.period == null)
179      if (Configuration.errorOnAutoCreate())
180        throw new Error("Attempt to auto-create ProductShelfLife.period");
181      else if (Configuration.doAutoCreate())
182        this.period = new Quantity(); // cc
183    return this.period;
184  }
185
186  public boolean hasPeriod() {
187    return this.period != null && !this.period.isEmpty();
188  }
189
190  /**
191   * @param value {@link #period} (The shelf life time period can be specified
192   *              using a numerical value for the period of time and its unit of
193   *              time measurement The unit of measurement shall be specified in
194   *              accordance with ISO 11240 and the resulting terminology The
195   *              symbol and the symbol identifier shall be used.)
196   */
197  public ProductShelfLife setPeriod(Quantity value) {
198    this.period = value;
199    return this;
200  }
201
202  /**
203   * @return {@link #specialPrecautionsForStorage} (Special precautions for
204   *         storage, if any, can be specified using an appropriate controlled
205   *         vocabulary The controlled term and the controlled term identifier
206   *         shall be specified.)
207   */
208  public List<CodeableConcept> getSpecialPrecautionsForStorage() {
209    if (this.specialPrecautionsForStorage == null)
210      this.specialPrecautionsForStorage = new ArrayList<CodeableConcept>();
211    return this.specialPrecautionsForStorage;
212  }
213
214  /**
215   * @return Returns a reference to <code>this</code> for easy method chaining
216   */
217  public ProductShelfLife setSpecialPrecautionsForStorage(List<CodeableConcept> theSpecialPrecautionsForStorage) {
218    this.specialPrecautionsForStorage = theSpecialPrecautionsForStorage;
219    return this;
220  }
221
222  public boolean hasSpecialPrecautionsForStorage() {
223    if (this.specialPrecautionsForStorage == null)
224      return false;
225    for (CodeableConcept item : this.specialPrecautionsForStorage)
226      if (!item.isEmpty())
227        return true;
228    return false;
229  }
230
231  public CodeableConcept addSpecialPrecautionsForStorage() { // 3
232    CodeableConcept t = new CodeableConcept();
233    if (this.specialPrecautionsForStorage == null)
234      this.specialPrecautionsForStorage = new ArrayList<CodeableConcept>();
235    this.specialPrecautionsForStorage.add(t);
236    return t;
237  }
238
239  public ProductShelfLife addSpecialPrecautionsForStorage(CodeableConcept t) { // 3
240    if (t == null)
241      return this;
242    if (this.specialPrecautionsForStorage == null)
243      this.specialPrecautionsForStorage = new ArrayList<CodeableConcept>();
244    this.specialPrecautionsForStorage.add(t);
245    return this;
246  }
247
248  /**
249   * @return The first repetition of repeating field
250   *         {@link #specialPrecautionsForStorage}, creating it if it does not
251   *         already exist
252   */
253  public CodeableConcept getSpecialPrecautionsForStorageFirstRep() {
254    if (getSpecialPrecautionsForStorage().isEmpty()) {
255      addSpecialPrecautionsForStorage();
256    }
257    return getSpecialPrecautionsForStorage().get(0);
258  }
259
260  protected void listChildren(List<Property> children) {
261    super.listChildren(children);
262    children.add(new Property("identifier", "Identifier", "Unique identifier for the packaged Medicinal Product.", 0, 1,
263        identifier));
264    children.add(new Property("type", "CodeableConcept",
265        "This describes the shelf life, taking into account various scenarios such as shelf life of the packaged Medicinal Product itself, shelf life after transformation where necessary and shelf life after the first opening of a bottle, etc. The shelf life type shall be specified using an appropriate controlled vocabulary The controlled term and the controlled term identifier shall be specified.",
266        0, 1, type));
267    children.add(new Property("period", "Quantity",
268        "The shelf life time period can be specified using a numerical value for the period of time and its unit of time measurement The unit of measurement shall be specified in accordance with ISO 11240 and the resulting terminology The symbol and the symbol identifier shall be used.",
269        0, 1, period));
270    children.add(new Property("specialPrecautionsForStorage", "CodeableConcept",
271        "Special precautions for storage, if any, can be specified using an appropriate controlled vocabulary The controlled term and the controlled term identifier shall be specified.",
272        0, java.lang.Integer.MAX_VALUE, specialPrecautionsForStorage));
273  }
274
275  @Override
276  public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
277    switch (_hash) {
278    case -1618432855:
279      /* identifier */ return new Property("identifier", "Identifier",
280          "Unique identifier for the packaged Medicinal Product.", 0, 1, identifier);
281    case 3575610:
282      /* type */ return new Property("type", "CodeableConcept",
283          "This describes the shelf life, taking into account various scenarios such as shelf life of the packaged Medicinal Product itself, shelf life after transformation where necessary and shelf life after the first opening of a bottle, etc. The shelf life type shall be specified using an appropriate controlled vocabulary The controlled term and the controlled term identifier shall be specified.",
284          0, 1, type);
285    case -991726143:
286      /* period */ return new Property("period", "Quantity",
287          "The shelf life time period can be specified using a numerical value for the period of time and its unit of time measurement The unit of measurement shall be specified in accordance with ISO 11240 and the resulting terminology The symbol and the symbol identifier shall be used.",
288          0, 1, period);
289    case 2103459492:
290      /* specialPrecautionsForStorage */ return new Property("specialPrecautionsForStorage", "CodeableConcept",
291          "Special precautions for storage, if any, can be specified using an appropriate controlled vocabulary The controlled term and the controlled term identifier shall be specified.",
292          0, java.lang.Integer.MAX_VALUE, specialPrecautionsForStorage);
293    default:
294      return super.getNamedProperty(_hash, _name, _checkValid);
295    }
296
297  }
298
299  @Override
300  public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
301    switch (hash) {
302    case -1618432855:
303      /* identifier */ return this.identifier == null ? new Base[0] : new Base[] { this.identifier }; // Identifier
304    case 3575610:
305      /* type */ return this.type == null ? new Base[0] : new Base[] { this.type }; // CodeableConcept
306    case -991726143:
307      /* period */ return this.period == null ? new Base[0] : new Base[] { this.period }; // Quantity
308    case 2103459492:
309      /* specialPrecautionsForStorage */ return this.specialPrecautionsForStorage == null ? new Base[0]
310          : this.specialPrecautionsForStorage.toArray(new Base[this.specialPrecautionsForStorage.size()]); // CodeableConcept
311    default:
312      return super.getProperty(hash, name, checkValid);
313    }
314
315  }
316
317  @Override
318  public Base setProperty(int hash, String name, Base value) throws FHIRException {
319    switch (hash) {
320    case -1618432855: // identifier
321      this.identifier = castToIdentifier(value); // Identifier
322      return value;
323    case 3575610: // type
324      this.type = castToCodeableConcept(value); // CodeableConcept
325      return value;
326    case -991726143: // period
327      this.period = castToQuantity(value); // Quantity
328      return value;
329    case 2103459492: // specialPrecautionsForStorage
330      this.getSpecialPrecautionsForStorage().add(castToCodeableConcept(value)); // CodeableConcept
331      return value;
332    default:
333      return super.setProperty(hash, name, value);
334    }
335
336  }
337
338  @Override
339  public Base setProperty(String name, Base value) throws FHIRException {
340    if (name.equals("identifier")) {
341      this.identifier = castToIdentifier(value); // Identifier
342    } else if (name.equals("type")) {
343      this.type = castToCodeableConcept(value); // CodeableConcept
344    } else if (name.equals("period")) {
345      this.period = castToQuantity(value); // Quantity
346    } else if (name.equals("specialPrecautionsForStorage")) {
347      this.getSpecialPrecautionsForStorage().add(castToCodeableConcept(value));
348    } else
349      return super.setProperty(name, value);
350    return value;
351  }
352
353  @Override
354  public void removeChild(String name, Base value) throws FHIRException {
355    if (name.equals("identifier")) {
356      this.identifier = null;
357    } else if (name.equals("type")) {
358      this.type = null;
359    } else if (name.equals("period")) {
360      this.period = null;
361    } else if (name.equals("specialPrecautionsForStorage")) {
362      this.getSpecialPrecautionsForStorage().remove(castToCodeableConcept(value));
363    } else
364      super.removeChild(name, value);
365    
366  }
367
368  @Override
369  public Base makeProperty(int hash, String name) throws FHIRException {
370    switch (hash) {
371    case -1618432855:
372      return getIdentifier();
373    case 3575610:
374      return getType();
375    case -991726143:
376      return getPeriod();
377    case 2103459492:
378      return addSpecialPrecautionsForStorage();
379    default:
380      return super.makeProperty(hash, name);
381    }
382
383  }
384
385  @Override
386  public String[] getTypesForProperty(int hash, String name) throws FHIRException {
387    switch (hash) {
388    case -1618432855:
389      /* identifier */ return new String[] { "Identifier" };
390    case 3575610:
391      /* type */ return new String[] { "CodeableConcept" };
392    case -991726143:
393      /* period */ return new String[] { "Quantity" };
394    case 2103459492:
395      /* specialPrecautionsForStorage */ return new String[] { "CodeableConcept" };
396    default:
397      return super.getTypesForProperty(hash, name);
398    }
399
400  }
401
402  @Override
403  public Base addChild(String name) throws FHIRException {
404    if (name.equals("identifier")) {
405      this.identifier = new Identifier();
406      return this.identifier;
407    } else if (name.equals("type")) {
408      this.type = new CodeableConcept();
409      return this.type;
410    } else if (name.equals("period")) {
411      this.period = new Quantity();
412      return this.period;
413    } else if (name.equals("specialPrecautionsForStorage")) {
414      return addSpecialPrecautionsForStorage();
415    } else
416      return super.addChild(name);
417  }
418
419  public String fhirType() {
420    return "ProductShelfLife";
421
422  }
423
424  public ProductShelfLife copy() {
425    ProductShelfLife dst = new ProductShelfLife();
426    copyValues(dst);
427    return dst;
428  }
429
430  public void copyValues(ProductShelfLife dst) {
431    super.copyValues(dst);
432    dst.identifier = identifier == null ? null : identifier.copy();
433    dst.type = type == null ? null : type.copy();
434    dst.period = period == null ? null : period.copy();
435    if (specialPrecautionsForStorage != null) {
436      dst.specialPrecautionsForStorage = new ArrayList<CodeableConcept>();
437      for (CodeableConcept i : specialPrecautionsForStorage)
438        dst.specialPrecautionsForStorage.add(i.copy());
439    }
440    ;
441  }
442
443  protected ProductShelfLife typedCopy() {
444    return copy();
445  }
446
447  @Override
448  public boolean equalsDeep(Base other_) {
449    if (!super.equalsDeep(other_))
450      return false;
451    if (!(other_ instanceof ProductShelfLife))
452      return false;
453    ProductShelfLife o = (ProductShelfLife) other_;
454    return compareDeep(identifier, o.identifier, true) && compareDeep(type, o.type, true)
455        && compareDeep(period, o.period, true)
456        && compareDeep(specialPrecautionsForStorage, o.specialPrecautionsForStorage, true);
457  }
458
459  @Override
460  public boolean equalsShallow(Base other_) {
461    if (!super.equalsShallow(other_))
462      return false;
463    if (!(other_ instanceof ProductShelfLife))
464      return false;
465    ProductShelfLife o = (ProductShelfLife) other_;
466    return true;
467  }
468
469  public boolean isEmpty() {
470    return super.isEmpty()
471        && ca.uhn.fhir.util.ElementUtil.isEmpty(identifier, type, period, specialPrecautionsForStorage);
472  }
473
474}