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 Thu, Mar 23, 2023 19:59+1100 for FHIR v5.0.0
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.IBaseDatatypeElement;
040import org.hl7.fhir.exceptions.FHIRException;
041import org.hl7.fhir.instance.model.api.ICompositeType;
042import ca.uhn.fhir.model.api.annotation.Child;
043import ca.uhn.fhir.model.api.annotation.ChildOrder;
044import ca.uhn.fhir.model.api.annotation.DatatypeDef;
045import ca.uhn.fhir.model.api.annotation.Description;
046import ca.uhn.fhir.model.api.annotation.Block;
047
048/**
049 * Expression Type: A expression that is evaluated in a specified context and returns a value. The context of use of the expression must specify the context in which the expression is evaluated, and how the result of the expression is used.
050 */
051@DatatypeDef(name="Expression")
052public class Expression extends DataType implements ICompositeType {
053
054    /**
055     * A brief, natural language description of the condition that effectively communicates the intended semantics.
056     */
057    @Child(name = "description", type = {StringType.class}, order=0, min=0, max=1, modifier=false, summary=true)
058    @Description(shortDefinition="Natural language description of the condition", formalDefinition="A brief, natural language description of the condition that effectively communicates the intended semantics." )
059    protected StringType description;
060
061    /**
062     * A short name assigned to the expression to allow for multiple reuse of the expression in the context where it is defined.
063     */
064    @Child(name = "name", type = {CodeType.class}, order=1, min=0, max=1, modifier=false, summary=true)
065    @Description(shortDefinition="Short name assigned to expression for reuse", formalDefinition="A short name assigned to the expression to allow for multiple reuse of the expression in the context where it is defined." )
066    protected CodeType name;
067
068    /**
069     * The media type of the language for the expression.
070     */
071    @Child(name = "language", type = {CodeType.class}, order=2, min=0, max=1, modifier=false, summary=true)
072    @Description(shortDefinition="text/cql | text/fhirpath | application/x-fhir-query | etc.", formalDefinition="The media type of the language for the expression." )
073    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/expression-language")
074    protected CodeType language;
075
076    /**
077     * An expression in the specified language that returns a value.
078     */
079    @Child(name = "expression", type = {StringType.class}, order=3, min=0, max=1, modifier=false, summary=true)
080    @Description(shortDefinition="Expression in specified language", formalDefinition="An expression in the specified language that returns a value." )
081    protected StringType expression;
082
083    /**
084     * A URI that defines where the expression is found.
085     */
086    @Child(name = "reference", type = {UriType.class}, order=4, min=0, max=1, modifier=false, summary=true)
087    @Description(shortDefinition="Where the expression is found", formalDefinition="A URI that defines where the expression is found." )
088    protected UriType reference;
089
090    private static final long serialVersionUID = -1266682572L;
091
092  /**
093   * Constructor
094   */
095    public Expression() {
096      super();
097    }
098
099    /**
100     * @return {@link #description} (A brief, natural language description of the condition that effectively communicates the intended semantics.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
101     */
102    public StringType getDescriptionElement() { 
103      if (this.description == null)
104        if (Configuration.errorOnAutoCreate())
105          throw new Error("Attempt to auto-create Expression.description");
106        else if (Configuration.doAutoCreate())
107          this.description = new StringType(); // bb
108      return this.description;
109    }
110
111    public boolean hasDescriptionElement() { 
112      return this.description != null && !this.description.isEmpty();
113    }
114
115    public boolean hasDescription() { 
116      return this.description != null && !this.description.isEmpty();
117    }
118
119    /**
120     * @param value {@link #description} (A brief, natural language description of the condition that effectively communicates the intended semantics.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
121     */
122    public Expression setDescriptionElement(StringType value) { 
123      this.description = value;
124      return this;
125    }
126
127    /**
128     * @return A brief, natural language description of the condition that effectively communicates the intended semantics.
129     */
130    public String getDescription() { 
131      return this.description == null ? null : this.description.getValue();
132    }
133
134    /**
135     * @param value A brief, natural language description of the condition that effectively communicates the intended semantics.
136     */
137    public Expression setDescription(String value) { 
138      if (Utilities.noString(value))
139        this.description = null;
140      else {
141        if (this.description == null)
142          this.description = new StringType();
143        this.description.setValue(value);
144      }
145      return this;
146    }
147
148    /**
149     * @return {@link #name} (A short name assigned to the expression to allow for multiple reuse of the expression in the context where it is defined.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
150     */
151    public CodeType getNameElement() { 
152      if (this.name == null)
153        if (Configuration.errorOnAutoCreate())
154          throw new Error("Attempt to auto-create Expression.name");
155        else if (Configuration.doAutoCreate())
156          this.name = new CodeType(); // bb
157      return this.name;
158    }
159
160    public boolean hasNameElement() { 
161      return this.name != null && !this.name.isEmpty();
162    }
163
164    public boolean hasName() { 
165      return this.name != null && !this.name.isEmpty();
166    }
167
168    /**
169     * @param value {@link #name} (A short name assigned to the expression to allow for multiple reuse of the expression in the context where it is defined.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
170     */
171    public Expression setNameElement(CodeType value) { 
172      this.name = value;
173      return this;
174    }
175
176    /**
177     * @return A short name assigned to the expression to allow for multiple reuse of the expression in the context where it is defined.
178     */
179    public String getName() { 
180      return this.name == null ? null : this.name.getValue();
181    }
182
183    /**
184     * @param value A short name assigned to the expression to allow for multiple reuse of the expression in the context where it is defined.
185     */
186    public Expression setName(String value) { 
187      if (Utilities.noString(value))
188        this.name = null;
189      else {
190        if (this.name == null)
191          this.name = new CodeType();
192        this.name.setValue(value);
193      }
194      return this;
195    }
196
197    /**
198     * @return {@link #language} (The media type of the language for the expression.). This is the underlying object with id, value and extensions. The accessor "getLanguage" gives direct access to the value
199     */
200    public CodeType getLanguageElement() { 
201      if (this.language == null)
202        if (Configuration.errorOnAutoCreate())
203          throw new Error("Attempt to auto-create Expression.language");
204        else if (Configuration.doAutoCreate())
205          this.language = new CodeType(); // bb
206      return this.language;
207    }
208
209    public boolean hasLanguageElement() { 
210      return this.language != null && !this.language.isEmpty();
211    }
212
213    public boolean hasLanguage() { 
214      return this.language != null && !this.language.isEmpty();
215    }
216
217    /**
218     * @param value {@link #language} (The media type of the language for the expression.). This is the underlying object with id, value and extensions. The accessor "getLanguage" gives direct access to the value
219     */
220    public Expression setLanguageElement(CodeType value) { 
221      this.language = value;
222      return this;
223    }
224
225    /**
226     * @return The media type of the language for the expression.
227     */
228    public String getLanguage() { 
229      return this.language == null ? null : this.language.getValue();
230    }
231
232    /**
233     * @param value The media type of the language for the expression.
234     */
235    public Expression setLanguage(String value) { 
236      if (Utilities.noString(value))
237        this.language = null;
238      else {
239        if (this.language == null)
240          this.language = new CodeType();
241        this.language.setValue(value);
242      }
243      return this;
244    }
245
246    /**
247     * @return {@link #expression} (An expression in the specified language that returns a value.). This is the underlying object with id, value and extensions. The accessor "getExpression" gives direct access to the value
248     */
249    public StringType getExpressionElement() { 
250      if (this.expression == null)
251        if (Configuration.errorOnAutoCreate())
252          throw new Error("Attempt to auto-create Expression.expression");
253        else if (Configuration.doAutoCreate())
254          this.expression = new StringType(); // bb
255      return this.expression;
256    }
257
258    public boolean hasExpressionElement() { 
259      return this.expression != null && !this.expression.isEmpty();
260    }
261
262    public boolean hasExpression() { 
263      return this.expression != null && !this.expression.isEmpty();
264    }
265
266    /**
267     * @param value {@link #expression} (An expression in the specified language that returns a value.). This is the underlying object with id, value and extensions. The accessor "getExpression" gives direct access to the value
268     */
269    public Expression setExpressionElement(StringType value) { 
270      this.expression = value;
271      return this;
272    }
273
274    /**
275     * @return An expression in the specified language that returns a value.
276     */
277    public String getExpression() { 
278      return this.expression == null ? null : this.expression.getValue();
279    }
280
281    /**
282     * @param value An expression in the specified language that returns a value.
283     */
284    public Expression setExpression(String value) { 
285      if (Utilities.noString(value))
286        this.expression = null;
287      else {
288        if (this.expression == null)
289          this.expression = new StringType();
290        this.expression.setValue(value);
291      }
292      return this;
293    }
294
295    /**
296     * @return {@link #reference} (A URI that defines where the expression is found.). This is the underlying object with id, value and extensions. The accessor "getReference" gives direct access to the value
297     */
298    public UriType getReferenceElement() { 
299      if (this.reference == null)
300        if (Configuration.errorOnAutoCreate())
301          throw new Error("Attempt to auto-create Expression.reference");
302        else if (Configuration.doAutoCreate())
303          this.reference = new UriType(); // bb
304      return this.reference;
305    }
306
307    public boolean hasReferenceElement() { 
308      return this.reference != null && !this.reference.isEmpty();
309    }
310
311    public boolean hasReference() { 
312      return this.reference != null && !this.reference.isEmpty();
313    }
314
315    /**
316     * @param value {@link #reference} (A URI that defines where the expression is found.). This is the underlying object with id, value and extensions. The accessor "getReference" gives direct access to the value
317     */
318    public Expression setReferenceElement(UriType value) { 
319      this.reference = value;
320      return this;
321    }
322
323    /**
324     * @return A URI that defines where the expression is found.
325     */
326    public String getReference() { 
327      return this.reference == null ? null : this.reference.getValue();
328    }
329
330    /**
331     * @param value A URI that defines where the expression is found.
332     */
333    public Expression setReference(String value) { 
334      if (Utilities.noString(value))
335        this.reference = null;
336      else {
337        if (this.reference == null)
338          this.reference = new UriType();
339        this.reference.setValue(value);
340      }
341      return this;
342    }
343
344      protected void listChildren(List<Property> children) {
345        super.listChildren(children);
346        children.add(new Property("description", "string", "A brief, natural language description of the condition that effectively communicates the intended semantics.", 0, 1, description));
347        children.add(new Property("name", "code", "A short name assigned to the expression to allow for multiple reuse of the expression in the context where it is defined.", 0, 1, name));
348        children.add(new Property("language", "code", "The media type of the language for the expression.", 0, 1, language));
349        children.add(new Property("expression", "string", "An expression in the specified language that returns a value.", 0, 1, expression));
350        children.add(new Property("reference", "uri", "A URI that defines where the expression is found.", 0, 1, reference));
351      }
352
353      @Override
354      public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
355        switch (_hash) {
356        case -1724546052: /*description*/  return new Property("description", "string", "A brief, natural language description of the condition that effectively communicates the intended semantics.", 0, 1, description);
357        case 3373707: /*name*/  return new Property("name", "code", "A short name assigned to the expression to allow for multiple reuse of the expression in the context where it is defined.", 0, 1, name);
358        case -1613589672: /*language*/  return new Property("language", "code", "The media type of the language for the expression.", 0, 1, language);
359        case -1795452264: /*expression*/  return new Property("expression", "string", "An expression in the specified language that returns a value.", 0, 1, expression);
360        case -925155509: /*reference*/  return new Property("reference", "uri", "A URI that defines where the expression is found.", 0, 1, reference);
361        default: return super.getNamedProperty(_hash, _name, _checkValid);
362        }
363
364      }
365
366      @Override
367      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
368        switch (hash) {
369        case -1724546052: /*description*/ return this.description == null ? new Base[0] : new Base[] {this.description}; // StringType
370        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // CodeType
371        case -1613589672: /*language*/ return this.language == null ? new Base[0] : new Base[] {this.language}; // CodeType
372        case -1795452264: /*expression*/ return this.expression == null ? new Base[0] : new Base[] {this.expression}; // StringType
373        case -925155509: /*reference*/ return this.reference == null ? new Base[0] : new Base[] {this.reference}; // UriType
374        default: return super.getProperty(hash, name, checkValid);
375        }
376
377      }
378
379      @Override
380      public Base setProperty(int hash, String name, Base value) throws FHIRException {
381        switch (hash) {
382        case -1724546052: // description
383          this.description = TypeConvertor.castToString(value); // StringType
384          return value;
385        case 3373707: // name
386          this.name = TypeConvertor.castToCode(value); // CodeType
387          return value;
388        case -1613589672: // language
389          this.language = TypeConvertor.castToCode(value); // CodeType
390          return value;
391        case -1795452264: // expression
392          this.expression = TypeConvertor.castToString(value); // StringType
393          return value;
394        case -925155509: // reference
395          this.reference = TypeConvertor.castToUri(value); // UriType
396          return value;
397        default: return super.setProperty(hash, name, value);
398        }
399
400      }
401
402      @Override
403      public Base setProperty(String name, Base value) throws FHIRException {
404        if (name.equals("description")) {
405          this.description = TypeConvertor.castToString(value); // StringType
406        } else if (name.equals("name")) {
407          this.name = TypeConvertor.castToCode(value); // CodeType
408        } else if (name.equals("language")) {
409          this.language = TypeConvertor.castToCode(value); // CodeType
410        } else if (name.equals("expression")) {
411          this.expression = TypeConvertor.castToString(value); // StringType
412        } else if (name.equals("reference")) {
413          this.reference = TypeConvertor.castToUri(value); // UriType
414        } else
415          return super.setProperty(name, value);
416        return value;
417      }
418
419      @Override
420      public Base makeProperty(int hash, String name) throws FHIRException {
421        switch (hash) {
422        case -1724546052:  return getDescriptionElement();
423        case 3373707:  return getNameElement();
424        case -1613589672:  return getLanguageElement();
425        case -1795452264:  return getExpressionElement();
426        case -925155509:  return getReferenceElement();
427        default: return super.makeProperty(hash, name);
428        }
429
430      }
431
432      @Override
433      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
434        switch (hash) {
435        case -1724546052: /*description*/ return new String[] {"string"};
436        case 3373707: /*name*/ return new String[] {"code"};
437        case -1613589672: /*language*/ return new String[] {"code"};
438        case -1795452264: /*expression*/ return new String[] {"string"};
439        case -925155509: /*reference*/ return new String[] {"uri"};
440        default: return super.getTypesForProperty(hash, name);
441        }
442
443      }
444
445      @Override
446      public Base addChild(String name) throws FHIRException {
447        if (name.equals("description")) {
448          throw new FHIRException("Cannot call addChild on a singleton property Expression.description");
449        }
450        else if (name.equals("name")) {
451          throw new FHIRException("Cannot call addChild on a singleton property Expression.name");
452        }
453        else if (name.equals("language")) {
454          throw new FHIRException("Cannot call addChild on a singleton property Expression.language");
455        }
456        else if (name.equals("expression")) {
457          throw new FHIRException("Cannot call addChild on a singleton property Expression.expression");
458        }
459        else if (name.equals("reference")) {
460          throw new FHIRException("Cannot call addChild on a singleton property Expression.reference");
461        }
462        else
463          return super.addChild(name);
464      }
465
466  public String fhirType() {
467    return "Expression";
468
469  }
470
471      public Expression copy() {
472        Expression dst = new Expression();
473        copyValues(dst);
474        return dst;
475      }
476
477      public void copyValues(Expression dst) {
478        super.copyValues(dst);
479        dst.description = description == null ? null : description.copy();
480        dst.name = name == null ? null : name.copy();
481        dst.language = language == null ? null : language.copy();
482        dst.expression = expression == null ? null : expression.copy();
483        dst.reference = reference == null ? null : reference.copy();
484      }
485
486      protected Expression typedCopy() {
487        return copy();
488      }
489
490      @Override
491      public boolean equalsDeep(Base other_) {
492        if (!super.equalsDeep(other_))
493          return false;
494        if (!(other_ instanceof Expression))
495          return false;
496        Expression o = (Expression) other_;
497        return compareDeep(description, o.description, true) && compareDeep(name, o.name, true) && compareDeep(language, o.language, true)
498           && compareDeep(expression, o.expression, true) && compareDeep(reference, o.reference, true);
499      }
500
501      @Override
502      public boolean equalsShallow(Base other_) {
503        if (!super.equalsShallow(other_))
504          return false;
505        if (!(other_ instanceof Expression))
506          return false;
507        Expression o = (Expression) other_;
508        return compareValues(description, o.description, true) && compareValues(name, o.name, true) && compareValues(language, o.language, true)
509           && compareValues(expression, o.expression, true) && compareValues(reference, o.reference, true);
510      }
511
512      public boolean isEmpty() {
513        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(description, name, language
514          , expression, reference);
515      }
516
517
518}
519