package ca.uhn.fhir.to.model;
import static org.apache.commons.lang3.StringUtils.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpRequestBase;
import org.springframework.web.bind.annotation.ModelAttribute;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.FhirVersionEnum;
import ca.uhn.fhir.parser.IParser;
import ca.uhn.fhir.rest.api.SummaryEnum;
import ca.uhn.fhir.rest.client.GenericClient;
import ca.uhn.fhir.rest.client.IClientInterceptor;
import ca.uhn.fhir.rest.client.ServerValidationModeEnum;
import ca.uhn.fhir.rest.client.api.IHttpRequest;
import ca.uhn.fhir.rest.client.api.IHttpResponse;
import ca.uhn.fhir.rest.server.EncodingEnum;
import ca.uhn.fhir.rest.server.IncomingRequestAddressStrategy;
import ca.uhn.fhir.to.Controller;
import ca.uhn.fhir.to.TesterConfig;
import ca.uhn.fhir.util.ITestingUiClientFactory;
public class HomeRequest {
private String myEncoding;
private String myPretty;
private String myResource;
private String myServerId;
private String mySummary;
@ModelAttribute("encoding")
public String getEncoding() {
return myEncoding;
}
@ModelAttribute("encoding")
public String getPretty() {
return myPretty;
}
@ModelAttribute("_summary")
public String get_summary() {
return mySummary;
}
@ModelAttribute("resource")
public String getResource() {
return myResource;
}
public String getServerBase(HttpServletRequest theRequest, TesterConfig theConfig) {
String retVal;
if (isBlank(myServerId) && !theConfig.getIdToServerBase().containsKey(myServerId)) {
retVal = theConfig.getIdToServerBase().entrySet().iterator().next().getValue();
} else {
retVal = theConfig.getIdToServerBase().get(myServerId);
}
if (retVal.contains("${serverBase}")) {
IncomingRequestAddressStrategy strategy = new IncomingRequestAddressStrategy();
strategy.setServletPath("");
String base = strategy.determineServerBase(theRequest.getServletContext(), theRequest);
if (base.endsWith("/")) {
base = base.substring(0, base.length() - 1);
}
if (base.endsWith("/resource")) {
base = base.substring(0, base.length() - "/resource".length());
}
retVal = retVal.replace("${serverBase}", base);
}
return retVal;
}
@ModelAttribute("serverId")
public String getServerId() {
return myServerId;
}
public String getServerIdWithDefault(TesterConfig theConfig) {
String retVal = myServerId;
if (isBlank(retVal)) {
retVal = theConfig.getIdToServerBase().keySet().iterator().next();
}
return retVal;
}
public FhirVersionEnum getFhirVersion(TesterConfig theConfig) {
if (isBlank(myServerId) && !theConfig.getIdToFhirVersion().containsKey(myServerId)) {
return theConfig.getIdToFhirVersion().entrySet().iterator().next().getValue();
} else {
return theConfig.getIdToFhirVersion().get(myServerId);
}
}
public String getServerName(TesterConfig theConfig) {
if (isBlank(myServerId) && !theConfig.getIdToServerName().containsKey(myServerId)) {
return theConfig.getIdToServerName().entrySet().iterator().next().getValue();
} else {
return theConfig.getIdToServerName().get(myServerId);
}
}
public void setEncoding(String theEncoding) {
myEncoding = theEncoding;
}
public void setPretty(String thePretty) {
myPretty = thePretty;
}
public void set_summary(String theSummary) {
mySummary = theSummary;
}
public void setResource(String theResource) {
myResource = theResource;
}
public void setServerId(String theServerId) {
myServerId = theServerId;
}
public GenericClient newClient(HttpServletRequest theRequest, FhirContext theContext, TesterConfig theConfig, Controller.CaptureInterceptor theInterceptor) {
theContext.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER);
GenericClient retVal;
ITestingUiClientFactory clientFactory = theConfig.getClientFactory();
if (clientFactory != null) {
retVal = (GenericClient) clientFactory.newClient(
theContext,
theRequest,
getServerBase(theRequest, theConfig));
} else {
retVal = (GenericClient) theContext.newRestfulGenericClient(getServerBase(theRequest, theConfig));
}
retVal.setKeepResponses(true);
if ("true".equals(getPretty())) {
retVal.setPrettyPrint(true);
} else if ("false".equals(getPretty())) {
retVal.setPrettyPrint(false);
}
if ("xml".equals(getEncoding())) {
retVal.setEncoding(EncodingEnum.XML);
} else if ("json".equals(getEncoding())) {
retVal.setEncoding(EncodingEnum.JSON);
}
if (isNotBlank(get_summary())) {
SummaryEnum summary = SummaryEnum.fromCode(get_summary());
if (summary != null) {
retVal.setSummary(summary);
}
}
retVal.registerInterceptor(theInterceptor);
final String remoteAddr = org.slf4j.MDC.get("req.remoteAddr");
retVal.registerInterceptor(new IClientInterceptor() {
@Override
public void interceptResponse(IHttpResponse theRequest) {
// nothing
}
@Override
public void interceptRequest(IHttpRequest theRequest) {
if (isNotBlank(remoteAddr)) {
theRequest.addHeader("x-forwarded-for", remoteAddr);
}
}
});
return retVal;
}
public IParser newParser(FhirContext theCtx) {
if ("json".equals(getEncoding())) {
return theCtx.newJsonParser();
}
return theCtx.newXmlParser();
}
public String getApiKey(HttpServletRequest theServletRequest, TesterConfig theConfig) {
Boolean allowsApiKey;
if (isBlank(myServerId) && !theConfig.getIdToFhirVersion().containsKey(myServerId)) {
allowsApiKey = theConfig.getIdToAllowsApiKey().entrySet().iterator().next().getValue();
} else {
allowsApiKey = theConfig.getIdToAllowsApiKey().get(myServerId);
}
if (!Boolean.TRUE.equals(allowsApiKey)) {
return null;
}
return defaultString(theServletRequest.getParameter("apiKey"));
}
}