package ca.uhn.fhir.to;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import javax.annotation.PostConstruct;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.springframework.beans.factory.annotation.Required;
import ca.uhn.fhir.context.FhirVersionEnum;
import ca.uhn.fhir.util.ITestingUiClientFactory;
public class TesterConfig {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(TesterConfig.class);
public static final String SYSPROP_FORCE_SERVERS = "ca.uhn.fhir.to.TesterConfig_SYSPROP_FORCE_SERVERS";
private ITestingUiClientFactory myClientFactory;
private LinkedHashMap<String, Boolean> myIdToAllowsApiKey = new LinkedHashMap<String, Boolean>();
private LinkedHashMap<String, FhirVersionEnum> myIdToFhirVersion = new LinkedHashMap<String, FhirVersionEnum>();
private LinkedHashMap<String, String> myIdToServerBase = new LinkedHashMap<String, String>();
private LinkedHashMap<String, String> myIdToServerName = new LinkedHashMap<String, String>();
private List<ServerBuilder> myServerBuilders = new ArrayList<TesterConfig.ServerBuilder>();
public IServerBuilderStep1 addServer() {
ServerBuilder retVal = new ServerBuilder();
myServerBuilders.add(retVal);
return retVal;
}
@PostConstruct
public void build() {
for (ServerBuilder next : myServerBuilders) {
Validate.notBlank(next.myId, "Found invalid server configuration - No ID supplied");
Validate.notNull(next.myVersion, "Found invalid server configuration - No FHIR version supplied");
Validate.notBlank(next.myBaseUrl, "Found invalid server configuration - No base URL supplied");
Validate.notBlank(next.myName, "Found invalid server configuration - No name supplied");
myIdToFhirVersion.put(next.myId, next.myVersion);
myIdToServerBase.put(next.myId, next.myBaseUrl);
myIdToServerName.put(next.myId, next.myName);
myIdToAllowsApiKey.put(next.myId, next.myAllowsApiKey);
}
myServerBuilders.clear();
}
public ITestingUiClientFactory getClientFactory() {
return myClientFactory;
}
public boolean getDebugTemplatesMode() {
return true;
}
public LinkedHashMap<String, Boolean> getIdToAllowsApiKey() {
return myIdToAllowsApiKey;
}
public LinkedHashMap<String, FhirVersionEnum> getIdToFhirVersion() {
return myIdToFhirVersion;
}
public LinkedHashMap<String, String> getIdToServerBase() {
return myIdToServerBase;
}
public LinkedHashMap<String, String> getIdToServerName() {
return myIdToServerName;
}
public void setClientFactory(ITestingUiClientFactory theClientFactory) {
myClientFactory = theClientFactory;
}
@Required
public void setServers(List<String> theServers) {
List<String> servers = theServers;
// This is mostly for unit tests
String force = System.getProperty(SYSPROP_FORCE_SERVERS);
if (StringUtils.isNotBlank(force)) {
ourLog.warn("Forcing server confirguration because of system property: {}", force);
servers = Collections.singletonList(force);
}
for (String nextRaw : servers) {
String[] nextSplit = nextRaw.split(",");
if (nextSplit.length < 3) {
throw new IllegalArgumentException("Invalid serveer line '" + nextRaw + "' - Must be comma separated");
} else if (nextSplit.length == 3) {
Validate.notBlank(nextSplit[0], "theId can not be blank");
Validate.notBlank(nextSplit[1], "theDisplayName can not be blank");
Validate.notBlank(nextSplit[2], "theServerBase can not be blank");
myIdToServerName.put(nextSplit[0].trim(), nextSplit[1].trim());
myIdToServerBase.put(nextSplit[0].trim(), nextSplit[2].trim());
myIdToFhirVersion.put(nextSplit[0].trim(), FhirVersionEnum.DSTU1);
} else {
Validate.notBlank(nextSplit[0], "theId can not be blank");
Validate.notBlank(nextSplit[1], "theVersion can not be blank");
Validate.notBlank(nextSplit[2], "theDisplayName can not be blank");
Validate.notBlank(nextSplit[3], "theServerBase can not be blank");
myIdToServerName.put(nextSplit[0].trim(), nextSplit[2].trim());
myIdToServerBase.put(nextSplit[0].trim(), nextSplit[3].trim());
myIdToFhirVersion.put(nextSplit[0].trim(), FhirVersionEnum.valueOf(nextSplit[1].trim().toUpperCase().replace('.', '_')));
}
}
}
public interface IServerBuilderStep1 {
IServerBuilderStep2 withId(String theId);
}
public interface IServerBuilderStep2 {
IServerBuilderStep3 withFhirVersion(FhirVersionEnum theVersion);
}
public interface IServerBuilderStep3 {
IServerBuilderStep4 withBaseUrl(String theBaseUrl);
}
public interface IServerBuilderStep4 {
IServerBuilderStep5 withName(String theName);
}
public interface IServerBuilderStep5 {
IServerBuilderStep1 addServer();
IServerBuilderStep5 allowsApiKey();
}
public class ServerBuilder implements IServerBuilderStep1, IServerBuilderStep2, IServerBuilderStep3, IServerBuilderStep4, IServerBuilderStep5 {
private boolean myAllowsApiKey;
private String myBaseUrl;
private String myId;
private String myName;
private FhirVersionEnum myVersion;
@Override
public IServerBuilderStep1 addServer() {
ServerBuilder retVal = new ServerBuilder();
myServerBuilders.add(retVal);
return retVal;
}
@Override
public IServerBuilderStep5 allowsApiKey() {
myAllowsApiKey = true;
return this;
}
@Override
public IServerBuilderStep4 withBaseUrl(String theBaseUrl) {
Validate.notBlank(theBaseUrl, "theBaseUrl can not be blank");
myBaseUrl = theBaseUrl;
return this;
}
@Override
public IServerBuilderStep3 withFhirVersion(FhirVersionEnum theVersion) {
Validate.notNull(theVersion);
myVersion = theVersion;
return this;
}
@Override
public IServerBuilderStep2 withId(String theId) {
Validate.notBlank(theId, "theId can not be blank");
myId = theId;
return this;
}
@Override
public IServerBuilderStep5 withName(String theName) {
Validate.notBlank(theName, "theName can not be blank");
myName = theName;
return this;
}
}
}