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;
038import org.hl7.fhir.utilities.Utilities;
039
040import ca.uhn.fhir.model.api.annotation.Child;
041import ca.uhn.fhir.model.api.annotation.DatatypeDef;
042import ca.uhn.fhir.model.api.annotation.Description;
043
044/**
045 * Specifies contact information for a person or organization.
046 */
047@DatatypeDef(name = "ContactDetail")
048public class ContactDetail extends Type implements ICompositeType {
049
050  /**
051   * The name of an individual to contact.
052   */
053  @Child(name = "name", type = { StringType.class }, order = 0, min = 0, max = 1, modifier = false, summary = true)
054  @Description(shortDefinition = "Name of an individual to contact", formalDefinition = "The name of an individual to contact.")
055  protected StringType name;
056
057  /**
058   * The contact details for the individual (if a name was provided) or the
059   * organization.
060   */
061  @Child(name = "telecom", type = {
062      ContactPoint.class }, order = 1, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = true)
063  @Description(shortDefinition = "Contact details for individual or organization", formalDefinition = "The contact details for the individual (if a name was provided) or the organization.")
064  protected List<ContactPoint> telecom;
065
066  private static final long serialVersionUID = 816838773L;
067
068  /**
069   * Constructor
070   */
071  public ContactDetail() {
072    super();
073  }
074
075  /**
076   * @return {@link #name} (The name of an individual to contact.). This is the
077   *         underlying object with id, value and extensions. The accessor
078   *         "getName" gives direct access to the value
079   */
080  public StringType getNameElement() {
081    if (this.name == null)
082      if (Configuration.errorOnAutoCreate())
083        throw new Error("Attempt to auto-create ContactDetail.name");
084      else if (Configuration.doAutoCreate())
085        this.name = new StringType(); // bb
086    return this.name;
087  }
088
089  public boolean hasNameElement() {
090    return this.name != null && !this.name.isEmpty();
091  }
092
093  public boolean hasName() {
094    return this.name != null && !this.name.isEmpty();
095  }
096
097  /**
098   * @param value {@link #name} (The name of an individual to contact.). This is
099   *              the underlying object with id, value and extensions. The
100   *              accessor "getName" gives direct access to the value
101   */
102  public ContactDetail setNameElement(StringType value) {
103    this.name = value;
104    return this;
105  }
106
107  /**
108   * @return The name of an individual to contact.
109   */
110  public String getName() {
111    return this.name == null ? null : this.name.getValue();
112  }
113
114  /**
115   * @param value The name of an individual to contact.
116   */
117  public ContactDetail setName(String value) {
118    if (Utilities.noString(value))
119      this.name = null;
120    else {
121      if (this.name == null)
122        this.name = new StringType();
123      this.name.setValue(value);
124    }
125    return this;
126  }
127
128  /**
129   * @return {@link #telecom} (The contact details for the individual (if a name
130   *         was provided) or the organization.)
131   */
132  public List<ContactPoint> getTelecom() {
133    if (this.telecom == null)
134      this.telecom = new ArrayList<ContactPoint>();
135    return this.telecom;
136  }
137
138  /**
139   * @return Returns a reference to <code>this</code> for easy method chaining
140   */
141  public ContactDetail setTelecom(List<ContactPoint> theTelecom) {
142    this.telecom = theTelecom;
143    return this;
144  }
145
146  public boolean hasTelecom() {
147    if (this.telecom == null)
148      return false;
149    for (ContactPoint item : this.telecom)
150      if (!item.isEmpty())
151        return true;
152    return false;
153  }
154
155  public ContactPoint addTelecom() { // 3
156    ContactPoint t = new ContactPoint();
157    if (this.telecom == null)
158      this.telecom = new ArrayList<ContactPoint>();
159    this.telecom.add(t);
160    return t;
161  }
162
163  public ContactDetail addTelecom(ContactPoint t) { // 3
164    if (t == null)
165      return this;
166    if (this.telecom == null)
167      this.telecom = new ArrayList<ContactPoint>();
168    this.telecom.add(t);
169    return this;
170  }
171
172  /**
173   * @return The first repetition of repeating field {@link #telecom}, creating it
174   *         if it does not already exist
175   */
176  public ContactPoint getTelecomFirstRep() {
177    if (getTelecom().isEmpty()) {
178      addTelecom();
179    }
180    return getTelecom().get(0);
181  }
182
183  protected void listChildren(List<Property> children) {
184    super.listChildren(children);
185    children.add(new Property("name", "string", "The name of an individual to contact.", 0, 1, name));
186    children.add(new Property("telecom", "ContactPoint",
187        "The contact details for the individual (if a name was provided) or the organization.", 0,
188        java.lang.Integer.MAX_VALUE, telecom));
189  }
190
191  @Override
192  public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
193    switch (_hash) {
194    case 3373707:
195      /* name */ return new Property("name", "string", "The name of an individual to contact.", 0, 1, name);
196    case -1429363305:
197      /* telecom */ return new Property("telecom", "ContactPoint",
198          "The contact details for the individual (if a name was provided) or the organization.", 0,
199          java.lang.Integer.MAX_VALUE, telecom);
200    default:
201      return super.getNamedProperty(_hash, _name, _checkValid);
202    }
203
204  }
205
206  @Override
207  public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
208    switch (hash) {
209    case 3373707:
210      /* name */ return this.name == null ? new Base[0] : new Base[] { this.name }; // StringType
211    case -1429363305:
212      /* telecom */ return this.telecom == null ? new Base[0] : this.telecom.toArray(new Base[this.telecom.size()]); // ContactPoint
213    default:
214      return super.getProperty(hash, name, checkValid);
215    }
216
217  }
218
219  @Override
220  public Base setProperty(int hash, String name, Base value) throws FHIRException {
221    switch (hash) {
222    case 3373707: // name
223      this.name = castToString(value); // StringType
224      return value;
225    case -1429363305: // telecom
226      this.getTelecom().add(castToContactPoint(value)); // ContactPoint
227      return value;
228    default:
229      return super.setProperty(hash, name, value);
230    }
231
232  }
233
234  @Override
235  public Base setProperty(String name, Base value) throws FHIRException {
236    if (name.equals("name")) {
237      this.name = castToString(value); // StringType
238    } else if (name.equals("telecom")) {
239      this.getTelecom().add(castToContactPoint(value));
240    } else
241      return super.setProperty(name, value);
242    return value;
243  }
244
245  @Override
246  public void removeChild(String name, Base value) throws FHIRException {
247    if (name.equals("name")) {
248      this.name = null;
249    } else if (name.equals("telecom")) {
250      this.getTelecom().remove(castToContactPoint(value));
251    } else
252      super.removeChild(name, value);
253    
254  }
255
256  @Override
257  public Base makeProperty(int hash, String name) throws FHIRException {
258    switch (hash) {
259    case 3373707:
260      return getNameElement();
261    case -1429363305:
262      return addTelecom();
263    default:
264      return super.makeProperty(hash, name);
265    }
266
267  }
268
269  @Override
270  public String[] getTypesForProperty(int hash, String name) throws FHIRException {
271    switch (hash) {
272    case 3373707:
273      /* name */ return new String[] { "string" };
274    case -1429363305:
275      /* telecom */ return new String[] { "ContactPoint" };
276    default:
277      return super.getTypesForProperty(hash, name);
278    }
279
280  }
281
282  @Override
283  public Base addChild(String name) throws FHIRException {
284    if (name.equals("name")) {
285      throw new FHIRException("Cannot call addChild on a singleton property ContactDetail.name");
286    } else if (name.equals("telecom")) {
287      return addTelecom();
288    } else
289      return super.addChild(name);
290  }
291
292  public String fhirType() {
293    return "ContactDetail";
294
295  }
296
297  public ContactDetail copy() {
298    ContactDetail dst = new ContactDetail();
299    copyValues(dst);
300    return dst;
301  }
302
303  public void copyValues(ContactDetail dst) {
304    super.copyValues(dst);
305    dst.name = name == null ? null : name.copy();
306    if (telecom != null) {
307      dst.telecom = new ArrayList<ContactPoint>();
308      for (ContactPoint i : telecom)
309        dst.telecom.add(i.copy());
310    }
311    ;
312  }
313
314  protected ContactDetail typedCopy() {
315    return copy();
316  }
317
318  @Override
319  public boolean equalsDeep(Base other_) {
320    if (!super.equalsDeep(other_))
321      return false;
322    if (!(other_ instanceof ContactDetail))
323      return false;
324    ContactDetail o = (ContactDetail) other_;
325    return compareDeep(name, o.name, true) && compareDeep(telecom, o.telecom, true);
326  }
327
328  @Override
329  public boolean equalsShallow(Base other_) {
330    if (!super.equalsShallow(other_))
331      return false;
332    if (!(other_ instanceof ContactDetail))
333      return false;
334    ContactDetail o = (ContactDetail) other_;
335    return compareValues(name, o.name, true);
336  }
337
338  public boolean isEmpty() {
339    return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(name, telecom);
340  }
341
342}