package ca.uhn.example.model;
import java.util.ArrayList;
import java.util.List;
import ca.uhn.fhir.model.api.BaseIdentifiableElement;
import ca.uhn.fhir.model.api.IElement;
import ca.uhn.fhir.model.api.IExtension;
import ca.uhn.fhir.model.api.annotation.Block;
import ca.uhn.fhir.model.api.annotation.Child;
import ca.uhn.fhir.model.api.annotation.Description;
import ca.uhn.fhir.model.api.annotation.Extension;
import ca.uhn.fhir.model.api.annotation.ResourceDef;
import ca.uhn.fhir.model.dstu2.composite.ContactPointDt;
import ca.uhn.fhir.model.dstu2.resource.Organization;
import ca.uhn.fhir.model.primitive.BooleanDt;
import ca.uhn.fhir.model.primitive.CodeDt;
import ca.uhn.fhir.util.ElementUtil;
/**
* This is an example of a customized model class. Essentially we have taken the
* built-in Organization resource class, and extended with a custom extension.
*/
@ResourceDef(name = "Organization")
public class MyOrganization extends Organization {
/* *****************************
* Fields
* *****************************/
/**
* This is a basic extension, with a DataType value (in this case, String)
*/
@Description(shortDefinition = "Contains a simple code indicating the billing code for this organization")
@Extension(url = "http://foo#billingCode", isModifier = false, definedLocally = true)
@Child(name = "billingCode")
private CodeDt myBillingCode;
/**
* This is a composite extension, containing further extensions instead of
* a value. The class "EmergencyContact" is defined at the bottom
* of this file.
*/
@Description(shortDefinition="Contains emergency contact details")
@Extension(url = "http://foo#emergencyContact", isModifier = false, definedLocally = true)
@Child(name = "emergencyContact", min=0, max=Child.MAX_UNLIMITED)
private List<EmergencyContact> myEmergencyContact;
/* *****************************
* Getters and setters
* *****************************/
public List<EmergencyContact> getEmergencyContact() {
if (myEmergencyContact==null) {
myEmergencyContact=new ArrayList<EmergencyContact>();
}
return myEmergencyContact;
}
public void setEmergencyContact(List<EmergencyContact> theEmergencyContact) {
myEmergencyContact = theEmergencyContact;
}
public CodeDt getBillingCode() {
if (myBillingCode == null) {
myBillingCode = new CodeDt();
}
return myBillingCode;
}
public void setBillingCode(CodeDt theBillingCode) {
myBillingCode = theBillingCode;
}
/* *****************************
* Boilerplate methods- Hopefully these will be removed or made optional
* in a future version of HAPI but for now they need to be added to all block
* types. These two methods follow a simple pattern where a utility method from
* ElementUtil is called and all fields are passed in.
* *****************************/
@Override
public <T extends IElement> List<T> getAllPopulatedChildElementsOfType(Class<T> theType) {
return ElementUtil.allPopulatedChildElements(theType, super.getAllPopulatedChildElementsOfType(theType), myBillingCode, myEmergencyContact);
}
@Override
public boolean isEmpty() {
return super.isEmpty() && ElementUtil.isEmpty(myBillingCode, myEmergencyContact);
}
/**
* This "block definition" defines an extension type with multiple child extensions.
* It is referenced by the field myEmergencyContact above.
*/
@Block
public static class EmergencyContact extends BaseIdentifiableElement implements IExtension
{
/* *****************************
* Fields
* *****************************/
/**
* This is a primitive datatype extension
*/
@Description(shortDefinition = "Should be set to true if the contact is active")
@Extension(url = "http://foo#emergencyContactActive", isModifier = false, definedLocally = true)
@Child(name = "active")
private BooleanDt myActive;
/**
* This is a composite datatype extension
*/
@Description(shortDefinition = "Contains the actual contact details")
@Extension(url = "http://foo#emergencyContactContact", isModifier = false, definedLocally = true)
@Child(name = "contact")
private ContactPointDt myContact;
/* *****************************
* Getters and setters
* *****************************/
public BooleanDt getActive() {
if (myActive == null) {
myActive = new BooleanDt();
}
return myActive;
}
public void setActive(BooleanDt theActive) {
myActive = theActive;
}
public ContactPointDt getContact() {
if (myContact == null) {
myContact = new ContactPointDt();
}
return myContact;
}
public void setContact(ContactPointDt theContact) {
myContact = theContact;
}
/* *****************************
* Boilerplate methods- Hopefully these will be removed or made optional
* in a future version of HAPI but for now they need to be added to all block
* types. These two methods follow a simple pattern where a utility method from
* ElementUtil is called and all fields are passed in.
* *****************************/
@Override
public <T extends IElement> List<T> getAllPopulatedChildElementsOfType(Class<T> theType) {
return ElementUtil.allPopulatedChildElements(theType, myActive, myContact);
}
@Override
public boolean isEmpty() {
return ElementUtil.isEmpty(myActive, myContact);
}
}
}