001package org.hl7.fhir.instance.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 Wed, Jul 13, 2016 05:32+1000 for FHIR v1.0.2
033import java.util.ArrayList;
034import java.util.List;
035
036import org.hl7.fhir.exceptions.FHIRException;
037import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
038import org.hl7.fhir.utilities.Utilities;
039
040import ca.uhn.fhir.model.api.annotation.*;
041/**
042 * Represents a defined collection of entities that may be discussed or acted upon collectively but which are not expected to act collectively and are not formally or legally recognized; i.e. a collection of entities that isn't an Organization.
043 */
044@ResourceDef(name="Group", profile="http://hl7.org/fhir/Profile/Group")
045public class Group extends DomainResource {
046
047    public enum GroupType {
048        /**
049         * Group contains "person" Patient resources
050         */
051        PERSON, 
052        /**
053         * Group contains "animal" Patient resources
054         */
055        ANIMAL, 
056        /**
057         * Group contains healthcare practitioner resources
058         */
059        PRACTITIONER, 
060        /**
061         * Group contains Device resources
062         */
063        DEVICE, 
064        /**
065         * Group contains Medication resources
066         */
067        MEDICATION, 
068        /**
069         * Group contains Substance resources
070         */
071        SUBSTANCE, 
072        /**
073         * added to help the parsers
074         */
075        NULL;
076        public static GroupType fromCode(String codeString) throws FHIRException {
077            if (codeString == null || "".equals(codeString))
078                return null;
079        if ("person".equals(codeString))
080          return PERSON;
081        if ("animal".equals(codeString))
082          return ANIMAL;
083        if ("practitioner".equals(codeString))
084          return PRACTITIONER;
085        if ("device".equals(codeString))
086          return DEVICE;
087        if ("medication".equals(codeString))
088          return MEDICATION;
089        if ("substance".equals(codeString))
090          return SUBSTANCE;
091        throw new FHIRException("Unknown GroupType code '"+codeString+"'");
092        }
093        public String toCode() {
094          switch (this) {
095            case PERSON: return "person";
096            case ANIMAL: return "animal";
097            case PRACTITIONER: return "practitioner";
098            case DEVICE: return "device";
099            case MEDICATION: return "medication";
100            case SUBSTANCE: return "substance";
101            default: return "?";
102          }
103        }
104        public String getSystem() {
105          switch (this) {
106            case PERSON: return "http://hl7.org/fhir/group-type";
107            case ANIMAL: return "http://hl7.org/fhir/group-type";
108            case PRACTITIONER: return "http://hl7.org/fhir/group-type";
109            case DEVICE: return "http://hl7.org/fhir/group-type";
110            case MEDICATION: return "http://hl7.org/fhir/group-type";
111            case SUBSTANCE: return "http://hl7.org/fhir/group-type";
112            default: return "?";
113          }
114        }
115        public String getDefinition() {
116          switch (this) {
117            case PERSON: return "Group contains \"person\" Patient resources";
118            case ANIMAL: return "Group contains \"animal\" Patient resources";
119            case PRACTITIONER: return "Group contains healthcare practitioner resources";
120            case DEVICE: return "Group contains Device resources";
121            case MEDICATION: return "Group contains Medication resources";
122            case SUBSTANCE: return "Group contains Substance resources";
123            default: return "?";
124          }
125        }
126        public String getDisplay() {
127          switch (this) {
128            case PERSON: return "Person";
129            case ANIMAL: return "Animal";
130            case PRACTITIONER: return "Practitioner";
131            case DEVICE: return "Device";
132            case MEDICATION: return "Medication";
133            case SUBSTANCE: return "Substance";
134            default: return "?";
135          }
136        }
137    }
138
139  public static class GroupTypeEnumFactory implements EnumFactory<GroupType> {
140    public GroupType fromCode(String codeString) throws IllegalArgumentException {
141      if (codeString == null || "".equals(codeString))
142            if (codeString == null || "".equals(codeString))
143                return null;
144        if ("person".equals(codeString))
145          return GroupType.PERSON;
146        if ("animal".equals(codeString))
147          return GroupType.ANIMAL;
148        if ("practitioner".equals(codeString))
149          return GroupType.PRACTITIONER;
150        if ("device".equals(codeString))
151          return GroupType.DEVICE;
152        if ("medication".equals(codeString))
153          return GroupType.MEDICATION;
154        if ("substance".equals(codeString))
155          return GroupType.SUBSTANCE;
156        throw new IllegalArgumentException("Unknown GroupType code '"+codeString+"'");
157        }
158        public Enumeration<GroupType> fromType(Base code) throws FHIRException {
159          if (code == null || code.isEmpty())
160            return null;
161          String codeString = ((PrimitiveType) code).asStringValue();
162          if (codeString == null || "".equals(codeString))
163            return null;
164        if ("person".equals(codeString))
165          return new Enumeration<GroupType>(this, GroupType.PERSON);
166        if ("animal".equals(codeString))
167          return new Enumeration<GroupType>(this, GroupType.ANIMAL);
168        if ("practitioner".equals(codeString))
169          return new Enumeration<GroupType>(this, GroupType.PRACTITIONER);
170        if ("device".equals(codeString))
171          return new Enumeration<GroupType>(this, GroupType.DEVICE);
172        if ("medication".equals(codeString))
173          return new Enumeration<GroupType>(this, GroupType.MEDICATION);
174        if ("substance".equals(codeString))
175          return new Enumeration<GroupType>(this, GroupType.SUBSTANCE);
176        throw new FHIRException("Unknown GroupType code '"+codeString+"'");
177        }
178    public String toCode(GroupType code) {
179      if (code == GroupType.PERSON)
180        return "person";
181      if (code == GroupType.ANIMAL)
182        return "animal";
183      if (code == GroupType.PRACTITIONER)
184        return "practitioner";
185      if (code == GroupType.DEVICE)
186        return "device";
187      if (code == GroupType.MEDICATION)
188        return "medication";
189      if (code == GroupType.SUBSTANCE)
190        return "substance";
191      return "?";
192      }
193    }
194
195    @Block()
196    public static class GroupCharacteristicComponent extends BackboneElement implements IBaseBackboneElement {
197        /**
198         * A code that identifies the kind of trait being asserted.
199         */
200        @Child(name = "code", type = {CodeableConcept.class}, order=1, min=1, max=1, modifier=false, summary=false)
201        @Description(shortDefinition="Kind of characteristic", formalDefinition="A code that identifies the kind of trait being asserted." )
202        protected CodeableConcept code;
203
204        /**
205         * The value of the trait that holds (or does not hold - see 'exclude') for members of the group.
206         */
207        @Child(name = "value", type = {CodeableConcept.class, BooleanType.class, Quantity.class, Range.class}, order=2, min=1, max=1, modifier=false, summary=false)
208        @Description(shortDefinition="Value held by characteristic", formalDefinition="The value of the trait that holds (or does not hold - see 'exclude') for members of the group." )
209        protected Type value;
210
211        /**
212         * If true, indicates the characteristic is one that is NOT held by members of the group.
213         */
214        @Child(name = "exclude", type = {BooleanType.class}, order=3, min=1, max=1, modifier=true, summary=false)
215        @Description(shortDefinition="Group includes or excludes", formalDefinition="If true, indicates the characteristic is one that is NOT held by members of the group." )
216        protected BooleanType exclude;
217
218        /**
219         * The period over which the characteristic is tested; e.g. the patient had an operation during the month of June.
220         */
221        @Child(name = "period", type = {Period.class}, order=4, min=0, max=1, modifier=false, summary=false)
222        @Description(shortDefinition="Period over which characteristic is tested", formalDefinition="The period over which the characteristic is tested; e.g. the patient had an operation during the month of June." )
223        protected Period period;
224
225        private static final long serialVersionUID = -1000688967L;
226
227    /*
228     * Constructor
229     */
230      public GroupCharacteristicComponent() {
231        super();
232      }
233
234    /*
235     * Constructor
236     */
237      public GroupCharacteristicComponent(CodeableConcept code, Type value, BooleanType exclude) {
238        super();
239        this.code = code;
240        this.value = value;
241        this.exclude = exclude;
242      }
243
244        /**
245         * @return {@link #code} (A code that identifies the kind of trait being asserted.)
246         */
247        public CodeableConcept getCode() { 
248          if (this.code == null)
249            if (Configuration.errorOnAutoCreate())
250              throw new Error("Attempt to auto-create GroupCharacteristicComponent.code");
251            else if (Configuration.doAutoCreate())
252              this.code = new CodeableConcept(); // cc
253          return this.code;
254        }
255
256        public boolean hasCode() { 
257          return this.code != null && !this.code.isEmpty();
258        }
259
260        /**
261         * @param value {@link #code} (A code that identifies the kind of trait being asserted.)
262         */
263        public GroupCharacteristicComponent setCode(CodeableConcept value) { 
264          this.code = value;
265          return this;
266        }
267
268        /**
269         * @return {@link #value} (The value of the trait that holds (or does not hold - see 'exclude') for members of the group.)
270         */
271        public Type getValue() { 
272          return this.value;
273        }
274
275        /**
276         * @return {@link #value} (The value of the trait that holds (or does not hold - see 'exclude') for members of the group.)
277         */
278        public CodeableConcept getValueCodeableConcept() throws FHIRException { 
279          if (!(this.value instanceof CodeableConcept))
280            throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "+this.value.getClass().getName()+" was encountered");
281          return (CodeableConcept) this.value;
282        }
283
284        public boolean hasValueCodeableConcept() { 
285          return this.value instanceof CodeableConcept;
286        }
287
288        /**
289         * @return {@link #value} (The value of the trait that holds (or does not hold - see 'exclude') for members of the group.)
290         */
291        public BooleanType getValueBooleanType() throws FHIRException { 
292          if (!(this.value instanceof BooleanType))
293            throw new FHIRException("Type mismatch: the type BooleanType was expected, but "+this.value.getClass().getName()+" was encountered");
294          return (BooleanType) this.value;
295        }
296
297        public boolean hasValueBooleanType() { 
298          return this.value instanceof BooleanType;
299        }
300
301        /**
302         * @return {@link #value} (The value of the trait that holds (or does not hold - see 'exclude') for members of the group.)
303         */
304        public Quantity getValueQuantity() throws FHIRException { 
305          if (!(this.value instanceof Quantity))
306            throw new FHIRException("Type mismatch: the type Quantity was expected, but "+this.value.getClass().getName()+" was encountered");
307          return (Quantity) this.value;
308        }
309
310        public boolean hasValueQuantity() { 
311          return this.value instanceof Quantity;
312        }
313
314        /**
315         * @return {@link #value} (The value of the trait that holds (or does not hold - see 'exclude') for members of the group.)
316         */
317        public Range getValueRange() throws FHIRException { 
318          if (!(this.value instanceof Range))
319            throw new FHIRException("Type mismatch: the type Range was expected, but "+this.value.getClass().getName()+" was encountered");
320          return (Range) this.value;
321        }
322
323        public boolean hasValueRange() { 
324          return this.value instanceof Range;
325        }
326
327        public boolean hasValue() { 
328          return this.value != null && !this.value.isEmpty();
329        }
330
331        /**
332         * @param value {@link #value} (The value of the trait that holds (or does not hold - see 'exclude') for members of the group.)
333         */
334        public GroupCharacteristicComponent setValue(Type value) { 
335          this.value = value;
336          return this;
337        }
338
339        /**
340         * @return {@link #exclude} (If true, indicates the characteristic is one that is NOT held by members of the group.). This is the underlying object with id, value and extensions. The accessor "getExclude" gives direct access to the value
341         */
342        public BooleanType getExcludeElement() { 
343          if (this.exclude == null)
344            if (Configuration.errorOnAutoCreate())
345              throw new Error("Attempt to auto-create GroupCharacteristicComponent.exclude");
346            else if (Configuration.doAutoCreate())
347              this.exclude = new BooleanType(); // bb
348          return this.exclude;
349        }
350
351        public boolean hasExcludeElement() { 
352          return this.exclude != null && !this.exclude.isEmpty();
353        }
354
355        public boolean hasExclude() { 
356          return this.exclude != null && !this.exclude.isEmpty();
357        }
358
359        /**
360         * @param value {@link #exclude} (If true, indicates the characteristic is one that is NOT held by members of the group.). This is the underlying object with id, value and extensions. The accessor "getExclude" gives direct access to the value
361         */
362        public GroupCharacteristicComponent setExcludeElement(BooleanType value) { 
363          this.exclude = value;
364          return this;
365        }
366
367        /**
368         * @return If true, indicates the characteristic is one that is NOT held by members of the group.
369         */
370        public boolean getExclude() { 
371          return this.exclude == null || this.exclude.isEmpty() ? false : this.exclude.getValue();
372        }
373
374        /**
375         * @param value If true, indicates the characteristic is one that is NOT held by members of the group.
376         */
377        public GroupCharacteristicComponent setExclude(boolean value) { 
378            if (this.exclude == null)
379              this.exclude = new BooleanType();
380            this.exclude.setValue(value);
381          return this;
382        }
383
384        /**
385         * @return {@link #period} (The period over which the characteristic is tested; e.g. the patient had an operation during the month of June.)
386         */
387        public Period getPeriod() { 
388          if (this.period == null)
389            if (Configuration.errorOnAutoCreate())
390              throw new Error("Attempt to auto-create GroupCharacteristicComponent.period");
391            else if (Configuration.doAutoCreate())
392              this.period = new Period(); // cc
393          return this.period;
394        }
395
396        public boolean hasPeriod() { 
397          return this.period != null && !this.period.isEmpty();
398        }
399
400        /**
401         * @param value {@link #period} (The period over which the characteristic is tested; e.g. the patient had an operation during the month of June.)
402         */
403        public GroupCharacteristicComponent setPeriod(Period value) { 
404          this.period = value;
405          return this;
406        }
407
408        protected void listChildren(List<Property> childrenList) {
409          super.listChildren(childrenList);
410          childrenList.add(new Property("code", "CodeableConcept", "A code that identifies the kind of trait being asserted.", 0, java.lang.Integer.MAX_VALUE, code));
411          childrenList.add(new Property("value[x]", "CodeableConcept|boolean|Quantity|Range", "The value of the trait that holds (or does not hold - see 'exclude') for members of the group.", 0, java.lang.Integer.MAX_VALUE, value));
412          childrenList.add(new Property("exclude", "boolean", "If true, indicates the characteristic is one that is NOT held by members of the group.", 0, java.lang.Integer.MAX_VALUE, exclude));
413          childrenList.add(new Property("period", "Period", "The period over which the characteristic is tested; e.g. the patient had an operation during the month of June.", 0, java.lang.Integer.MAX_VALUE, period));
414        }
415
416      @Override
417      public void setProperty(String name, Base value) throws FHIRException {
418        if (name.equals("code"))
419          this.code = castToCodeableConcept(value); // CodeableConcept
420        else if (name.equals("value[x]"))
421          this.value = (Type) value; // Type
422        else if (name.equals("exclude"))
423          this.exclude = castToBoolean(value); // BooleanType
424        else if (name.equals("period"))
425          this.period = castToPeriod(value); // Period
426        else
427          super.setProperty(name, value);
428      }
429
430      @Override
431      public Base addChild(String name) throws FHIRException {
432        if (name.equals("code")) {
433          this.code = new CodeableConcept();
434          return this.code;
435        }
436        else if (name.equals("valueCodeableConcept")) {
437          this.value = new CodeableConcept();
438          return this.value;
439        }
440        else if (name.equals("valueBoolean")) {
441          this.value = new BooleanType();
442          return this.value;
443        }
444        else if (name.equals("valueQuantity")) {
445          this.value = new Quantity();
446          return this.value;
447        }
448        else if (name.equals("valueRange")) {
449          this.value = new Range();
450          return this.value;
451        }
452        else if (name.equals("exclude")) {
453          throw new FHIRException("Cannot call addChild on a primitive type Group.exclude");
454        }
455        else if (name.equals("period")) {
456          this.period = new Period();
457          return this.period;
458        }
459        else
460          return super.addChild(name);
461      }
462
463      public GroupCharacteristicComponent copy() {
464        GroupCharacteristicComponent dst = new GroupCharacteristicComponent();
465        copyValues(dst);
466        dst.code = code == null ? null : code.copy();
467        dst.value = value == null ? null : value.copy();
468        dst.exclude = exclude == null ? null : exclude.copy();
469        dst.period = period == null ? null : period.copy();
470        return dst;
471      }
472
473      @Override
474      public boolean equalsDeep(Base other) {
475        if (!super.equalsDeep(other))
476          return false;
477        if (!(other instanceof GroupCharacteristicComponent))
478          return false;
479        GroupCharacteristicComponent o = (GroupCharacteristicComponent) other;
480        return compareDeep(code, o.code, true) && compareDeep(value, o.value, true) && compareDeep(exclude, o.exclude, true)
481           && compareDeep(period, o.period, true);
482      }
483
484      @Override
485      public boolean equalsShallow(Base other) {
486        if (!super.equalsShallow(other))
487          return false;
488        if (!(other instanceof GroupCharacteristicComponent))
489          return false;
490        GroupCharacteristicComponent o = (GroupCharacteristicComponent) other;
491        return compareValues(exclude, o.exclude, true);
492      }
493
494      public boolean isEmpty() {
495        return super.isEmpty() && (code == null || code.isEmpty()) && (value == null || value.isEmpty())
496           && (exclude == null || exclude.isEmpty()) && (period == null || period.isEmpty());
497      }
498
499  public String fhirType() {
500    return "Group.characteristic";
501
502  }
503
504  }
505
506    @Block()
507    public static class GroupMemberComponent extends BackboneElement implements IBaseBackboneElement {
508        /**
509         * A reference to the entity that is a member of the group. Must be consistent with Group.type.
510         */
511        @Child(name = "entity", type = {Patient.class, Practitioner.class, Device.class, Medication.class, Substance.class}, order=1, min=1, max=1, modifier=false, summary=false)
512        @Description(shortDefinition="Reference to the group member", formalDefinition="A reference to the entity that is a member of the group. Must be consistent with Group.type." )
513        protected Reference entity;
514
515        /**
516         * The actual object that is the target of the reference (A reference to the entity that is a member of the group. Must be consistent with Group.type.)
517         */
518        protected Resource entityTarget;
519
520        /**
521         * The period that the member was in the group, if known.
522         */
523        @Child(name = "period", type = {Period.class}, order=2, min=0, max=1, modifier=false, summary=false)
524        @Description(shortDefinition="Period member belonged to the group", formalDefinition="The period that the member was in the group, if known." )
525        protected Period period;
526
527        /**
528         * A flag to indicate that the member is no longer in the group, but previously may have been a member.
529         */
530        @Child(name = "inactive", type = {BooleanType.class}, order=3, min=0, max=1, modifier=false, summary=false)
531        @Description(shortDefinition="If member is no longer in group", formalDefinition="A flag to indicate that the member is no longer in the group, but previously may have been a member." )
532        protected BooleanType inactive;
533
534        private static final long serialVersionUID = -333869055L;
535
536    /*
537     * Constructor
538     */
539      public GroupMemberComponent() {
540        super();
541      }
542
543    /*
544     * Constructor
545     */
546      public GroupMemberComponent(Reference entity) {
547        super();
548        this.entity = entity;
549      }
550
551        /**
552         * @return {@link #entity} (A reference to the entity that is a member of the group. Must be consistent with Group.type.)
553         */
554        public Reference getEntity() { 
555          if (this.entity == null)
556            if (Configuration.errorOnAutoCreate())
557              throw new Error("Attempt to auto-create GroupMemberComponent.entity");
558            else if (Configuration.doAutoCreate())
559              this.entity = new Reference(); // cc
560          return this.entity;
561        }
562
563        public boolean hasEntity() { 
564          return this.entity != null && !this.entity.isEmpty();
565        }
566
567        /**
568         * @param value {@link #entity} (A reference to the entity that is a member of the group. Must be consistent with Group.type.)
569         */
570        public GroupMemberComponent setEntity(Reference value) { 
571          this.entity = value;
572          return this;
573        }
574
575        /**
576         * @return {@link #entity} The actual object that is the target of the reference. The reference library doesn't populate this, but you can use it to hold the resource if you resolve it. (A reference to the entity that is a member of the group. Must be consistent with Group.type.)
577         */
578        public Resource getEntityTarget() { 
579          return this.entityTarget;
580        }
581
582        /**
583         * @param value {@link #entity} The actual object that is the target of the reference. The reference library doesn't use these, but you can use it to hold the resource if you resolve it. (A reference to the entity that is a member of the group. Must be consistent with Group.type.)
584         */
585        public GroupMemberComponent setEntityTarget(Resource value) { 
586          this.entityTarget = value;
587          return this;
588        }
589
590        /**
591         * @return {@link #period} (The period that the member was in the group, if known.)
592         */
593        public Period getPeriod() { 
594          if (this.period == null)
595            if (Configuration.errorOnAutoCreate())
596              throw new Error("Attempt to auto-create GroupMemberComponent.period");
597            else if (Configuration.doAutoCreate())
598              this.period = new Period(); // cc
599          return this.period;
600        }
601
602        public boolean hasPeriod() { 
603          return this.period != null && !this.period.isEmpty();
604        }
605
606        /**
607         * @param value {@link #period} (The period that the member was in the group, if known.)
608         */
609        public GroupMemberComponent setPeriod(Period value) { 
610          this.period = value;
611          return this;
612        }
613
614        /**
615         * @return {@link #inactive} (A flag to indicate that the member is no longer in the group, but previously may have been a member.). This is the underlying object with id, value and extensions. The accessor "getInactive" gives direct access to the value
616         */
617        public BooleanType getInactiveElement() { 
618          if (this.inactive == null)
619            if (Configuration.errorOnAutoCreate())
620              throw new Error("Attempt to auto-create GroupMemberComponent.inactive");
621            else if (Configuration.doAutoCreate())
622              this.inactive = new BooleanType(); // bb
623          return this.inactive;
624        }
625
626        public boolean hasInactiveElement() { 
627          return this.inactive != null && !this.inactive.isEmpty();
628        }
629
630        public boolean hasInactive() { 
631          return this.inactive != null && !this.inactive.isEmpty();
632        }
633
634        /**
635         * @param value {@link #inactive} (A flag to indicate that the member is no longer in the group, but previously may have been a member.). This is the underlying object with id, value and extensions. The accessor "getInactive" gives direct access to the value
636         */
637        public GroupMemberComponent setInactiveElement(BooleanType value) { 
638          this.inactive = value;
639          return this;
640        }
641
642        /**
643         * @return A flag to indicate that the member is no longer in the group, but previously may have been a member.
644         */
645        public boolean getInactive() { 
646          return this.inactive == null || this.inactive.isEmpty() ? false : this.inactive.getValue();
647        }
648
649        /**
650         * @param value A flag to indicate that the member is no longer in the group, but previously may have been a member.
651         */
652        public GroupMemberComponent setInactive(boolean value) { 
653            if (this.inactive == null)
654              this.inactive = new BooleanType();
655            this.inactive.setValue(value);
656          return this;
657        }
658
659        protected void listChildren(List<Property> childrenList) {
660          super.listChildren(childrenList);
661          childrenList.add(new Property("entity", "Reference(Patient|Practitioner|Device|Medication|Substance)", "A reference to the entity that is a member of the group. Must be consistent with Group.type.", 0, java.lang.Integer.MAX_VALUE, entity));
662          childrenList.add(new Property("period", "Period", "The period that the member was in the group, if known.", 0, java.lang.Integer.MAX_VALUE, period));
663          childrenList.add(new Property("inactive", "boolean", "A flag to indicate that the member is no longer in the group, but previously may have been a member.", 0, java.lang.Integer.MAX_VALUE, inactive));
664        }
665
666      @Override
667      public void setProperty(String name, Base value) throws FHIRException {
668        if (name.equals("entity"))
669          this.entity = castToReference(value); // Reference
670        else if (name.equals("period"))
671          this.period = castToPeriod(value); // Period
672        else if (name.equals("inactive"))
673          this.inactive = castToBoolean(value); // BooleanType
674        else
675          super.setProperty(name, value);
676      }
677
678      @Override
679      public Base addChild(String name) throws FHIRException {
680        if (name.equals("entity")) {
681          this.entity = new Reference();
682          return this.entity;
683        }
684        else if (name.equals("period")) {
685          this.period = new Period();
686          return this.period;
687        }
688        else if (name.equals("inactive")) {
689          throw new FHIRException("Cannot call addChild on a primitive type Group.inactive");
690        }
691        else
692          return super.addChild(name);
693      }
694
695      public GroupMemberComponent copy() {
696        GroupMemberComponent dst = new GroupMemberComponent();
697        copyValues(dst);
698        dst.entity = entity == null ? null : entity.copy();
699        dst.period = period == null ? null : period.copy();
700        dst.inactive = inactive == null ? null : inactive.copy();
701        return dst;
702      }
703
704      @Override
705      public boolean equalsDeep(Base other) {
706        if (!super.equalsDeep(other))
707          return false;
708        if (!(other instanceof GroupMemberComponent))
709          return false;
710        GroupMemberComponent o = (GroupMemberComponent) other;
711        return compareDeep(entity, o.entity, true) && compareDeep(period, o.period, true) && compareDeep(inactive, o.inactive, true)
712          ;
713      }
714
715      @Override
716      public boolean equalsShallow(Base other) {
717        if (!super.equalsShallow(other))
718          return false;
719        if (!(other instanceof GroupMemberComponent))
720          return false;
721        GroupMemberComponent o = (GroupMemberComponent) other;
722        return compareValues(inactive, o.inactive, true);
723      }
724
725      public boolean isEmpty() {
726        return super.isEmpty() && (entity == null || entity.isEmpty()) && (period == null || period.isEmpty())
727           && (inactive == null || inactive.isEmpty());
728      }
729
730  public String fhirType() {
731    return "Group.member";
732
733  }
734
735  }
736
737    /**
738     * A unique business identifier for this group.
739     */
740    @Child(name = "identifier", type = {Identifier.class}, order=0, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
741    @Description(shortDefinition="Unique id", formalDefinition="A unique business identifier for this group." )
742    protected List<Identifier> identifier;
743
744    /**
745     * Identifies the broad classification of the kind of resources the group includes.
746     */
747    @Child(name = "type", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=true)
748    @Description(shortDefinition="person | animal | practitioner | device | medication | substance", formalDefinition="Identifies the broad classification of the kind of resources the group includes." )
749    protected Enumeration<GroupType> type;
750
751    /**
752     * If true, indicates that the resource refers to a specific group of real individuals.  If false, the group defines a set of intended individuals.
753     */
754    @Child(name = "actual", type = {BooleanType.class}, order=2, min=1, max=1, modifier=false, summary=true)
755    @Description(shortDefinition="Descriptive or actual", formalDefinition="If true, indicates that the resource refers to a specific group of real individuals.  If false, the group defines a set of intended individuals." )
756    protected BooleanType actual;
757
758    /**
759     * Provides a specific type of resource the group includes; e.g. "cow", "syringe", etc.
760     */
761    @Child(name = "code", type = {CodeableConcept.class}, order=3, min=0, max=1, modifier=false, summary=true)
762    @Description(shortDefinition="Kind of Group members", formalDefinition="Provides a specific type of resource the group includes; e.g. \"cow\", \"syringe\", etc." )
763    protected CodeableConcept code;
764
765    /**
766     * A label assigned to the group for human identification and communication.
767     */
768    @Child(name = "name", type = {StringType.class}, order=4, min=0, max=1, modifier=false, summary=true)
769    @Description(shortDefinition="Label for Group", formalDefinition="A label assigned to the group for human identification and communication." )
770    protected StringType name;
771
772    /**
773     * A count of the number of resource instances that are part of the group.
774     */
775    @Child(name = "quantity", type = {UnsignedIntType.class}, order=5, min=0, max=1, modifier=false, summary=true)
776    @Description(shortDefinition="Number of members", formalDefinition="A count of the number of resource instances that are part of the group." )
777    protected UnsignedIntType quantity;
778
779    /**
780     * Identifies the traits shared by members of the group.
781     */
782    @Child(name = "characteristic", type = {}, order=6, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
783    @Description(shortDefinition="Trait of group members", formalDefinition="Identifies the traits shared by members of the group." )
784    protected List<GroupCharacteristicComponent> characteristic;
785
786    /**
787     * Identifies the resource instances that are members of the group.
788     */
789    @Child(name = "member", type = {}, order=7, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
790    @Description(shortDefinition="Who or what is in group", formalDefinition="Identifies the resource instances that are members of the group." )
791    protected List<GroupMemberComponent> member;
792
793    private static final long serialVersionUID = 1401345819L;
794
795  /*
796   * Constructor
797   */
798    public Group() {
799      super();
800    }
801
802  /*
803   * Constructor
804   */
805    public Group(Enumeration<GroupType> type, BooleanType actual) {
806      super();
807      this.type = type;
808      this.actual = actual;
809    }
810
811    /**
812     * @return {@link #identifier} (A unique business identifier for this group.)
813     */
814    public List<Identifier> getIdentifier() { 
815      if (this.identifier == null)
816        this.identifier = new ArrayList<Identifier>();
817      return this.identifier;
818    }
819
820    public boolean hasIdentifier() { 
821      if (this.identifier == null)
822        return false;
823      for (Identifier item : this.identifier)
824        if (!item.isEmpty())
825          return true;
826      return false;
827    }
828
829    /**
830     * @return {@link #identifier} (A unique business identifier for this group.)
831     */
832    // syntactic sugar
833    public Identifier addIdentifier() { //3
834      Identifier t = new Identifier();
835      if (this.identifier == null)
836        this.identifier = new ArrayList<Identifier>();
837      this.identifier.add(t);
838      return t;
839    }
840
841    // syntactic sugar
842    public Group addIdentifier(Identifier t) { //3
843      if (t == null)
844        return this;
845      if (this.identifier == null)
846        this.identifier = new ArrayList<Identifier>();
847      this.identifier.add(t);
848      return this;
849    }
850
851    /**
852     * @return {@link #type} (Identifies the broad classification of the kind of resources the group includes.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
853     */
854    public Enumeration<GroupType> getTypeElement() { 
855      if (this.type == null)
856        if (Configuration.errorOnAutoCreate())
857          throw new Error("Attempt to auto-create Group.type");
858        else if (Configuration.doAutoCreate())
859          this.type = new Enumeration<GroupType>(new GroupTypeEnumFactory()); // bb
860      return this.type;
861    }
862
863    public boolean hasTypeElement() { 
864      return this.type != null && !this.type.isEmpty();
865    }
866
867    public boolean hasType() { 
868      return this.type != null && !this.type.isEmpty();
869    }
870
871    /**
872     * @param value {@link #type} (Identifies the broad classification of the kind of resources the group includes.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
873     */
874    public Group setTypeElement(Enumeration<GroupType> value) { 
875      this.type = value;
876      return this;
877    }
878
879    /**
880     * @return Identifies the broad classification of the kind of resources the group includes.
881     */
882    public GroupType getType() { 
883      return this.type == null ? null : this.type.getValue();
884    }
885
886    /**
887     * @param value Identifies the broad classification of the kind of resources the group includes.
888     */
889    public Group setType(GroupType value) { 
890        if (this.type == null)
891          this.type = new Enumeration<GroupType>(new GroupTypeEnumFactory());
892        this.type.setValue(value);
893      return this;
894    }
895
896    /**
897     * @return {@link #actual} (If true, indicates that the resource refers to a specific group of real individuals.  If false, the group defines a set of intended individuals.). This is the underlying object with id, value and extensions. The accessor "getActual" gives direct access to the value
898     */
899    public BooleanType getActualElement() { 
900      if (this.actual == null)
901        if (Configuration.errorOnAutoCreate())
902          throw new Error("Attempt to auto-create Group.actual");
903        else if (Configuration.doAutoCreate())
904          this.actual = new BooleanType(); // bb
905      return this.actual;
906    }
907
908    public boolean hasActualElement() { 
909      return this.actual != null && !this.actual.isEmpty();
910    }
911
912    public boolean hasActual() { 
913      return this.actual != null && !this.actual.isEmpty();
914    }
915
916    /**
917     * @param value {@link #actual} (If true, indicates that the resource refers to a specific group of real individuals.  If false, the group defines a set of intended individuals.). This is the underlying object with id, value and extensions. The accessor "getActual" gives direct access to the value
918     */
919    public Group setActualElement(BooleanType value) { 
920      this.actual = value;
921      return this;
922    }
923
924    /**
925     * @return If true, indicates that the resource refers to a specific group of real individuals.  If false, the group defines a set of intended individuals.
926     */
927    public boolean getActual() { 
928      return this.actual == null || this.actual.isEmpty() ? false : this.actual.getValue();
929    }
930
931    /**
932     * @param value If true, indicates that the resource refers to a specific group of real individuals.  If false, the group defines a set of intended individuals.
933     */
934    public Group setActual(boolean value) { 
935        if (this.actual == null)
936          this.actual = new BooleanType();
937        this.actual.setValue(value);
938      return this;
939    }
940
941    /**
942     * @return {@link #code} (Provides a specific type of resource the group includes; e.g. "cow", "syringe", etc.)
943     */
944    public CodeableConcept getCode() { 
945      if (this.code == null)
946        if (Configuration.errorOnAutoCreate())
947          throw new Error("Attempt to auto-create Group.code");
948        else if (Configuration.doAutoCreate())
949          this.code = new CodeableConcept(); // cc
950      return this.code;
951    }
952
953    public boolean hasCode() { 
954      return this.code != null && !this.code.isEmpty();
955    }
956
957    /**
958     * @param value {@link #code} (Provides a specific type of resource the group includes; e.g. "cow", "syringe", etc.)
959     */
960    public Group setCode(CodeableConcept value) { 
961      this.code = value;
962      return this;
963    }
964
965    /**
966     * @return {@link #name} (A label assigned to the group for human identification and communication.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
967     */
968    public StringType getNameElement() { 
969      if (this.name == null)
970        if (Configuration.errorOnAutoCreate())
971          throw new Error("Attempt to auto-create Group.name");
972        else if (Configuration.doAutoCreate())
973          this.name = new StringType(); // bb
974      return this.name;
975    }
976
977    public boolean hasNameElement() { 
978      return this.name != null && !this.name.isEmpty();
979    }
980
981    public boolean hasName() { 
982      return this.name != null && !this.name.isEmpty();
983    }
984
985    /**
986     * @param value {@link #name} (A label assigned to the group for human identification and communication.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
987     */
988    public Group setNameElement(StringType value) { 
989      this.name = value;
990      return this;
991    }
992
993    /**
994     * @return A label assigned to the group for human identification and communication.
995     */
996    public String getName() { 
997      return this.name == null ? null : this.name.getValue();
998    }
999
1000    /**
1001     * @param value A label assigned to the group for human identification and communication.
1002     */
1003    public Group setName(String value) { 
1004      if (Utilities.noString(value))
1005        this.name = null;
1006      else {
1007        if (this.name == null)
1008          this.name = new StringType();
1009        this.name.setValue(value);
1010      }
1011      return this;
1012    }
1013
1014    /**
1015     * @return {@link #quantity} (A count of the number of resource instances that are part of the group.). This is the underlying object with id, value and extensions. The accessor "getQuantity" gives direct access to the value
1016     */
1017    public UnsignedIntType getQuantityElement() { 
1018      if (this.quantity == null)
1019        if (Configuration.errorOnAutoCreate())
1020          throw new Error("Attempt to auto-create Group.quantity");
1021        else if (Configuration.doAutoCreate())
1022          this.quantity = new UnsignedIntType(); // bb
1023      return this.quantity;
1024    }
1025
1026    public boolean hasQuantityElement() { 
1027      return this.quantity != null && !this.quantity.isEmpty();
1028    }
1029
1030    public boolean hasQuantity() { 
1031      return this.quantity != null && !this.quantity.isEmpty();
1032    }
1033
1034    /**
1035     * @param value {@link #quantity} (A count of the number of resource instances that are part of the group.). This is the underlying object with id, value and extensions. The accessor "getQuantity" gives direct access to the value
1036     */
1037    public Group setQuantityElement(UnsignedIntType value) { 
1038      this.quantity = value;
1039      return this;
1040    }
1041
1042    /**
1043     * @return A count of the number of resource instances that are part of the group.
1044     */
1045    public int getQuantity() { 
1046      return this.quantity == null || this.quantity.isEmpty() ? 0 : this.quantity.getValue();
1047    }
1048
1049    /**
1050     * @param value A count of the number of resource instances that are part of the group.
1051     */
1052    public Group setQuantity(int value) { 
1053        if (this.quantity == null)
1054          this.quantity = new UnsignedIntType();
1055        this.quantity.setValue(value);
1056      return this;
1057    }
1058
1059    /**
1060     * @return {@link #characteristic} (Identifies the traits shared by members of the group.)
1061     */
1062    public List<GroupCharacteristicComponent> getCharacteristic() { 
1063      if (this.characteristic == null)
1064        this.characteristic = new ArrayList<GroupCharacteristicComponent>();
1065      return this.characteristic;
1066    }
1067
1068    public boolean hasCharacteristic() { 
1069      if (this.characteristic == null)
1070        return false;
1071      for (GroupCharacteristicComponent item : this.characteristic)
1072        if (!item.isEmpty())
1073          return true;
1074      return false;
1075    }
1076
1077    /**
1078     * @return {@link #characteristic} (Identifies the traits shared by members of the group.)
1079     */
1080    // syntactic sugar
1081    public GroupCharacteristicComponent addCharacteristic() { //3
1082      GroupCharacteristicComponent t = new GroupCharacteristicComponent();
1083      if (this.characteristic == null)
1084        this.characteristic = new ArrayList<GroupCharacteristicComponent>();
1085      this.characteristic.add(t);
1086      return t;
1087    }
1088
1089    // syntactic sugar
1090    public Group addCharacteristic(GroupCharacteristicComponent t) { //3
1091      if (t == null)
1092        return this;
1093      if (this.characteristic == null)
1094        this.characteristic = new ArrayList<GroupCharacteristicComponent>();
1095      this.characteristic.add(t);
1096      return this;
1097    }
1098
1099    /**
1100     * @return {@link #member} (Identifies the resource instances that are members of the group.)
1101     */
1102    public List<GroupMemberComponent> getMember() { 
1103      if (this.member == null)
1104        this.member = new ArrayList<GroupMemberComponent>();
1105      return this.member;
1106    }
1107
1108    public boolean hasMember() { 
1109      if (this.member == null)
1110        return false;
1111      for (GroupMemberComponent item : this.member)
1112        if (!item.isEmpty())
1113          return true;
1114      return false;
1115    }
1116
1117    /**
1118     * @return {@link #member} (Identifies the resource instances that are members of the group.)
1119     */
1120    // syntactic sugar
1121    public GroupMemberComponent addMember() { //3
1122      GroupMemberComponent t = new GroupMemberComponent();
1123      if (this.member == null)
1124        this.member = new ArrayList<GroupMemberComponent>();
1125      this.member.add(t);
1126      return t;
1127    }
1128
1129    // syntactic sugar
1130    public Group addMember(GroupMemberComponent t) { //3
1131      if (t == null)
1132        return this;
1133      if (this.member == null)
1134        this.member = new ArrayList<GroupMemberComponent>();
1135      this.member.add(t);
1136      return this;
1137    }
1138
1139      protected void listChildren(List<Property> childrenList) {
1140        super.listChildren(childrenList);
1141        childrenList.add(new Property("identifier", "Identifier", "A unique business identifier for this group.", 0, java.lang.Integer.MAX_VALUE, identifier));
1142        childrenList.add(new Property("type", "code", "Identifies the broad classification of the kind of resources the group includes.", 0, java.lang.Integer.MAX_VALUE, type));
1143        childrenList.add(new Property("actual", "boolean", "If true, indicates that the resource refers to a specific group of real individuals.  If false, the group defines a set of intended individuals.", 0, java.lang.Integer.MAX_VALUE, actual));
1144        childrenList.add(new Property("code", "CodeableConcept", "Provides a specific type of resource the group includes; e.g. \"cow\", \"syringe\", etc.", 0, java.lang.Integer.MAX_VALUE, code));
1145        childrenList.add(new Property("name", "string", "A label assigned to the group for human identification and communication.", 0, java.lang.Integer.MAX_VALUE, name));
1146        childrenList.add(new Property("quantity", "unsignedInt", "A count of the number of resource instances that are part of the group.", 0, java.lang.Integer.MAX_VALUE, quantity));
1147        childrenList.add(new Property("characteristic", "", "Identifies the traits shared by members of the group.", 0, java.lang.Integer.MAX_VALUE, characteristic));
1148        childrenList.add(new Property("member", "", "Identifies the resource instances that are members of the group.", 0, java.lang.Integer.MAX_VALUE, member));
1149      }
1150
1151      @Override
1152      public void setProperty(String name, Base value) throws FHIRException {
1153        if (name.equals("identifier"))
1154          this.getIdentifier().add(castToIdentifier(value));
1155        else if (name.equals("type"))
1156          this.type = new GroupTypeEnumFactory().fromType(value); // Enumeration<GroupType>
1157        else if (name.equals("actual"))
1158          this.actual = castToBoolean(value); // BooleanType
1159        else if (name.equals("code"))
1160          this.code = castToCodeableConcept(value); // CodeableConcept
1161        else if (name.equals("name"))
1162          this.name = castToString(value); // StringType
1163        else if (name.equals("quantity"))
1164          this.quantity = castToUnsignedInt(value); // UnsignedIntType
1165        else if (name.equals("characteristic"))
1166          this.getCharacteristic().add((GroupCharacteristicComponent) value);
1167        else if (name.equals("member"))
1168          this.getMember().add((GroupMemberComponent) value);
1169        else
1170          super.setProperty(name, value);
1171      }
1172
1173      @Override
1174      public Base addChild(String name) throws FHIRException {
1175        if (name.equals("identifier")) {
1176          return addIdentifier();
1177        }
1178        else if (name.equals("type")) {
1179          throw new FHIRException("Cannot call addChild on a primitive type Group.type");
1180        }
1181        else if (name.equals("actual")) {
1182          throw new FHIRException("Cannot call addChild on a primitive type Group.actual");
1183        }
1184        else if (name.equals("code")) {
1185          this.code = new CodeableConcept();
1186          return this.code;
1187        }
1188        else if (name.equals("name")) {
1189          throw new FHIRException("Cannot call addChild on a primitive type Group.name");
1190        }
1191        else if (name.equals("quantity")) {
1192          throw new FHIRException("Cannot call addChild on a primitive type Group.quantity");
1193        }
1194        else if (name.equals("characteristic")) {
1195          return addCharacteristic();
1196        }
1197        else if (name.equals("member")) {
1198          return addMember();
1199        }
1200        else
1201          return super.addChild(name);
1202      }
1203
1204  public String fhirType() {
1205    return "Group";
1206
1207  }
1208
1209      public Group copy() {
1210        Group dst = new Group();
1211        copyValues(dst);
1212        if (identifier != null) {
1213          dst.identifier = new ArrayList<Identifier>();
1214          for (Identifier i : identifier)
1215            dst.identifier.add(i.copy());
1216        };
1217        dst.type = type == null ? null : type.copy();
1218        dst.actual = actual == null ? null : actual.copy();
1219        dst.code = code == null ? null : code.copy();
1220        dst.name = name == null ? null : name.copy();
1221        dst.quantity = quantity == null ? null : quantity.copy();
1222        if (characteristic != null) {
1223          dst.characteristic = new ArrayList<GroupCharacteristicComponent>();
1224          for (GroupCharacteristicComponent i : characteristic)
1225            dst.characteristic.add(i.copy());
1226        };
1227        if (member != null) {
1228          dst.member = new ArrayList<GroupMemberComponent>();
1229          for (GroupMemberComponent i : member)
1230            dst.member.add(i.copy());
1231        };
1232        return dst;
1233      }
1234
1235      protected Group typedCopy() {
1236        return copy();
1237      }
1238
1239      @Override
1240      public boolean equalsDeep(Base other) {
1241        if (!super.equalsDeep(other))
1242          return false;
1243        if (!(other instanceof Group))
1244          return false;
1245        Group o = (Group) other;
1246        return compareDeep(identifier, o.identifier, true) && compareDeep(type, o.type, true) && compareDeep(actual, o.actual, true)
1247           && compareDeep(code, o.code, true) && compareDeep(name, o.name, true) && compareDeep(quantity, o.quantity, true)
1248           && compareDeep(characteristic, o.characteristic, true) && compareDeep(member, o.member, true);
1249      }
1250
1251      @Override
1252      public boolean equalsShallow(Base other) {
1253        if (!super.equalsShallow(other))
1254          return false;
1255        if (!(other instanceof Group))
1256          return false;
1257        Group o = (Group) other;
1258        return compareValues(type, o.type, true) && compareValues(actual, o.actual, true) && compareValues(name, o.name, true)
1259           && compareValues(quantity, o.quantity, true);
1260      }
1261
1262      public boolean isEmpty() {
1263        return super.isEmpty() && (identifier == null || identifier.isEmpty()) && (type == null || type.isEmpty())
1264           && (actual == null || actual.isEmpty()) && (code == null || code.isEmpty()) && (name == null || name.isEmpty())
1265           && (quantity == null || quantity.isEmpty()) && (characteristic == null || characteristic.isEmpty())
1266           && (member == null || member.isEmpty());
1267      }
1268
1269  @Override
1270  public ResourceType getResourceType() {
1271    return ResourceType.Group;
1272   }
1273
1274  @SearchParamDefinition(name="actual", path="Group.actual", description="Descriptive or actual", type="token" )
1275  public static final String SP_ACTUAL = "actual";
1276  @SearchParamDefinition(name="identifier", path="Group.identifier", description="Unique id", type="token" )
1277  public static final String SP_IDENTIFIER = "identifier";
1278  @SearchParamDefinition(name="characteristic-value", path="null", description="A composite of both characteristic and value", type="composite" )
1279  public static final String SP_CHARACTERISTICVALUE = "characteristic-value";
1280  @SearchParamDefinition(name="code", path="Group.code", description="The kind of resources contained", type="token" )
1281  public static final String SP_CODE = "code";
1282  @SearchParamDefinition(name="member", path="Group.member.entity", description="Reference to the group member", type="reference" )
1283  public static final String SP_MEMBER = "member";
1284  @SearchParamDefinition(name="exclude", path="Group.characteristic.exclude", description="Group includes or excludes", type="token" )
1285  public static final String SP_EXCLUDE = "exclude";
1286  @SearchParamDefinition(name="type", path="Group.type", description="The type of resources the group contains", type="token" )
1287  public static final String SP_TYPE = "type";
1288  @SearchParamDefinition(name="value", path="Group.characteristic.value[x]", description="Value held by characteristic", type="token" )
1289  public static final String SP_VALUE = "value";
1290  @SearchParamDefinition(name="characteristic", path="Group.characteristic.code", description="Kind of characteristic", type="token" )
1291  public static final String SP_CHARACTERISTIC = "characteristic";
1292
1293}
1294