Subscription refactoring
This commit is contained in:
parent
5f89f6ed16
commit
be07ebc4ef
|
@ -131,6 +131,12 @@
|
||||||
<artifactId>javassist</artifactId>
|
<artifactId>javassist</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Jackson -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-annotations</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.phloc</groupId>
|
<groupId>com.phloc</groupId>
|
||||||
<artifactId>phloc-schematron</artifactId>
|
<artifactId>phloc-schematron</artifactId>
|
||||||
|
|
|
@ -55,7 +55,7 @@ public class DaoConfig {
|
||||||
* @see #setMaximumSearchResultCountInTransaction(Integer)
|
* @see #setMaximumSearchResultCountInTransaction(Integer)
|
||||||
*/
|
*/
|
||||||
private static final Integer DEFAULT_MAXIMUM_SEARCH_RESULT_COUNT_IN_TRANSACTION = null;
|
private static final Integer DEFAULT_MAXIMUM_SEARCH_RESULT_COUNT_IN_TRANSACTION = null;
|
||||||
private IndexEnabledEnum myIndexMissingFieldsEnabled = IndexEnabledEnum.ENABLED;
|
private IndexEnabledEnum myIndexMissingFieldsEnabled = IndexEnabledEnum.DISABLED;
|
||||||
/**
|
/**
|
||||||
* update setter javadoc if default changes
|
* update setter javadoc if default changes
|
||||||
*/
|
*/
|
||||||
|
@ -107,6 +107,7 @@ public class DaoConfig {
|
||||||
private Set<String> myTreatBaseUrlsAsLocal = new HashSet<String>();
|
private Set<String> myTreatBaseUrlsAsLocal = new HashSet<String>();
|
||||||
private Set<String> myTreatReferencesAsLogical = new HashSet<String>(DEFAULT_LOGICAL_BASE_URLS);
|
private Set<String> myTreatReferencesAsLogical = new HashSet<String>(DEFAULT_LOGICAL_BASE_URLS);
|
||||||
private boolean myAutoCreatePlaceholderReferenceTargets;
|
private boolean myAutoCreatePlaceholderReferenceTargets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
|
@ -284,7 +285,7 @@ public class DaoConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If set to {@link IndexEnabledEnum#DISABLED} (default is {@link IndexEnabledEnum#ENABLED})
|
* If set to {@link IndexEnabledEnum#DISABLED} (default is {@link IndexEnabledEnum#DISABLED})
|
||||||
* the server will not create search indexes for search parameters with no values in resources.
|
* the server will not create search indexes for search parameters with no values in resources.
|
||||||
* <p>
|
* <p>
|
||||||
* Disabling this feature means that the <code>:missing</code> search modifier will not be
|
* Disabling this feature means that the <code>:missing</code> search modifier will not be
|
||||||
|
@ -292,13 +293,17 @@ public class DaoConfig {
|
||||||
* database) may be much faster on servers which have lots of search parameters and need
|
* database) may be much faster on servers which have lots of search parameters and need
|
||||||
* to write quickly.
|
* to write quickly.
|
||||||
* </p>
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* This feature may be enabled on servers where supporting the use of the :missing parameter is
|
||||||
|
* of higher importance than raw write performance
|
||||||
|
* </p>
|
||||||
*/
|
*/
|
||||||
public IndexEnabledEnum getIndexMissingFields() {
|
public IndexEnabledEnum getIndexMissingFields() {
|
||||||
return myIndexMissingFieldsEnabled;
|
return myIndexMissingFieldsEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If set to {@link IndexEnabledEnum#DISABLED} (default is {@link IndexEnabledEnum#ENABLED})
|
* If set to {@link IndexEnabledEnum#DISABLED} (default is {@link IndexEnabledEnum#DISABLED})
|
||||||
* the server will not create search indexes for search parameters with no values in resources.
|
* the server will not create search indexes for search parameters with no values in resources.
|
||||||
* <p>
|
* <p>
|
||||||
* Disabling this feature means that the <code>:missing</code> search modifier will not be
|
* Disabling this feature means that the <code>:missing</code> search modifier will not be
|
||||||
|
@ -306,6 +311,10 @@ public class DaoConfig {
|
||||||
* database) may be much faster on servers which have lots of search parameters and need
|
* database) may be much faster on servers which have lots of search parameters and need
|
||||||
* to write quickly.
|
* to write quickly.
|
||||||
* </p>
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* This feature may be enabled on servers where supporting the use of the :missing parameter is
|
||||||
|
* of higher importance than raw write performance
|
||||||
|
* </p>
|
||||||
*/
|
*/
|
||||||
public void setIndexMissingFields(IndexEnabledEnum theIndexMissingFields) {
|
public void setIndexMissingFields(IndexEnabledEnum theIndexMissingFields) {
|
||||||
Validate.notNull(theIndexMissingFields, "theIndexMissingFields must not be null");
|
Validate.notNull(theIndexMissingFields, "theIndexMissingFields must not be null");
|
||||||
|
|
|
@ -21,8 +21,10 @@ package ca.uhn.fhir.jpa.subscription;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import com.google.gson.annotations.Expose;
|
import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
||||||
import com.google.gson.annotations.SerializedName;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import org.apache.commons.lang3.builder.EqualsBuilder;
|
import org.apache.commons.lang3.builder.EqualsBuilder;
|
||||||
import org.apache.commons.lang3.builder.HashCodeBuilder;
|
import org.apache.commons.lang3.builder.HashCodeBuilder;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
@ -37,30 +39,33 @@ import java.util.List;
|
||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
|
||||||
public class CanonicalSubscription implements Serializable {
|
public class CanonicalSubscription implements Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@SerializedName("id")
|
@JsonProperty("id")
|
||||||
private String myIdElement;
|
private String myIdElement;
|
||||||
@SerializedName("criteria")
|
@JsonProperty("criteria")
|
||||||
private String myCriteriaString;
|
private String myCriteriaString;
|
||||||
@SerializedName("endpointUrl")
|
@JsonProperty("endpointUrl")
|
||||||
private String myEndpointUrl;
|
private String myEndpointUrl;
|
||||||
@SerializedName("payload")
|
@JsonProperty("payload")
|
||||||
private String myPayloadString;
|
private String myPayloadString;
|
||||||
@SerializedName("headers")
|
@JsonProperty("headers")
|
||||||
private List<String> myHeaders;
|
private List<String> myHeaders;
|
||||||
@SerializedName("channelType")
|
@JsonProperty("channelType")
|
||||||
private Subscription.SubscriptionChannelType myChannelType;
|
private Subscription.SubscriptionChannelType myChannelType;
|
||||||
@SerializedName("status")
|
@JsonProperty("status")
|
||||||
private Subscription.SubscriptionStatus myStatus;
|
private Subscription.SubscriptionStatus myStatus;
|
||||||
|
@JsonIgnore
|
||||||
private transient IBaseResource myBackingSubscription;
|
private transient IBaseResource myBackingSubscription;
|
||||||
@SerializedName("backingSubscription")
|
@JsonProperty("backingSubscription")
|
||||||
private String myBackingSubscriptionString;
|
private String myBackingSubscriptionString;
|
||||||
@SerializedName("triggerDefinition")
|
@JsonProperty("triggerDefinition")
|
||||||
private CanonicalEventDefinition myTrigger;
|
private CanonicalEventDefinition myTrigger;
|
||||||
@SerializedName("emailDetails")
|
@JsonProperty("emailDetails")
|
||||||
private EmailDetails myEmailDetails;
|
private EmailDetails myEmailDetails;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -91,18 +96,6 @@ public class CanonicalSubscription implements Serializable {
|
||||||
return myBackingSubscription;
|
return myBackingSubscription;
|
||||||
}
|
}
|
||||||
|
|
||||||
String getIdElementString() {
|
|
||||||
return myIdElement;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBackingSubscription(FhirContext theCtx, IBaseResource theBackingSubscription) {
|
|
||||||
myBackingSubscription = theBackingSubscription;
|
|
||||||
myBackingSubscriptionString = null;
|
|
||||||
if (myBackingSubscription != null) {
|
|
||||||
myBackingSubscriptionString = theCtx.newJsonParser().encodeResourceToString(myBackingSubscription);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Subscription.SubscriptionChannelType getChannelType() {
|
public Subscription.SubscriptionChannelType getChannelType() {
|
||||||
return myChannelType;
|
return myChannelType;
|
||||||
}
|
}
|
||||||
|
@ -138,12 +131,10 @@ public class CanonicalSubscription implements Serializable {
|
||||||
return myHeaders;
|
return myHeaders;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setHeaders(List<? extends IPrimitiveType<String>> theHeader) {
|
public void setHeaders(String theHeaders) {
|
||||||
myHeaders = new ArrayList<>();
|
myHeaders = new ArrayList<>();
|
||||||
for (IPrimitiveType<String> next : theHeader) {
|
if (isNotBlank(theHeaders)) {
|
||||||
if (isNotBlank(next.getValueAsString())) {
|
myHeaders.add(theHeaders);
|
||||||
myHeaders.add(next.getValueAsString());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,6 +146,10 @@ public class CanonicalSubscription implements Serializable {
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String getIdElementString() {
|
||||||
|
return myIdElement;
|
||||||
|
}
|
||||||
|
|
||||||
public String getPayloadString() {
|
public String getPayloadString() {
|
||||||
return myPayloadString;
|
return myPayloadString;
|
||||||
}
|
}
|
||||||
|
@ -186,10 +181,20 @@ public class CanonicalSubscription implements Serializable {
|
||||||
.toHashCode();
|
.toHashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setHeaders(String theHeaders) {
|
public void setBackingSubscription(FhirContext theCtx, IBaseResource theBackingSubscription) {
|
||||||
|
myBackingSubscription = theBackingSubscription;
|
||||||
|
myBackingSubscriptionString = null;
|
||||||
|
if (myBackingSubscription != null) {
|
||||||
|
myBackingSubscriptionString = theCtx.newJsonParser().encodeResourceToString(myBackingSubscription);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHeaders(List<? extends IPrimitiveType<String>> theHeader) {
|
||||||
myHeaders = new ArrayList<>();
|
myHeaders = new ArrayList<>();
|
||||||
if (isNotBlank(theHeaders)) {
|
for (IPrimitiveType<String> next : theHeader) {
|
||||||
myHeaders.add(theHeaders);
|
if (isNotBlank(next.getValueAsString())) {
|
||||||
|
myHeaders.add(next.getValueAsString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,12 +205,14 @@ public class CanonicalSubscription implements Serializable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
|
||||||
public static class EmailDetails {
|
public static class EmailDetails {
|
||||||
@SerializedName("from")
|
@JsonProperty("from")
|
||||||
private String myFrom;
|
private String myFrom;
|
||||||
@SerializedName("subjectTemplate")
|
@JsonProperty("subjectTemplate")
|
||||||
private String mySubjectTemplate;
|
private String mySubjectTemplate;
|
||||||
@SerializedName("bodyTemplate")
|
@JsonProperty("bodyTemplate")
|
||||||
private String myBodyTemplate;
|
private String myBodyTemplate;
|
||||||
|
|
||||||
public String getBodyTemplate() {
|
public String getBodyTemplate() {
|
||||||
|
@ -233,6 +240,8 @@ public class CanonicalSubscription implements Serializable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
|
||||||
public static class CanonicalEventDefinition {
|
public static class CanonicalEventDefinition {
|
||||||
|
|
||||||
public CanonicalEventDefinition(EventDefinition theDef) {
|
public CanonicalEventDefinition(EventDefinition theDef) {
|
||||||
|
|
|
@ -22,21 +22,30 @@ package ca.uhn.fhir.jpa.subscription;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
|
import com.fasterxml.jackson.annotation.*;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
public class ResourceDeliveryMessage implements Serializable {
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
|
||||||
|
public class ResourceDeliveryMessage {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
private transient CanonicalSubscription mySubscription;
|
private transient CanonicalSubscription mySubscription;
|
||||||
|
@JsonProperty("subscription")
|
||||||
private String mySubscriptionString;
|
private String mySubscriptionString;
|
||||||
|
@JsonIgnore
|
||||||
private transient IBaseResource myPayload;
|
private transient IBaseResource myPayload;
|
||||||
|
@JsonProperty("payload")
|
||||||
private String myPayoadString;
|
private String myPayoadString;
|
||||||
|
@JsonProperty("payloadId")
|
||||||
private String myPayloadId;
|
private String myPayloadId;
|
||||||
|
@JsonProperty("operationType")
|
||||||
private RestOperationTypeEnum myOperationType;
|
private RestOperationTypeEnum myOperationType;
|
||||||
|
|
||||||
public RestOperationTypeEnum getOperationType() {
|
public RestOperationTypeEnum getOperationType() {
|
||||||
|
|
|
@ -22,18 +22,28 @@ package ca.uhn.fhir.jpa.subscription;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
|
||||||
public class ResourceModifiedMessage implements Serializable {
|
public class ResourceModifiedMessage implements Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@JsonProperty("resourceId")
|
||||||
private String myId;
|
private String myId;
|
||||||
|
@JsonProperty("operationType")
|
||||||
private RestOperationTypeEnum myOperationType;
|
private RestOperationTypeEnum myOperationType;
|
||||||
|
@JsonProperty("newPayload")
|
||||||
private String myNewPayloadEncoded;
|
private String myNewPayloadEncoded;
|
||||||
|
@JsonIgnore
|
||||||
private transient IBaseResource myNewPayload;
|
private transient IBaseResource myNewPayload;
|
||||||
|
|
||||||
public IIdType getId(FhirContext theCtx) {
|
public IIdType getId(FhirContext theCtx) {
|
||||||
|
|
|
@ -27,14 +27,13 @@ import static org.junit.Assert.fail;
|
||||||
public class TestDstu3Config extends BaseJavaConfigDstu3 {
|
public class TestDstu3Config extends BaseJavaConfigDstu3 {
|
||||||
|
|
||||||
static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(TestDstu3Config.class);
|
static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(TestDstu3Config.class);
|
||||||
|
private Exception myLastStackTrace;
|
||||||
|
|
||||||
@Bean()
|
@Bean()
|
||||||
public DaoConfig daoConfig() {
|
public DaoConfig daoConfig() {
|
||||||
return new DaoConfig();
|
return new DaoConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Exception myLastStackTrace;
|
|
||||||
|
|
||||||
@Bean()
|
@Bean()
|
||||||
public DataSource dataSource() {
|
public DataSource dataSource() {
|
||||||
BasicDataSource retVal = new BasicDataSource() {
|
BasicDataSource retVal = new BasicDataSource() {
|
||||||
|
@ -48,10 +47,10 @@ public class TestDstu3Config extends BaseJavaConfigDstu3 {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ourLog.error("Exceeded maximum wait for connection", e);
|
ourLog.error("Exceeded maximum wait for connection", e);
|
||||||
logGetConnectionStackTrace();
|
logGetConnectionStackTrace();
|
||||||
if ("true".equals(System.getProperty("ci"))) {
|
// if ("true".equals(System.getProperty("ci"))) {
|
||||||
fail("Exceeded maximum wait for connection: "+ e.toString());
|
fail("Exceeded maximum wait for connection: "+ e.toString());
|
||||||
}
|
// }
|
||||||
System.exit(1);
|
// System.exit(1);
|
||||||
retVal = null;
|
retVal = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ import static org.junit.Assert.*;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
@ContextConfiguration(classes= {TestDstu2Config.class})
|
@ContextConfiguration(classes = {TestDstu2Config.class})
|
||||||
public abstract class BaseJpaDstu2Test extends BaseJpaTest {
|
public abstract class BaseJpaDstu2Test extends BaseJpaTest {
|
||||||
@Autowired
|
@Autowired
|
||||||
protected ApplicationContext myAppCtx;
|
protected ApplicationContext myAppCtx;
|
||||||
|
@ -84,13 +84,11 @@ public abstract class BaseJpaDstu2Test extends BaseJpaTest {
|
||||||
@Qualifier("myLocationDaoDstu2")
|
@Qualifier("myLocationDaoDstu2")
|
||||||
protected IFhirResourceDao<Location> myLocationDao;
|
protected IFhirResourceDao<Location> myLocationDao;
|
||||||
@Autowired
|
@Autowired
|
||||||
@Qualifier("myMediaDaoDstu2")
|
@Qualifier("myMediaDaoDstu2")
|
||||||
protected IFhirResourceDao<Media> myMediaDao;
|
protected IFhirResourceDao<Media> myMediaDao;
|
||||||
|
@Autowired
|
||||||
@Autowired
|
@Qualifier("myMedicationAdministrationDaoDstu2")
|
||||||
@Qualifier("myMedicationAdministrationDaoDstu2")
|
protected IFhirResourceDao<MedicationAdministration> myMedicationAdministrationDao;
|
||||||
protected IFhirResourceDao<MedicationAdministration> myMedicationAdministrationDao;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@Qualifier("myMedicationDaoDstu2")
|
@Qualifier("myMedicationDaoDstu2")
|
||||||
protected IFhirResourceDao<Medication> myMedicationDao;
|
protected IFhirResourceDao<Medication> myMedicationDao;
|
||||||
|
@ -158,6 +156,7 @@ protected IFhirResourceDao<MedicationAdministration> myMedicationAdministrationD
|
||||||
myInterceptor = mock(IServerInterceptor.class);
|
myInterceptor = mock(IServerInterceptor.class);
|
||||||
myDaoConfig.setInterceptors(myInterceptor);
|
myDaoConfig.setInterceptors(myInterceptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@Transactional
|
@Transactional
|
||||||
public void beforeFlushFT() {
|
public void beforeFlushFT() {
|
||||||
|
@ -167,6 +166,7 @@ protected IFhirResourceDao<MedicationAdministration> myMedicationAdministrationD
|
||||||
ftem.flushToIndexes();
|
ftem.flushToIndexes();
|
||||||
|
|
||||||
myDaoConfig.setSchedulingDisabled(true);
|
myDaoConfig.setSchedulingDisabled(true);
|
||||||
|
myDaoConfig.setIndexMissingFields(DaoConfig.IndexEnabledEnum.ENABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
|
|
@ -118,8 +118,6 @@ public abstract class BaseJpaDstu3Test extends BaseJpaTest {
|
||||||
protected IFhirResourceDao<ImmunizationRecommendation> myImmunizationRecommendationDao;
|
protected IFhirResourceDao<ImmunizationRecommendation> myImmunizationRecommendationDao;
|
||||||
protected IServerInterceptor myInterceptor;
|
protected IServerInterceptor myInterceptor;
|
||||||
@Autowired
|
@Autowired
|
||||||
private JpaValidationSupportChainDstu3 myJpaValidationSupportChainDstu3;
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("myLocationDaoDstu3")
|
@Qualifier("myLocationDaoDstu3")
|
||||||
protected IFhirResourceDao<Location> myLocationDao;
|
protected IFhirResourceDao<Location> myLocationDao;
|
||||||
@Autowired
|
@Autowired
|
||||||
|
@ -219,6 +217,8 @@ public abstract class BaseJpaDstu3Test extends BaseJpaTest {
|
||||||
@Autowired
|
@Autowired
|
||||||
@Qualifier("myValueSetDaoDstu3")
|
@Qualifier("myValueSetDaoDstu3")
|
||||||
protected IFhirResourceDaoValueSet<ValueSet, Coding, CodeableConcept> myValueSetDao;
|
protected IFhirResourceDaoValueSet<ValueSet, Coding, CodeableConcept> myValueSetDao;
|
||||||
|
@Autowired
|
||||||
|
private JpaValidationSupportChainDstu3 myJpaValidationSupportChainDstu3;
|
||||||
|
|
||||||
@After()
|
@After()
|
||||||
public void afterCleanupDao() {
|
public void afterCleanupDao() {
|
||||||
|
@ -250,6 +250,7 @@ public abstract class BaseJpaDstu3Test extends BaseJpaTest {
|
||||||
ftem.flushToIndexes();
|
ftem.flushToIndexes();
|
||||||
|
|
||||||
myDaoConfig.setSchedulingDisabled(true);
|
myDaoConfig.setSchedulingDisabled(true);
|
||||||
|
myDaoConfig.setIndexMissingFields(DaoConfig.IndexEnabledEnum.ENABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
|
|
@ -258,6 +258,7 @@ public abstract class BaseJpaR4Test extends BaseJpaTest {
|
||||||
ftem.flushToIndexes();
|
ftem.flushToIndexes();
|
||||||
|
|
||||||
myDaoConfig.setSchedulingDisabled(true);
|
myDaoConfig.setSchedulingDisabled(true);
|
||||||
|
myDaoConfig.setIndexMissingFields(DaoConfig.IndexEnabledEnum.ENABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
|
|
@ -22,7 +22,7 @@ public class FhirResourceDaoR4SearchMissingTest extends BaseJpaR4Test {
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void beforeResetMissing() {
|
public void beforeResetMissing() {
|
||||||
myDaoConfig.setIndexMissingFields(new DaoConfig().getIndexMissingFields());
|
myDaoConfig.setIndexMissingFields(DaoConfig.IndexEnabledEnum.ENABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -35,6 +35,16 @@ public class CommonConfig {
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a joke
|
||||||
|
*
|
||||||
|
* https://chat.fhir.org/#narrow/stream/implementers/topic/Unsupported.20search.20parameters
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public IServerInterceptor holyFooCowInterceptor() {
|
||||||
|
return new HolyFooCowInterceptor();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do some fancy logging to create a nice access log that has details about each incoming request.
|
* Do some fancy logging to create a nice access log that has details about each incoming request.
|
||||||
*/
|
*/
|
||||||
|
@ -47,16 +57,6 @@ public class CommonConfig {
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This is a joke
|
|
||||||
*
|
|
||||||
* https://chat.fhir.org/#narrow/stream/implementers/topic/Unsupported.20search.20parameters
|
|
||||||
*/
|
|
||||||
@Bean
|
|
||||||
public IServerInterceptor holyFooCowInterceptor() {
|
|
||||||
return new HolyFooCowInterceptor();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isLocalTestMode(){
|
public static boolean isLocalTestMode(){
|
||||||
return "true".equalsIgnoreCase(System.getProperty("testmode.local"));
|
return "true".equalsIgnoreCase(System.getProperty("testmode.local"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,6 +66,7 @@ public class TdlDstu2Config extends BaseJavaConfigDstu2 {
|
||||||
retVal.setAllowExternalReferences(true);
|
retVal.setAllowExternalReferences(true);
|
||||||
retVal.getTreatBaseUrlsAsLocal().add("http://fhirtest.uhn.ca/testDataLibraryDstu2");
|
retVal.getTreatBaseUrlsAsLocal().add("http://fhirtest.uhn.ca/testDataLibraryDstu2");
|
||||||
retVal.getTreatBaseUrlsAsLocal().add("https://fhirtest.uhn.ca/testDataLibraryDstu2");
|
retVal.getTreatBaseUrlsAsLocal().add("https://fhirtest.uhn.ca/testDataLibraryDstu2");
|
||||||
|
retVal.setIndexMissingFields(DaoConfig.IndexEnabledEnum.ENABLED);
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,14 +56,10 @@ public class TdlDstu3Config extends BaseJavaConfigDstu3 {
|
||||||
retVal.setAllowExternalReferences(true);
|
retVal.setAllowExternalReferences(true);
|
||||||
retVal.getTreatBaseUrlsAsLocal().add("http://fhirtest.uhn.ca/testDataLibraryStu3");
|
retVal.getTreatBaseUrlsAsLocal().add("http://fhirtest.uhn.ca/testDataLibraryStu3");
|
||||||
retVal.getTreatBaseUrlsAsLocal().add("https://fhirtest.uhn.ca/testDataLibraryStu3");
|
retVal.getTreatBaseUrlsAsLocal().add("https://fhirtest.uhn.ca/testDataLibraryStu3");
|
||||||
|
retVal.setIndexMissingFields(DaoConfig.IndexEnabledEnum.ENABLED);
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
|
||||||
public IServerInterceptor securityInterceptor() {
|
|
||||||
return new TdlSecurityInterceptor();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean(name = "myPersistenceDataSourceDstu3", destroyMethod = "close")
|
@Bean(name = "myPersistenceDataSourceDstu3", destroyMethod = "close")
|
||||||
public DataSource dataSource() {
|
public DataSource dataSource() {
|
||||||
BasicDataSource retVal = new BasicDataSource();
|
BasicDataSource retVal = new BasicDataSource();
|
||||||
|
@ -146,6 +142,11 @@ public class TdlDstu3Config extends BaseJavaConfigDstu3 {
|
||||||
return responseValidator;
|
return responseValidator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public IServerInterceptor securityInterceptor() {
|
||||||
|
return new TdlSecurityInterceptor();
|
||||||
|
}
|
||||||
|
|
||||||
@Bean(autowire = Autowire.BY_TYPE)
|
@Bean(autowire = Autowire.BY_TYPE)
|
||||||
public IServerInterceptor subscriptionSecurityInterceptor() {
|
public IServerInterceptor subscriptionSecurityInterceptor() {
|
||||||
return new SubscriptionsRequireManualActivationInterceptorDstu3();
|
return new SubscriptionsRequireManualActivationInterceptorDstu3();
|
||||||
|
|
|
@ -55,24 +55,10 @@ public class TestR4Config extends BaseJavaConfigR4 {
|
||||||
retVal.setAllowExternalReferences(true);
|
retVal.setAllowExternalReferences(true);
|
||||||
retVal.getTreatBaseUrlsAsLocal().add("http://fhirtest.uhn.ca/baseR4");
|
retVal.getTreatBaseUrlsAsLocal().add("http://fhirtest.uhn.ca/baseR4");
|
||||||
retVal.getTreatBaseUrlsAsLocal().add("https://fhirtest.uhn.ca/baseR4");
|
retVal.getTreatBaseUrlsAsLocal().add("https://fhirtest.uhn.ca/baseR4");
|
||||||
|
retVal.setIndexMissingFields(DaoConfig.IndexEnabledEnum.ENABLED);
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@Bean(autowire = Autowire.BY_TYPE)
|
|
||||||
public DatabaseBackedPagingProvider databaseBackedPagingProvider() {
|
|
||||||
DatabaseBackedPagingProvider retVal = super.databaseBackedPagingProvider();
|
|
||||||
retVal.setDefaultPageSize(20);
|
|
||||||
retVal.setMaximumPageSize(500);
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public IServerInterceptor securityInterceptor() {
|
|
||||||
return new PublicSecurityInterceptor();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean(name = "myPersistenceDataSourceR4", destroyMethod = "close")
|
@Bean(name = "myPersistenceDataSourceR4", destroyMethod = "close")
|
||||||
public DataSource dataSource() {
|
public DataSource dataSource() {
|
||||||
BasicDataSource retVal = new BasicDataSource();
|
BasicDataSource retVal = new BasicDataSource();
|
||||||
|
@ -87,6 +73,15 @@ public class TestR4Config extends BaseJavaConfigR4 {
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Bean(autowire = Autowire.BY_TYPE)
|
||||||
|
public DatabaseBackedPagingProvider databaseBackedPagingProvider() {
|
||||||
|
DatabaseBackedPagingProvider retVal = super.databaseBackedPagingProvider();
|
||||||
|
retVal.setDefaultPageSize(20);
|
||||||
|
retVal.setMaximumPageSize(500);
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
@Bean()
|
@Bean()
|
||||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
|
||||||
LocalContainerEntityManagerFactoryBean retVal = new LocalContainerEntityManagerFactoryBean();
|
LocalContainerEntityManagerFactoryBean retVal = new LocalContainerEntityManagerFactoryBean();
|
||||||
|
@ -135,6 +130,10 @@ public class TestR4Config extends BaseJavaConfigR4 {
|
||||||
return requestValidator;
|
return requestValidator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public IServerInterceptor securityInterceptor() {
|
||||||
|
return new PublicSecurityInterceptor();
|
||||||
|
}
|
||||||
|
|
||||||
@Bean()
|
@Bean()
|
||||||
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
|
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
package ca.uhn.fhir.tinder;
|
||||||
|
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class ExamineTestTrace {
|
||||||
|
|
||||||
|
private static final Logger ourLog = LoggerFactory.getLogger(ExamineTestTrace.class);
|
||||||
|
|
||||||
|
public static void main(String[] aaa) {
|
||||||
|
String input = "Running ca.uhn.fhir.jpa.config.IdentifierLengthTest\n" +
|
||||||
|
"Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.913 sec - in ca.uhn.fhir.jpa.subscription.r4.RestHookTestWithInterceptorRegisteredToDaoConfigR4Test";
|
||||||
|
|
||||||
|
Set<String> started = new HashSet<>();
|
||||||
|
Set<String> finished = new HashSet<>();
|
||||||
|
for (String next : input.split("\n")) {
|
||||||
|
if (next.startsWith("Running ")) {
|
||||||
|
started.add(next.substring("Running ".length()));
|
||||||
|
} else if (next.startsWith("Tests run: ")) {
|
||||||
|
finished.add(next.substring(next.indexOf(" - in ") + " - in ".length()));
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ourLog.info("Started {}", started.size());
|
||||||
|
ourLog.info("Finished {}", finished.size());
|
||||||
|
ourLog.info(CollectionUtils.disjunction(started, finished).toString());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
32
pom.xml
32
pom.xml
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<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">
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.sonatype.oss</groupId>
|
<groupId>org.sonatype.oss</groupId>
|
||||||
|
@ -422,6 +422,36 @@
|
||||||
<artifactId>commonmark</artifactId>
|
<artifactId>commonmark</artifactId>
|
||||||
<version>0.9.0</version>
|
<version>0.9.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-annotations</artifactId>
|
||||||
|
<version>2.8.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-core</artifactId>
|
||||||
|
<version>2.8.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
<version>2.8.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.datatype</groupId>
|
||||||
|
<artifactId>jackson-datatype-jsr310</artifactId>
|
||||||
|
<version>2.8.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||||
|
<artifactId>jackson-dataformat-yaml</artifactId>
|
||||||
|
<version>2.8.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.module</groupId>
|
||||||
|
<artifactId>jackson-module-jaxb-annotations</artifactId>
|
||||||
|
<version>2.8.1</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.icegreen</groupId>
|
<groupId>com.icegreen</groupId>
|
||||||
<artifactId>greenmail</artifactId>
|
<artifactId>greenmail</artifactId>
|
||||||
|
|
|
@ -384,6 +384,15 @@
|
||||||
<![CDATA[<code>:missing</code>]]> modifiers, which
|
<![CDATA[<code>:missing</code>]]> modifiers, which
|
||||||
increases write performance since fewer indexes are written
|
increases write performance since fewer indexes are written
|
||||||
</action>
|
</action>
|
||||||
|
<action type="add">
|
||||||
|
A new JPA configuration option has been added to the DaoConfig which allows
|
||||||
|
support for the <![CDATA[<code>:missing</code>]]> search parameter modifier
|
||||||
|
to be enabled or disabled, and sets the default to DISABLED.
|
||||||
|
<![CDATA[<br/><br/>]]>
|
||||||
|
Support for this parameter causes many more index rows to be inserted in the database,
|
||||||
|
which has a significant impact on write performance. A future HAPI update may allow these
|
||||||
|
rows to be written asynchronously in order to improve this.
|
||||||
|
</action>
|
||||||
</release>
|
</release>
|
||||||
<release version="2.5" date="2017-06-08">
|
<release version="2.5" date="2017-06-08">
|
||||||
<action type="fix">
|
<action type="fix">
|
||||||
|
|
Loading…
Reference in New Issue