mirror of
https://github.com/hapifhir/hapi-fhir.git
synced 2025-02-17 18:35:50 +00:00
* Replace phloc with ph * Enable schematron tests * Make HAPI-FHIR ph-schematron on OSGI * Work on getting tests passing * Another test fix * Fix up transaction handling for DSTU2 * Add changelog * Avoid double transaction * Dont use readonly * One more test fix * Update to snapshow build * Resolve a circular dependency * Try to fix tests * Solve recurring NPE in DSTU2 tests * Fix one more test * Test fix * More test threading fixes * One more attempt to get tests passing * Refactoring for tests * Refactoring for tests
This commit is contained in:
parent
3a03d4ff63
commit
a3ff08d9ec
@ -181,8 +181,8 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>Saxon-HE</artifactId>
|
<artifactId>Saxon-HE</artifactId>
|
||||||
|
@ -60,7 +60,7 @@ public class FhirServerConfig extends BaseJavaConfigDstu3 {
|
|||||||
|
|
||||||
@Bean()
|
@Bean()
|
||||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
||||||
LocalContainerEntityManagerFactoryBean retVal = entityManagerFactory();
|
LocalContainerEntityManagerFactoryBean retVal = super.entityManagerFactory();
|
||||||
retVal.setPersistenceUnitName("HAPI_PU");
|
retVal.setPersistenceUnitName("HAPI_PU");
|
||||||
retVal.setDataSource(dataSource());
|
retVal.setDataSource(dataSource());
|
||||||
retVal.setJpaProperties(jpaProperties());
|
retVal.setJpaProperties(jpaProperties());
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
<groupId>ca.uhn.hapi.fhir</groupId>
|
<groupId>ca.uhn.hapi.fhir</groupId>
|
||||||
<artifactId>hapi-fhir</artifactId>
|
<artifactId>hapi-fhir</artifactId>
|
||||||
<version>3.4.0-SNAPSHOT</version>
|
<version>3.4.0-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>hapi-fhir-jpaserver-dynamic</artifactId>
|
<artifactId>hapi-fhir-jpaserver-dynamic</artifactId>
|
||||||
@ -198,8 +198,8 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>Saxon-HE</artifactId>
|
<artifactId>Saxon-HE</artifactId>
|
||||||
|
@ -100,8 +100,8 @@
|
|||||||
<artifactId>javax.mail-api</artifactId>
|
<artifactId>javax.mail-api</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-logging</groupId>
|
<groupId>commons-logging</groupId>
|
||||||
@ -140,6 +140,7 @@
|
|||||||
<ignoredResourcePattern>changelog.txt</ignoredResourcePattern>
|
<ignoredResourcePattern>changelog.txt</ignoredResourcePattern>
|
||||||
<ignoredResource>javac.bat</ignoredResource>
|
<ignoredResource>javac.bat</ignoredResource>
|
||||||
<ignoredResource>about.html</ignoredResource>
|
<ignoredResource>about.html</ignoredResource>
|
||||||
|
<ignoredResource>changelog.xml</ignoredResource>
|
||||||
</ignoredResourcePatterns>
|
</ignoredResourcePatterns>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
@ -45,27 +45,14 @@
|
|||||||
|
|
||||||
<!-- Only required for Schematron Validator Support -->
|
<!-- Only required for Schematron Validator Support -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
<exclusions><!--
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>Saxon-HE</artifactId>
|
|
||||||
<groupId>net.sf.saxon</groupId>
|
|
||||||
</exclusion>-->
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<!-- Guava brings in a newer replacement for this dependency called com.google.code.findbugs:jsr305 -->
|
|
||||||
<groupId>com.google.code.findbugs</groupId>
|
|
||||||
<artifactId>annotations</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId>
|
<!-- <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId>
|
||||||
|
@ -42,9 +42,9 @@ import ca.uhn.fhir.validation.schematron.SchematronProvider;
|
|||||||
*/
|
*/
|
||||||
public class FhirValidator {
|
public class FhirValidator {
|
||||||
|
|
||||||
private static final String I18N_KEY_NO_PHLOC_ERROR = FhirValidator.class.getName() + ".noPhlocError";
|
private static final String I18N_KEY_NO_PH_ERROR = FhirValidator.class.getName() + ".noPhError";
|
||||||
|
|
||||||
private static volatile Boolean ourPhlocPresentOnClasspath;
|
private static volatile Boolean ourPhPresentOnClasspath;
|
||||||
private final FhirContext myContext;
|
private final FhirContext myContext;
|
||||||
private List<IValidatorModule> myValidators = new ArrayList<IValidatorModule>();
|
private List<IValidatorModule> myValidators = new ArrayList<IValidatorModule>();
|
||||||
|
|
||||||
@ -54,8 +54,8 @@ public class FhirValidator {
|
|||||||
public FhirValidator(FhirContext theFhirContext) {
|
public FhirValidator(FhirContext theFhirContext) {
|
||||||
myContext = theFhirContext;
|
myContext = theFhirContext;
|
||||||
|
|
||||||
if (ourPhlocPresentOnClasspath == null) {
|
if (ourPhPresentOnClasspath == null) {
|
||||||
ourPhlocPresentOnClasspath = SchematronProvider.isSchematronAvailable(theFhirContext);
|
ourPhPresentOnClasspath = SchematronProvider.isSchematronAvailable(theFhirContext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,9 +96,10 @@ public class FhirValidator {
|
|||||||
* Should the validator validate the resource against the base schema (the schema provided with the FHIR distribution itself)
|
* Should the validator validate the resource against the base schema (the schema provided with the FHIR distribution itself)
|
||||||
*/
|
*/
|
||||||
public synchronized boolean isValidateAgainstStandardSchematron() {
|
public synchronized boolean isValidateAgainstStandardSchematron() {
|
||||||
if (!ourPhlocPresentOnClasspath) {
|
if (!ourPhPresentOnClasspath) {
|
||||||
return false; // No need to ask since we dont have Phloc. Also Class.forname will complain
|
// No need to ask since we dont have Ph-Schematron. Also Class.forname will complain
|
||||||
// about missing phloc import.
|
// about missing ph-schematron import.
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
Class<? extends IValidatorModule> cls = SchematronProvider.getSchematronValidatorClass();
|
Class<? extends IValidatorModule> cls = SchematronProvider.getSchematronValidatorClass();
|
||||||
return haveValidatorOfType(cls);
|
return haveValidatorOfType(cls);
|
||||||
@ -135,8 +136,11 @@ public class FhirValidator {
|
|||||||
* @return Returns a referens to <code>this<code> for method chaining
|
* @return Returns a referens to <code>this<code> for method chaining
|
||||||
*/
|
*/
|
||||||
public synchronized FhirValidator setValidateAgainstStandardSchematron(boolean theValidateAgainstStandardSchematron) {
|
public synchronized FhirValidator setValidateAgainstStandardSchematron(boolean theValidateAgainstStandardSchematron) {
|
||||||
if (theValidateAgainstStandardSchematron && !ourPhlocPresentOnClasspath) {
|
if (theValidateAgainstStandardSchematron && !ourPhPresentOnClasspath) {
|
||||||
throw new IllegalArgumentException(myContext.getLocalizer().getMessage(I18N_KEY_NO_PHLOC_ERROR));
|
throw new IllegalArgumentException(myContext.getLocalizer().getMessage(I18N_KEY_NO_PH_ERROR));
|
||||||
|
}
|
||||||
|
if (!theValidateAgainstStandardSchematron && !ourPhPresentOnClasspath) {
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
Class<? extends IValidatorModule> cls = SchematronProvider.getSchematronValidatorClass();
|
Class<? extends IValidatorModule> cls = SchematronProvider.getSchematronValidatorClass();
|
||||||
IValidatorModule instance = SchematronProvider.getSchematronValidatorInstance(myContext);
|
IValidatorModule instance = SchematronProvider.getSchematronValidatorInstance(myContext);
|
||||||
@ -163,7 +167,7 @@ public class FhirValidator {
|
|||||||
private void applyDefaultValidators() {
|
private void applyDefaultValidators() {
|
||||||
if (myValidators.isEmpty()) {
|
if (myValidators.isEmpty()) {
|
||||||
setValidateAgainstStandardSchema(true);
|
setValidateAgainstStandardSchema(true);
|
||||||
if (ourPhlocPresentOnClasspath) {
|
if (ourPhPresentOnClasspath) {
|
||||||
setValidateAgainstStandardSchematron(true);
|
setValidateAgainstStandardSchematron(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,28 +20,28 @@ package ca.uhn.fhir.validation.schematron;
|
|||||||
* #L%
|
* #L%
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.StringReader;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import javax.xml.transform.stream.StreamSource;
|
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseBundle;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
import org.oclc.purl.dsdl.svrl.SchematronOutputType;
|
|
||||||
|
|
||||||
import com.phloc.commons.error.IResourceError;
|
|
||||||
import com.phloc.commons.error.IResourceErrorGroup;
|
|
||||||
import com.phloc.schematron.ISchematronResource;
|
|
||||||
import com.phloc.schematron.SchematronHelper;
|
|
||||||
import com.phloc.schematron.xslt.SchematronResourceSCH;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.api.EncodingEnum;
|
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.util.BundleUtil;
|
import ca.uhn.fhir.util.BundleUtil;
|
||||||
import ca.uhn.fhir.validation.*;
|
import ca.uhn.fhir.validation.*;
|
||||||
|
import com.helger.commons.error.IError;
|
||||||
|
import com.helger.commons.error.list.IErrorList;
|
||||||
|
import com.helger.schematron.ISchematronResource;
|
||||||
|
import com.helger.schematron.SchematronHelper;
|
||||||
|
import com.helger.schematron.xslt.SchematronResourceSCH;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseBundle;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
import org.oclc.purl.dsdl.svrl.SchematronOutputType;
|
||||||
|
|
||||||
|
import javax.xml.transform.stream.StreamSource;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.StringReader;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is only used using reflection from {@link SchematronProvider} in order
|
* This class is only used using reflection from {@link SchematronProvider} in order
|
||||||
@ -81,27 +81,21 @@ public class SchematronBaseValidator implements IValidatorModule {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IResourceErrorGroup errors = SchematronHelper.convertToResourceErrorGroup(results, theCtx.getFhirContext().getResourceDefinition(theCtx.getResource()).getBaseDefinition().getName());
|
IErrorList errors = SchematronHelper.convertToErrorList(results, theCtx.getFhirContext().getResourceDefinition(theCtx.getResource()).getBaseDefinition().getName());
|
||||||
|
|
||||||
if (errors.getAllErrors().containsOnlySuccess()) {
|
if (errors.getAllErrors().containsOnlySuccess()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (IResourceError next : errors.getAllErrors().getAllResourceErrors()) {
|
for (IError next : errors) {
|
||||||
ResultSeverityEnum severity;
|
ResultSeverityEnum severity;
|
||||||
switch (next.getErrorLevel()) {
|
if (next.isFailure()) {
|
||||||
case ERROR:
|
|
||||||
severity = ResultSeverityEnum.ERROR;
|
severity = ResultSeverityEnum.ERROR;
|
||||||
break;
|
} else if (next.isError()) {
|
||||||
case FATAL_ERROR:
|
|
||||||
severity = ResultSeverityEnum.FATAL;
|
severity = ResultSeverityEnum.FATAL;
|
||||||
break;
|
} else if (next.isNoError()) {
|
||||||
case WARN:
|
|
||||||
severity = ResultSeverityEnum.WARNING;
|
severity = ResultSeverityEnum.WARNING;
|
||||||
break;
|
} else {
|
||||||
case INFO:
|
|
||||||
case SUCCESS:
|
|
||||||
default:
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,9 +103,9 @@ public class SchematronBaseValidator implements IValidatorModule {
|
|||||||
|
|
||||||
SingleValidationMessage message = new SingleValidationMessage();
|
SingleValidationMessage message = new SingleValidationMessage();
|
||||||
message.setMessage(details);
|
message.setMessage(details);
|
||||||
message.setLocationLine(next.getLocation().getLineNumber());
|
message.setLocationLine(next.getErrorLocation().getLineNumber());
|
||||||
message.setLocationCol(next.getLocation().getColumnNumber());
|
message.setLocationCol(next.getErrorLocation().getColumnNumber());
|
||||||
message.setLocationString(next.getLocation().getAsString());
|
message.setLocationString(next.getErrorLocation().getAsString());
|
||||||
message.setSeverity(severity);
|
message.setSeverity(severity);
|
||||||
theCtx.addValidationMessage(message);
|
theCtx.addValidationMessage(message);
|
||||||
}
|
}
|
||||||
|
@ -30,16 +30,16 @@ import ca.uhn.fhir.validation.IValidatorModule;
|
|||||||
public class SchematronProvider {
|
public class SchematronProvider {
|
||||||
|
|
||||||
|
|
||||||
private static final String I18N_KEY_NO_PHLOC_WARNING = FhirValidator.class.getName() + ".noPhlocWarningOnStartup";
|
private static final String I18N_KEY_NO_PH_WARNING = FhirValidator.class.getName() + ".noPhWarningOnStartup";
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirValidator.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirValidator.class);
|
||||||
|
|
||||||
@CoverageIgnore
|
@CoverageIgnore
|
||||||
public static boolean isSchematronAvailable(FhirContext theFhirContext) {
|
public static boolean isSchematronAvailable(FhirContext theFhirContext) {
|
||||||
try {
|
try {
|
||||||
Class.forName("com.phloc.schematron.ISchematronResource");
|
Class.forName("com.helger.schematron.ISchematronResource");
|
||||||
return true;
|
return true;
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
ourLog.info(theFhirContext.getLocalizer().getMessage(I18N_KEY_NO_PHLOC_WARNING));
|
ourLog.info(theFhirContext.getLocalizer().getMessage(I18N_KEY_NO_PH_WARNING));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,8 +51,8 @@ ca.uhn.fhir.rest.server.RestfulServer.unknownMethod=Invalid request: The FHIR en
|
|||||||
ca.uhn.fhir.rest.server.RestfulServer.rootRequest=This is the base URL of FHIR server. Unable to handle this request, as it does not contain a resource type or operation name.
|
ca.uhn.fhir.rest.server.RestfulServer.rootRequest=This is the base URL of FHIR server. Unable to handle this request, as it does not contain a resource type or operation name.
|
||||||
ca.uhn.fhir.rest.server.RestfulServer.rootRequest.multitenant=This is the base URL of a multitenant FHIR server. Unable to handle this request, as it does not contain a tenant ID.
|
ca.uhn.fhir.rest.server.RestfulServer.rootRequest.multitenant=This is the base URL of a multitenant FHIR server. Unable to handle this request, as it does not contain a tenant ID.
|
||||||
ca.uhn.fhir.validation.ValidationContext.unableToDetermineEncoding=Unable to determine encoding (e.g. XML / JSON) on validation input. Is this a valid FHIR resource body?
|
ca.uhn.fhir.validation.ValidationContext.unableToDetermineEncoding=Unable to determine encoding (e.g. XML / JSON) on validation input. Is this a valid FHIR resource body?
|
||||||
ca.uhn.fhir.validation.FhirValidator.noPhlocWarningOnStartup=Phloc-schematron library not found on classpath, will not attempt to perform schematron validation
|
ca.uhn.fhir.validation.FhirValidator.noPhWarningOnStartup=Ph-schematron library not found on classpath, will not attempt to perform schematron validation
|
||||||
ca.uhn.fhir.validation.FhirValidator.noPhlocError=Phloc-schematron library not found on classpath, can not enable perform schematron validation
|
ca.uhn.fhir.validation.FhirValidator.noPhError=Ph-schematron library not found on classpath, can not enable perform schematron validation
|
||||||
ca.uhn.fhir.validation.ValidationResult.noIssuesDetected=No issues detected during validation
|
ca.uhn.fhir.validation.ValidationResult.noIssuesDetected=No issues detected during validation
|
||||||
|
|
||||||
# JPA Messages
|
# JPA Messages
|
||||||
|
@ -173,8 +173,8 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>Saxon-HE</artifactId>
|
<artifactId>Saxon-HE</artifactId>
|
||||||
@ -183,8 +183,8 @@
|
|||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
@ -196,14 +196,11 @@
|
|||||||
<artifactId>jaxb-api</artifactId>
|
<artifactId>jaxb-api</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sun.xml.bind</groupId>
|
<groupId>org.glassfish.jaxb</groupId>
|
||||||
<artifactId>jaxb-core</artifactId>
|
<artifactId>jaxb-runtime</artifactId>
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.xml.bind</groupId>
|
|
||||||
<artifactId>jaxb-impl</artifactId>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.fusesource.jansi</groupId>
|
<groupId>org.fusesource.jansi</groupId>
|
||||||
<artifactId>jansi</artifactId>
|
<artifactId>jansi</artifactId>
|
||||||
|
@ -24,7 +24,7 @@ import ca.uhn.fhir.util.VersionUtil;
|
|||||||
import ch.qos.logback.classic.LoggerContext;
|
import ch.qos.logback.classic.LoggerContext;
|
||||||
import ch.qos.logback.classic.joran.JoranConfigurator;
|
import ch.qos.logback.classic.joran.JoranConfigurator;
|
||||||
import ch.qos.logback.core.joran.spi.JoranException;
|
import ch.qos.logback.core.joran.spi.JoranException;
|
||||||
import com.phloc.commons.io.file.FileUtils;
|
import com.helger.commons.io.file.FileHelper;
|
||||||
import org.apache.commons.cli.*;
|
import org.apache.commons.cli.*;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.commons.lang3.text.WordUtils;
|
import org.apache.commons.lang3.text.WordUtils;
|
||||||
@ -60,7 +60,7 @@ public abstract class BaseApp {
|
|||||||
System.out.println("------------------------------------------------------------");
|
System.out.println("------------------------------------------------------------");
|
||||||
System.out.println("\ud83d\udd25 " + ansi().bold() + " " + provideProductName() + ansi().boldOff() + " " + provideProductVersion() + " - Command Line Tool");
|
System.out.println("\ud83d\udd25 " + ansi().bold() + " " + provideProductName() + ansi().boldOff() + " " + provideProductVersion() + " - Command Line Tool");
|
||||||
System.out.println("------------------------------------------------------------");
|
System.out.println("------------------------------------------------------------");
|
||||||
System.out.println("Max configured JVM memory (Xmx): " + FileUtils.getFileSizeDisplay(Runtime.getRuntime().maxMemory(), 1));
|
System.out.println("Max configured JVM memory (Xmx): " + FileHelper.getFileSizeDisplay(Runtime.getRuntime().maxMemory(), 1));
|
||||||
System.out.println("Detected Java version: " + System.getProperty("java.version"));
|
System.out.println("Detected Java version: " + System.getProperty("java.version"));
|
||||||
System.out.println("------------------------------------------------------------");
|
System.out.println("------------------------------------------------------------");
|
||||||
}
|
}
|
||||||
@ -233,10 +233,10 @@ public abstract class BaseApp {
|
|||||||
} else {
|
} else {
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Throwable t) {
|
||||||
ourLog.error("Error during execution: ", e);
|
ourLog.error("Error during execution: ", t);
|
||||||
if ("true".equals(System.getProperty("test"))) {
|
if ("true".equals(System.getProperty("test"))) {
|
||||||
throw new CommandFailureException("Error: " + e.toString(), e);
|
throw new CommandFailureException("Error: " + t.toString(), t);
|
||||||
} else {
|
} else {
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ public class CommandFailureException extends Error {
|
|||||||
super(theMessage);
|
super(theMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CommandFailureException(String theString, Exception theCause) {
|
public CommandFailureException(String theString, Throwable theCause) {
|
||||||
super(theString, theCause);
|
super(theString, theCause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,8 +27,8 @@ import ca.uhn.fhir.parser.LenientErrorHandler;
|
|||||||
import ca.uhn.fhir.validation.FhirValidator;
|
import ca.uhn.fhir.validation.FhirValidator;
|
||||||
import ca.uhn.fhir.validation.SingleValidationMessage;
|
import ca.uhn.fhir.validation.SingleValidationMessage;
|
||||||
import ca.uhn.fhir.validation.ValidationResult;
|
import ca.uhn.fhir.validation.ValidationResult;
|
||||||
|
import com.helger.commons.io.file.FileHelper;
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import com.phloc.commons.io.file.FileUtils;
|
|
||||||
import org.apache.commons.cli.*;
|
import org.apache.commons.cli.*;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.commons.lang3.text.WordUtils;
|
import org.apache.commons.lang3.text.WordUtils;
|
||||||
@ -80,6 +80,7 @@ public class ValidateCommand extends BaseCommand {
|
|||||||
addOptionalOption(retVal, "x", "xsd", false, "Validate using Schemas");
|
addOptionalOption(retVal, "x", "xsd", false, "Validate using Schemas");
|
||||||
addOptionalOption(retVal, "s", "sch", false, "Validate using Schematrons");
|
addOptionalOption(retVal, "s", "sch", false, "Validate using Schematrons");
|
||||||
addOptionalOption(retVal, "e", "encoding","encoding", "File encoding (default is UTF-8)");
|
addOptionalOption(retVal, "e", "encoding","encoding", "File encoding (default is UTF-8)");
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,7 +120,7 @@ public class ValidateCommand extends BaseCommand {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new CommandFailureException(e);
|
throw new CommandFailureException(e);
|
||||||
}
|
}
|
||||||
ourLog.info("Fully read - Size is {}", FileUtils.getFileSizeDisplay(contents.length()));
|
ourLog.info("Fully read - Size is {}", FileHelper.getFileSizeDisplay(contents.length()));
|
||||||
}
|
}
|
||||||
|
|
||||||
ca.uhn.fhir.rest.api.EncodingEnum enc = ca.uhn.fhir.rest.api.EncodingEnum.detectEncodingNoDefault(defaultString(contents));
|
ca.uhn.fhir.rest.api.EncodingEnum enc = ca.uhn.fhir.rest.api.EncodingEnum.detectEncodingNoDefault(defaultString(contents));
|
||||||
|
@ -132,8 +132,8 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>Saxon-HE</artifactId>
|
<artifactId>Saxon-HE</artifactId>
|
||||||
|
@ -217,8 +217,8 @@
|
|||||||
<artifactId>thymeleaf</artifactId>
|
<artifactId>thymeleaf</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>Saxon-HE</artifactId>
|
<artifactId>Saxon-HE</artifactId>
|
||||||
@ -227,8 +227,8 @@
|
|||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework</groupId>
|
<groupId>org.springframework</groupId>
|
||||||
|
@ -78,8 +78,8 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>Saxon-HE</artifactId>
|
<artifactId>Saxon-HE</artifactId>
|
||||||
@ -88,8 +88,8 @@
|
|||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.thymeleaf</groupId>
|
<groupId>org.thymeleaf</groupId>
|
||||||
|
@ -123,11 +123,6 @@
|
|||||||
<artifactId>logback-classic</artifactId>
|
<artifactId>logback-classic</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.thymeleaf</groupId>
|
|
||||||
<artifactId>thymeleaf</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.ttddyy</groupId>
|
<groupId>net.ttddyy</groupId>
|
||||||
<artifactId>datasource-proxy</artifactId>
|
<artifactId>datasource-proxy</artifactId>
|
||||||
@ -146,8 +141,8 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
@ -157,8 +152,8 @@
|
|||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
@ -468,6 +463,11 @@
|
|||||||
<artifactId>greenmail-spring</artifactId>
|
<artifactId>greenmail-spring</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-collections4</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.ben-manes.caffeine</groupId>
|
<groupId>com.github.ben-manes.caffeine</groupId>
|
||||||
@ -566,19 +566,9 @@
|
|||||||
as JDK9 no longer includes them by default
|
as JDK9 no longer includes them by default
|
||||||
-->
|
-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.xml.bind</groupId>
|
<groupId>org.glassfish.jaxb</groupId>
|
||||||
<artifactId>jaxb-api</artifactId>
|
<artifactId>jaxb-runtime</artifactId>
|
||||||
<version>${jaxb_api_version}</version>
|
<version>${jaxb_runtime_version}</version>
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.xml.bind</groupId>
|
|
||||||
<artifactId>jaxb-core</artifactId>
|
|
||||||
<version>${jaxb_core_version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.xml.bind</groupId>
|
|
||||||
<artifactId>jaxb-impl</artifactId>
|
|
||||||
<version>${jaxb_core_version}</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
@ -73,7 +73,10 @@ import org.hl7.fhir.r4.model.BaseResource;
|
|||||||
import org.hl7.fhir.r4.model.Bundle.HTTPVerb;
|
import org.hl7.fhir.r4.model.Bundle.HTTPVerb;
|
||||||
import org.hl7.fhir.r4.model.CanonicalType;
|
import org.hl7.fhir.r4.model.CanonicalType;
|
||||||
import org.hl7.fhir.r4.model.Reference;
|
import org.hl7.fhir.r4.model.Reference;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
import org.springframework.data.domain.PageRequest;
|
import org.springframework.data.domain.PageRequest;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.domain.Slice;
|
import org.springframework.data.domain.Slice;
|
||||||
@ -100,7 +103,7 @@ import static org.apache.commons.lang3.StringUtils.*;
|
|||||||
|
|
||||||
@SuppressWarnings("WeakerAccess")
|
@SuppressWarnings("WeakerAccess")
|
||||||
@Repository
|
@Repository
|
||||||
public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
|
public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao, ApplicationContextAware {
|
||||||
|
|
||||||
public static final long INDEX_STATUS_INDEXED = 1L;
|
public static final long INDEX_STATUS_INDEXED = 1L;
|
||||||
public static final long INDEX_STATUS_INDEXING_FAILED = 2L;
|
public static final long INDEX_STATUS_INDEXING_FAILED = 2L;
|
||||||
@ -186,9 +189,6 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private PlatformTransactionManager myPlatformTransactionManager;
|
private PlatformTransactionManager myPlatformTransactionManager;
|
||||||
@Autowired
|
@Autowired
|
||||||
private List<IFhirResourceDao<?>> myResourceDaos;
|
|
||||||
private Map<Class<? extends IBaseResource>, IFhirResourceDao<?>> myResourceTypeToDao;
|
|
||||||
@Autowired
|
|
||||||
private ISearchDao mySearchDao;
|
private ISearchDao mySearchDao;
|
||||||
@Autowired
|
@Autowired
|
||||||
private ISearchParamExtractor mySearchParamExtractor;
|
private ISearchParamExtractor mySearchParamExtractor;
|
||||||
@ -200,6 +200,8 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
|
|||||||
private ISearchResultDao mySearchResultDao;
|
private ISearchResultDao mySearchResultDao;
|
||||||
@Autowired
|
@Autowired
|
||||||
private IResourceIndexedCompositeStringUniqueDao myResourceIndexedCompositeStringUniqueDao;
|
private IResourceIndexedCompositeStringUniqueDao myResourceIndexedCompositeStringUniqueDao;
|
||||||
|
private ApplicationContext myApplicationContext;
|
||||||
|
private Map<Class<? extends IBaseResource>, IFhirResourceDao<?>> myResourceTypeToDao;
|
||||||
|
|
||||||
protected void clearRequestAsProcessingSubRequest(ServletRequestDetails theRequestDetails) {
|
protected void clearRequestAsProcessingSubRequest(ServletRequestDetails theRequestDetails) {
|
||||||
if (theRequestDetails != null) {
|
if (theRequestDetails != null) {
|
||||||
@ -695,6 +697,29 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
|
|||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <R extends IBaseResource> IFhirResourceDao<R> getDao(Class<R> theType) {
|
||||||
|
if (myResourceTypeToDao == null) {
|
||||||
|
Map<Class<? extends IBaseResource>, IFhirResourceDao<?>> theResourceTypeToDao = new HashMap<>();
|
||||||
|
Map<String, IFhirResourceDao> daos = myApplicationContext.getBeansOfType(IFhirResourceDao.class, false, false);
|
||||||
|
for (IFhirResourceDao<?> next : daos.values()) {
|
||||||
|
theResourceTypeToDao.put(next.getResourceType(), next);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this instanceof IFhirResourceDao<?>) {
|
||||||
|
IFhirResourceDao<?> thiz = (IFhirResourceDao<?>) this;
|
||||||
|
theResourceTypeToDao.put(thiz.getResourceType(), thiz);
|
||||||
|
}
|
||||||
|
|
||||||
|
myResourceTypeToDao = theResourceTypeToDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
IFhirResourceDao<R> dao = (IFhirResourceDao<R>) myResourceTypeToDao.get(theType);
|
||||||
|
return dao;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected Set<ResourceIndexedSearchParamCoords> extractSearchParamCoords(ResourceTable theEntity, IBaseResource theResource) {
|
protected Set<ResourceIndexedSearchParamCoords> extractSearchParamCoords(ResourceTable theEntity, IBaseResource theResource) {
|
||||||
return mySearchParamExtractor.extractSearchParamCoords(theEntity, theResource);
|
return mySearchParamExtractor.extractSearchParamCoords(theEntity, theResource);
|
||||||
}
|
}
|
||||||
@ -896,6 +921,11 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
|
|||||||
return myConfig;
|
return myConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationContext(ApplicationContext theApplicationContext) throws BeansException {
|
||||||
|
myApplicationContext = theApplicationContext;
|
||||||
|
}
|
||||||
|
|
||||||
public void setConfig(DaoConfig theConfig) {
|
public void setConfig(DaoConfig theConfig) {
|
||||||
myConfig = theConfig;
|
myConfig = theConfig;
|
||||||
}
|
}
|
||||||
@ -922,26 +952,6 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <R extends IBaseResource> IFhirResourceDao<R> getDao(Class<R> theType) {
|
|
||||||
if (myResourceTypeToDao == null) {
|
|
||||||
Map<Class<? extends IBaseResource>, IFhirResourceDao<?>> theResourceTypeToDao = new HashMap<>();
|
|
||||||
for (IFhirResourceDao<?> next : myResourceDaos) {
|
|
||||||
theResourceTypeToDao.put(next.getResourceType(), next);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this instanceof IFhirResourceDao<?>) {
|
|
||||||
IFhirResourceDao<?> thiz = (IFhirResourceDao<?>) this;
|
|
||||||
theResourceTypeToDao.put(thiz.getResourceType(), thiz);
|
|
||||||
}
|
|
||||||
|
|
||||||
myResourceTypeToDao = theResourceTypeToDao;
|
|
||||||
}
|
|
||||||
|
|
||||||
IFhirResourceDao<R> dao = (IFhirResourceDao<R>) myResourceTypeToDao.get(theType);
|
|
||||||
return dao;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IResourceIndexedCompositeStringUniqueDao getResourceIndexedCompositeStringUniqueDao() {
|
public IResourceIndexedCompositeStringUniqueDao getResourceIndexedCompositeStringUniqueDao() {
|
||||||
return myResourceIndexedCompositeStringUniqueDao;
|
return myResourceIndexedCompositeStringUniqueDao;
|
||||||
}
|
}
|
||||||
|
@ -159,7 +159,7 @@ public abstract class BaseHapiFhirSystemDao<T, MT> extends BaseHapiFhirDao<IBase
|
|||||||
return doExpunge(null, null, null, theExpungeOptions);
|
return doExpunge(null, null, null, theExpungeOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
|
@Transactional(propagation = Propagation.REQUIRED)
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Long> getResourceCounts() {
|
public Map<String, Long> getResourceCounts() {
|
||||||
Map<String, Long> retVal = new HashMap<>();
|
Map<String, Long> retVal = new HashMap<>();
|
||||||
@ -172,7 +172,7 @@ public abstract class BaseHapiFhirSystemDao<T, MT> extends BaseHapiFhirDao<IBase
|
|||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
|
@Transactional(propagation = Propagation.SUPPORTS)
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Long> getResourceCountsFromCache() {
|
public Map<String, Long> getResourceCountsFromCache() {
|
||||||
@ -265,7 +265,7 @@ public abstract class BaseHapiFhirSystemDao<T, MT> extends BaseHapiFhirDao<IBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(propagation = Propagation.NOT_SUPPORTED)
|
@Transactional(propagation = Propagation.NEVER)
|
||||||
public Integer performReindexingPass(final Integer theCount) {
|
public Integer performReindexingPass(final Integer theCount) {
|
||||||
if (!myReindexLock.tryLock()) {
|
if (!myReindexLock.tryLock()) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -32,7 +32,10 @@ import org.apache.commons.lang3.time.DateUtils;
|
|||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
@ -40,7 +43,7 @@ import java.util.*;
|
|||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isBlank;
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
|
|
||||||
public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implements ISearchParamRegistry {
|
public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implements ISearchParamRegistry, ApplicationContextAware {
|
||||||
|
|
||||||
private static final int MAX_MANAGED_PARAM_COUNT = 10000;
|
private static final int MAX_MANAGED_PARAM_COUNT = 10000;
|
||||||
private static final Logger ourLog = LoggerFactory.getLogger(BaseSearchParamRegistry.class);
|
private static final Logger ourLog = LoggerFactory.getLogger(BaseSearchParamRegistry.class);
|
||||||
@ -49,12 +52,12 @@ public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implemen
|
|||||||
private volatile Map<String, Map<Set<String>, List<JpaRuntimeSearchParam>>> myActiveParamNamesToUniqueSearchParams = Collections.emptyMap();
|
private volatile Map<String, Map<Set<String>, List<JpaRuntimeSearchParam>>> myActiveParamNamesToUniqueSearchParams = Collections.emptyMap();
|
||||||
@Autowired
|
@Autowired
|
||||||
private FhirContext myCtx;
|
private FhirContext myCtx;
|
||||||
@Autowired
|
private Collection<IFhirResourceDao<?>> myResourceDaos;
|
||||||
private Collection<IFhirResourceDao<?>> myDaos;
|
|
||||||
private volatile Map<String, Map<String, RuntimeSearchParam>> myActiveSearchParams;
|
private volatile Map<String, Map<String, RuntimeSearchParam>> myActiveSearchParams;
|
||||||
@Autowired
|
@Autowired
|
||||||
private DaoConfig myDaoConfig;
|
private DaoConfig myDaoConfig;
|
||||||
private volatile long myLastRefresh;
|
private volatile long myLastRefresh;
|
||||||
|
private ApplicationContext myApplicationContext;
|
||||||
|
|
||||||
public BaseSearchParamRegistry() {
|
public BaseSearchParamRegistry() {
|
||||||
super();
|
super();
|
||||||
@ -212,7 +215,13 @@ public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implemen
|
|||||||
public void postConstruct() {
|
public void postConstruct() {
|
||||||
Map<String, Map<String, RuntimeSearchParam>> resourceNameToSearchParams = new HashMap<>();
|
Map<String, Map<String, RuntimeSearchParam>> resourceNameToSearchParams = new HashMap<>();
|
||||||
|
|
||||||
for (IFhirResourceDao<?> nextDao : myDaos) {
|
myResourceDaos = new ArrayList<>();
|
||||||
|
Map<String, IFhirResourceDao> daos = myApplicationContext.getBeansOfType(IFhirResourceDao.class, false, false);
|
||||||
|
for (IFhirResourceDao next : daos.values()) {
|
||||||
|
myResourceDaos.add(next);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (IFhirResourceDao<?> nextDao : myResourceDaos) {
|
||||||
RuntimeResourceDefinition nextResDef = myCtx.getResourceDefinition(nextDao.getResourceType());
|
RuntimeResourceDefinition nextResDef = myCtx.getResourceDefinition(nextDao.getResourceType());
|
||||||
String nextResourceName = nextResDef.getName();
|
String nextResourceName = nextResDef.getName();
|
||||||
HashMap<String, RuntimeSearchParam> nameToParam = new HashMap<>();
|
HashMap<String, RuntimeSearchParam> nameToParam = new HashMap<>();
|
||||||
@ -321,6 +330,11 @@ public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implemen
|
|||||||
refreshCacheIfNecessary();
|
refreshCacheIfNecessary();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationContext(ApplicationContext theApplicationContext) throws BeansException {
|
||||||
|
myApplicationContext = theApplicationContext;
|
||||||
|
}
|
||||||
|
|
||||||
protected abstract RuntimeSearchParam toRuntimeSp(SP theNextSp);
|
protected abstract RuntimeSearchParam toRuntimeSp(SP theNextSp);
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,6 +33,8 @@ import ca.uhn.fhir.model.primitive.CodeDt;
|
|||||||
import org.apache.commons.lang3.time.DateUtils;
|
import org.apache.commons.lang3.time.DateUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.transaction.annotation.Propagation;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -58,6 +60,7 @@ public class FhirResourceDaoSearchParameterDstu2 extends FhirResourceDaoDstu2<Se
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@Scheduled(fixedDelay = DateUtils.MILLIS_PER_MINUTE)
|
@Scheduled(fixedDelay = DateUtils.MILLIS_PER_MINUTE)
|
||||||
|
@Transactional(propagation = Propagation.NEVER)
|
||||||
public void performReindexingPass() {
|
public void performReindexingPass() {
|
||||||
if (getConfig().isSchedulingDisabled()) {
|
if (getConfig().isSchedulingDisabled()) {
|
||||||
return;
|
return;
|
||||||
|
@ -68,6 +68,7 @@ import org.springframework.transaction.TransactionStatus;
|
|||||||
import org.springframework.transaction.annotation.Propagation;
|
import org.springframework.transaction.annotation.Propagation;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.transaction.support.TransactionCallback;
|
import org.springframework.transaction.support.TransactionCallback;
|
||||||
|
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
||||||
import org.springframework.transaction.support.TransactionTemplate;
|
import org.springframework.transaction.support.TransactionTemplate;
|
||||||
|
|
||||||
import javax.persistence.TypedQuery;
|
import javax.persistence.TypedQuery;
|
||||||
@ -103,15 +104,20 @@ public class FhirSystemDaoDstu2 extends BaseHapiFhirSystemDao<Bundle, MetaDt> {
|
|||||||
Bundle subRequestBundle = new Bundle();
|
Bundle subRequestBundle = new Bundle();
|
||||||
subRequestBundle.setType(BundleTypeEnum.TRANSACTION);
|
subRequestBundle.setType(BundleTypeEnum.TRANSACTION);
|
||||||
subRequestBundle.addEntry(nextRequestEntry);
|
subRequestBundle.addEntry(nextRequestEntry);
|
||||||
|
return transaction((ServletRequestDetails) theRequestDetails, subRequestBundle, "Batch sub-request");
|
||||||
Bundle subResponseBundle = transaction((ServletRequestDetails) theRequestDetails, subRequestBundle, "Batch sub-request");
|
|
||||||
return subResponseBundle;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
BaseServerResponseException caughtEx;
|
BaseServerResponseException caughtEx;
|
||||||
try {
|
try {
|
||||||
Bundle nextResponseBundle = txTemplate.execute(callback);
|
Bundle nextResponseBundle;
|
||||||
|
if (nextRequestEntry.getRequest().getMethodElement().getValueAsEnum() == HTTPVerbEnum.GET) {
|
||||||
|
// Don't process GETs in a transaction because they'll
|
||||||
|
// create their own
|
||||||
|
nextResponseBundle = callback.doInTransaction(null);
|
||||||
|
} else {
|
||||||
|
nextResponseBundle = txTemplate.execute(callback);
|
||||||
|
}
|
||||||
caughtEx = null;
|
caughtEx = null;
|
||||||
|
|
||||||
Entry subResponseEntry = nextResponseBundle.getEntry().get(0);
|
Entry subResponseEntry = nextResponseBundle.getEntry().get(0);
|
||||||
@ -156,13 +162,17 @@ public class FhirSystemDaoDstu2 extends BaseHapiFhirSystemDao<Bundle, MetaDt> {
|
|||||||
return batch(theRequestDetails, theRequest);
|
return batch(theRequestDetails, theRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transactionType == null) {
|
return doTransaction(theRequestDetails, theRequest, theActionName, transactionType);
|
||||||
String message = "Transactiion Bundle did not specify valid Bundle.type, assuming " + BundleTypeEnum.TRANSACTION.getCode();
|
|
||||||
ourLog.warn(message);
|
|
||||||
transactionType = BundleTypeEnum.TRANSACTION;
|
|
||||||
}
|
}
|
||||||
if (transactionType != BundleTypeEnum.TRANSACTION) {
|
|
||||||
throw new InvalidRequestException("Unable to process transaction where incoming Bundle.type = " + transactionType.getCode());
|
private Bundle doTransaction(ServletRequestDetails theRequestDetails, Bundle theRequest, String theActionName, BundleTypeEnum theTransactionType) {
|
||||||
|
if (theTransactionType == null) {
|
||||||
|
String message = "Transaction Bundle did not specify valid Bundle.type, assuming " + BundleTypeEnum.TRANSACTION.getCode();
|
||||||
|
ourLog.warn(message);
|
||||||
|
theTransactionType = BundleTypeEnum.TRANSACTION;
|
||||||
|
}
|
||||||
|
if (theTransactionType != BundleTypeEnum.TRANSACTION) {
|
||||||
|
throw new InvalidRequestException("Unable to process transaction where incoming Bundle.type = " + theTransactionType.getCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
ourLog.info("Beginning {} with {} resources", theActionName, theRequest.getEntry().size());
|
ourLog.info("Beginning {} with {} resources", theActionName, theRequest.getEntry().size());
|
||||||
@ -186,7 +196,7 @@ public class FhirSystemDaoDstu2 extends BaseHapiFhirSystemDao<Bundle, MetaDt> {
|
|||||||
*/
|
*/
|
||||||
Bundle response = new Bundle();
|
Bundle response = new Bundle();
|
||||||
List<Entry> getEntries = new ArrayList<Entry>();
|
List<Entry> getEntries = new ArrayList<Entry>();
|
||||||
IdentityHashMap<Entry, Integer> originalRequestOrder = new IdentityHashMap<Bundle.Entry, Integer>();
|
IdentityHashMap<Entry, Integer> originalRequestOrder = new IdentityHashMap<Entry, Integer>();
|
||||||
for (int i = 0; i < theRequest.getEntry().size(); i++) {
|
for (int i = 0; i < theRequest.getEntry().size(); i++) {
|
||||||
originalRequestOrder.put(theRequest.getEntry().get(i), i);
|
originalRequestOrder.put(theRequest.getEntry().get(i), i);
|
||||||
response.addEntry();
|
response.addEntry();
|
||||||
@ -203,225 +213,13 @@ public class FhirSystemDaoDstu2 extends BaseHapiFhirSystemDao<Bundle, MetaDt> {
|
|||||||
Set<ResourceTable> updatedEntities = new HashSet<>();
|
Set<ResourceTable> updatedEntities = new HashSet<>();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Loop through the request and process any entries of type
|
* Handle: GET/PUT/POST
|
||||||
* PUT, POST or DELETE
|
|
||||||
*/
|
*/
|
||||||
for (int i = 0; i < theRequest.getEntry().size(); i++) {
|
TransactionTemplate txTemplate = new TransactionTemplate(myTxManager);
|
||||||
|
txTemplate.execute(t->{
|
||||||
if (i % 100 == 0) {
|
handleTransactionWriteOperations(theRequestDetails, theRequest, theActionName, updateTime, allIds, idSubstitutions, idToPersistedOutcome, response, originalRequestOrder, deletedResources, deleteConflicts, entriesToProcess, nonUpdatedEntities, updatedEntities);
|
||||||
ourLog.debug("Processed {} non-GET entries out of {}", i, theRequest.getEntry().size());
|
return null;
|
||||||
}
|
});
|
||||||
|
|
||||||
Entry nextReqEntry = theRequest.getEntry().get(i);
|
|
||||||
IResource res = nextReqEntry.getResource();
|
|
||||||
IdDt nextResourceId = null;
|
|
||||||
if (res != null) {
|
|
||||||
|
|
||||||
nextResourceId = res.getId();
|
|
||||||
|
|
||||||
if (!nextResourceId.hasIdPart()) {
|
|
||||||
if (isNotBlank(nextReqEntry.getFullUrl())) {
|
|
||||||
nextResourceId = new IdDt(nextReqEntry.getFullUrl());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nextResourceId.hasIdPart() && nextResourceId.getIdPart().matches("[a-zA-Z]+\\:.*") && !isPlaceholder(nextResourceId)) {
|
|
||||||
throw new InvalidRequestException("Invalid placeholder ID found: " + nextResourceId.getIdPart() + " - Must be of the form 'urn:uuid:[uuid]' or 'urn:oid:[oid]'");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nextResourceId.hasIdPart() && !nextResourceId.hasResourceType() && !isPlaceholder(nextResourceId)) {
|
|
||||||
nextResourceId = new IdDt(toResourceName(res.getClass()), nextResourceId.getIdPart());
|
|
||||||
res.setId(nextResourceId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Ensure that the bundle doesn't have any duplicates, since this causes all kinds of weirdness
|
|
||||||
*/
|
|
||||||
if (isPlaceholder(nextResourceId)) {
|
|
||||||
if (!allIds.add(nextResourceId)) {
|
|
||||||
throw new InvalidRequestException(getContext().getLocalizer().getMessage(BaseHapiFhirSystemDao.class, "transactionContainsMultipleWithDuplicateId", nextResourceId));
|
|
||||||
}
|
|
||||||
} else if (nextResourceId.hasResourceType() && nextResourceId.hasIdPart()) {
|
|
||||||
IdDt nextId = nextResourceId.toUnqualifiedVersionless();
|
|
||||||
if (!allIds.add(nextId)) {
|
|
||||||
throw new InvalidRequestException(getContext().getLocalizer().getMessage(BaseHapiFhirSystemDao.class, "transactionContainsMultipleWithDuplicateId", nextId));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
HTTPVerbEnum verb = nextReqEntry.getRequest().getMethodElement().getValueAsEnum();
|
|
||||||
if (verb == null) {
|
|
||||||
throw new InvalidRequestException(getContext().getLocalizer().getMessage(BaseHapiFhirSystemDao.class, "transactionEntryHasInvalidVerb", nextReqEntry.getRequest().getMethod()));
|
|
||||||
}
|
|
||||||
|
|
||||||
String resourceType = res != null ? getContext().getResourceDefinition(res).getName() : null;
|
|
||||||
Entry nextRespEntry = response.getEntry().get(originalRequestOrder.get(nextReqEntry));
|
|
||||||
|
|
||||||
switch (verb) {
|
|
||||||
case POST: {
|
|
||||||
// CREATE
|
|
||||||
@SuppressWarnings("rawtypes")
|
|
||||||
IFhirResourceDao resourceDao = getDaoOrThrowException(res.getClass());
|
|
||||||
res.setId((String) null);
|
|
||||||
DaoMethodOutcome outcome;
|
|
||||||
outcome = resourceDao.create(res, nextReqEntry.getRequest().getIfNoneExist(), false, theRequestDetails);
|
|
||||||
handleTransactionCreateOrUpdateOutcome(idSubstitutions, idToPersistedOutcome, nextResourceId, outcome, nextRespEntry, resourceType, res);
|
|
||||||
entriesToProcess.put(nextRespEntry, outcome.getEntity());
|
|
||||||
if (outcome.getCreated() == false) {
|
|
||||||
nonUpdatedEntities.add(outcome.getEntity());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DELETE: {
|
|
||||||
// DELETE
|
|
||||||
String url = extractTransactionUrlOrThrowException(nextReqEntry, verb);
|
|
||||||
UrlParts parts = UrlUtil.parseUrl(url);
|
|
||||||
ca.uhn.fhir.jpa.dao.IFhirResourceDao<? extends IBaseResource> dao = toDao(parts, verb.getCode(), url);
|
|
||||||
int status = Constants.STATUS_HTTP_204_NO_CONTENT;
|
|
||||||
if (parts.getResourceId() != null) {
|
|
||||||
DaoMethodOutcome outcome = dao.delete(new IdDt(parts.getResourceType(), parts.getResourceId()), deleteConflicts, theRequestDetails);
|
|
||||||
if (outcome.getEntity() != null) {
|
|
||||||
deletedResources.add(outcome.getId().toUnqualifiedVersionless());
|
|
||||||
entriesToProcess.put(nextRespEntry, outcome.getEntity());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
DeleteMethodOutcome deleteOutcome = dao.deleteByUrl(parts.getResourceType() + '?' + parts.getParams(), deleteConflicts, theRequestDetails);
|
|
||||||
List<ResourceTable> allDeleted = deleteOutcome.getDeletedEntities();
|
|
||||||
for (ResourceTable deleted : allDeleted) {
|
|
||||||
deletedResources.add(deleted.getIdDt().toUnqualifiedVersionless());
|
|
||||||
}
|
|
||||||
if (allDeleted.isEmpty()) {
|
|
||||||
status = Constants.STATUS_HTTP_404_NOT_FOUND;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nextRespEntry.getResponse().setStatus(toStatusString(status));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PUT: {
|
|
||||||
// UPDATE
|
|
||||||
@SuppressWarnings("rawtypes")
|
|
||||||
IFhirResourceDao resourceDao = getDaoOrThrowException(res.getClass());
|
|
||||||
|
|
||||||
DaoMethodOutcome outcome;
|
|
||||||
|
|
||||||
String url = extractTransactionUrlOrThrowException(nextReqEntry, verb);
|
|
||||||
|
|
||||||
UrlParts parts = UrlUtil.parseUrl(url);
|
|
||||||
if (isNotBlank(parts.getResourceId())) {
|
|
||||||
res.setId(new IdDt(parts.getResourceType(), parts.getResourceId()));
|
|
||||||
outcome = resourceDao.update(res, null, false, theRequestDetails);
|
|
||||||
} else {
|
|
||||||
res.setId((String) null);
|
|
||||||
outcome = resourceDao.update(res, parts.getResourceType() + '?' + parts.getParams(), false, theRequestDetails);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (outcome.getCreated() == Boolean.FALSE) {
|
|
||||||
updatedEntities.add(outcome.getEntity());
|
|
||||||
}
|
|
||||||
|
|
||||||
handleTransactionCreateOrUpdateOutcome(idSubstitutions, idToPersistedOutcome, nextResourceId, outcome, nextRespEntry, resourceType, res);
|
|
||||||
entriesToProcess.put(nextRespEntry, outcome.getEntity());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GET:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure that there are no conflicts from deletions. E.g. we can't delete something
|
|
||||||
* if something else has a reference to it.. Unless the thing that has a reference to it
|
|
||||||
* was also deleted as a part of this transaction, which is why we check this now at the
|
|
||||||
* end.
|
|
||||||
*/
|
|
||||||
|
|
||||||
deleteConflicts.removeIf(next -> deletedResources.contains(next.getTargetId().toVersionless()));
|
|
||||||
validateDeleteConflictsEmptyOrThrowException(deleteConflicts);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Perform ID substitutions and then index each resource we have saved
|
|
||||||
*/
|
|
||||||
|
|
||||||
FhirTerser terser = getContext().newTerser();
|
|
||||||
for (DaoMethodOutcome nextOutcome : idToPersistedOutcome.values()) {
|
|
||||||
IResource nextResource = (IResource) nextOutcome.getResource();
|
|
||||||
if (nextResource == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// References
|
|
||||||
List<BaseResourceReferenceDt> allRefs = terser.getAllPopulatedChildElementsOfType(nextResource, BaseResourceReferenceDt.class);
|
|
||||||
for (BaseResourceReferenceDt nextRef : allRefs) {
|
|
||||||
IdDt nextId = nextRef.getReference();
|
|
||||||
if (!nextId.hasIdPart()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (idSubstitutions.containsKey(nextId)) {
|
|
||||||
IdDt newId = idSubstitutions.get(nextId);
|
|
||||||
ourLog.debug(" * Replacing resource ref {} with {}", nextId, newId);
|
|
||||||
nextRef.setReference(newId);
|
|
||||||
} else {
|
|
||||||
ourLog.debug(" * Reference [{}] does not exist in bundle", nextId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// URIs
|
|
||||||
List<UriDt> allUris = terser.getAllPopulatedChildElementsOfType(nextResource, UriDt.class);
|
|
||||||
for (UriDt nextRef : allUris) {
|
|
||||||
if (nextRef instanceof IIdType) {
|
|
||||||
continue; // No substitution on the resource ID itself!
|
|
||||||
}
|
|
||||||
IdDt nextUriString = new IdDt(nextRef.getValueAsString());
|
|
||||||
if (idSubstitutions.containsKey(nextUriString)) {
|
|
||||||
IdDt newId = idSubstitutions.get(nextUriString);
|
|
||||||
ourLog.debug(" * Replacing resource ref {} with {}", nextUriString, newId);
|
|
||||||
nextRef.setValue(newId.getValue());
|
|
||||||
} else {
|
|
||||||
ourLog.debug(" * Reference [{}] does not exist in bundle", nextUriString);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
InstantDt deletedInstantOrNull = ResourceMetadataKeyEnum.DELETED_AT.get(nextResource);
|
|
||||||
Date deletedTimestampOrNull = deletedInstantOrNull != null ? deletedInstantOrNull.getValue() : null;
|
|
||||||
if (updatedEntities.contains(nextOutcome.getEntity())) {
|
|
||||||
updateInternal(theRequestDetails, nextResource, true, false, theRequestDetails, nextOutcome.getEntity(), nextResource.getIdElement(), nextOutcome.getPreviousResource());
|
|
||||||
} else if (!nonUpdatedEntities.contains(nextOutcome.getEntity())) {
|
|
||||||
updateEntity(theRequestDetails, nextResource, nextOutcome.getEntity(), deletedTimestampOrNull, true, false, updateTime, false, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
myEntityManager.flush();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Double check we didn't allow any duplicates we shouldn't have
|
|
||||||
*/
|
|
||||||
for (Entry nextEntry : theRequest.getEntry()) {
|
|
||||||
if (nextEntry.getRequest().getMethodElement().getValueAsEnum() == HTTPVerbEnum.POST) {
|
|
||||||
String matchUrl = nextEntry.getRequest().getIfNoneExist();
|
|
||||||
if (isNotBlank(matchUrl)) {
|
|
||||||
IFhirResourceDao<?> resourceDao = getDao(nextEntry.getResource().getClass());
|
|
||||||
Set<Long> val = resourceDao.processMatchUrl(matchUrl);
|
|
||||||
if (val.size() > 1) {
|
|
||||||
throw new InvalidRequestException(
|
|
||||||
"Unable to process " + theActionName + " - Request would cause multiple resources to match URL: \"" + matchUrl + "\". Does transaction request contain duplicates?");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (IdDt next : allIds) {
|
|
||||||
IdDt replacement = idSubstitutions.get(next);
|
|
||||||
if (replacement == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (replacement.equals(next)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
ourLog.debug("Placeholder resource ID \"{}\" was replaced with permanent ID \"{}\"", next, replacement);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Loop through the request and process any entries of type GET
|
* Loop through the request and process any entries of type GET
|
||||||
@ -447,7 +245,7 @@ public class FhirSystemDaoDstu2 extends BaseHapiFhirSystemDao<Bundle, MetaDt> {
|
|||||||
for (NameValuePair next : parameters) {
|
for (NameValuePair next : parameters) {
|
||||||
paramValues.put(next.getName(), next.getValue());
|
paramValues.put(next.getName(), next.getValue());
|
||||||
}
|
}
|
||||||
for (java.util.Map.Entry<String, Collection<String>> nextParamEntry : paramValues.asMap().entrySet()) {
|
for (Map.Entry<String, Collection<String>> nextParamEntry : paramValues.asMap().entrySet()) {
|
||||||
String[] nextValue = nextParamEntry.getValue().toArray(new String[nextParamEntry.getValue().size()]);
|
String[] nextValue = nextParamEntry.getValue().toArray(new String[nextParamEntry.getValue().size()]);
|
||||||
requestDetails.addParameter(nextParamEntry.getKey(), nextValue);
|
requestDetails.addParameter(nextParamEntry.getKey(), nextValue);
|
||||||
}
|
}
|
||||||
@ -490,10 +288,7 @@ public class FhirSystemDaoDstu2 extends BaseHapiFhirSystemDao<Bundle, MetaDt> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ourLog.info("Flushing context after {}", theActionName);
|
for (Map.Entry<Entry, ResourceTable> nextEntry : entriesToProcess.entrySet()) {
|
||||||
myEntityManager.flush();
|
|
||||||
|
|
||||||
for (java.util.Map.Entry<Entry, ResourceTable> nextEntry : entriesToProcess.entrySet()) {
|
|
||||||
nextEntry.getKey().getResponse().setLocation(nextEntry.getValue().getIdDt().toUnqualified().getValue());
|
nextEntry.getKey().getResponse().setLocation(nextEntry.getValue().getIdDt().toUnqualified().getValue());
|
||||||
nextEntry.getKey().getResponse().setEtag(nextEntry.getValue().getIdDt().getVersionIdPart());
|
nextEntry.getKey().getResponse().setEtag(nextEntry.getValue().getIdDt().getVersionIdPart());
|
||||||
}
|
}
|
||||||
@ -507,6 +302,229 @@ public class FhirSystemDaoDstu2 extends BaseHapiFhirSystemDao<Bundle, MetaDt> {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleTransactionWriteOperations(ServletRequestDetails theRequestDetails, Bundle theRequest, String theActionName, Date theUpdateTime, Set<IdDt> theAllIds, Map<IdDt, IdDt> theIdSubstitutions, Map<IdDt, DaoMethodOutcome> theIdToPersistedOutcome, Bundle theResponse, IdentityHashMap<Entry, Integer> theOriginalRequestOrder, List<IIdType> theDeletedResources, List<DeleteConflict> theDeleteConflicts, Map<Entry, ResourceTable> theEntriesToProcess, Set<ResourceTable> theNonUpdatedEntities, Set<ResourceTable> theUpdatedEntities) {
|
||||||
|
/*
|
||||||
|
* Loop through the request and process any entries of type
|
||||||
|
* PUT, POST or DELETE
|
||||||
|
*/
|
||||||
|
for (int i = 0; i < theRequest.getEntry().size(); i++) {
|
||||||
|
|
||||||
|
if (i % 100 == 0) {
|
||||||
|
ourLog.debug("Processed {} non-GET entries out of {}", i, theRequest.getEntry().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry nextReqEntry = theRequest.getEntry().get(i);
|
||||||
|
IResource res = nextReqEntry.getResource();
|
||||||
|
IdDt nextResourceId = null;
|
||||||
|
if (res != null) {
|
||||||
|
|
||||||
|
nextResourceId = res.getId();
|
||||||
|
|
||||||
|
if (!nextResourceId.hasIdPart()) {
|
||||||
|
if (isNotBlank(nextReqEntry.getFullUrl())) {
|
||||||
|
nextResourceId = new IdDt(nextReqEntry.getFullUrl());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nextResourceId.hasIdPart() && nextResourceId.getIdPart().matches("[a-zA-Z]+\\:.*") && !isPlaceholder(nextResourceId)) {
|
||||||
|
throw new InvalidRequestException("Invalid placeholder ID found: " + nextResourceId.getIdPart() + " - Must be of the form 'urn:uuid:[uuid]' or 'urn:oid:[oid]'");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nextResourceId.hasIdPart() && !nextResourceId.hasResourceType() && !isPlaceholder(nextResourceId)) {
|
||||||
|
nextResourceId = new IdDt(toResourceName(res.getClass()), nextResourceId.getIdPart());
|
||||||
|
res.setId(nextResourceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ensure that the bundle doesn't have any duplicates, since this causes all kinds of weirdness
|
||||||
|
*/
|
||||||
|
if (isPlaceholder(nextResourceId)) {
|
||||||
|
if (!theAllIds.add(nextResourceId)) {
|
||||||
|
throw new InvalidRequestException(getContext().getLocalizer().getMessage(BaseHapiFhirSystemDao.class, "transactionContainsMultipleWithDuplicateId", nextResourceId));
|
||||||
|
}
|
||||||
|
} else if (nextResourceId.hasResourceType() && nextResourceId.hasIdPart()) {
|
||||||
|
IdDt nextId = nextResourceId.toUnqualifiedVersionless();
|
||||||
|
if (!theAllIds.add(nextId)) {
|
||||||
|
throw new InvalidRequestException(getContext().getLocalizer().getMessage(BaseHapiFhirSystemDao.class, "transactionContainsMultipleWithDuplicateId", nextId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
HTTPVerbEnum verb = nextReqEntry.getRequest().getMethodElement().getValueAsEnum();
|
||||||
|
if (verb == null) {
|
||||||
|
throw new InvalidRequestException(getContext().getLocalizer().getMessage(BaseHapiFhirSystemDao.class, "transactionEntryHasInvalidVerb", nextReqEntry.getRequest().getMethod()));
|
||||||
|
}
|
||||||
|
|
||||||
|
String resourceType = res != null ? getContext().getResourceDefinition(res).getName() : null;
|
||||||
|
Entry nextRespEntry = theResponse.getEntry().get(theOriginalRequestOrder.get(nextReqEntry));
|
||||||
|
|
||||||
|
switch (verb) {
|
||||||
|
case POST: {
|
||||||
|
// CREATE
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
IFhirResourceDao resourceDao = getDaoOrThrowException(res.getClass());
|
||||||
|
res.setId((String) null);
|
||||||
|
DaoMethodOutcome outcome;
|
||||||
|
outcome = resourceDao.create(res, nextReqEntry.getRequest().getIfNoneExist(), false, theRequestDetails);
|
||||||
|
handleTransactionCreateOrUpdateOutcome(theIdSubstitutions, theIdToPersistedOutcome, nextResourceId, outcome, nextRespEntry, resourceType, res);
|
||||||
|
theEntriesToProcess.put(nextRespEntry, outcome.getEntity());
|
||||||
|
if (outcome.getCreated() == false) {
|
||||||
|
theNonUpdatedEntities.add(outcome.getEntity());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DELETE: {
|
||||||
|
// DELETE
|
||||||
|
String url = extractTransactionUrlOrThrowException(nextReqEntry, verb);
|
||||||
|
UrlParts parts = UrlUtil.parseUrl(url);
|
||||||
|
IFhirResourceDao<? extends IBaseResource> dao = toDao(parts, verb.getCode(), url);
|
||||||
|
int status = Constants.STATUS_HTTP_204_NO_CONTENT;
|
||||||
|
if (parts.getResourceId() != null) {
|
||||||
|
DaoMethodOutcome outcome = dao.delete(new IdDt(parts.getResourceType(), parts.getResourceId()), theDeleteConflicts, theRequestDetails);
|
||||||
|
if (outcome.getEntity() != null) {
|
||||||
|
theDeletedResources.add(outcome.getId().toUnqualifiedVersionless());
|
||||||
|
theEntriesToProcess.put(nextRespEntry, outcome.getEntity());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
DeleteMethodOutcome deleteOutcome = dao.deleteByUrl(parts.getResourceType() + '?' + parts.getParams(), theDeleteConflicts, theRequestDetails);
|
||||||
|
List<ResourceTable> allDeleted = deleteOutcome.getDeletedEntities();
|
||||||
|
for (ResourceTable deleted : allDeleted) {
|
||||||
|
theDeletedResources.add(deleted.getIdDt().toUnqualifiedVersionless());
|
||||||
|
}
|
||||||
|
if (allDeleted.isEmpty()) {
|
||||||
|
status = Constants.STATUS_HTTP_404_NOT_FOUND;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nextRespEntry.getResponse().setStatus(toStatusString(status));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PUT: {
|
||||||
|
// UPDATE
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
IFhirResourceDao resourceDao = getDaoOrThrowException(res.getClass());
|
||||||
|
|
||||||
|
DaoMethodOutcome outcome;
|
||||||
|
|
||||||
|
String url = extractTransactionUrlOrThrowException(nextReqEntry, verb);
|
||||||
|
|
||||||
|
UrlParts parts = UrlUtil.parseUrl(url);
|
||||||
|
if (isNotBlank(parts.getResourceId())) {
|
||||||
|
res.setId(new IdDt(parts.getResourceType(), parts.getResourceId()));
|
||||||
|
outcome = resourceDao.update(res, null, false, theRequestDetails);
|
||||||
|
} else {
|
||||||
|
res.setId((String) null);
|
||||||
|
outcome = resourceDao.update(res, parts.getResourceType() + '?' + parts.getParams(), false, theRequestDetails);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outcome.getCreated() == Boolean.FALSE) {
|
||||||
|
theUpdatedEntities.add(outcome.getEntity());
|
||||||
|
}
|
||||||
|
|
||||||
|
handleTransactionCreateOrUpdateOutcome(theIdSubstitutions, theIdToPersistedOutcome, nextResourceId, outcome, nextRespEntry, resourceType, res);
|
||||||
|
theEntriesToProcess.put(nextRespEntry, outcome.getEntity());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GET:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure that there are no conflicts from deletions. E.g. we can't delete something
|
||||||
|
* if something else has a reference to it.. Unless the thing that has a reference to it
|
||||||
|
* was also deleted as a part of this transaction, which is why we check this now at the
|
||||||
|
* end.
|
||||||
|
*/
|
||||||
|
|
||||||
|
theDeleteConflicts.removeIf(next -> theDeletedResources.contains(next.getTargetId().toVersionless()));
|
||||||
|
validateDeleteConflictsEmptyOrThrowException(theDeleteConflicts);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Perform ID substitutions and then index each resource we have saved
|
||||||
|
*/
|
||||||
|
|
||||||
|
FhirTerser terser = getContext().newTerser();
|
||||||
|
for (DaoMethodOutcome nextOutcome : theIdToPersistedOutcome.values()) {
|
||||||
|
IResource nextResource = (IResource) nextOutcome.getResource();
|
||||||
|
if (nextResource == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// References
|
||||||
|
List<BaseResourceReferenceDt> allRefs = terser.getAllPopulatedChildElementsOfType(nextResource, BaseResourceReferenceDt.class);
|
||||||
|
for (BaseResourceReferenceDt nextRef : allRefs) {
|
||||||
|
IdDt nextId = nextRef.getReference();
|
||||||
|
if (!nextId.hasIdPart()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (theIdSubstitutions.containsKey(nextId)) {
|
||||||
|
IdDt newId = theIdSubstitutions.get(nextId);
|
||||||
|
ourLog.debug(" * Replacing resource ref {} with {}", nextId, newId);
|
||||||
|
nextRef.setReference(newId);
|
||||||
|
} else {
|
||||||
|
ourLog.debug(" * Reference [{}] does not exist in bundle", nextId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// URIs
|
||||||
|
List<UriDt> allUris = terser.getAllPopulatedChildElementsOfType(nextResource, UriDt.class);
|
||||||
|
for (UriDt nextRef : allUris) {
|
||||||
|
if (nextRef instanceof IIdType) {
|
||||||
|
continue; // No substitution on the resource ID itself!
|
||||||
|
}
|
||||||
|
IdDt nextUriString = new IdDt(nextRef.getValueAsString());
|
||||||
|
if (theIdSubstitutions.containsKey(nextUriString)) {
|
||||||
|
IdDt newId = theIdSubstitutions.get(nextUriString);
|
||||||
|
ourLog.debug(" * Replacing resource ref {} with {}", nextUriString, newId);
|
||||||
|
nextRef.setValue(newId.getValue());
|
||||||
|
} else {
|
||||||
|
ourLog.debug(" * Reference [{}] does not exist in bundle", nextUriString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
InstantDt deletedInstantOrNull = ResourceMetadataKeyEnum.DELETED_AT.get(nextResource);
|
||||||
|
Date deletedTimestampOrNull = deletedInstantOrNull != null ? deletedInstantOrNull.getValue() : null;
|
||||||
|
if (theUpdatedEntities.contains(nextOutcome.getEntity())) {
|
||||||
|
updateInternal(theRequestDetails, nextResource, true, false, theRequestDetails, nextOutcome.getEntity(), nextResource.getIdElement(), nextOutcome.getPreviousResource());
|
||||||
|
} else if (!theNonUpdatedEntities.contains(nextOutcome.getEntity())) {
|
||||||
|
updateEntity(theRequestDetails, nextResource, nextOutcome.getEntity(), deletedTimestampOrNull, true, false, theUpdateTime, false, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
myEntityManager.flush();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Double check we didn't allow any duplicates we shouldn't have
|
||||||
|
*/
|
||||||
|
for (Entry nextEntry : theRequest.getEntry()) {
|
||||||
|
if (nextEntry.getRequest().getMethodElement().getValueAsEnum() == HTTPVerbEnum.POST) {
|
||||||
|
String matchUrl = nextEntry.getRequest().getIfNoneExist();
|
||||||
|
if (isNotBlank(matchUrl)) {
|
||||||
|
IFhirResourceDao<?> resourceDao = getDao(nextEntry.getResource().getClass());
|
||||||
|
Set<Long> val = resourceDao.processMatchUrl(matchUrl);
|
||||||
|
if (val.size() > 1) {
|
||||||
|
throw new InvalidRequestException(
|
||||||
|
"Unable to process " + theActionName + " - Request would cause multiple resources to match URL: \"" + matchUrl + "\". Does transaction request contain duplicates?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (IdDt next : theAllIds) {
|
||||||
|
IdDt replacement = theIdSubstitutions.get(next);
|
||||||
|
if (replacement == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (replacement.equals(next)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ourLog.debug("Placeholder resource ID \"{}\" was replaced with permanent ID \"{}\"", next, replacement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private String extractTransactionUrlOrThrowException(Entry nextEntry, HTTPVerbEnum verb) {
|
private String extractTransactionUrlOrThrowException(Entry nextEntry, HTTPVerbEnum verb) {
|
||||||
String url = nextEntry.getRequest().getUrl();
|
String url = nextEntry.getRequest().getUrl();
|
||||||
if (isBlank(url)) {
|
if (isBlank(url)) {
|
||||||
@ -595,7 +613,7 @@ public class FhirSystemDaoDstu2 extends BaseHapiFhirSystemDao<Bundle, MetaDt> {
|
|||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(propagation = Propagation.REQUIRED)
|
@Transactional(propagation = Propagation.NEVER)
|
||||||
@Override
|
@Override
|
||||||
public Bundle transaction(RequestDetails theRequestDetails, Bundle theRequest) {
|
public Bundle transaction(RequestDetails theRequestDetails, Bundle theRequest) {
|
||||||
if (theRequestDetails != null) {
|
if (theRequestDetails != null) {
|
||||||
|
@ -20,6 +20,7 @@ package ca.uhn.fhir.jpa.dao;
|
|||||||
* #L%
|
* #L%
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import ca.uhn.fhir.jpa.dao.data.IForcedIdDao;
|
||||||
import ca.uhn.fhir.jpa.entity.ResourceTable;
|
import ca.uhn.fhir.jpa.entity.ResourceTable;
|
||||||
import ca.uhn.fhir.model.api.IQueryParameterType;
|
import ca.uhn.fhir.model.api.IQueryParameterType;
|
||||||
import ca.uhn.fhir.rest.api.Constants;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
@ -41,6 +42,7 @@ import org.hibernate.search.query.dsl.BooleanJunction;
|
|||||||
import org.hibernate.search.query.dsl.QueryBuilder;
|
import org.hibernate.search.query.dsl.QueryBuilder;
|
||||||
import org.hl7.fhir.dstu3.model.BaseResource;
|
import org.hl7.fhir.dstu3.model.BaseResource;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
@ -50,12 +52,15 @@ import java.util.*;
|
|||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
public class FulltextSearchSvcImpl extends BaseHapiFhirDao<IBaseResource> implements IFulltextSearchSvc {
|
public class FulltextSearchSvcImpl implements IFulltextSearchSvc {
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FulltextSearchSvcImpl.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FulltextSearchSvcImpl.class);
|
||||||
|
|
||||||
@PersistenceContext(type = PersistenceContextType.TRANSACTION)
|
@PersistenceContext(type = PersistenceContextType.TRANSACTION)
|
||||||
private EntityManager myEntityManager;
|
private EntityManager myEntityManager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
protected IForcedIdDao myForcedIdDao;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
|
@ -112,8 +112,6 @@ public interface IFhirResourceDao<T extends IBaseResource> extends IDao {
|
|||||||
|
|
||||||
TagList getAllResourceTags(RequestDetails theRequestDetails);
|
TagList getAllResourceTags(RequestDetails theRequestDetails);
|
||||||
|
|
||||||
<R extends IBaseResource> IFhirResourceDao<R> getDao(Class<R> theType);
|
|
||||||
|
|
||||||
Class<T> getResourceType();
|
Class<T> getResourceType();
|
||||||
|
|
||||||
TagList getTags(IIdType theResourceId, RequestDetails theRequestDetails);
|
TagList getTags(IIdType theResourceId, RequestDetails theRequestDetails);
|
||||||
|
@ -25,8 +25,6 @@ import ca.uhn.fhir.jpa.util.ExpungeOutcome;
|
|||||||
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.springframework.transaction.annotation.Propagation;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -40,12 +38,13 @@ public interface IFhirSystemDao<T, MT> extends IDao {
|
|||||||
|
|
||||||
ExpungeOutcome expunge(ExpungeOptions theExpungeOptions);
|
ExpungeOutcome expunge(ExpungeOptions theExpungeOptions);
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
<R extends IBaseResource> IFhirResourceDao<R> getDao(Class<R> theType);
|
<R extends IBaseResource> IFhirResourceDao<R> getDao(Class<R> theType);
|
||||||
|
|
||||||
Map<String, Long> getResourceCounts();
|
Map<String, Long> getResourceCounts();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*Returns a cached count of resources using a cache that regularly
|
* Returns a cached count of resources using a cache that regularly
|
||||||
* refreshes in the background. This method will never
|
* refreshes in the background. This method will never
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
|
@ -14,6 +14,8 @@ import org.apache.commons.lang3.time.DateUtils;
|
|||||||
import org.hl7.fhir.dstu3.model.*;
|
import org.hl7.fhir.dstu3.model.*;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.transaction.annotation.Propagation;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -63,6 +65,7 @@ public class FhirResourceDaoSearchParameterDstu3 extends FhirResourceDaoDstu3<Se
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@Scheduled(fixedDelay = DateUtils.MILLIS_PER_MINUTE)
|
@Scheduled(fixedDelay = DateUtils.MILLIS_PER_MINUTE)
|
||||||
|
@Transactional(propagation = Propagation.NEVER)
|
||||||
public void performReindexingPass() {
|
public void performReindexingPass() {
|
||||||
if (getConfig().isSchedulingDisabled()) {
|
if (getConfig().isSchedulingDisabled()) {
|
||||||
return;
|
return;
|
||||||
|
@ -11,9 +11,12 @@ import org.hl7.fhir.dstu3.model.ValueSet.ConceptSetComponent;
|
|||||||
import org.hl7.fhir.dstu3.model.ValueSet.ValueSetExpansionComponent;
|
import org.hl7.fhir.dstu3.model.ValueSet.ValueSetExpansionComponent;
|
||||||
import org.hl7.fhir.instance.model.api.IAnyResource;
|
import org.hl7.fhir.instance.model.api.IAnyResource;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
import javax.transaction.Transactional.TxType;
|
import javax.transaction.Transactional.TxType;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -42,34 +45,25 @@ import static org.apache.commons.lang3.StringUtils.isBlank;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
@Transactional(value = TxType.REQUIRED)
|
@Transactional(value = TxType.REQUIRED)
|
||||||
public class JpaValidationSupportDstu3 implements IJpaValidationSupportDstu3 {
|
public class JpaValidationSupportDstu3 implements IJpaValidationSupportDstu3, ApplicationContextAware {
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(JpaValidationSupportDstu3.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(JpaValidationSupportDstu3.class);
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("myStructureDefinitionDaoDstu3")
|
|
||||||
private IFhirResourceDao<StructureDefinition> myStructureDefinitionDao;
|
private IFhirResourceDao<StructureDefinition> myStructureDefinitionDao;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("myValueSetDaoDstu3")
|
|
||||||
private IFhirResourceDao<ValueSet> myValueSetDao;
|
private IFhirResourceDao<ValueSet> myValueSetDao;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("myQuestionnaireDaoDstu3")
|
|
||||||
private IFhirResourceDao<Questionnaire> myQuestionnaireDao;
|
private IFhirResourceDao<Questionnaire> myQuestionnaireDao;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("myCodeSystemDaoDstu3")
|
|
||||||
private IFhirResourceDao<CodeSystem> myCodeSystemDao;
|
private IFhirResourceDao<CodeSystem> myCodeSystemDao;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private FhirContext myDstu3Ctx;
|
private FhirContext myDstu3Ctx;
|
||||||
|
private ApplicationContext myApplicationContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
public JpaValidationSupportDstu3() {
|
public JpaValidationSupportDstu3() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(value = TxType.SUPPORTS)
|
@Transactional(value = TxType.SUPPORTS)
|
||||||
public ValueSetExpansionComponent expandValueSet(FhirContext theCtx, ConceptSetComponent theInclude) {
|
public ValueSetExpansionComponent expandValueSet(FhirContext theCtx, ConceptSetComponent theInclude) {
|
||||||
@ -168,6 +162,19 @@ public class JpaValidationSupportDstu3 implements IJpaValidationSupportDstu3 {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationContext(ApplicationContext theApplicationContext) throws BeansException {
|
||||||
|
myApplicationContext = theApplicationContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void start() {
|
||||||
|
myStructureDefinitionDao = myApplicationContext.getBean("myStructureDefinitionDaoDstu3", IFhirResourceDao.class);
|
||||||
|
myValueSetDao = myApplicationContext.getBean("myValueSetDaoDstu3", IFhirResourceDao.class);
|
||||||
|
myQuestionnaireDao = myApplicationContext.getBean("myQuestionnaireDaoDstu3", IFhirResourceDao.class);
|
||||||
|
myCodeSystemDao = myApplicationContext.getBean("myCodeSystemDaoDstu3", IFhirResourceDao.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(value = TxType.SUPPORTS)
|
@Transactional(value = TxType.SUPPORTS)
|
||||||
public CodeValidationResult validateCode(FhirContext theCtx, String theCodeSystem, String theCode, String theDisplay) {
|
public CodeValidationResult validateCode(FhirContext theCtx, String theCodeSystem, String theCode, String theDisplay) {
|
||||||
|
@ -13,6 +13,8 @@ import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
|||||||
import org.hl7.fhir.r4.model.*;
|
import org.hl7.fhir.r4.model.*;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.transaction.annotation.Propagation;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -57,6 +59,7 @@ public class FhirResourceDaoSearchParameterR4 extends FhirResourceDaoR4<SearchPa
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@Scheduled(fixedDelay = DateUtils.MILLIS_PER_MINUTE)
|
@Scheduled(fixedDelay = DateUtils.MILLIS_PER_MINUTE)
|
||||||
|
@Transactional(propagation = Propagation.NEVER)
|
||||||
public void performReindexingPass() {
|
public void performReindexingPass() {
|
||||||
if (getConfig().isSchedulingDisabled()) {
|
if (getConfig().isSchedulingDisabled()) {
|
||||||
return;
|
return;
|
||||||
|
@ -11,9 +11,12 @@ import org.hl7.fhir.instance.model.api.IBaseResource;
|
|||||||
import org.hl7.fhir.r4.model.*;
|
import org.hl7.fhir.r4.model.*;
|
||||||
import org.hl7.fhir.r4.model.ValueSet.ConceptSetComponent;
|
import org.hl7.fhir.r4.model.ValueSet.ConceptSetComponent;
|
||||||
import org.hl7.fhir.r4.model.ValueSet.ValueSetExpansionComponent;
|
import org.hl7.fhir.r4.model.ValueSet.ValueSetExpansionComponent;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
import javax.transaction.Transactional.TxType;
|
import javax.transaction.Transactional.TxType;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -40,29 +43,22 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
@Transactional(value = TxType.REQUIRED)
|
@Transactional(value = TxType.REQUIRED)
|
||||||
public class JpaValidationSupportR4 implements IJpaValidationSupportR4 {
|
public class JpaValidationSupportR4 implements IJpaValidationSupportR4, ApplicationContextAware {
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(JpaValidationSupportR4.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(JpaValidationSupportR4.class);
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("myStructureDefinitionDaoR4")
|
|
||||||
private IFhirResourceDao<StructureDefinition> myStructureDefinitionDao;
|
private IFhirResourceDao<StructureDefinition> myStructureDefinitionDao;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("myValueSetDaoR4")
|
|
||||||
private IFhirResourceDao<ValueSet> myValueSetDao;
|
private IFhirResourceDao<ValueSet> myValueSetDao;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("myQuestionnaireDaoR4")
|
|
||||||
private IFhirResourceDao<Questionnaire> myQuestionnaireDao;
|
private IFhirResourceDao<Questionnaire> myQuestionnaireDao;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("myCodeSystemDaoR4")
|
|
||||||
private IFhirResourceDao<CodeSystem> myCodeSystemDao;
|
private IFhirResourceDao<CodeSystem> myCodeSystemDao;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private FhirContext myR4Ctx;
|
private FhirContext myR4Ctx;
|
||||||
|
private ApplicationContext myApplicationContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
public JpaValidationSupportR4() {
|
public JpaValidationSupportR4() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
@ -163,6 +159,19 @@ public class JpaValidationSupportR4 implements IJpaValidationSupportR4 {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationContext(ApplicationContext theApplicationContext) throws BeansException {
|
||||||
|
myApplicationContext = theApplicationContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void start() {
|
||||||
|
myStructureDefinitionDao = myApplicationContext.getBean("myStructureDefinitionDaoR4", IFhirResourceDao.class);
|
||||||
|
myValueSetDao = myApplicationContext.getBean("myValueSetDaoR4", IFhirResourceDao.class);
|
||||||
|
myQuestionnaireDao = myApplicationContext.getBean("myQuestionnaireDaoR4", IFhirResourceDao.class);
|
||||||
|
myCodeSystemDao = myApplicationContext.getBean("myCodeSystemDaoR4", IFhirResourceDao.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(value = TxType.SUPPORTS)
|
@Transactional(value = TxType.SUPPORTS)
|
||||||
public CodeValidationResult validateCode(FhirContext theCtx, String theCodeSystem, String theCode, String theDisplay) {
|
public CodeValidationResult validateCode(FhirContext theCtx, String theCodeSystem, String theCode, String theDisplay) {
|
||||||
|
@ -77,7 +77,7 @@ public class StaleSearchDeletingSvcImpl implements IStaleSearchDeletingSvc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(propagation = Propagation.NOT_SUPPORTED)
|
@Transactional(propagation = Propagation.NEVER)
|
||||||
public void pollForStaleSearchesAndDeleteThem() {
|
public void pollForStaleSearchesAndDeleteThem() {
|
||||||
if (!myDaoConfig.isExpireSearchResults()) {
|
if (!myDaoConfig.isExpireSearchResults()) {
|
||||||
return;
|
return;
|
||||||
@ -127,7 +127,7 @@ public class StaleSearchDeletingSvcImpl implements IStaleSearchDeletingSvc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Scheduled(fixedDelay = DEFAULT_CUTOFF_SLACK)
|
@Scheduled(fixedDelay = DEFAULT_CUTOFF_SLACK)
|
||||||
@Transactional(propagation = Propagation.NOT_SUPPORTED)
|
@Transactional(propagation = Propagation.NEVER)
|
||||||
@Override
|
@Override
|
||||||
public synchronized void schedulePollForStaleSearches() {
|
public synchronized void schedulePollForStaleSearches() {
|
||||||
if (!myDaoConfig.isSchedulingDisabled()) {
|
if (!myDaoConfig.isSchedulingDisabled()) {
|
||||||
|
@ -67,7 +67,7 @@ public abstract class BaseSubscriptionDeliverySubscriber extends BaseSubscriptio
|
|||||||
// can have placeholder IDs in them.
|
// can have placeholder IDs in them.
|
||||||
IIdType payloadId = msg.getPayloadId(getContext());
|
IIdType payloadId = msg.getPayloadId(getContext());
|
||||||
Class type = getContext().getResourceDefinition(payloadId.getResourceType()).getImplementingClass();
|
Class type = getContext().getResourceDefinition(payloadId.getResourceType()).getImplementingClass();
|
||||||
IFhirResourceDao dao = getSubscriptionDao().getDao(type);
|
IFhirResourceDao dao = getSubscriptionInterceptor().getDao(type);
|
||||||
IBaseResource loadedPayload;
|
IBaseResource loadedPayload;
|
||||||
try {
|
try {
|
||||||
loadedPayload = dao.read(payloadId);
|
loadedPayload = dao.read(payloadId);
|
||||||
|
@ -28,7 +28,6 @@ import ca.uhn.fhir.jpa.dao.IFhirResourceDao;
|
|||||||
import ca.uhn.fhir.jpa.dao.SearchParameterMap;
|
import ca.uhn.fhir.jpa.dao.SearchParameterMap;
|
||||||
import ca.uhn.fhir.jpa.provider.ServletSubRequestDetails;
|
import ca.uhn.fhir.jpa.provider.ServletSubRequestDetails;
|
||||||
import ca.uhn.fhir.jpa.util.JpaConstants;
|
import ca.uhn.fhir.jpa.util.JpaConstants;
|
||||||
import ca.uhn.fhir.util.StopWatch;
|
|
||||||
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
@ -37,6 +36,7 @@ import ca.uhn.fhir.rest.param.TokenParam;
|
|||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
|
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.ServerOperationInterceptorAdapter;
|
import ca.uhn.fhir.rest.server.interceptor.ServerOperationInterceptorAdapter;
|
||||||
|
import ca.uhn.fhir.util.StopWatch;
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
|
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
|
||||||
@ -99,6 +99,7 @@ public abstract class BaseSubscriptionInterceptor<S extends IBaseResource> exten
|
|||||||
@Autowired
|
@Autowired
|
||||||
@Qualifier(BaseConfig.TASK_EXECUTOR_NAME)
|
@Qualifier(BaseConfig.TASK_EXECUTOR_NAME)
|
||||||
private AsyncTaskExecutor myAsyncTaskExecutor;
|
private AsyncTaskExecutor myAsyncTaskExecutor;
|
||||||
|
private Map<Class<? extends IBaseResource>, IFhirResourceDao<?>> myResourceTypeToDao;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@ -243,6 +244,26 @@ public abstract class BaseSubscriptionInterceptor<S extends IBaseResource> exten
|
|||||||
|
|
||||||
public abstract Subscription.SubscriptionChannelType getChannelType();
|
public abstract Subscription.SubscriptionChannelType getChannelType();
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <R extends IBaseResource> IFhirResourceDao<R> getDao(Class<R> theType) {
|
||||||
|
if (myResourceTypeToDao == null) {
|
||||||
|
Map<Class<? extends IBaseResource>, IFhirResourceDao<?>> theResourceTypeToDao = new HashMap<>();
|
||||||
|
for (IFhirResourceDao<?> next : myResourceDaos) {
|
||||||
|
theResourceTypeToDao.put(next.getResourceType(), next);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this instanceof IFhirResourceDao<?>) {
|
||||||
|
IFhirResourceDao<?> thiz = (IFhirResourceDao<?>) this;
|
||||||
|
theResourceTypeToDao.put(thiz.getResourceType(), thiz);
|
||||||
|
}
|
||||||
|
|
||||||
|
myResourceTypeToDao = theResourceTypeToDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
IFhirResourceDao<R> dao = (IFhirResourceDao<R>) myResourceTypeToDao.get(theType);
|
||||||
|
return dao;
|
||||||
|
}
|
||||||
|
|
||||||
public SubscribableChannel getDeliveryChannel() {
|
public SubscribableChannel getDeliveryChannel() {
|
||||||
return myDeliveryChannel;
|
return myDeliveryChannel;
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ public class SubscriptionCheckingSubscriber extends BaseSubscriptionSubscriber {
|
|||||||
RequestDetails req = new ServletSubRequestDetails();
|
RequestDetails req = new ServletSubRequestDetails();
|
||||||
req.setSubRequest(true);
|
req.setSubRequest(true);
|
||||||
|
|
||||||
IFhirResourceDao<? extends IBaseResource> responseDao = getSubscriptionDao().getDao(responseResourceDef.getImplementingClass());
|
IFhirResourceDao<? extends IBaseResource> responseDao = getSubscriptionInterceptor().getDao(responseResourceDef.getImplementingClass());
|
||||||
responseCriteriaUrl.setLoadSynchronousUpTo(1);
|
responseCriteriaUrl.setLoadSynchronousUpTo(1);
|
||||||
|
|
||||||
IBundleProvider responseResults = responseDao.search(responseCriteriaUrl, req);
|
IBundleProvider responseResults = responseDao.search(responseCriteriaUrl, req);
|
||||||
|
@ -123,7 +123,7 @@ public class SubscriptionDeliveringRestHookSubscriber extends BaseSubscriptionDe
|
|||||||
IBaseResource payloadResource = theMsg.getPayload(getContext());
|
IBaseResource payloadResource = theMsg.getPayload(getContext());
|
||||||
|
|
||||||
if (theSubscription.getRestHookDetails().isDeliverLatestVersion()) {
|
if (theSubscription.getRestHookDetails().isDeliverLatestVersion()) {
|
||||||
IFhirResourceDao dao = getSubscriptionDao().getDao(payloadResource.getClass());
|
IFhirResourceDao dao = getSubscriptionInterceptor().getDao(payloadResource.getClass());
|
||||||
try {
|
try {
|
||||||
payloadResource = dao.read(payloadResource.getIdElement().toVersionless());
|
payloadResource = dao.read(payloadResource.getIdElement().toVersionless());
|
||||||
} catch (ResourceGoneException e) {
|
} catch (ResourceGoneException e) {
|
||||||
|
@ -31,7 +31,6 @@ import ca.uhn.fhir.jpa.util.ScrollableResultsIterator;
|
|||||||
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
import ca.uhn.fhir.rest.api.server.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
|
|
||||||
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
||||||
import ca.uhn.fhir.util.ObjectUtil;
|
import ca.uhn.fhir.util.ObjectUtil;
|
||||||
import ca.uhn.fhir.util.StopWatch;
|
import ca.uhn.fhir.util.StopWatch;
|
||||||
@ -56,7 +55,10 @@ import org.hl7.fhir.r4.model.CodeSystem;
|
|||||||
import org.hl7.fhir.r4.model.Coding;
|
import org.hl7.fhir.r4.model.Coding;
|
||||||
import org.hl7.fhir.r4.model.ConceptMap;
|
import org.hl7.fhir.r4.model.ConceptMap;
|
||||||
import org.hl7.fhir.r4.model.ValueSet;
|
import org.hl7.fhir.r4.model.ValueSet;
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.domain.PageRequest;
|
import org.springframework.data.domain.PageRequest;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
@ -80,7 +82,7 @@ import java.util.stream.Collectors;
|
|||||||
import static org.apache.commons.lang3.StringUtils.isBlank;
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
public abstract class BaseHapiTerminologySvcImpl implements IHapiTerminologySvc {
|
public abstract class BaseHapiTerminologySvcImpl implements IHapiTerminologySvc, ApplicationContextAware {
|
||||||
public static final int DEFAULT_FETCH_SIZE = 250;
|
public static final int DEFAULT_FETCH_SIZE = 250;
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseHapiTerminologySvcImpl.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseHapiTerminologySvcImpl.class);
|
||||||
@ -123,14 +125,11 @@ public abstract class BaseHapiTerminologySvcImpl implements IHapiTerminologySvc
|
|||||||
private boolean myProcessDeferred = true;
|
private boolean myProcessDeferred = true;
|
||||||
@Autowired
|
@Autowired
|
||||||
private PlatformTransactionManager myTransactionMgr;
|
private PlatformTransactionManager myTransactionMgr;
|
||||||
@Autowired(required = false)
|
|
||||||
private IFhirResourceDaoCodeSystem<?, ?, ?> myCodeSystemResourceDao;
|
private IFhirResourceDaoCodeSystem<?, ?, ?> myCodeSystemResourceDao;
|
||||||
|
|
||||||
private Cache<TranslationQuery, List<TermConceptMapGroupElementTarget>> myTranslationCache;
|
private Cache<TranslationQuery, List<TermConceptMapGroupElementTarget>> myTranslationCache;
|
||||||
private Cache<TranslationQuery, List<TermConceptMapGroupElement>> myTranslationWithReverseCache;
|
private Cache<TranslationQuery, List<TermConceptMapGroupElement>> myTranslationWithReverseCache;
|
||||||
|
|
||||||
|
|
||||||
private int myFetchSize = DEFAULT_FETCH_SIZE;
|
private int myFetchSize = DEFAULT_FETCH_SIZE;
|
||||||
|
private ApplicationContext myApplicationContext;
|
||||||
|
|
||||||
private void addCodeIfNotAlreadyAdded(String theCodeSystem, ValueSet.ValueSetExpansionComponent theExpansionComponent, Set<String> theAddedCodes, TermConcept theConcept) {
|
private void addCodeIfNotAlreadyAdded(String theCodeSystem, ValueSet.ValueSetExpansionComponent theExpansionComponent, Set<String> theAddedCodes, TermConcept theConcept) {
|
||||||
if (theAddedCodes.add(theConcept.getCode())) {
|
if (theAddedCodes.add(theConcept.getCode())) {
|
||||||
@ -207,6 +206,32 @@ public abstract class BaseHapiTerminologySvcImpl implements IHapiTerminologySvc
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is present only for unit tests, do not call from client code
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
public void clearDeferred() {
|
||||||
|
myDeferredValueSets.clear();
|
||||||
|
myDeferredConceptMaps.clear();
|
||||||
|
myDeferredConcepts.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is present only for unit tests, do not call from client code
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
public void clearTranslationCache() {
|
||||||
|
myTranslationCache.invalidateAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is present only for unit tests, do not call from client code
|
||||||
|
*/
|
||||||
|
@VisibleForTesting()
|
||||||
|
public void clearTranslationWithReverseCache() {
|
||||||
|
myTranslationWithReverseCache.invalidateAll();
|
||||||
|
}
|
||||||
|
|
||||||
protected abstract IIdType createOrUpdateCodeSystem(CodeSystem theCodeSystemResource);
|
protected abstract IIdType createOrUpdateCodeSystem(CodeSystem theCodeSystemResource);
|
||||||
|
|
||||||
protected abstract void createOrUpdateConceptMap(ConceptMap theNextConceptMap);
|
protected abstract void createOrUpdateConceptMap(ConceptMap theNextConceptMap);
|
||||||
@ -788,11 +813,21 @@ public abstract class BaseHapiTerminologySvcImpl implements IHapiTerminologySvc
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationContext(ApplicationContext theApplicationContext) throws BeansException {
|
||||||
|
myApplicationContext = theApplicationContext;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setProcessDeferred(boolean theProcessDeferred) {
|
public void setProcessDeferred(boolean theProcessDeferred) {
|
||||||
myProcessDeferred = theProcessDeferred;
|
myProcessDeferred = theProcessDeferred;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void start() {
|
||||||
|
myCodeSystemResourceDao = myApplicationContext.getBean(IFhirResourceDaoCodeSystem.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(propagation = Propagation.REQUIRED)
|
@Transactional(propagation = Propagation.REQUIRED)
|
||||||
public void storeNewCodeSystemVersion(Long theCodeSystemResourcePid, String theSystemUri, String theSystemName, TermCodeSystemVersion theCodeSystemVersion) {
|
public void storeNewCodeSystemVersion(Long theCodeSystemResourcePid, String theSystemUri, String theSystemName, TermCodeSystemVersion theCodeSystemVersion) {
|
||||||
@ -1258,32 +1293,6 @@ public abstract class BaseHapiTerminologySvcImpl implements IHapiTerminologySvc
|
|||||||
ourLastResultsFromTranslationWithReverseCache = false;
|
ourLastResultsFromTranslationWithReverseCache = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is present only for unit tests, do not call from client code
|
|
||||||
*/
|
|
||||||
@VisibleForTesting
|
|
||||||
public void clearTranslationCache() {
|
|
||||||
myTranslationCache.invalidateAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is present only for unit tests, do not call from client code
|
|
||||||
*/
|
|
||||||
@VisibleForTesting
|
|
||||||
public void clearDeferred() {
|
|
||||||
myDeferredValueSets.clear();
|
|
||||||
myDeferredConceptMaps.clear();
|
|
||||||
myDeferredConcepts.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is present only for unit tests, do not call from client code
|
|
||||||
*/
|
|
||||||
@VisibleForTesting()
|
|
||||||
public void clearTranslationWithReverseCache() {
|
|
||||||
myTranslationWithReverseCache.invalidateAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is present only for unit tests, do not call from client code
|
* This method is present only for unit tests, do not call from client code
|
||||||
*/
|
*/
|
||||||
|
@ -252,6 +252,7 @@ public class ConnectionWrapper implements Connection {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setReadOnly(boolean theReadOnly) throws SQLException {
|
public void setReadOnly(boolean theReadOnly) throws SQLException {
|
||||||
|
ourLog.info("Setting connection as readonly");
|
||||||
myWrap.setReadOnly(theReadOnly);
|
myWrap.setReadOnly(theReadOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,8 +4,11 @@ import ca.uhn.fhir.jpa.dao.DaoConfig;
|
|||||||
import ca.uhn.fhir.jpa.search.LuceneSearchMappingFactory;
|
import ca.uhn.fhir.jpa.search.LuceneSearchMappingFactory;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor;
|
import ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor;
|
||||||
import ca.uhn.fhir.validation.ResultSeverityEnum;
|
import ca.uhn.fhir.validation.ResultSeverityEnum;
|
||||||
|
import net.ttddyy.dsproxy.listener.ThreadQueryCountHolder;
|
||||||
|
import net.ttddyy.dsproxy.support.ProxyDataSourceBuilder;
|
||||||
import org.apache.commons.dbcp2.BasicDataSource;
|
import org.apache.commons.dbcp2.BasicDataSource;
|
||||||
import org.hibernate.jpa.HibernatePersistenceProvider;
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
@ -15,11 +18,35 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
|
|||||||
|
|
||||||
import javax.persistence.EntityManagerFactory;
|
import javax.persistence.EntityManagerFactory;
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableTransactionManagement()
|
@EnableTransactionManagement()
|
||||||
public class TestDstu2Config extends BaseJavaConfigDstu2 {
|
public class TestDstu2Config extends BaseJavaConfigDstu2 {
|
||||||
|
private static final Logger ourLog = LoggerFactory.getLogger(TestDstu2Config.class);
|
||||||
|
private static int ourMaxThreads;
|
||||||
|
|
||||||
|
static {
|
||||||
|
/*
|
||||||
|
* We use a randomized number of maximum threads in order to try
|
||||||
|
* and catch any potential deadlocks caused by database connection
|
||||||
|
* starvation
|
||||||
|
*/
|
||||||
|
ourMaxThreads = (int) (Math.random() * 6.0) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Exception myLastStackTrace;
|
||||||
|
private String myLastStackTraceThreadName;
|
||||||
|
|
||||||
|
@Bean(name="maxDatabaseThreadsForTest")
|
||||||
|
public Integer getMaxThread(){
|
||||||
|
return ourMaxThreads;
|
||||||
|
}
|
||||||
|
|
||||||
@Bean()
|
@Bean()
|
||||||
public DaoConfig daoConfig() {
|
public DaoConfig daoConfig() {
|
||||||
@ -28,21 +55,73 @@ public class TestDstu2Config extends BaseJavaConfigDstu2 {
|
|||||||
|
|
||||||
@Bean()
|
@Bean()
|
||||||
public DataSource dataSource() {
|
public DataSource dataSource() {
|
||||||
BasicDataSource retVal = new BasicDataSource();
|
BasicDataSource retVal = new BasicDataSource() {
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Connection getConnection() throws SQLException {
|
||||||
|
ConnectionWrapper retVal;
|
||||||
|
try {
|
||||||
|
retVal = new ConnectionWrapper(super.getConnection());
|
||||||
|
} catch (Exception e) {
|
||||||
|
ourLog.error("Exceeded maximum wait for connection", e);
|
||||||
|
logGetConnectionStackTrace();
|
||||||
|
|
||||||
|
// if ("true".equals(System.getStringProperty("ci"))) {
|
||||||
|
fail("Exceeded maximum wait for connection: " + e.toString());
|
||||||
|
// }
|
||||||
|
// System.exit(1);
|
||||||
|
retVal = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
throw new Exception();
|
||||||
|
} catch (Exception e) {
|
||||||
|
myLastStackTrace = e;
|
||||||
|
myLastStackTraceThreadName = Thread.currentThread().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void logGetConnectionStackTrace() {
|
||||||
|
StringBuilder b = new StringBuilder();
|
||||||
|
b.append("Last connection request stack trace:");
|
||||||
|
for (StackTraceElement next : myLastStackTrace.getStackTrace()) {
|
||||||
|
b.append("\n ");
|
||||||
|
b.append(next.getClassName());
|
||||||
|
b.append(".");
|
||||||
|
b.append(next.getMethodName());
|
||||||
|
b.append("(");
|
||||||
|
b.append(next.getFileName());
|
||||||
|
b.append(":");
|
||||||
|
b.append(next.getLineNumber());
|
||||||
|
b.append(")");
|
||||||
|
}
|
||||||
|
ourLog.info(b.toString());
|
||||||
|
ourLog.info("Last connection thread: {}", myLastStackTraceThreadName);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
retVal.setDriver(new org.apache.derby.jdbc.EmbeddedDriver());
|
retVal.setDriver(new org.apache.derby.jdbc.EmbeddedDriver());
|
||||||
retVal.setUrl("jdbc:derby:memory:myUnitTestDBDstu2;create=true");
|
retVal.setUrl("jdbc:derby:memory:myUnitTestDBDstu2;create=true");
|
||||||
|
retVal.setMaxWaitMillis(10000);
|
||||||
retVal.setUsername("");
|
retVal.setUsername("");
|
||||||
retVal.setPassword("");
|
retVal.setPassword("");
|
||||||
return retVal;
|
|
||||||
}
|
retVal.setMaxTotal(ourMaxThreads);
|
||||||
|
|
||||||
@Bean()
|
DataSource dataSource = ProxyDataSourceBuilder
|
||||||
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
|
.create(retVal)
|
||||||
JpaTransactionManager retVal = new JpaTransactionManager();
|
// .logQueryBySlf4j(SLF4JLogLevel.INFO, "SQL")
|
||||||
retVal.setEntityManagerFactory(entityManagerFactory);
|
.logSlowQueryBySlf4j(10, TimeUnit.SECONDS)
|
||||||
return retVal;
|
.countQuery(new ThreadQueryCountHolder())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
return dataSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
@Bean()
|
@Bean()
|
||||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
||||||
LocalContainerEntityManagerFactoryBean retVal = super.entityManagerFactory();
|
LocalContainerEntityManagerFactoryBean retVal = super.entityManagerFactory();
|
||||||
@ -60,7 +139,7 @@ public class TestDstu2Config extends BaseJavaConfigDstu2 {
|
|||||||
extraProperties.put("hibernate.dialect", "ca.uhn.fhir.jpa.util.DerbyTenSevenHapiFhirDialect");
|
extraProperties.put("hibernate.dialect", "ca.uhn.fhir.jpa.util.DerbyTenSevenHapiFhirDialect");
|
||||||
extraProperties.put("hibernate.search.model_mapping", LuceneSearchMappingFactory.class.getName());
|
extraProperties.put("hibernate.search.model_mapping", LuceneSearchMappingFactory.class.getName());
|
||||||
extraProperties.put("hibernate.search.default.directory_provider", "ram");
|
extraProperties.put("hibernate.search.default.directory_provider", "ram");
|
||||||
extraProperties.put("hibernate.search.lucene_version","LUCENE_CURRENT");
|
extraProperties.put("hibernate.search.lucene_version", "LUCENE_CURRENT");
|
||||||
return extraProperties;
|
return extraProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,4 +158,11 @@ public class TestDstu2Config extends BaseJavaConfigDstu2 {
|
|||||||
return requestValidator;
|
return requestValidator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean()
|
||||||
|
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
|
||||||
|
JpaTransactionManager retVal = new JpaTransactionManager();
|
||||||
|
retVal.setEntityManagerFactory(entityManagerFactory);
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,10 @@ import ca.uhn.fhir.util.BundleUtil;
|
|||||||
import ca.uhn.fhir.util.StopWatch;
|
import ca.uhn.fhir.util.StopWatch;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.hibernate.HibernateException;
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.SessionFactory;
|
||||||
|
import org.hibernate.jdbc.Work;
|
||||||
import org.hl7.fhir.dstu3.model.Bundle.BundleEntryComponent;
|
import org.hl7.fhir.dstu3.model.Bundle.BundleEntryComponent;
|
||||||
import org.hl7.fhir.dstu3.model.Resource;
|
import org.hl7.fhir.dstu3.model.Resource;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseBundle;
|
import org.hl7.fhir.instance.model.api.IBaseBundle;
|
||||||
@ -30,6 +34,8 @@ import org.junit.AfterClass;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
|
import org.springframework.orm.hibernate5.HibernateTransactionManager;
|
||||||
|
import org.springframework.orm.jpa.JpaTransactionManager;
|
||||||
import org.springframework.transaction.PlatformTransactionManager;
|
import org.springframework.transaction.PlatformTransactionManager;
|
||||||
import org.springframework.transaction.TransactionDefinition;
|
import org.springframework.transaction.TransactionDefinition;
|
||||||
import org.springframework.transaction.TransactionStatus;
|
import org.springframework.transaction.TransactionStatus;
|
||||||
@ -38,8 +44,11 @@ import org.springframework.transaction.support.TransactionTemplate;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import static ca.uhn.fhir.util.TestUtil.randomizeLocale;
|
import static ca.uhn.fhir.util.TestUtil.randomizeLocale;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
@ -64,7 +73,7 @@ public abstract class BaseJpaTest {
|
|||||||
protected IRequestOperationCallback myRequestOperationCallback = mock(IRequestOperationCallback.class);
|
protected IRequestOperationCallback myRequestOperationCallback = mock(IRequestOperationCallback.class);
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public final void afterPerformCleanup() {
|
public void afterPerformCleanup() {
|
||||||
BaseHapiFhirResourceDao.setDisableIncrementOnUpdateForUnitTest(false);
|
BaseHapiFhirResourceDao.setDisableIncrementOnUpdateForUnitTest(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,6 +87,32 @@ public abstract class BaseJpaTest {
|
|||||||
when(mySrd.getHeaders(eq(JpaConstants.HEADER_META_SNAPSHOT_MODE))).thenReturn(new ArrayList<>());
|
when(mySrd.getHeaders(eq(JpaConstants.HEADER_META_SNAPSHOT_MODE))).thenReturn(new ArrayList<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void afterValidateNoTransaction() {
|
||||||
|
PlatformTransactionManager txManager = getTxManager();
|
||||||
|
if (txManager != null) {
|
||||||
|
JpaTransactionManager hibernateTxManager = (JpaTransactionManager) txManager;
|
||||||
|
SessionFactory sessionFactory = (SessionFactory) hibernateTxManager.getEntityManagerFactory();
|
||||||
|
AtomicBoolean isReadOnly = new AtomicBoolean();
|
||||||
|
Session currentSession;
|
||||||
|
try {
|
||||||
|
currentSession = sessionFactory.getCurrentSession();
|
||||||
|
} catch (HibernateException e) {
|
||||||
|
currentSession = null;
|
||||||
|
}
|
||||||
|
if (currentSession != null) {
|
||||||
|
currentSession.doWork(new Work() {
|
||||||
|
|
||||||
|
public void execute(Connection connection) throws SQLException {
|
||||||
|
isReadOnly.set(connection.isReadOnly());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assertFalse(isReadOnly.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void beforeRandomizeLocale() {
|
public void beforeRandomizeLocale() {
|
||||||
randomizeLocale();
|
randomizeLocale();
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
package ca.uhn.fhir.jpa.dao.dstu3;
|
package ca.uhn.fhir.jpa.dao.dstu3;
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.dao.DaoConfig;
|
|
||||||
import ca.uhn.fhir.util.StopWatch;
|
|
||||||
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||||
|
import ca.uhn.fhir.util.StopWatch;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
import com.phloc.commons.compare.ReverseComparator;
|
import org.apache.commons.collections4.comparators.ReverseComparator;
|
||||||
import org.apache.commons.dbcp2.BasicDataSource;
|
import org.apache.commons.dbcp2.BasicDataSource;
|
||||||
import org.hl7.fhir.dstu3.model.Bundle;
|
import org.hl7.fhir.dstu3.model.Bundle;
|
||||||
import org.hl7.fhir.dstu3.model.Bundle.BundleType;
|
import org.hl7.fhir.dstu3.model.Bundle.BundleType;
|
||||||
|
@ -44,11 +44,7 @@ import org.springframework.test.context.ContextConfiguration;
|
|||||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
import org.springframework.test.util.AopTestUtils;
|
import org.springframework.test.util.AopTestUtils;
|
||||||
import org.springframework.transaction.PlatformTransactionManager;
|
import org.springframework.transaction.PlatformTransactionManager;
|
||||||
import org.springframework.transaction.TransactionDefinition;
|
|
||||||
import org.springframework.transaction.TransactionStatus;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
|
||||||
import org.springframework.transaction.support.TransactionTemplate;
|
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -49,6 +49,7 @@ public abstract class BaseResourceProviderDstu2Test extends BaseJpaDstu2Test {
|
|||||||
protected static SubscriptionRestHookInterceptor ourRestHookSubscriptionInterceptor;
|
protected static SubscriptionRestHookInterceptor ourRestHookSubscriptionInterceptor;
|
||||||
protected static DatabaseBackedPagingProvider ourPagingProvider;
|
protected static DatabaseBackedPagingProvider ourPagingProvider;
|
||||||
protected static PlatformTransactionManager ourTxManager;
|
protected static PlatformTransactionManager ourTxManager;
|
||||||
|
protected static Integer ourConnectionPoolSize;
|
||||||
|
|
||||||
public BaseResourceProviderDstu2Test() {
|
public BaseResourceProviderDstu2Test() {
|
||||||
super();
|
super();
|
||||||
@ -84,6 +85,7 @@ public abstract class BaseResourceProviderDstu2Test extends BaseJpaDstu2Test {
|
|||||||
ourRestServer.setServerConformanceProvider(confProvider);
|
ourRestServer.setServerConformanceProvider(confProvider);
|
||||||
|
|
||||||
ourPagingProvider = myAppCtx.getBean(DatabaseBackedPagingProvider.class);
|
ourPagingProvider = myAppCtx.getBean(DatabaseBackedPagingProvider.class);
|
||||||
|
ourConnectionPoolSize = myAppCtx.getBean("maxDatabaseThreadsForTest", Integer.class);
|
||||||
ourRestServer.setPagingProvider(ourPagingProvider);
|
ourRestServer.setPagingProvider(ourPagingProvider);
|
||||||
|
|
||||||
Server server = new Server(ourPort);
|
Server server = new Server(ourPort);
|
||||||
|
@ -1,41 +1,58 @@
|
|||||||
package ca.uhn.fhir.jpa.provider;
|
package ca.uhn.fhir.jpa.provider;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.*;
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.net.*;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.apache.http.client.ClientProtocolException;
|
|
||||||
import org.apache.http.client.methods.*;
|
|
||||||
import org.apache.http.entity.*;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseBundle;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
|
||||||
import org.junit.*;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.springframework.test.util.AopTestUtils;
|
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.dao.DaoConfig;
|
import ca.uhn.fhir.jpa.dao.DaoConfig;
|
||||||
import ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl;
|
import ca.uhn.fhir.jpa.search.SearchCoordinatorSvcImpl;
|
||||||
import ca.uhn.fhir.model.api.*;
|
import ca.uhn.fhir.model.api.ExtensionDt;
|
||||||
import ca.uhn.fhir.model.dstu2.composite.*;
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
|
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
|
||||||
|
import ca.uhn.fhir.model.api.TemporalPrecisionEnum;
|
||||||
|
import ca.uhn.fhir.model.dstu2.composite.CodingDt;
|
||||||
|
import ca.uhn.fhir.model.dstu2.composite.MetaDt;
|
||||||
|
import ca.uhn.fhir.model.dstu2.composite.PeriodDt;
|
||||||
|
import ca.uhn.fhir.model.dstu2.composite.ResourceReferenceDt;
|
||||||
import ca.uhn.fhir.model.dstu2.resource.*;
|
import ca.uhn.fhir.model.dstu2.resource.*;
|
||||||
import ca.uhn.fhir.model.dstu2.resource.Bundle.Entry;
|
import ca.uhn.fhir.model.dstu2.resource.Bundle.Entry;
|
||||||
import ca.uhn.fhir.model.dstu2.valueset.*;
|
import ca.uhn.fhir.model.dstu2.valueset.*;
|
||||||
import ca.uhn.fhir.model.primitive.*;
|
import ca.uhn.fhir.model.primitive.*;
|
||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.rest.api.*;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
|
import ca.uhn.fhir.rest.api.MethodOutcome;
|
||||||
|
import ca.uhn.fhir.rest.api.SummaryEnum;
|
||||||
import ca.uhn.fhir.rest.client.api.IGenericClient;
|
import ca.uhn.fhir.rest.client.api.IGenericClient;
|
||||||
import ca.uhn.fhir.rest.param.*;
|
import ca.uhn.fhir.rest.param.*;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.*;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.util.*;
|
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.ResourceGoneException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
||||||
|
import ca.uhn.fhir.util.BundleUtil;
|
||||||
|
import ca.uhn.fhir.util.StopWatch;
|
||||||
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
import ca.uhn.fhir.util.UrlUtil;
|
||||||
|
import com.google.common.base.Charsets;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.http.client.ClientProtocolException;
|
||||||
|
import org.apache.http.client.methods.*;
|
||||||
|
import org.apache.http.entity.ByteArrayEntity;
|
||||||
|
import org.apache.http.entity.ContentType;
|
||||||
|
import org.apache.http.entity.StringEntity;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseBundle;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
import org.junit.*;
|
||||||
|
import org.springframework.test.util.AopTestUtils;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.net.SocketTimeoutException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.*;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
|
public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
|
||||||
|
|
||||||
@ -208,7 +225,7 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testCreateAndUpdateBinary() throws ClientProtocolException, Exception {
|
public void testCreateAndUpdateBinary() throws ClientProtocolException, Exception {
|
||||||
byte[] arr = { 1, 21, 74, 123, -44 };
|
byte[] arr = {1, 21, 74, 123, -44};
|
||||||
Binary binary = new Binary();
|
Binary binary = new Binary();
|
||||||
binary.setContent(arr);
|
binary.setContent(arr);
|
||||||
binary.setContentType("dansk");
|
binary.setContentType("dansk");
|
||||||
@ -934,7 +951,7 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
|
|||||||
List<IIdType> actual;
|
List<IIdType> actual;
|
||||||
StringAndListParam param;
|
StringAndListParam param;
|
||||||
|
|
||||||
ourLog.info("Pt1:{} Pt2:{} Obs1:{} Obs2:{} Obs3:{}", new Object[] { ptId1.getIdPart(), ptId2.getIdPart(), obsId1.getIdPart(), obsId2.getIdPart(), obsId3.getIdPart() });
|
ourLog.info("Pt1:{} Pt2:{} Obs1:{} Obs2:{} Obs3:{}", new Object[] {ptId1.getIdPart(), ptId2.getIdPart(), obsId1.getIdPart(), obsId2.getIdPart(), obsId3.getIdPart()});
|
||||||
|
|
||||||
param = new StringAndListParam();
|
param = new StringAndListParam();
|
||||||
param.addAnd(new StringOrListParam().addOr(new StringParam("obsvalue1")));
|
param.addAnd(new StringOrListParam().addOr(new StringParam("obsvalue1")));
|
||||||
@ -1471,6 +1488,7 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPagingOverEverythingSet() throws InterruptedException {
|
public void testPagingOverEverythingSet() throws InterruptedException {
|
||||||
Patient p = new Patient();
|
Patient p = new Patient();
|
||||||
@ -1488,6 +1506,7 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
|
|||||||
mySearchCoordinatorSvcRaw.setSyncSizeForUnitTests(10);
|
mySearchCoordinatorSvcRaw.setSyncSizeForUnitTests(10);
|
||||||
mySearchCoordinatorSvcRaw.setNeverUseLocalSearchForUnitTests(true);
|
mySearchCoordinatorSvcRaw.setNeverUseLocalSearchForUnitTests(true);
|
||||||
|
|
||||||
|
StopWatch sw = new StopWatch();
|
||||||
ca.uhn.fhir.model.dstu2.resource.Bundle response = ourClient
|
ca.uhn.fhir.model.dstu2.resource.Bundle response = ourClient
|
||||||
.operation()
|
.operation()
|
||||||
.onInstance(new IdDt(pid))
|
.onInstance(new IdDt(pid))
|
||||||
@ -1498,7 +1517,9 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
|
|||||||
.execute();
|
.execute();
|
||||||
|
|
||||||
assertEquals(10, response.getEntry().size());
|
assertEquals(10, response.getEntry().size());
|
||||||
assertEquals(null, response.getTotalElement().getValueAsString());
|
if (ourConnectionPoolSize > 1) {
|
||||||
|
assertEquals("Total should be null but was " + response.getTotalElement().getValueAsString() + " in " + sw.toString(), null, response.getTotalElement().getValueAsString());
|
||||||
|
}
|
||||||
assertThat(response.getLink("next").getUrl(), not(emptyString()));
|
assertThat(response.getLink("next").getUrl(), not(emptyString()));
|
||||||
|
|
||||||
// Load page 2
|
// Load page 2
|
||||||
@ -1993,7 +2014,7 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
|
|||||||
Bundle found = ourClient
|
Bundle found = ourClient
|
||||||
.search()
|
.search()
|
||||||
.forResource(Patient.class)
|
.forResource(Patient.class)
|
||||||
.where(Patient.IDENTIFIER.exactly().systemAndIdentifier("urn:system:rpdstu2","testSearchWithInclude02"))
|
.where(Patient.IDENTIFIER.exactly().systemAndIdentifier("urn:system:rpdstu2", "testSearchWithInclude02"))
|
||||||
.include(Patient.INCLUDE_ORGANIZATION)
|
.include(Patient.INCLUDE_ORGANIZATION)
|
||||||
.prettyPrint()
|
.prettyPrint()
|
||||||
.returnBundle(Bundle.class)
|
.returnBundle(Bundle.class)
|
||||||
@ -2295,7 +2316,7 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
|
|||||||
CloseableHttpResponse resp = ourHttpClient.execute(post);
|
CloseableHttpResponse resp = ourHttpClient.execute(post);
|
||||||
try {
|
try {
|
||||||
assertEquals(200, resp.getStatusLine().getStatusCode());
|
assertEquals(200, resp.getStatusLine().getStatusCode());
|
||||||
String output= IOUtils.toString(resp.getEntity().getContent());
|
String output = IOUtils.toString(resp.getEntity().getContent());
|
||||||
ourLog.info(output);
|
ourLog.info(output);
|
||||||
} finally {
|
} finally {
|
||||||
resp.close();
|
resp.close();
|
||||||
@ -2387,7 +2408,7 @@ public class ResourceProviderDstu2Test extends BaseResourceProviderDstu2Test {
|
|||||||
response.close();
|
response.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
pt.addName().addFamily(methodName+"2");
|
pt.addName().addFamily(methodName + "2");
|
||||||
resource = myFhirCtx.newXmlParser().encodeResourceToString(pt);
|
resource = myFhirCtx.newXmlParser().encodeResourceToString(pt);
|
||||||
HttpPut put = new HttpPut(ourServerBase + "/Patient?name=" + methodName);
|
HttpPut put = new HttpPut(ourServerBase + "/Patient?name=" + methodName);
|
||||||
put.setEntity(new StringEntity(resource, ContentType.create(Constants.CT_FHIR_XML, "UTF-8")));
|
put.setEntity(new StringEntity(resource, ContentType.create(Constants.CT_FHIR_XML, "UTF-8")));
|
||||||
|
@ -11,14 +11,12 @@ import org.hl7.fhir.instance.model.api.IIdType;
|
|||||||
import org.hl7.fhir.r4.model.ConceptMap;
|
import org.hl7.fhir.r4.model.ConceptMap;
|
||||||
import org.hl7.fhir.r4.model.Enumerations.ConceptMapEquivalence;
|
import org.hl7.fhir.r4.model.Enumerations.ConceptMapEquivalence;
|
||||||
import org.hl7.fhir.r4.model.UriType;
|
import org.hl7.fhir.r4.model.UriType;
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.rules.ExpectedException;
|
import org.junit.rules.ExpectedException;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.test.util.AopTestUtils;
|
|
||||||
import org.springframework.transaction.TransactionStatus;
|
import org.springframework.transaction.TransactionStatus;
|
||||||
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
||||||
import org.springframework.transaction.support.TransactionTemplate;
|
import org.springframework.transaction.support.TransactionTemplate;
|
||||||
@ -102,7 +100,6 @@ public class TerminologySvcImplR4Test extends BaseJpaR4Test {
|
|||||||
.addTarget()
|
.addTarget()
|
||||||
.setCode("34567");
|
.setCode("34567");
|
||||||
|
|
||||||
runInTransaction(() -> {
|
|
||||||
try {
|
try {
|
||||||
runInTransaction(() -> {
|
runInTransaction(() -> {
|
||||||
myConceptMapDao.create(conceptMap);
|
myConceptMapDao.create(conceptMap);
|
||||||
@ -111,7 +108,6 @@ public class TerminologySvcImplR4Test extends BaseJpaR4Test {
|
|||||||
} catch (UnprocessableEntityException e) {
|
} catch (UnprocessableEntityException e) {
|
||||||
assertEquals("ConceptMap has no value for ConceptMap.url", e.getMessage());
|
assertEquals("ConceptMap has no value for ConceptMap.url", e.getMessage());
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,8 +187,8 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>Saxon-HE</artifactId>
|
<artifactId>Saxon-HE</artifactId>
|
||||||
|
@ -138,8 +138,8 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>Saxon-HE</artifactId>
|
<artifactId>Saxon-HE</artifactId>
|
||||||
|
@ -55,8 +55,8 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>Saxon-HE</artifactId>
|
<artifactId>Saxon-HE</artifactId>
|
||||||
@ -65,8 +65,8 @@
|
|||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -72,8 +72,8 @@
|
|||||||
<artifactId>thymeleaf</artifactId>
|
<artifactId>thymeleaf</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>Saxon-HE</artifactId>
|
<artifactId>Saxon-HE</artifactId>
|
||||||
@ -82,8 +82,8 @@
|
|||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -197,8 +197,8 @@
|
|||||||
com.ctc.wstx.api;version="4.4";resolution:=optional,
|
com.ctc.wstx.api;version="4.4";resolution:=optional,
|
||||||
com.ctc.wstx.*;version="4.4";resolution:=optional,
|
com.ctc.wstx.*;version="4.4";resolution:=optional,
|
||||||
com.google.*;resolution:=optional;-remove-attribute:=version,
|
com.google.*;resolution:=optional;-remove-attribute:=version,
|
||||||
com.phloc.commons;resolution:=optional;-remove-attribute:=version,
|
com.helger.commons;resolution:=optional;-remove-attribute:=version,
|
||||||
com.phloc.*;resolution:=optional;-remove-attribute:=version,
|
com.helger.*;resolution:=optional;-remove-attribute:=version,
|
||||||
javassist;-remove-attribute:=version,
|
javassist;-remove-attribute:=version,
|
||||||
javax.*;-remove-attribute:=version,
|
javax.*;-remove-attribute:=version,
|
||||||
net.sf.saxon;resolution:=optional,
|
net.sf.saxon;resolution:=optional,
|
||||||
|
@ -68,13 +68,13 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -130,22 +130,6 @@
|
|||||||
<artifactId>thymeleaf</artifactId>
|
<artifactId>thymeleaf</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>com.phloc</groupId>
|
|
||||||
<artifactId>phloc-schematron</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
<exclusions><!--
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>Saxon-HE</artifactId>
|
|
||||||
<groupId>net.sf.saxon</groupId>
|
|
||||||
</exclusion>-->
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.phloc</groupId>
|
|
||||||
<artifactId>phloc-commons</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- UNIT TEST DEPENDENCIES -->
|
<!-- UNIT TEST DEPENDENCIES -->
|
||||||
@ -208,6 +192,16 @@
|
|||||||
<artifactId>spring-web</artifactId>
|
<artifactId>spring-web</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.helger</groupId>
|
||||||
|
<artifactId>ph-schematron</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.helger</groupId>
|
||||||
|
<artifactId>ph-commons</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<reporting>
|
<reporting>
|
||||||
|
@ -11,6 +11,7 @@ import java.nio.charset.Charset;
|
|||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import com.helger.commons.io.stream.StringInputStream;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.commons.io.input.ReaderInputStream;
|
import org.apache.commons.io.input.ReaderInputStream;
|
||||||
import org.apache.http.*;
|
import org.apache.http.*;
|
||||||
@ -29,7 +30,6 @@ import org.mockito.invocation.InvocationOnMock;
|
|||||||
import org.mockito.stubbing.Answer;
|
import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import com.phloc.commons.io.streams.StringInputStream;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||||
@ -83,7 +83,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArgumentCaptor<HttpUriRequest> prepareClientForSearchResponse() throws IOException, ClientProtocolException {
|
private ArgumentCaptor<HttpUriRequest> prepareClientForSearchResponse() throws IOException {
|
||||||
final String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}";
|
final String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}";
|
||||||
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
@ -92,7 +92,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -111,7 +111,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -149,7 +149,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -187,7 +187,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -225,7 +225,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -264,7 +264,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -303,7 +303,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -330,7 +330,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPatchInvalid() throws Exception {
|
public void testPatchInvalid() {
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -354,7 +354,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -398,7 +398,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -441,7 +441,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -505,7 +505,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -537,14 +537,14 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
||||||
@Override
|
@Override
|
||||||
public Header[] answer(InvocationOnMock theInvocation) throws Throwable {
|
public Header[] answer(InvocationOnMock theInvocation) {
|
||||||
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
if (myAnswerCount++ == 0) {
|
if (myAnswerCount++ == 0) {
|
||||||
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
||||||
} else {
|
} else {
|
||||||
@ -586,14 +586,14 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
||||||
@Override
|
@Override
|
||||||
public Header[] answer(InvocationOnMock theInvocation) throws Throwable {
|
public Header[] answer(InvocationOnMock theInvocation) {
|
||||||
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
myAnswerCount++;
|
myAnswerCount++;
|
||||||
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp1)), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp1)), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
@ -625,7 +625,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -652,7 +652,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -697,7 +697,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -737,7 +737,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -773,7 +773,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
private int myCount = 0;
|
private int myCount = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
final String respString;
|
final String respString;
|
||||||
if (myCount == 1 || myCount == 2) {
|
if (myCount == 1 || myCount == 2) {
|
||||||
ourLog.info("Encoding patient");
|
ourLog.info("Encoding patient");
|
||||||
@ -822,7 +822,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
final String respString;
|
final String respString;
|
||||||
if (myAnswerCount >= 1) {
|
if (myAnswerCount >= 1) {
|
||||||
ourLog.info("Encoding patient");
|
ourLog.info("Encoding patient");
|
||||||
@ -872,7 +872,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
final String respString;
|
final String respString;
|
||||||
if (myAnswerCount >= 1) {
|
if (myAnswerCount >= 1) {
|
||||||
ourLog.info("Encoding patient");
|
ourLog.info("Encoding patient");
|
||||||
@ -912,7 +912,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public StringInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public StringInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new StringInputStream("HELLO", Charsets.UTF_8);
|
return new StringInputStream("HELLO", Charsets.UTF_8);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -937,7 +937,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public StringInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public StringInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new StringInputStream("not implemented", Charsets.UTF_8);
|
return new StringInputStream("not implemented", Charsets.UTF_8);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -968,7 +968,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
.forResource(Patient.class)
|
.forResource(Patient.class)
|
||||||
.where(Patient.FAMILY.matches().value((String) null))
|
.where(Patient.FAMILY.matches().value((String) null))
|
||||||
.and(Patient.BIRTHDATE.exactly().day((Date) null))
|
.and(Patient.BIRTHDATE.exactly().day((Date) null))
|
||||||
.and(Patient.GENDER.exactly().code((String) null))
|
.and(Patient.GENDER.exactly().code(null))
|
||||||
.and(Patient.ORGANIZATION.hasId((String) null))
|
.and(Patient.ORGANIZATION.hasId((String) null))
|
||||||
.returnBundle(Bundle.class)
|
.returnBundle(Bundle.class)
|
||||||
.execute();
|
.execute();
|
||||||
@ -1019,7 +1019,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(encoded), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(encoded), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1064,7 +1064,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(encoded), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(encoded), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1121,7 +1121,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(null);
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(null);
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1152,7 +1152,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
// when(myHttpResponse.getEntity().getContentType()).thenReturn(null);
|
// when(myHttpResponse.getEntity().getContentType()).thenReturn(null);
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1179,7 +1179,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1286,7 +1286,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1405,7 +1405,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1497,7 +1497,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1564,7 +1564,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1601,7 +1601,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testTransactionWithInvalidBody() throws Exception {
|
public void testTransactionWithInvalidBody() {
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
// Transaction
|
// Transaction
|
||||||
@ -1652,7 +1652,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1691,14 +1691,14 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
||||||
@Override
|
@Override
|
||||||
public Header[] answer(InvocationOnMock theInvocation) throws Throwable {
|
public Header[] answer(InvocationOnMock theInvocation) {
|
||||||
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
if (myAnswerCount++ == 0) {
|
if (myAnswerCount++ == 0) {
|
||||||
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
||||||
} else {
|
} else {
|
||||||
@ -1739,14 +1739,14 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
||||||
@Override
|
@Override
|
||||||
public Header[] answer(InvocationOnMock theInvocation) throws Throwable {
|
public Header[] answer(InvocationOnMock theInvocation) {
|
||||||
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
myAnswerCount++;
|
myAnswerCount++;
|
||||||
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp1)), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp1)), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
@ -1784,7 +1784,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1821,7 +1821,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1842,7 +1842,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1870,14 +1870,14 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
||||||
@Override
|
@Override
|
||||||
public Header[] answer(InvocationOnMock theInvocation) throws Throwable {
|
public Header[] answer(InvocationOnMock theInvocation) {
|
||||||
return new Header[] {};
|
return new Header[] {};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1910,7 +1910,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1948,7 +1948,7 @@ public class GenericClientDstu2_1Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -103,13 +103,13 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<scope>test</scope><!-- <exclusions> <exclusion> <artifactId>Saxon-HE</artifactId> <groupId>net.sf.saxon</groupId> </exclusion> </exclusions> -->
|
<scope>test</scope><!-- <exclusions> <exclusion> <artifactId>Saxon-HE</artifactId> <groupId>net.sf.saxon</groupId> </exclusion> </exclusions> -->
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
|||||||
import ca.uhn.fhir.util.PortUtil;
|
import ca.uhn.fhir.util.PortUtil;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
import ca.uhn.fhir.util.UrlUtil;
|
import ca.uhn.fhir.util.UrlUtil;
|
||||||
import com.phloc.commons.collections.iterate.ArrayEnumeration;
|
import com.helger.collection.iterate.ArrayEnumeration;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||||
@ -130,7 +130,7 @@ public class ResponseHighlightingInterceptorTest {
|
|||||||
when(req.getHeaders(Constants.HEADER_ACCEPT)).thenAnswer(new Answer<Enumeration<String>>() {
|
when(req.getHeaders(Constants.HEADER_ACCEPT)).thenAnswer(new Answer<Enumeration<String>>() {
|
||||||
@Override
|
@Override
|
||||||
public Enumeration<String> answer(InvocationOnMock theInvocation) throws Throwable {
|
public Enumeration<String> answer(InvocationOnMock theInvocation) throws Throwable {
|
||||||
return new ArrayEnumeration<String>("text/html,application/xhtml+xml,application/xml;q=0.9");
|
return new ArrayEnumeration<>("text/html,application/xhtml+xml,application/xml;q=0.9");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
when(req.getHeader(Constants.HEADER_ORIGIN)).thenAnswer(new Answer<String>() {
|
when(req.getHeader(Constants.HEADER_ORIGIN)).thenAnswer(new Answer<String>() {
|
||||||
|
@ -217,13 +217,13 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import java.nio.charset.Charset;
|
|||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import com.helger.commons.io.stream.StringInputStream;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.commons.io.input.ReaderInputStream;
|
import org.apache.commons.io.input.ReaderInputStream;
|
||||||
import org.apache.http.*;
|
import org.apache.http.*;
|
||||||
@ -29,7 +30,6 @@ import org.mockito.invocation.InvocationOnMock;
|
|||||||
import org.mockito.stubbing.Answer;
|
import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import com.phloc.commons.io.streams.StringInputStream;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||||
|
@ -122,8 +122,8 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
@ -133,8 +133,8 @@
|
|||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -125,13 +125,13 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
@ -192,11 +192,6 @@
|
|||||||
<artifactId>spring-web</artifactId>
|
<artifactId>spring-web</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-context</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<reporting>
|
<reporting>
|
||||||
|
@ -17,6 +17,7 @@ import java.nio.charset.Charset;
|
|||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import com.helger.commons.io.stream.StringInputStream;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.commons.io.input.ReaderInputStream;
|
import org.apache.commons.io.input.ReaderInputStream;
|
||||||
import org.apache.http.*;
|
import org.apache.http.*;
|
||||||
@ -36,7 +37,6 @@ import org.mockito.invocation.InvocationOnMock;
|
|||||||
import org.mockito.stubbing.Answer;
|
import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import com.phloc.commons.io.streams.StringInputStream;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||||
@ -93,7 +93,7 @@ public class GenericClientR4Test {
|
|||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArgumentCaptor<HttpUriRequest> prepareClientForSearchResponse() throws IOException, ClientProtocolException {
|
private ArgumentCaptor<HttpUriRequest> prepareClientForSearchResponse() throws IOException {
|
||||||
final String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}";
|
final String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}";
|
||||||
|
|
||||||
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
|
||||||
@ -102,7 +102,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -143,7 +143,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -187,7 +187,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -234,7 +234,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -278,7 +278,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -322,7 +322,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -366,7 +366,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -408,7 +408,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -472,7 +472,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -504,14 +504,14 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
||||||
@Override
|
@Override
|
||||||
public Header[] answer(InvocationOnMock theInvocation) throws Throwable {
|
public Header[] answer(InvocationOnMock theInvocation) {
|
||||||
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
if (myAnswerCount++ == 0) {
|
if (myAnswerCount++ == 0) {
|
||||||
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
||||||
} else {
|
} else {
|
||||||
@ -553,14 +553,14 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
||||||
@Override
|
@Override
|
||||||
public Header[] answer(InvocationOnMock theInvocation) throws Throwable {
|
public Header[] answer(InvocationOnMock theInvocation) {
|
||||||
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
myAnswerCount++;
|
myAnswerCount++;
|
||||||
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp1)), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp1)), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
@ -592,7 +592,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -619,7 +619,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -664,7 +664,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -704,7 +704,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -740,7 +740,7 @@ public class GenericClientR4Test {
|
|||||||
private int myCount = 0;
|
private int myCount = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
final String respString;
|
final String respString;
|
||||||
if (myCount == 1 || myCount == 2) {
|
if (myCount == 1 || myCount == 2) {
|
||||||
ourLog.info("Encoding patient");
|
ourLog.info("Encoding patient");
|
||||||
@ -788,7 +788,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
final String respString;
|
final String respString;
|
||||||
if (myAnswerCount >= 1) {
|
if (myAnswerCount >= 1) {
|
||||||
ourLog.info("Encoding patient");
|
ourLog.info("Encoding patient");
|
||||||
@ -828,7 +828,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public StringInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public StringInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new StringInputStream("HELLO", Charsets.UTF_8);
|
return new StringInputStream("HELLO", Charsets.UTF_8);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -853,7 +853,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public StringInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public StringInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new StringInputStream("not implemented", Charsets.UTF_8);
|
return new StringInputStream("not implemented", Charsets.UTF_8);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -884,7 +884,7 @@ public class GenericClientR4Test {
|
|||||||
.forResource(Patient.class)
|
.forResource(Patient.class)
|
||||||
.where(Patient.FAMILY.matches().value((String) null))
|
.where(Patient.FAMILY.matches().value((String) null))
|
||||||
.and(Patient.BIRTHDATE.exactly().day((Date) null))
|
.and(Patient.BIRTHDATE.exactly().day((Date) null))
|
||||||
.and(Patient.GENDER.exactly().code((String) null))
|
.and(Patient.GENDER.exactly().code(null))
|
||||||
.and(Patient.ORGANIZATION.hasId((String) null))
|
.and(Patient.ORGANIZATION.hasId((String) null))
|
||||||
.returnBundle(Bundle.class)
|
.returnBundle(Bundle.class)
|
||||||
.execute();
|
.execute();
|
||||||
@ -915,7 +915,7 @@ public class GenericClientR4Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPatchInvalid() throws Exception {
|
public void testPatchInvalid() {
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -941,7 +941,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -980,7 +980,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1019,7 +1019,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1057,7 +1057,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1095,7 +1095,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1133,7 +1133,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1180,7 +1180,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON_NEW + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON_NEW + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(encoded), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(encoded), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1225,7 +1225,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(encoded), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(encoded), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1282,7 +1282,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(null);
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(null);
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1313,7 +1313,7 @@ public class GenericClientR4Test {
|
|||||||
// when(myHttpResponse.getEntity().getContentType()).thenReturn(null);
|
// when(myHttpResponse.getEntity().getContentType()).thenReturn(null);
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1331,7 +1331,7 @@ public class GenericClientR4Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRevIncludeRecursive() throws ClientProtocolException, IOException {
|
public void testRevIncludeRecursive() throws IOException {
|
||||||
ArgumentCaptor<HttpUriRequest> capt = prepareClientForSearchResponse();
|
ArgumentCaptor<HttpUriRequest> capt = prepareClientForSearchResponse();
|
||||||
|
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
@ -1361,7 +1361,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1468,7 +1468,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1578,7 +1578,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1670,7 +1670,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1756,7 +1756,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
when(myHttpResponse.getEntity().getContent()).then(new Answer<InputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public InputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1793,7 +1793,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1830,7 +1830,7 @@ public class GenericClientR4Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testTransactionWithInvalidBody() throws Exception {
|
public void testTransactionWithInvalidBody() {
|
||||||
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
|
||||||
|
|
||||||
// Transaction
|
// Transaction
|
||||||
@ -1881,7 +1881,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1920,14 +1920,14 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
||||||
@Override
|
@Override
|
||||||
public Header[] answer(InvocationOnMock theInvocation) throws Throwable {
|
public Header[] answer(InvocationOnMock theInvocation) {
|
||||||
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
if (myAnswerCount++ == 0) {
|
if (myAnswerCount++ == 0) {
|
||||||
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
||||||
} else {
|
} else {
|
||||||
@ -1968,14 +1968,14 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
||||||
@Override
|
@Override
|
||||||
public Header[] answer(InvocationOnMock theInvocation) throws Throwable {
|
public Header[] answer(InvocationOnMock theInvocation) {
|
||||||
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
return new Header[] { new BasicHeader(Constants.HEADER_LOCATION, "http://foo.com/base/Patient/222/_history/3") };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
myAnswerCount++;
|
myAnswerCount++;
|
||||||
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp1)), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp1)), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
@ -2013,7 +2013,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -2050,7 +2050,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -2071,7 +2071,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -2099,14 +2099,14 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
|
||||||
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer<Header[]>() {
|
||||||
@Override
|
@Override
|
||||||
public Header[] answer(InvocationOnMock theInvocation) throws Throwable {
|
public Header[] answer(InvocationOnMock theInvocation) {
|
||||||
return new Header[] {};
|
return new Header[] {};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(p.encodeResourceToString(resp0)), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -2139,7 +2139,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -2177,7 +2177,7 @@ public class GenericClientR4Test {
|
|||||||
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
|
||||||
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
|
||||||
@Override
|
@Override
|
||||||
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
|
public ReaderInputStream answer(InvocationOnMock theInvocation) {
|
||||||
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -65,8 +65,8 @@
|
|||||||
Schematron resource validation. Otherwise, they may be omitted.
|
Schematron resource validation. Otherwise, they may be omitted.
|
||||||
-->
|
-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>Saxon-HE</artifactId>
|
<artifactId>Saxon-HE</artifactId>
|
||||||
@ -75,8 +75,8 @@
|
|||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
<version>4.3.3</version>
|
<version>4.3.3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -173,13 +173,13 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -89,9 +89,14 @@
|
|||||||
<bundle dependency='true'>
|
<bundle dependency='true'>
|
||||||
mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xmlresolver/${servicemix_xmlresolver_version}
|
mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xmlresolver/${servicemix_xmlresolver_version}
|
||||||
</bundle>
|
</bundle>
|
||||||
|
<bundle dependency="true">mvn:org.apache.aries.spifly/org.apache.aries.spifly.dynamic.bundle/${aries_spifly_version}</bundle>
|
||||||
<bundle dependency='true'>mvn:com.google.code.findbugs/jsr305/${jsr305_version}</bundle>
|
<bundle dependency='true'>mvn:com.google.code.findbugs/jsr305/${jsr305_version}</bundle>
|
||||||
<bundle>mvn:com.phloc/phloc-schematron/${phloc_schematron_version}</bundle>
|
<bundle dependency='true'>mvn:com.helger/ph-commons/${ph_commons_version}</bundle>
|
||||||
<bundle>mvn:com.phloc/phloc-commons/${phloc_commons_version}</bundle>
|
<bundle dependency='true'>mvn:com.helger/ph-collection/${ph_commons_version}</bundle>
|
||||||
|
<bundle dependency='true'>mvn:com.helger/ph-xml/${ph_commons_version}</bundle>
|
||||||
|
<bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jaxb-impl/${jaxb_bundle_version}</bundle>
|
||||||
|
<bundle dependency='true'>mvn:com.helger/ph-jaxb/${ph_commons_version}</bundle>
|
||||||
|
<bundle dependency='true'>mvn:com.helger/ph-schematron/${ph_schematron_version}</bundle>
|
||||||
</feature>
|
</feature>
|
||||||
|
|
||||||
<feature name='hapi-fhir-validation' version='${project.version}' start-level='50'>
|
<feature name='hapi-fhir-validation' version='${project.version}' start-level='50'>
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
-->
|
-->
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
@ -98,6 +98,7 @@
|
|||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<!-- karaf test -->
|
<!-- karaf test -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.ops4j.pax.exam</groupId>
|
<groupId>org.ops4j.pax.exam</groupId>
|
||||||
@ -122,6 +123,12 @@
|
|||||||
<version>${apache_karaf_version}</version>
|
<version>${apache_karaf_version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
<type>tar.gz</type>
|
<type>tar.gz</type>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.ops4j.pax.logging</groupId>
|
||||||
|
<artifactId>pax-logging-api</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.karaf.shell</groupId>
|
<groupId>org.apache.karaf.shell</groupId>
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package ca.uhn.fhir.tests.integration.karaf;
|
||||||
|
|
||||||
|
public class ValidationConstants {
|
||||||
|
|
||||||
|
public static final boolean SCHEMATRON_ENABLED = true;
|
||||||
|
|
||||||
|
}
|
@ -26,6 +26,7 @@ import ca.uhn.fhir.model.primitive.StringDt;
|
|||||||
import ca.uhn.fhir.parser.DataFormatException;
|
import ca.uhn.fhir.parser.DataFormatException;
|
||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.parser.StrictErrorHandler;
|
import ca.uhn.fhir.parser.StrictErrorHandler;
|
||||||
|
import ca.uhn.fhir.tests.integration.karaf.ValidationConstants;
|
||||||
import ca.uhn.fhir.validation.FhirValidator;
|
import ca.uhn.fhir.validation.FhirValidator;
|
||||||
import ca.uhn.fhir.validation.SchemaBaseValidator;
|
import ca.uhn.fhir.validation.SchemaBaseValidator;
|
||||||
import ca.uhn.fhir.validation.ValidationFailureException;
|
import ca.uhn.fhir.validation.ValidationFailureException;
|
||||||
@ -85,7 +86,7 @@ public class Dstu2ResourceValidatorDstu2Test {
|
|||||||
private FhirValidator createFhirValidator() {
|
private FhirValidator createFhirValidator() {
|
||||||
FhirValidator val = ourCtx.newValidator();
|
FhirValidator val = ourCtx.newValidator();
|
||||||
val.setValidateAgainstStandardSchema(true);
|
val.setValidateAgainstStandardSchema(true);
|
||||||
val.setValidateAgainstStandardSchematron(true);
|
val.setValidateAgainstStandardSchematron(ValidationConstants.SCHEMATRON_ENABLED);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,7 +157,9 @@ public class Dstu2ResourceValidatorDstu2Test {
|
|||||||
|
|
||||||
FhirValidator val = ourCtx.newValidator();
|
FhirValidator val = ourCtx.newValidator();
|
||||||
val.setValidateAgainstStandardSchema(true);
|
val.setValidateAgainstStandardSchema(true);
|
||||||
val.setValidateAgainstStandardSchematron(false);
|
if (ValidationConstants.SCHEMATRON_ENABLED) {
|
||||||
|
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
||||||
|
}
|
||||||
|
|
||||||
val.validate(p);
|
val.validate(p);
|
||||||
|
|
||||||
@ -246,7 +249,9 @@ public class Dstu2ResourceValidatorDstu2Test {
|
|||||||
|
|
||||||
FhirValidator val = ourCtx.newValidator();
|
FhirValidator val = ourCtx.newValidator();
|
||||||
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
||||||
|
if (ValidationConstants.SCHEMATRON_ENABLED) {
|
||||||
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
||||||
|
}
|
||||||
|
|
||||||
ValidationResult result = val.validateWithResult(messageString);
|
ValidationResult result = val.validateWithResult(messageString);
|
||||||
|
|
||||||
@ -299,7 +304,9 @@ public class Dstu2ResourceValidatorDstu2Test {
|
|||||||
|
|
||||||
FhirValidator val = ourCtx.newValidator();
|
FhirValidator val = ourCtx.newValidator();
|
||||||
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
||||||
|
if (ValidationConstants.SCHEMATRON_ENABLED) {
|
||||||
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
||||||
|
}
|
||||||
|
|
||||||
ValidationResult result = val.validateWithResult(messageString);
|
ValidationResult result = val.validateWithResult(messageString);
|
||||||
|
|
||||||
|
@ -6,19 +6,12 @@ import ca.uhn.fhir.model.api.annotation.ResourceDef;
|
|||||||
import ca.uhn.fhir.parser.DataFormatException;
|
import ca.uhn.fhir.parser.DataFormatException;
|
||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import ca.uhn.fhir.parser.StrictErrorHandler;
|
import ca.uhn.fhir.parser.StrictErrorHandler;
|
||||||
|
import ca.uhn.fhir.tests.integration.karaf.ValidationConstants;
|
||||||
import ca.uhn.fhir.validation.*;
|
import ca.uhn.fhir.validation.*;
|
||||||
import ca.uhn.fhir.validation.schematron.SchematronBaseValidator;
|
import ca.uhn.fhir.validation.schematron.SchematronBaseValidator;
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.apache.commons.lang3.Validate;
|
|
||||||
import org.hamcrest.core.StringContains;
|
import org.hamcrest.core.StringContains;
|
||||||
import org.hl7.fhir.dstu3.conformance.ProfileUtilities;
|
|
||||||
import org.hl7.fhir.dstu3.context.IWorkerContext;
|
|
||||||
import org.hl7.fhir.dstu3.hapi.ctx.HapiWorkerContext;
|
|
||||||
import org.hl7.fhir.dstu3.hapi.validation.DefaultProfileValidationSupport;
|
|
||||||
import org.hl7.fhir.dstu3.hapi.validation.FhirInstanceValidator;
|
import org.hl7.fhir.dstu3.hapi.validation.FhirInstanceValidator;
|
||||||
import org.hl7.fhir.dstu3.model.*;
|
import org.hl7.fhir.dstu3.model.*;
|
||||||
import org.hl7.fhir.exceptions.FHIRException;
|
|
||||||
import org.hl7.fhir.utilities.validation.ValidationMessage;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.ops4j.pax.exam.Configuration;
|
import org.ops4j.pax.exam.Configuration;
|
||||||
@ -33,14 +26,10 @@ import java.util.Arrays;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static ca.uhn.fhir.tests.integration.karaf.PaxExamOptions.HAPI_FHIR_VALIDATION_DSTU3;
|
import static ca.uhn.fhir.tests.integration.karaf.PaxExamOptions.*;
|
||||||
import static ca.uhn.fhir.tests.integration.karaf.PaxExamOptions.KARAF;
|
|
||||||
import static ca.uhn.fhir.tests.integration.karaf.PaxExamOptions.WRAP;
|
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.*;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
|
import static org.ops4j.pax.exam.CoreOptions.*;
|
||||||
import static org.ops4j.pax.exam.CoreOptions.options;
|
|
||||||
import static org.ops4j.pax.exam.CoreOptions.when;
|
|
||||||
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.debugConfiguration;
|
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.debugConfiguration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -145,7 +134,9 @@ public class ResourceValidatorDstu3FeatureTest {
|
|||||||
|
|
||||||
FhirValidator val = ourCtx.newValidator();
|
FhirValidator val = ourCtx.newValidator();
|
||||||
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
||||||
|
if (ValidationConstants.SCHEMATRON_ENABLED) {
|
||||||
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
||||||
|
}
|
||||||
val.registerValidatorModule(new FhirInstanceValidator());
|
val.registerValidatorModule(new FhirInstanceValidator());
|
||||||
|
|
||||||
ValidationResult output = val.validateWithResult(p);
|
ValidationResult output = val.validateWithResult(p);
|
||||||
@ -162,7 +153,9 @@ public class ResourceValidatorDstu3FeatureTest {
|
|||||||
|
|
||||||
FhirValidator val = ourCtx.newValidator();
|
FhirValidator val = ourCtx.newValidator();
|
||||||
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
||||||
|
if (ValidationConstants.SCHEMATRON_ENABLED) {
|
||||||
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
||||||
|
}
|
||||||
val.registerValidatorModule(new FhirInstanceValidator());
|
val.registerValidatorModule(new FhirInstanceValidator());
|
||||||
|
|
||||||
ValidationResult output = val.validateWithResult(p);
|
ValidationResult output = val.validateWithResult(p);
|
||||||
@ -232,7 +225,9 @@ public class ResourceValidatorDstu3FeatureTest {
|
|||||||
|
|
||||||
FhirValidator val = ourCtx.newValidator();
|
FhirValidator val = ourCtx.newValidator();
|
||||||
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
||||||
|
if (ValidationConstants.SCHEMATRON_ENABLED) {
|
||||||
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
||||||
|
}
|
||||||
val.registerValidatorModule(new FhirInstanceValidator());
|
val.registerValidatorModule(new FhirInstanceValidator());
|
||||||
|
|
||||||
ValidationResult result = val.validateWithResult(q);
|
ValidationResult result = val.validateWithResult(q);
|
||||||
@ -273,7 +268,9 @@ public class ResourceValidatorDstu3FeatureTest {
|
|||||||
|
|
||||||
FhirValidator val = ourCtx.newValidator();
|
FhirValidator val = ourCtx.newValidator();
|
||||||
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
||||||
|
if (ValidationConstants.SCHEMATRON_ENABLED) {
|
||||||
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
||||||
|
}
|
||||||
val.registerValidatorModule(new FhirInstanceValidator());
|
val.registerValidatorModule(new FhirInstanceValidator());
|
||||||
|
|
||||||
ValidationResult result = val.validateWithResult(encoded);
|
ValidationResult result = val.validateWithResult(encoded);
|
||||||
@ -321,7 +318,9 @@ public class ResourceValidatorDstu3FeatureTest {
|
|||||||
|
|
||||||
FhirValidator val = ourCtx.newValidator();
|
FhirValidator val = ourCtx.newValidator();
|
||||||
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
||||||
|
if (ValidationConstants.SCHEMATRON_ENABLED) {
|
||||||
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
||||||
|
}
|
||||||
val.registerValidatorModule(new FhirInstanceValidator());
|
val.registerValidatorModule(new FhirInstanceValidator());
|
||||||
|
|
||||||
ValidationResult result = val.validateWithResult(messageString);
|
ValidationResult result = val.validateWithResult(messageString);
|
||||||
@ -374,7 +373,9 @@ public class ResourceValidatorDstu3FeatureTest {
|
|||||||
|
|
||||||
FhirValidator val = ourCtx.newValidator();
|
FhirValidator val = ourCtx.newValidator();
|
||||||
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchemaBaseValidator(ourCtx));
|
||||||
|
if (ValidationConstants.SCHEMATRON_ENABLED) {
|
||||||
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
val.registerValidatorModule(new SchematronBaseValidator(ourCtx));
|
||||||
|
}
|
||||||
val.registerValidatorModule(new FhirInstanceValidator());
|
val.registerValidatorModule(new FhirInstanceValidator());
|
||||||
|
|
||||||
ValidationResult result = val.validateWithResult(messageString);
|
ValidationResult result = val.validateWithResult(messageString);
|
||||||
|
72
pom.xml
72
pom.xml
@ -51,7 +51,20 @@
|
|||||||
<repository>
|
<repository>
|
||||||
<id>jitpack.io</id>
|
<id>jitpack.io</id>
|
||||||
<url>https://jitpack.io</url>
|
<url>https://jitpack.io</url>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
</snapshots>
|
||||||
</repository>
|
</repository>
|
||||||
|
<!--
|
||||||
|
Snapshots should generally not be needed
|
||||||
|
<repository>
|
||||||
|
<id>oss-snapshot</id>
|
||||||
|
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
</snapshots>
|
||||||
|
</repository>
|
||||||
|
-->
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
<description>
|
<description>
|
||||||
@ -444,16 +457,17 @@
|
|||||||
|
|
||||||
<!-- Dependency Versions -->
|
<!-- Dependency Versions -->
|
||||||
<apache_karaf_version>4.1.4</apache_karaf_version>
|
<apache_karaf_version>4.1.4</apache_karaf_version>
|
||||||
|
<aries_spifly_version>1.0.10</aries_spifly_version>
|
||||||
<caffeine_version>2.6.2</caffeine_version>
|
<caffeine_version>2.6.2</caffeine_version>
|
||||||
<commons_codec_version>1.10</commons_codec_version>
|
<commons_codec_version>1.10</commons_codec_version>
|
||||||
<commons_io_version>2.5</commons_io_version>
|
<commons_io_version>2.5</commons_io_version>
|
||||||
<commons_lang3_version>3.6</commons_lang3_version>
|
<commons_lang3_version>3.6</commons_lang3_version>
|
||||||
<derby_version>10.14.1.0</derby_version>
|
<derby_version>10.14.2.0</derby_version>
|
||||||
<error_prone_annotations_version>2.0.18</error_prone_annotations_version>
|
<error_prone_annotations_version>2.0.18</error_prone_annotations_version>
|
||||||
<guava_version>23.0</guava_version>
|
<guava_version>23.0</guava_version>
|
||||||
<gson_version>2.8.1</gson_version>
|
<gson_version>2.8.1</gson_version>
|
||||||
<jaxb_api_version>2.3.0</jaxb_api_version>
|
<jaxb_api_version>2.3.0</jaxb_api_version>
|
||||||
<jaxb_core_version>2.3.0</jaxb_core_version>
|
<jaxb_runtime_version>2.3.0</jaxb_runtime_version>
|
||||||
<jersey_version>2.25.1</jersey_version>
|
<jersey_version>2.25.1</jersey_version>
|
||||||
<jetty_version>9.4.8.v20171121</jetty_version>
|
<jetty_version>9.4.8.v20171121</jetty_version>
|
||||||
<jsr305_version>3.0.2</jsr305_version>
|
<jsr305_version>3.0.2</jsr305_version>
|
||||||
@ -464,11 +478,12 @@
|
|||||||
<hibernate_search_version>5.7.1.Final</hibernate_search_version>
|
<hibernate_search_version>5.7.1.Final</hibernate_search_version>
|
||||||
<httpcore_version>4.4.6</httpcore_version>
|
<httpcore_version>4.4.6</httpcore_version>
|
||||||
<httpclient_version>4.5.3</httpclient_version>
|
<httpclient_version>4.5.3</httpclient_version>
|
||||||
|
<jaxb_bundle_version>2.2.11_1</jaxb_bundle_version>
|
||||||
<lucene_version>5.5.4</lucene_version>
|
<lucene_version>5.5.4</lucene_version>
|
||||||
<maven_assembly_plugin_version>2.5.3</maven_assembly_plugin_version>
|
<maven_assembly_plugin_version>2.5.3</maven_assembly_plugin_version>
|
||||||
<maven_license_plugin_version>1.8</maven_license_plugin_version>
|
<maven_license_plugin_version>1.8</maven_license_plugin_version>
|
||||||
<phloc_schematron_version>2.7.1</phloc_schematron_version>
|
<ph_schematron_version>5.0.4</ph_schematron_version>
|
||||||
<phloc_commons_version>4.4.11</phloc_commons_version>
|
<ph_commons_version>9.1.1</ph_commons_version>
|
||||||
<servicemix_saxon_version>9.5.1-5_1</servicemix_saxon_version>
|
<servicemix_saxon_version>9.5.1-5_1</servicemix_saxon_version>
|
||||||
<servicemix_xmlresolver_version>1.2_5</servicemix_xmlresolver_version>
|
<servicemix_xmlresolver_version>1.2_5</servicemix_xmlresolver_version>
|
||||||
<spring_version>5.0.3.RELEASE</spring_version>
|
<spring_version>5.0.3.RELEASE</spring_version>
|
||||||
@ -572,14 +587,14 @@
|
|||||||
<version>23.0</version>
|
<version>23.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<version>${phloc_schematron_version}</version>
|
<version>${ph_schematron_version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
<version>${phloc_commons_version}</version>
|
<version>${ph_commons_version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
@ -601,6 +616,11 @@
|
|||||||
<artifactId>commons-codec</artifactId>
|
<artifactId>commons-codec</artifactId>
|
||||||
<version>${commons_codec_version}</version>
|
<version>${commons_codec_version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-collections4</artifactId>
|
||||||
|
<version>4.1</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-compress</artifactId>
|
<artifactId>commons-compress</artifactId>
|
||||||
@ -658,16 +678,6 @@
|
|||||||
<artifactId>gson</artifactId>
|
<artifactId>gson</artifactId>
|
||||||
<version>${gson_version}</version>
|
<version>${gson_version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.xml.bind</groupId>
|
|
||||||
<artifactId>jaxb-core</artifactId>
|
|
||||||
<version>${jaxb_core_version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.sun.xml.bind</groupId>
|
|
||||||
<artifactId>jaxb-impl</artifactId>
|
|
||||||
<version>${jaxb_core_version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.mail</groupId>
|
<groupId>javax.mail</groupId>
|
||||||
<artifactId>javax.mail-api</artifactId>
|
<artifactId>javax.mail-api</artifactId>
|
||||||
@ -952,6 +962,11 @@
|
|||||||
<artifactId>javax.json</artifactId>
|
<artifactId>javax.json</artifactId>
|
||||||
<version>1.0.4</version>
|
<version>1.0.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.glassfish.jaxb</groupId>
|
||||||
|
<artifactId>jaxb-runtime</artifactId>
|
||||||
|
<version>${jaxb_runtime_version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.core</groupId>
|
<groupId>org.glassfish.jersey.core</groupId>
|
||||||
<artifactId>jersey-server</artifactId>
|
<artifactId>jersey-server</artifactId>
|
||||||
@ -1182,6 +1197,11 @@
|
|||||||
<artifactId>maven-antrun-plugin</artifactId>
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
<version>1.8</version>
|
<version>1.8</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-clean-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
@ -1251,7 +1271,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-failsafe-plugin</artifactId>
|
<artifactId>maven-failsafe-plugin</artifactId>
|
||||||
<version>2.19.1</version>
|
<version>2.20</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
@ -1278,7 +1298,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>2.20.1</version>
|
<version>2.21.0</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<redirectTestOutputToFile>true</redirectTestOutputToFile>
|
<redirectTestOutputToFile>true</redirectTestOutputToFile>
|
||||||
<runOrder>random</runOrder>
|
<runOrder>random</runOrder>
|
||||||
@ -1509,14 +1529,20 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-enforcer-plugin</artifactId>
|
<artifactId>maven-enforcer-plugin</artifactId>
|
||||||
|
<version>1.4.1</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>enforce-java</id>
|
<id>enforce-java</id>
|
||||||
<goals>
|
<goals>
|
||||||
<goal>enforce</goal>
|
<goal>enforce</goal>
|
||||||
</goals>
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
<configuration>
|
<configuration>
|
||||||
<rules>
|
<rules>
|
||||||
|
<requireMavenVersion>
|
||||||
|
<version>3.5</version>
|
||||||
|
</requireMavenVersion>
|
||||||
<requireJavaVersion>
|
<requireJavaVersion>
|
||||||
<version>[1.8,)</version>
|
<version>[1.8,)</version>
|
||||||
<message>
|
<message>
|
||||||
@ -1525,8 +1551,6 @@
|
|||||||
</requireJavaVersion>
|
</requireJavaVersion>
|
||||||
</rules>
|
</rules>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
@ -162,6 +162,11 @@
|
|||||||
an unspecified error was thrown by the JPA server. An HTTP 409
|
an unspecified error was thrown by the JPA server. An HTTP 409
|
||||||
(Conflict) with an informative error message is now thrown.
|
(Conflict) with an informative error message is now thrown.
|
||||||
</action>
|
</action>
|
||||||
|
<action type="fix">
|
||||||
|
A bug in the JPA server's DSTU2 transaction processing routine caused it
|
||||||
|
to occasionally consume two database connections, which could lead to deadlocks
|
||||||
|
under heavy load. This has been fixed.
|
||||||
|
</action>
|
||||||
</release>
|
</release>
|
||||||
<release version="3.3.0" date="2018-03-29">
|
<release version="3.3.0" date="2018-03-29">
|
||||||
<action type="add">
|
<action type="add">
|
||||||
|
@ -33,6 +33,17 @@
|
|||||||
<img src="./images/hapi-fhir-cli.png" alt="Basic screen shot" style="margin-left: 40px;"/>
|
<img src="./images/hapi-fhir-cli.png" alt="Basic screen shot" style="margin-left: 40px;"/>
|
||||||
</subsection>
|
</subsection>
|
||||||
|
|
||||||
|
<subsection name="Download and Installation - Mac/OSX">
|
||||||
|
|
||||||
|
<p>
|
||||||
|
hapi-fhir-cli is available as a <a href="https://brew.sh/">Homebrew</a> package
|
||||||
|
for Mac. It can be installed using the following command:
|
||||||
|
</p>
|
||||||
|
<code>brew install hapi-fhir-cli</code>
|
||||||
|
|
||||||
|
|
||||||
|
</subsection>
|
||||||
|
|
||||||
<subsection name="Troubleshooting">
|
<subsection name="Troubleshooting">
|
||||||
<p>
|
<p>
|
||||||
<b>Note on Java version support:</b> The HAPI library is designed to
|
<b>Note on Java version support:</b> The HAPI library is designed to
|
||||||
|
@ -142,7 +142,7 @@
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
In order to use HAPI's Schematron support, a libaray called
|
In order to use HAPI's Schematron support, a libaray called
|
||||||
<a href="https://code.google.com/p/phloc-schematron/">Phloc-Schematron</a>
|
<a href="https://github.com/phax/ph-schematron">Ph-Schematron</a>
|
||||||
is used, so this library must be added to your classpath (or Maven POM file, Gradle
|
is used, so this library must be added to your classpath (or Maven POM file, Gradle
|
||||||
file, etc.)
|
file, etc.)
|
||||||
Note that this library is specified as an optional dependency
|
Note that this library is specified as an optional dependency
|
||||||
|
@ -541,13 +541,14 @@ System.setProperty("javax.xml.stream.XMLEventFactory", "com.ctc.wstx.stax.WstxEv
|
|||||||
|
|
||||||
</subsection>
|
</subsection>
|
||||||
|
|
||||||
<subsection name="Phloc-Schematron">
|
<subsection name="Ph-Schematron">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If you are using the
|
If you are using the
|
||||||
<a href="./doc_validation.html">Schematron Validatioon</a>
|
<a href="./doc_validation.html">Schematron Validatioon</a>
|
||||||
module, you will also need to include the Phloc library on your
|
module, you will also need to include the Ph-Schematron library on your
|
||||||
classpath.
|
classpath. (Note that prior to HAPI FHIR 3.4.0 we used Phloc-Schamtron
|
||||||
|
instead, but that lirary has been discontinued)
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
If you are using Maven, this library is not added by default (it is
|
If you are using Maven, this library is not added by default (it is
|
||||||
@ -556,16 +557,15 @@ System.setProperty("javax.xml.stream.XMLEventFactory", "com.ctc.wstx.stax.WstxEv
|
|||||||
dependencies to your project POM.xml
|
dependencies to your project POM.xml
|
||||||
</p>
|
</p>
|
||||||
<source><![CDATA[<dependency>
|
<source><![CDATA[<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>ph-schematron</artifactId>
|
||||||
<version>${phloc_schematron_version}</version>
|
<version>${ph_schematron_version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.helger</groupId>
|
||||||
<artifactId>phloc-commons</artifactId>
|
<artifactId>ph-commons</artifactId>
|
||||||
<version>${phloc_commons_version}</version>
|
<version>${ph_commons_version}</version>
|
||||||
</dependency>]]></source>
|
</dependency>]]></source>
|
||||||
|
|
||||||
</subsection>
|
</subsection>
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ public class ValidatorTest {
|
|||||||
assertEquals("This parser is for FHIR version DSTU2 - Can not encode a structure for version DSTU3", e.getMessage());
|
assertEquals("This parser is for FHIR version DSTU2 - Can not encode a structure for version DSTU3", e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Phloc is not onthe classpath
|
// Ph-Schematron is not onthe classpath
|
||||||
assertTrue(val.isValidateAgainstStandardSchema());
|
assertTrue(val.isValidateAgainstStandardSchema());
|
||||||
assertFalse(val.isValidateAgainstStandardSchematron());
|
assertFalse(val.isValidateAgainstStandardSchematron());
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ public class ValidatorTest {
|
|||||||
val.setValidateAgainstStandardSchematron(true);
|
val.setValidateAgainstStandardSchematron(true);
|
||||||
fail();
|
fail();
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
assertEquals("Phloc-schematron library not found on classpath, can not enable perform schematron validation", e.getMessage());
|
assertEquals("Ph-schematron library not found on classpath, can not enable perform schematron validation", e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user