..and still...

This commit is contained in:
jamesagnew 2014-02-19 13:02:51 -05:00
parent 9aa5e52911
commit 5296e8121c
9 changed files with 158 additions and 31 deletions

View File

@ -3,8 +3,10 @@ package ca.uhn.fhir.context;
import static org.apache.commons.lang3.StringUtils.*; import static org.apache.commons.lang3.StringUtils.*;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
@ -67,7 +69,7 @@ class ModelScanner {
toScan.clear(); toScan.clear();
toScan.addAll(myScanAlso); toScan.addAll(myScanAlso);
myScanAlso.clear(); myScanAlso.clear();
} while (!myScanAlso.isEmpty()); } while (!toScan.isEmpty());
for (BaseRuntimeElementDefinition<?> next : myClassToElementDefinitions.values()) { for (BaseRuntimeElementDefinition<?> next : myClassToElementDefinitions.values()) {
next.sealAndInitialize(myClassToElementDefinitions); next.sealAndInitialize(myClassToElementDefinitions);
@ -130,17 +132,10 @@ class ModelScanner {
throw new ConfigurationException("Resource type @" + ResourceDef.class.getSimpleName() + " annotation contains no resource name: " + theClass.getCanonicalName()); throw new ConfigurationException("Resource type @" + ResourceDef.class.getSimpleName() + " annotation contains no resource name: " + theClass.getCanonicalName());
} }
if (myNameToResourceDefinitions.containsKey(resourceName)) {
if (!myNameToResourceDefinitions.get(resourceName).getImplementingClass().equals(theClass)) {
throw new ConfigurationException("Detected duplicate element name '" + resourceName + "' in types '" + theClass.getCanonicalName() + "' and '" + myNameToResourceDefinitions.get(resourceName).getImplementingClass() + "'");
}
return resourceName;
}
RuntimeCompositeDatatypeDefinition resourceDef = new RuntimeCompositeDatatypeDefinition(resourceName, theClass); RuntimeCompositeDatatypeDefinition resourceDef = new RuntimeCompositeDatatypeDefinition(resourceName, theClass);
myClassToElementDefinitions.put(theClass, resourceDef); myClassToElementDefinitions.put(theClass, resourceDef);
scanCompositeElementForChildren(theClass, resourceDef); scanCompositeElementForChildren(theClass, resourceDef, null);
return resourceName; return resourceName;
} }
@ -153,13 +148,6 @@ class ModelScanner {
throw new ConfigurationException("Resource type @" + ResourceDef.class.getSimpleName() + " annotation contains no resource name: " + theClass.getCanonicalName()); throw new ConfigurationException("Resource type @" + ResourceDef.class.getSimpleName() + " annotation contains no resource name: " + theClass.getCanonicalName());
} }
if (myNameToResourceDefinitions.containsKey(resourceName)) {
if (!myNameToResourceDefinitions.get(resourceName).getImplementingClass().equals(theClass)) {
throw new ConfigurationException("Detected duplicate element name '" + resourceName + "' in types '" + theClass.getCanonicalName() + "' and '" + myNameToResourceDefinitions.get(resourceName).getImplementingClass() + "'");
}
return resourceName;
}
RuntimePrimitiveDatatypeDefinition resourceDef = new RuntimePrimitiveDatatypeDefinition(resourceName, theClass); RuntimePrimitiveDatatypeDefinition resourceDef = new RuntimePrimitiveDatatypeDefinition(resourceName, theClass);
myClassToElementDefinitions.put(theClass, resourceDef); myClassToElementDefinitions.put(theClass, resourceDef);
@ -185,13 +173,13 @@ class ModelScanner {
myClassToElementDefinitions.put(theClass, resourceDef); myClassToElementDefinitions.put(theClass, resourceDef);
myNameToResourceDefinitions.put(resourceName, resourceDef); myNameToResourceDefinitions.put(resourceName, resourceDef);
scanCompositeElementForChildren(theClass, resourceDef); scanCompositeElementForChildren(theClass, resourceDef, resourceDefinition.identifierOrder());
return resourceName; return resourceName;
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private void scanCompositeElementForChildren(Class<? extends ICompositeElement> theClass, BaseRuntimeElementCompositeDefinition<?> theDefinition) { private void scanCompositeElementForChildren(Class<? extends ICompositeElement> theClass, BaseRuntimeElementCompositeDefinition<?> theDefinition, Integer theIdentifierOrder) {
Set<String> elementNames = new HashSet<String>(); Set<String> elementNames = new HashSet<String>();
TreeMap<Integer, BaseRuntimeChildDefinition> orderToElementDef = new TreeMap<Integer, BaseRuntimeChildDefinition>(); TreeMap<Integer, BaseRuntimeChildDefinition> orderToElementDef = new TreeMap<Integer, BaseRuntimeChildDefinition>();
@ -210,7 +198,14 @@ class ModelScanner {
scanCompositeElementForChildren(next, theDefinition, elementNames, orderToElementDef); scanCompositeElementForChildren(next, theDefinition, elementNames, orderToElementDef);
} }
dealwithnegative while (orderToElementDef.firstKey() < 0) {
BaseRuntimeChildDefinition elementDef = orderToElementDef.remove(orderToElementDef.firstKey());
if (elementDef.getElementName().equals("identifier")) {
orderToElementDef.put(theIdentifierOrder, elementDef);
}else {
throw new ConfigurationException("Don't know how to handle element: " + elementDef.getElementName());
}
}
for (int i = 0; i < orderToElementDef.size(); i++) { for (int i = 0; i < orderToElementDef.size(); i++) {
if (!orderToElementDef.containsKey(i)) { if (!orderToElementDef.containsKey(i)) {
@ -222,6 +217,7 @@ class ModelScanner {
} }
@SuppressWarnings("unchecked")
private void scanCompositeElementForChildren(Class<? extends ICompositeElement> theClass, BaseRuntimeElementCompositeDefinition<?> theDefinition, Set<String> elementNames, TreeMap<Integer, BaseRuntimeChildDefinition> orderToElementDef) { private void scanCompositeElementForChildren(Class<? extends ICompositeElement> theClass, BaseRuntimeElementCompositeDefinition<?> theDefinition, Set<String> elementNames, TreeMap<Integer, BaseRuntimeChildDefinition> orderToElementDef) {
for (Field next : theClass.getDeclaredFields()) { for (Field next : theClass.getDeclaredFields()) {
@ -292,12 +288,25 @@ class ModelScanner {
if (resRefAnnotation != null) { if (resRefAnnotation != null) {
throw new ConfigurationException("Field '" + elementName + "' in type '" + theClass.getCanonicalName() + "' is not a resource reference but has a @" + ChildResource.class.getSimpleName() + " annotation"); throw new ConfigurationException("Field '" + elementName + "' in type '" + theClass.getCanonicalName() + "' is not a resource reference but has a @" + ChildResource.class.getSimpleName() + " annotation");
} }
if (!IDatatype.class.isAssignableFrom(next.getType())) {
throw new ConfigurationException("Field '" + elementName + "' in type '" + theClass.getCanonicalName() + "' is not a resource reference and is not an instance of type " + IDatatype.class.getName()); Class<? extends IDatatype> nextDatatype;
if (IDatatype.class.isAssignableFrom(next.getType())) {
nextDatatype = (Class<? extends IDatatype>) next.getType();
} else {
if (Collection.class.isAssignableFrom(next.getType())) {
Class<?> type = (Class<?>) ((ParameterizedType) next.getType().getGenericSuperclass()).getActualTypeArguments()[0];
if (IDatatype.class.isAssignableFrom(type)) {
nextDatatype=(Class<? extends IDatatype>) type;
}else {
throw new ConfigurationException("Field '" + elementName + "' in type '" + theClass.getCanonicalName() + "' is not a resource reference and is not an instance of type " + IDatatype.class.getName());
}
}else {
throw new ConfigurationException("Field '" + elementName + "' in type '" + theClass.getCanonicalName() + "' is not a resource reference and is not an instance of type " + IDatatype.class.getName());
}
} }
@SuppressWarnings("unchecked")
Class<? extends IDatatype> nextDatatype = (Class<? extends IDatatype>) next.getType();
myScanAlso.add(nextDatatype); myScanAlso.add(nextDatatype);
BaseRuntimeChildDatatypeDefinition def; BaseRuntimeChildDatatypeDefinition def;

View File

@ -32,4 +32,53 @@ public class IdentifierDt extends BaseCompositeDatatype {
@ChildResource(types= {Organization.class}) @ChildResource(types= {Organization.class})
private ResourceReference myAssigner; private ResourceReference myAssigner;
public CodeDt<IdentifierUseEnum> getUse() {
return myUse;
}
public void setUse(CodeDt<IdentifierUseEnum> theUse) {
myUse = theUse;
}
public StringDt getLabel() {
return myLabel;
}
public void setLabel(StringDt theLabel) {
myLabel = theLabel;
}
public UriDt getSystem() {
return mySystem;
}
public void setSystem(UriDt theSystem) {
mySystem = theSystem;
}
public StringDt getValue() {
return myValue;
}
public void setValue(StringDt theValue) {
myValue = theValue;
}
public PeriodDt getPeriod() {
return myPeriod;
}
public void setPeriod(PeriodDt thePeriod) {
myPeriod = thePeriod;
}
public ResourceReference getAssigner() {
return myAssigner;
}
public void setAssigner(ResourceReference theAssigner) {
myAssigner = theAssigner;
}
} }

View File

@ -16,4 +16,21 @@ public class PeriodDt extends BaseCompositeDatatype {
@Constraint(greaterThan= {"start"}) @Constraint(greaterThan= {"start"})
private DateTimeDt myEnd; private DateTimeDt myEnd;
public DateTimeDt getStart() {
return myStart;
}
public void setStart(DateTimeDt theStart) {
myStart = theStart;
}
public DateTimeDt getEnd() {
return myEnd;
}
public void setEnd(DateTimeDt theEnd) {
myEnd = theEnd;
}
} }

View File

@ -4,7 +4,7 @@ import ca.uhn.fhir.model.api.BaseCompositeDatatype;
import ca.uhn.fhir.model.api.annotation.Constraint; import ca.uhn.fhir.model.api.annotation.Constraint;
import ca.uhn.fhir.model.api.annotation.Child; import ca.uhn.fhir.model.api.annotation.Child;
import ca.uhn.fhir.model.api.annotation.DatatypeDef; import ca.uhn.fhir.model.api.annotation.DatatypeDef;
import ca.uhn.fhir.model.enm.QuantityComparator; import ca.uhn.fhir.model.enm.QuantityComparatorEnum;
@DatatypeDef(name="Quantity") @DatatypeDef(name="Quantity")
public class QuantityDt extends BaseCompositeDatatype { public class QuantityDt extends BaseCompositeDatatype {
@ -13,7 +13,7 @@ public class QuantityDt extends BaseCompositeDatatype {
private DecimalDt myValue; private DecimalDt myValue;
@Child(name="comparator",order=1, min=0, max=1) @Child(name="comparator",order=1, min=0, max=1)
private QuantityComparator myComparator; private CodeDt<QuantityComparatorEnum> myComparator;
@Child(name="units",order=2, min=0, max=1) @Child(name="units",order=2, min=0, max=1)
private StringDt myUnits; private StringDt myUnits;
@ -24,6 +24,46 @@ public class QuantityDt extends BaseCompositeDatatype {
@Child(name="code",order=4, min=0, max=1) @Child(name="code",order=4, min=0, max=1)
@Constraint(coRequirements= {"system"}) @Constraint(coRequirements= {"system"})
private CodeDt myCode; private CodeDt<?> myCode;
public DecimalDt getValue() {
return myValue;
}
public void setValue(DecimalDt theValue) {
myValue = theValue;
}
public CodeDt<QuantityComparatorEnum> getComparator() {
return myComparator;
}
public void setComparator(CodeDt<QuantityComparatorEnum> theComparator) {
myComparator = theComparator;
}
public StringDt getUnits() {
return myUnits;
}
public void setUnits(StringDt theUnits) {
myUnits = theUnits;
}
public UriDt getSystem() {
return mySystem;
}
public void setSystem(UriDt theSystem) {
mySystem = theSystem;
}
public CodeDt<?> getCode() {
return myCode;
}
public void setCode(CodeDt<?> theCode) {
myCode = theCode;
}
} }

View File

@ -6,7 +6,7 @@ import ca.uhn.fhir.model.api.annotation.EnumeratedCodeValue;
import ca.uhn.fhir.model.api.annotation.CodeTableDef; import ca.uhn.fhir.model.api.annotation.CodeTableDef;
@CodeTableDef(tableId=14, name="quantity-comparator") @CodeTableDef(tableId=14, name="quantity-comparator")
public enum QuantityComparator implements ICodeEnum { public enum QuantityComparatorEnum implements ICodeEnum {
@EnumeratedCodeValue("<") @EnumeratedCodeValue("<")
@Description("The actual value is less than the given value.") @Description("The actual value is less than the given value.")

View File

@ -1,5 +1,8 @@
package ca.uhn.fhir.model.resource; package ca.uhn.fhir.model.resource;
public class Group extends BaseResource { import ca.uhn.fhir.model.api.annotation.ResourceDef;
@ResourceDef(name="Group", identifierOrder=0)
public class Group extends BaseResourceWithIdentifier {
} }

View File

@ -1,5 +1,8 @@
package ca.uhn.fhir.model.resource; package ca.uhn.fhir.model.resource;
public class Organization extends BaseResource { import ca.uhn.fhir.model.api.annotation.ResourceDef;
@ResourceDef(name="Organization", identifierOrder=0)
public class Organization extends BaseResourceWithIdentifier {
//TODO: fill in //TODO: fill in
} }

View File

@ -1,5 +1,8 @@
package ca.uhn.fhir.model.resource; package ca.uhn.fhir.model.resource;
public class Patient extends BaseResource { import ca.uhn.fhir.model.api.annotation.ResourceDef;
@ResourceDef(name="Patient", identifierOrder=0)
public class Patient extends BaseResourceWithIdentifier {
} }

View File

@ -1,5 +1,8 @@
package ca.uhn.fhir.model.resource; package ca.uhn.fhir.model.resource;
public class ValueSet extends BaseResource { import ca.uhn.fhir.model.api.annotation.ResourceDef;
@ResourceDef(name="ValueSet", identifierOrder=0)
public class ValueSet extends BaseResourceWithIdentifier {
} }