Start adding view generator
This commit is contained in:
parent
04b4d5acb7
commit
901ce12e8e
|
@ -62,6 +62,11 @@ public abstract class BaseRuntimeElementCompositeDefinition<T extends IComposite
|
|||
return retVal;
|
||||
}
|
||||
|
||||
public BaseRuntimeChildDefinition getChildByName(String theName){
|
||||
BaseRuntimeChildDefinition retVal = myNameToChild.get(theName);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
public List<BaseRuntimeChildDefinition> getChildren() {
|
||||
return myChildren;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,13 @@ public abstract class BaseElement implements IElement, ISupportsUndeclaredExtens
|
|||
Validate.notEmpty(theUrl, "URL must be populated");
|
||||
Validate.notNull(theValue, "Value must not be null");
|
||||
ExtensionDt retVal = new ExtensionDt(theIsModifier, theUrl, theValue);
|
||||
getUndeclaredExtensions().add(retVal);
|
||||
if (theIsModifier) {
|
||||
getUndeclaredModifierExtensions();
|
||||
myUndeclaredModifierExtensions.add(retVal);
|
||||
} else {
|
||||
getUndeclaredExtensions();
|
||||
myUndeclaredExtensions.add(retVal);
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
|
@ -45,7 +51,13 @@ public abstract class BaseElement implements IElement, ISupportsUndeclaredExtens
|
|||
Validate.notEmpty(theUrl, "URL must be populated");
|
||||
|
||||
ExtensionDt retVal = new ExtensionDt(theIsModifier, theUrl);
|
||||
getUndeclaredExtensions().add(retVal);
|
||||
if (theIsModifier) {
|
||||
getUndeclaredModifierExtensions();
|
||||
myUndeclaredModifierExtensions.add(retVal);
|
||||
} else {
|
||||
getUndeclaredExtensions();
|
||||
myUndeclaredExtensions.add(retVal);
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
|
@ -53,9 +65,11 @@ public abstract class BaseElement implements IElement, ISupportsUndeclaredExtens
|
|||
public void addUndeclaredExtension(ExtensionDt theExtension) {
|
||||
Validate.notNull(theExtension, "Extension can not be null");
|
||||
if (theExtension.isModifier()) {
|
||||
getUndeclaredModifierExtensions().add(theExtension);
|
||||
getUndeclaredModifierExtensions();
|
||||
myUndeclaredModifierExtensions.add(theExtension);
|
||||
} else {
|
||||
getUndeclaredExtensions().add(theExtension);
|
||||
getUndeclaredExtensions();
|
||||
myUndeclaredExtensions.add(theExtension);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -76,7 +90,7 @@ public abstract class BaseElement implements IElement, ISupportsUndeclaredExtens
|
|||
if (myUndeclaredExtensions == null) {
|
||||
myUndeclaredExtensions = new ArrayList<ExtensionDt>();
|
||||
}
|
||||
return myUndeclaredExtensions;
|
||||
return Collections.unmodifiableList(myUndeclaredExtensions);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -96,12 +110,12 @@ public abstract class BaseElement implements IElement, ISupportsUndeclaredExtens
|
|||
if (myUndeclaredModifierExtensions == null) {
|
||||
myUndeclaredModifierExtensions = new ArrayList<ExtensionDt>();
|
||||
}
|
||||
return myUndeclaredModifierExtensions;
|
||||
return Collections.unmodifiableList(myUndeclaredModifierExtensions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Intended to be called by extending classes {@link #isEmpty()} implementations, returns <code>true</code> if all
|
||||
* content in this superclass instance is empty per the semantics of {@link #isEmpty()}.
|
||||
* Intended to be called by extending classes {@link #isEmpty()} implementations, returns <code>true</code> if all content in this superclass instance is empty per the semantics of
|
||||
* {@link #isEmpty()}.
|
||||
*/
|
||||
protected boolean isBaseEmpty() {
|
||||
if (myUndeclaredExtensions != null) {
|
||||
|
|
|
@ -42,10 +42,17 @@ public @interface Child {
|
|||
int ORDER_UNKNOWN = -1;
|
||||
|
||||
/**
|
||||
* COnstant value to supply for {@link #max()} to indicate '*' (no maximum)
|
||||
* Constant value to supply for {@link #max()} to indicate '*' (no maximum)
|
||||
*/
|
||||
int MAX_UNLIMITED = -1;
|
||||
|
||||
/**
|
||||
* Constant value to supply for {@link #order()} to indicate that this child should replace the
|
||||
* entry in the superclass with the same name. This may be used to indicate to parsers that
|
||||
*
|
||||
*/
|
||||
int REPLACE_PARENT = -2;
|
||||
|
||||
/**
|
||||
* The name of this field, as it will appear in serialized versions of the message
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
package ca.uhn.fhir.model.view;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import ca.uhn.fhir.context.BaseRuntimeChildDefinition;
|
||||
import ca.uhn.fhir.context.BaseRuntimeElementCompositeDefinition;
|
||||
import ca.uhn.fhir.context.ConfigurationException;
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.context.RuntimeChildDeclaredExtensionDefinition;
|
||||
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
||||
import ca.uhn.fhir.model.api.BaseElement;
|
||||
import ca.uhn.fhir.model.api.ExtensionDt;
|
||||
import ca.uhn.fhir.model.api.IElement;
|
||||
import ca.uhn.fhir.model.api.IResource;
|
||||
|
||||
public class ViewGenerator {
|
||||
|
||||
public <T extends IResource> T newView(FhirContext theContext, IResource theResource, Class<T> theTargetType) {
|
||||
Class<? extends IResource> sourceType = theResource.getClass();
|
||||
RuntimeResourceDefinition sourceDef = theContext.getResourceDefinition(theResource);
|
||||
RuntimeResourceDefinition targetDef = theContext.getResourceDefinition(theTargetType);
|
||||
|
||||
if (sourceType.equals(theTargetType)) {
|
||||
@SuppressWarnings("unchecked")
|
||||
T resource = (T) theResource;
|
||||
return resource;
|
||||
}
|
||||
|
||||
T retVal;
|
||||
try {
|
||||
retVal = theTargetType.newInstance();
|
||||
} catch (InstantiationException e) {
|
||||
throw new ConfigurationException("Failed to instantiate " + theTargetType, e);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new ConfigurationException("Failed to instantiate " + theTargetType, e);
|
||||
}
|
||||
|
||||
copyChildren(sourceDef, (BaseElement) theResource, targetDef, (BaseElement) retVal);
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
private void copyChildren(BaseRuntimeElementCompositeDefinition<?> theSourceDef, BaseElement theSource, BaseRuntimeElementCompositeDefinition<?> theTargetDef, BaseElement theTarget) {
|
||||
if (!theSource.isEmpty()) {
|
||||
List<BaseRuntimeChildDefinition> targetChildren = theTargetDef.getChildren();
|
||||
for (BaseRuntimeChildDefinition nextChild : targetChildren) {
|
||||
|
||||
BaseRuntimeChildDefinition sourceChildEquivalent = theSourceDef.getChildByNameOrThrowDataFormatException(nextChild.getElementName());
|
||||
if (sourceChildEquivalent == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
List<? extends IElement> sourceValues = sourceChildEquivalent.getAccessor().getValues(theTarget);
|
||||
for (IElement nextElement : sourceValues) {
|
||||
nextChild.getMutator().addValue(theTargetDef, nextElement);
|
||||
}
|
||||
}
|
||||
|
||||
List<RuntimeChildDeclaredExtensionDefinition> targetExts = theTargetDef.getExtensions();
|
||||
for (RuntimeChildDeclaredExtensionDefinition nextExt : targetExts) {
|
||||
String url = nextExt.getExtensionUrl();
|
||||
|
||||
RuntimeChildDeclaredExtensionDefinition sourceDeclaredExt = theSourceDef.getDeclaredExtension(url);
|
||||
if (sourceDeclaredExt == null) {
|
||||
|
||||
for (ExtensionDt next : theSource.getAllUndeclaredExtensions()) {
|
||||
if (next.getUrlAsString().equals(url)) {
|
||||
nextExt.getMutator().addValue(theTarget, next.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
List<? extends IElement> values = sourceDeclaredExt.getAccessor().getValues(theSource);
|
||||
for (IElement nextElement : values) {
|
||||
nextExt.getMutator().addValue(theTarget, nextElement);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -109,17 +109,6 @@ public class JsonParser extends BaseParser implements IParser {
|
|||
myContext = theContext;
|
||||
}
|
||||
|
||||
private void addToHeldExtensions(int valueIdx, ArrayList<ArrayList<HeldExtension>> list, RuntimeChildDeclaredExtensionDefinition theDef, IElement theValue) {
|
||||
list.ensureCapacity(valueIdx);
|
||||
while (list.size() <= valueIdx) {
|
||||
list.add(null);
|
||||
}
|
||||
if (list.get(valueIdx) == null) {
|
||||
list.set(valueIdx, new ArrayList<JsonParser.HeldExtension>());
|
||||
}
|
||||
list.get(valueIdx).add(new HeldExtension(theDef, theValue));
|
||||
}
|
||||
|
||||
private void addToHeldExtensions(int valueIdx, List<ExtensionDt> ext, ArrayList<ArrayList<HeldExtension>> list) {
|
||||
if (ext.size() > 0) {
|
||||
list.ensureCapacity(valueIdx);
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
package ca.uhn.fhir.parser;
|
||||
|
||||
import ca.uhn.fhir.model.api.annotation.ResourceDef;
|
||||
import ca.uhn.fhir.model.dstu.resource.Organization;
|
||||
|
||||
@ResourceDef(name="Organization")
|
||||
public class MyOrganization extends Organization {
|
||||
|
||||
}
|
|
@ -7,6 +7,7 @@ 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.dstu.composite.ResourceReferenceDt;
|
||||
import ca.uhn.fhir.model.dstu.resource.Patient;
|
||||
import ca.uhn.fhir.model.primitive.DateTimeDt;
|
||||
import ca.uhn.fhir.model.primitive.StringDt;
|
||||
|
@ -23,7 +24,16 @@ public class MyPatient extends Patient {
|
|||
@Extension(url="http://example.com/dontuse#importantDates", definedLocally=false, isModifier=true)
|
||||
@Description(shortDefinition="Some dates of note for the patient")
|
||||
private List<DateTimeDt> myImportantDates;
|
||||
|
||||
|
||||
@Child(name="managingOrganization", order=Child.REPLACE_PARENT, min=0, max=1, type={
|
||||
ca.uhn.fhir.model.dstu.resource.Organization.class })
|
||||
@Description(
|
||||
shortDefinition="Organization that is the custodian of the patient record",
|
||||
formalDefinition="Organization that is the custodian of the patient record"
|
||||
)
|
||||
private ResourceReferenceDt myManagingOrganization;
|
||||
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return super.isEmpty() && myPetName.isEmpty();
|
||||
|
|
Loading…
Reference in New Issue