package ca.uhn.fhir.tinder.model;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import ca.uhn.fhir.model.api.BasePrimitive;
import ca.uhn.fhir.model.api.IDatatype;
import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt;
import ca.uhn.fhir.model.primitive.IdDt;
public abstract class Child extends BaseElement {
private List<SimpleSetter> mySimpleStters = new ArrayList<SimpleSetter>();
@Override
public void clearTypes() {
super.clearTypes();
mySimpleStters.clear();
}
public String getAnnotationType() {
return getSingleType();
}
public String getBoundDatatype() {
String singleType = getSingleType();
if ("CodeDt".equals(singleType) || "CodeableConceptDt".equals(singleType)) {
return "Bound" + singleType;
}
throw new IllegalStateException();
}
public String getCardMaxForChildAnnotation() {
if (getCardMax().equals("*")) {
return "Child.MAX_UNLIMITED";
} else {
return getCardMax();
}
}
@Override
public String toString() {
return getClass().getSimpleName() + "[" + getName() + "]";
}
/**
* Strips off "[x]"
*/
public String getElementNameSimplified() {
String elementName = getElementName();
if (elementName.endsWith("[x]")) {
elementName = elementName.substring(0, elementName.length() - 3);
}
return elementName.trim();
}
public String getMethodName() {
String elementName = getElementNameSimplified();
elementName = elementName.substring(0, 1).toUpperCase() + elementName.substring(1);
if ("Class".equals(elementName)) {
elementName = "ClassElement";
}
// if ("Language".equals(elementName)) {
// elementName = "LanguageElement";
// }
return elementName;
}
public String getReferenceType() {
String retVal;
if (this.isResourceRef()) {
retVal = ResourceReferenceDt.class.getSimpleName();
} else if (this.getType().size() == 1 || this instanceof ResourceBlock) {
if (isBoundCode()) {
retVal = "Bound" + getSingleType() + "<" + getBindingClass() + ">";
} else {
retVal = getSingleType();
}
} else {
if (this instanceof Extension && ((Extension) this).getChildExtensions().size() > 0) {
retVal = ((Extension) this).getNameType();
} else {
retVal = IDatatype.class.getSimpleName();
}
}
if (this.isRepeatable()) {
retVal = ("java.util.List<" + retVal + ">");
}
return retVal;
}
public String getReferenceTypeForConstructor() {
return getReferenceType().replaceAll("^java.util.List<", "java.util.ArrayList<");
}
public List<String> getReferenceTypesForMultiple() {
ArrayList<String> retVal = new ArrayList<String>();
for (String next : getType()) {
if ("Any".equals(next)) {
next = "IResource";
}
retVal.add(Resource.correctName(next));
// retVal.add(next + getTypeSuffix());
}
return retVal;
}
public List<SimpleSetter> getSimpleSetters() {
if (isBoundCode()) {
return Collections.emptyList();
}
return mySimpleStters;
}
public String getSingleType() {
String retVal;
String elemName = this.getType().get(0);
if (elemName.startsWith("ca.") == false) {
elemName = elemName.substring(0, 1).toUpperCase() + elemName.substring(1);
}
// if (this instanceof ResourceBlock) {
retVal = (elemName);
// } else {
// retVal = (elemName + getTypeSuffix());
// }
if (retVal.equals("ResourceDt")) {
retVal = "IResource";
}
return retVal;
}
public String getVariableName() {
String elementName = getMethodName();
return "my" + elementName;
}
public boolean isBlock() {
return false;
}
public boolean isBlockRef() {
return false;
}
public boolean isPrimitive (String theType) {
return isPrimitiveInternal(theType);
}
public boolean isPrimitive() {
if (IDatatype.class.getSimpleName().equals(getReferenceType())) {
return false;
}
return isPrimitiveInternal(getSingleType());
}
protected boolean isPrimitiveInternal (String theType) {
try {
String name = "ca.uhn.fhir.model.primitive." + theType;
Class.forName(name);
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
public String getPrimitiveType (String theType) throws ClassNotFoundException {
return getPrimitiveTypeInternal(theType);
}
public String getPrimitiveType() throws ClassNotFoundException {
return getPrimitiveTypeInternal(getSingleType());
}
protected String getPrimitiveTypeInternal (String theType) throws ClassNotFoundException {
String name = "ca.uhn.fhir.model.primitive." + theType;
Class<?> clazz = Class.forName(name);
if (clazz.equals(IdDt.class)) {
return String.class.getSimpleName();
}
while (!clazz.getSuperclass().equals(BasePrimitive.class)) {
clazz = clazz.getSuperclass();
if (clazz.equals(Object.class)) {
throw new Error("Parent of " + name + " is not BasePrimitive");
}
}
ParameterizedType type = (ParameterizedType) clazz.getGenericSuperclass();
Type type2 = type.getActualTypeArguments()[0];
if (type2 instanceof GenericArrayType) {
String arrayType = ((GenericArrayType) type2).getGenericComponentType().toString();
return arrayType + "[]";
}
Class<?> rawType = (Class<?>) type2;
return rawType.getSimpleName();
}
public boolean isBoundCode() {
String singleType = getSingleType();
if ("CodeDt".equals(singleType) || "CodeableConceptDt".equals(singleType)) {
if (StringUtils.isNotBlank(getBindingClass())) {
return true;
}
}
return false;
}
public boolean isRepeatable() {
return "1".equals(getCardMax()) == false;
}
public boolean isSingleChildInstantiable() {
return true;
}
}