package ca.uhn.fhir.tinder.model;
import static org.apache.commons.lang.StringUtils.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
public abstract class BaseElement {
private String myBinding;
private String myBindingClass;
private String myCardMax;
private String myCardMin;
private Map<String, Slicing> myChildElementNameToSlicing = new HashMap<String, Slicing>();
private List<BaseElement> myChildren;
private String myComments;
private String myDeclaringClassNameComplete;
private String myDefinition;
private String myElementName;
private String myElementParentName;
private String myExtensionUrl;
private boolean myModifier;
private String myName;
private String myRequirement;
private boolean myResourceRef = false;
private String myShortName;
private boolean mySummary;
private List<String> myType;
private String myV2Mapping;
private String myBindingUrl;
public void addChild(Child theElem) {
if (myChildren == null) {
myChildren = new ArrayList<BaseElement>();
}
myChildren.add(theElem);
// if (theElem.getDeclaringClassNameComplete()==null) {
theElem.setDeclaringClassNameComplete(getDeclaringClassNameCompleteForChildren());
// }
// clearTypes();
}
public void clearTypes() {
getType().clear();
}
public String getBinding() {
return myBinding;
}
public String getBindingClass() {
return myBindingClass;
}
public String getCardMax() {
return defaultString(myCardMax, "1");
}
public String getCardMin() {
return defaultString(myCardMin, "0");
}
public Map<String, Slicing> getChildElementNameToSlicing() {
return myChildElementNameToSlicing;
}
public List<BaseElement> getChildren() {
if (myChildren == null) {
myChildren = new ArrayList<BaseElement>();
}
return Collections.unmodifiableList(myChildren);
}
public String getComments() {
return myComments;
}
public String getDeclaringClassNameComplete() {
return myDeclaringClassNameComplete;
}
public String getDeclaringClassNameCompleteForChildren() {
return getDeclaringClassNameComplete();
}
public String getDefinition() {
return toStringConstant(myDefinition);
}
public String getElementName() {
return myElementName;
}
public String getElementParentName() {
return myElementParentName;
}
public String getExtensionUrl() {
return myExtensionUrl;
}
public String getName() {
return myName;
}
public String getRequirement() {
return myRequirement;
}
public List<ResourceBlock> getResourceBlockChildren() {
ArrayList<ResourceBlock> retVal = new ArrayList<ResourceBlock>();
for (BaseElement next : getChildren()) {
if (next instanceof ResourceBlock) {
retVal.add((ResourceBlock) next);
}
}
return retVal;
}
public String getShortName() {
return toStringConstant(myShortName);
}
public List<String> getType() {
if (myType == null) {
myType = new ArrayList<String>();
}
return myType;
}
public String getV2Mapping() {
return myV2Mapping;
}
public boolean isExtensionLocal() {
return false; // TODO: implemment
}
public boolean isExtensionModifier() {
return false; // TODO: implemment
}
public boolean isHasExtensionUrl() {
return StringUtils.isNotBlank(myExtensionUrl);
}
public boolean isHasMultipleTypes() {
return getType().size() > 1;
}
public boolean isModifier() {
return myModifier;
}
public boolean isResourceRef() {
return myResourceRef;
}
public boolean isSummary() {
return mySummary;
}
public void setBinding(String theCellValue) {
myBinding = theCellValue;
}
public void setBindingClass(String theBindingClass) {
myBindingClass = theBindingClass;
}
public void setCardMax(String theCardMax) {
myCardMax = theCardMax;
}
public void setCardMin(String theCardMin) {
myCardMin = theCardMin;
}
public void setChildElementNameToSlicing(Map<String, Slicing> theChildElementNameToSlicing) {
myChildElementNameToSlicing = theChildElementNameToSlicing;
}
public void setComments(String theComments) {
myComments = theComments;
}
public void setDeclaringClassNameComplete(String theDeclaringClassNameComplete) {
myDeclaringClassNameComplete = theDeclaringClassNameComplete.trim();
}
public void setDefinition(String theDefinition) {
myDefinition = theDefinition != null ? theDefinition.trim() : null;
}
public void setElementName(String theName) {
myElementName = theName.trim();
}
public void setElementNameAndDeriveParentElementName(String theName) {
String name = theName.trim();
int lastDot = name.lastIndexOf('.');
if (lastDot == -1) {
setElementName(name);
} else {
String elementName = name.substring(lastDot + 1);
String elementParentName = name.substring(0, lastDot);
setElementName(elementName);
myElementParentName = (elementParentName);
}
}
public void setExtensionUrl(String theExtensionUrl) {
myExtensionUrl = theExtensionUrl.trim();
}
public void setModifier(String theModifier) {
if (theModifier == null) {
myModifier = false;
} else {
myModifier = "Y".equals(theModifier.toUpperCase());
}
}
public void setName(String theName) {
myName = theName.trim();
}
public void setRequirement(String theString) {
myRequirement = theString;
}
public void setResourceRef(boolean theResourceRef) {
myResourceRef = theResourceRef;
}
public void setShortName(String theShortName) {
myShortName = theShortName;
}
public void setSummary(String theSummary) {
if (theSummary == null) {
mySummary = false;
} else {
mySummary = "Y".equals(theSummary.toUpperCase());
}
}
public void setTypeFromString(String theType) {
if (theType == null) {
myType = null;
return;
}
String typeString = theType;
typeString = typeString.replace("Reference (", "Reference(");
typeString = typeString.replace("Resource (", "Reference(");
typeString = typeString.replace("Resource(", "Reference(").trim();
// if (typeString.toLowerCase().startsWith("resource(")) {
// typeString = typeString.substring("Resource(".length(), typeString.length());
// myResourceRef = true;
// } else if (typeString.toLowerCase().startsWith("reference(")) {
// typeString = typeString.substring("Reference(".length(), typeString.length());
// myResourceRef = true;
// } else
boolean datatype = true;
if (typeString.startsWith("@")) {
typeString = typeString.substring(1);
typeString = ResourceBlock.convertFhirPathNameToClassName(typeString);
datatype = false;
// } else if (typeString.equals("Reference(Any)")) {
// typeString = "Reference(IResource)";
// datatype = false;
} else if (typeString.equals("*")) {
typeString = "IDatatype";
datatype = false;
}
if (StringUtils.isNotBlank(typeString)) {
int idx = typeString.indexOf("Reference(");
if (idx != -1) {
int endIdx = typeString.indexOf(")");
typeString = typeString.substring(0, idx) + typeString.substring(idx, endIdx).replace("|", ",") + typeString.substring(endIdx);
}
if (idx == 0 && typeString.endsWith(")")) {
myResourceRef = true;
}
if (typeString.startsWith("=")) {
datatype = false;
}
String[] types = typeString.replace("=", "").split("\\|");
for (String nextType : types) {
nextType = nextType.trim();
if (nextType.endsWith(")")) {
nextType = nextType.substring(0, nextType.length() - 1);
}
if (nextType.toLowerCase().startsWith("resource(")) {
nextType = nextType.substring("Resource(".length(), nextType.length());
nextType = nextType.substring(0, 1).toUpperCase() + nextType.substring(1);
} else if (nextType.toLowerCase().startsWith("reference(")) {
nextType = nextType.substring("Reference(".length(), nextType.length());
nextType = nextType.substring(0, 1).toUpperCase() + nextType.substring(1);
} else {
nextType = nextType.substring(0, 1).toUpperCase() + nextType.substring(1);
if (datatype) {
nextType = nextType + "Dt";
}
}
for (String next : nextType.split(",")) {
if (isNotBlank(next.trim())) {
getType().add(next.trim());
}
}
}
}
}
public void setV2Mapping(String theV2Mapping) {
myV2Mapping = theV2Mapping;
}
public static void main(String[] args) {
SimpleChild child = new SimpleChild();
child.setTypeFromString("CodeableConcept | Resource(Any)");
}
static String toStringConstant(String theDefinition) {
if (theDefinition == null) {
return "";
}
StringBuffer b = new StringBuffer();
for (char next : theDefinition.toCharArray()) {
if (next < ' ') {
continue;
}
if (next == '"') {
b.append('\\');
}
b.append(next);
}
return b.toString().trim();
}
public void setBindingUrl(String theBindingUrl) {
myBindingUrl = theBindingUrl;
}
public boolean isHasBindingUrl() {
return isNotBlank(myBindingUrl);
}
public String getBindingUrl() {
return myBindingUrl;
}
}