package ca.uhn.fhir.tinder.model;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang.WordUtils;
import org.apache.commons.lang3.StringUtils;
public class SearchParameter {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SearchParameter.class);
private List<String> myCompartments = new ArrayList<String>();
private List<String> myCompositeOf;
private List<String> myCompositeTypes;
private String myDescription;
private String myName;
private String myPath;
private String myResourceName;
private List<String> myTargetTypes;
private String myType;
private String myVersion;
public SearchParameter(String theVersion, String theResourceName) {
this.myVersion = theVersion;
this.myResourceName = theResourceName;
}
public void addCompartment(String theCompartment) {
myCompartments.add(theCompartment);
}
public List<String> getCompartments() {
return myCompartments;
}
public List<String> getCompositeOf() {
if (myCompositeOf == null) {
myCompositeOf = new ArrayList<String>();
}
return myCompositeOf;
}
public List<String> getCompositeTypes() {
if (myCompositeTypes == null) {
myCompositeTypes = new ArrayList<String>();
}
return myCompositeTypes;
}
public String getConstantName() {
return "SP_" + myName.toUpperCase().replace("_[X]", "_X").replace("-[X]", "_X").replace('-', '_').replace("!", "");
}
public String getDescription() {
return BaseElement.toStringConstant(myDescription);
}
public String getFluentConstantName() {
// if (myPath==null) {
// return myName.toUpperCase();
// }
// return myPath.toUpperCase().replace("_[X]", "_X").replace("-[X]", "_X").replace('-', '_').replace("!", "");
return myName.toUpperCase().replace("_[X]", "_X").replace("-[X]", "_X").replace('-', '_').replace("!", "");
}
public String getName() {
return myName;
}
public String getNameCapitalized() {
return WordUtils.capitalize(myName).replace("_[x]", "").replace("-[x]", "").replace("_[X]", "").replace("-[X]", "").replace('-', '_').replace("!", "");
}
public String getPath() {
return StringUtils.defaultString(myPath);
}
public List<Include> getPaths() {
ArrayList<Include> retVal = new ArrayList<Include>();
if ("dstu".equals(myVersion)) {
for (String next : getPath().split("\\s*\\|\\s*")) {
retVal.add(new Include(next));
}
} else {
if (myType == null) {
if (isNotBlank(myName)) {
ourLog.warn("Search parameter {} has no type", myName);
}
}
if ("resource".equals(myType) || "reference".equals(myType)) {
retVal.add(new Include(myResourceName + ":" + myName));
}
}
return retVal;
}
public List<String> getTargetTypes() {
if (myTargetTypes == null) {
return Collections.emptyList();
}
ArrayList<String> retVal = new ArrayList<String>();
for (String i : myTargetTypes) {
retVal.add(Resource.correctName(i));
}
return retVal;
}
public String getType() {
return StringUtils.defaultString(myType);
}
public String getTypeCapitalized() {
return WordUtils.capitalize(myType);
}
public void setCompositeOf(List<String> theCompositeOf) {
myCompositeOf = theCompositeOf;
}
public void setCompositeTypes(List<String> theCompositeTypes) {
myCompositeTypes = theCompositeTypes;
}
public void setDescription(String theDescription) {
myDescription = theDescription;
}
public void setName(String theName) {
if (theName != null && Character.isUpperCase(theName.charAt(0))) {
myName = theName.substring(theName.indexOf('.') + 1);
} else {
myName = theName;
}
}
public void setPath(String thePath) {
myPath = thePath;
}
public void addTargetType(String theTargetType) {
if (myTargetTypes == null) {
myTargetTypes = new ArrayList<String>();
}
myTargetTypes.add(theTargetType);
}
public void setType(String theType) {
myType = theType;
}
public static class Include implements Comparable<Include> {
private String myPath;
public Include(String thePath) {
myPath = thePath;
}
@Override
public int compareTo(Include theO) {
return myPath.compareTo(theO.myPath);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Include other = (Include) obj;
if (myPath == null) {
if (other.myPath != null)
return false;
} else if (!myPath.equals(other.myPath))
return false;
return true;
}
public String getIncludeName() {
String retVal = myPath;
retVal = retVal.substring(retVal.indexOf('.') + 1);
retVal = retVal.substring(retVal.indexOf(':') + 1);
retVal = retVal.toUpperCase().replace('.', '_').replace("[X]", "").replace("-", "_");
return retVal;
}
public String getPath() {
// String retVal = StringUtils.defaultString(myPath);
// retVal = retVal.substring(retVal.indexOf('.')+1);
return myPath;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((myPath == null) ? 0 : myPath.hashCode());
return result;
}
}
}