Merge pull request #1572 from jamesagnew/ks-source-subscriptions
fixed in-memory search by _source for Dstu3
This commit is contained in:
commit
1fd3948b12
|
@ -26,18 +26,47 @@ import ca.uhn.fhir.context.FhirContext;
|
||||||
import ca.uhn.fhir.context.FhirVersionEnum;
|
import ca.uhn.fhir.context.FhirVersionEnum;
|
||||||
import ca.uhn.fhir.rest.api.Constants;
|
import ca.uhn.fhir.rest.api.Constants;
|
||||||
import org.hl7.fhir.instance.model.api.*;
|
import org.hl7.fhir.instance.model.api.*;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class MetaUtil {
|
public class MetaUtil {
|
||||||
|
private static final Logger ourLog = LoggerFactory.getLogger(MetaUtil.class);
|
||||||
|
|
||||||
private MetaUtil() {
|
private MetaUtil() {
|
||||||
// non-instantiable
|
// non-instantiable
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getSource(FhirContext theContext, IBaseMetaType theMeta) {
|
public static String getSource(FhirContext theContext, IBaseMetaType theMeta) {
|
||||||
BaseRuntimeElementCompositeDefinition<?> elementDef = (BaseRuntimeElementCompositeDefinition<?>) theContext.getElementDefinition(theMeta.getClass());
|
if (theContext.getVersion().getVersion().isEqualOrNewerThan(FhirVersionEnum.R4)) {
|
||||||
|
return getSourceR4Plus(theContext, theMeta);
|
||||||
|
} else if (theContext.getVersion().getVersion().equals(FhirVersionEnum.DSTU3)) {
|
||||||
|
return getSourceDstu3((IBaseHasExtensions) theMeta);
|
||||||
|
} else {
|
||||||
|
throw new UnsupportedOperationException(MetaUtil.class.getSimpleName() + ".getSource() not supported on FHIR Version " + theContext.getVersion().getVersion());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getSourceDstu3(IBaseHasExtensions theMeta) {
|
||||||
|
IBaseHasExtensions metaWithExtensions = theMeta;
|
||||||
|
List<? extends IBaseExtension<?, ?>> extensions = metaWithExtensions.getExtension();
|
||||||
|
for (IBaseExtension extension : extensions) {
|
||||||
|
if (Constants.EXT_META_SOURCE.equals(extension.getUrl())) {
|
||||||
|
IPrimitiveType<String> value = (IPrimitiveType<String>) extension.getValue();
|
||||||
|
return value.getValueAsString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getSourceR4Plus(FhirContext theFhirContext, IBaseMetaType theMeta) {
|
||||||
|
BaseRuntimeElementCompositeDefinition<?> elementDef = (BaseRuntimeElementCompositeDefinition<?>) theFhirContext.getElementDefinition(theMeta.getClass());
|
||||||
BaseRuntimeChildDefinition sourceChild = elementDef.getChildByName("source");
|
BaseRuntimeChildDefinition sourceChild = elementDef.getChildByName("source");
|
||||||
|
if (sourceChild == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
List<IBase> sourceValues = sourceChild.getAccessor().getValues(theMeta);
|
List<IBase> sourceValues = sourceChild.getAccessor().getValues(theMeta);
|
||||||
String retVal = null;
|
String retVal = null;
|
||||||
if (sourceValues.size() > 0) {
|
if (sourceValues.size() > 0) {
|
||||||
|
@ -66,6 +95,8 @@ public class MetaUtil {
|
||||||
IPrimitiveType<String> value = (IPrimitiveType<String>) theContext.getElementDefinition("uri").newInstance();
|
IPrimitiveType<String> value = (IPrimitiveType<String>) theContext.getElementDefinition("uri").newInstance();
|
||||||
value.setValue(theValue);
|
value.setValue(theValue);
|
||||||
sourceExtension.setValue(value);
|
sourceExtension.setValue(value);
|
||||||
|
} else {
|
||||||
|
ourLog.error(MetaUtil.class.getSimpleName() + ".setSource() not supported on FHIR Version " + theContext.getVersion().getVersion());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ import ca.uhn.fhir.rest.server.IResourceProvider;
|
||||||
import ca.uhn.fhir.rest.server.RestfulServer;
|
import ca.uhn.fhir.rest.server.RestfulServer;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
||||||
import ca.uhn.fhir.test.utilities.JettyUtil;
|
import ca.uhn.fhir.test.utilities.JettyUtil;
|
||||||
|
import ca.uhn.fhir.util.MetaUtil;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.servlet.ServletContextHandler;
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||||
|
@ -242,6 +243,33 @@ public class RestHookTestDstu3Test extends BaseResourceProviderDstu3Test {
|
||||||
assertEquals(Constants.CT_FHIR_JSON_NEW, ourContentTypes.get(0));
|
assertEquals(Constants.CT_FHIR_JSON_NEW, ourContentTypes.get(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRestHookSubscriptionSource() throws Exception {
|
||||||
|
String payload = "application/fhir+json";
|
||||||
|
|
||||||
|
String source = "foosource";
|
||||||
|
String criteria = "Observation?_source=" + source;
|
||||||
|
|
||||||
|
Subscription subscription = newSubscription(criteria, payload, ourListenerServerBase, null);
|
||||||
|
MethodOutcome methodOutcome = ourClient.create().resource(subscription).execute();
|
||||||
|
Subscription savedSub = (Subscription) methodOutcome.getResource();
|
||||||
|
assertInMemoryTag(savedSub);
|
||||||
|
mySubscriptionIds.add(methodOutcome.getId());
|
||||||
|
|
||||||
|
waitForQueueToDrain();
|
||||||
|
|
||||||
|
Observation observation = new Observation();
|
||||||
|
MetaUtil.setSource(myFhirCtx, observation, source);
|
||||||
|
ourClient.create().resource(observation).execute();
|
||||||
|
|
||||||
|
// Should see 1 subscription notification
|
||||||
|
waitForQueueToDrain();
|
||||||
|
waitForSize(0, ourCreatedObservations);
|
||||||
|
waitForSize(1, ourUpdatedObservations);
|
||||||
|
assertEquals(Constants.CT_FHIR_JSON_NEW, ourContentTypes.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRestHookSubscriptionApplicationJson() throws Exception {
|
public void testRestHookSubscriptionApplicationJson() throws Exception {
|
||||||
String payload = "application/json";
|
String payload = "application/json";
|
||||||
|
@ -474,11 +502,17 @@ public class RestHookTestDstu3Test extends BaseResourceProviderDstu3Test {
|
||||||
assertEquals("In-memory", tag.getDisplay());
|
assertEquals("In-memory", tag.getDisplay());
|
||||||
|
|
||||||
// Wait for subscription to be moved to active
|
// Wait for subscription to be moved to active
|
||||||
await().until(()-> Subscription.SubscriptionStatus.ACTIVE.equals(ourClient.read().resource(Subscription.class).withId(subscriptionId.toUnqualifiedVersionless()).execute().getStatus()));
|
await().until(() -> Subscription.SubscriptionStatus.ACTIVE.equals(ourClient.read().resource(Subscription.class).withId(subscriptionId.toUnqualifiedVersionless()).execute().getStatus()));
|
||||||
|
|
||||||
Subscription subscriptionActivated = ourClient.read().resource(Subscription.class).withId(subscriptionId.toUnqualifiedVersionless()).execute();
|
Subscription subscriptionActivated = ourClient.read().resource(Subscription.class).withId(subscriptionId.toUnqualifiedVersionless()).execute();
|
||||||
assertEquals(Subscription.SubscriptionStatus.ACTIVE, subscriptionActivated.getStatus());
|
assertEquals(Subscription.SubscriptionStatus.ACTIVE, subscriptionActivated.getStatus());
|
||||||
tags = subscriptionActivated.getMeta().getTag();
|
assertInMemoryTag(subscriptionActivated);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertInMemoryTag(Subscription theSubscription) {
|
||||||
|
List<Coding> tags;
|
||||||
|
Coding tag;
|
||||||
|
tags = theSubscription.getMeta().getTag();
|
||||||
assertEquals(1, tags.size());
|
assertEquals(1, tags.size());
|
||||||
tag = tags.get(0);
|
tag = tags.get(0);
|
||||||
assertEquals(JpaConstants.EXT_SUBSCRIPTION_MATCHING_STRATEGY, tag.getSystem());
|
assertEquals(JpaConstants.EXT_SUBSCRIPTION_MATCHING_STRATEGY, tag.getSystem());
|
||||||
|
@ -501,7 +535,7 @@ public class RestHookTestDstu3Test extends BaseResourceProviderDstu3Test {
|
||||||
assertEquals("Database", tag.getDisplay());
|
assertEquals("Database", tag.getDisplay());
|
||||||
|
|
||||||
// Wait for subscription to be moved to active
|
// Wait for subscription to be moved to active
|
||||||
await().until(()-> Subscription.SubscriptionStatus.ACTIVE.equals(ourClient.read().resource(Subscription.class).withId(subscriptionId.toUnqualifiedVersionless()).execute().getStatus()));
|
await().until(() -> Subscription.SubscriptionStatus.ACTIVE.equals(ourClient.read().resource(Subscription.class).withId(subscriptionId.toUnqualifiedVersionless()).execute().getStatus()));
|
||||||
|
|
||||||
Subscription subscription = ourClient.read().resource(Subscription.class).withId(subscriptionId.toUnqualifiedVersionless()).execute();
|
Subscription subscription = ourClient.read().resource(Subscription.class).withId(subscriptionId.toUnqualifiedVersionless()).execute();
|
||||||
assertEquals(Subscription.SubscriptionStatus.ACTIVE, subscription.getStatus());
|
assertEquals(Subscription.SubscriptionStatus.ACTIVE, subscription.getStatus());
|
||||||
|
@ -624,9 +658,9 @@ public class RestHookTestDstu3Test extends BaseResourceProviderDstu3Test {
|
||||||
|
|
||||||
ourListenerServer.setHandler(proxyHandler);
|
ourListenerServer.setHandler(proxyHandler);
|
||||||
JettyUtil.startServer(ourListenerServer);
|
JettyUtil.startServer(ourListenerServer);
|
||||||
ourListenerPort = JettyUtil.getPortForStartedServer(ourListenerServer);
|
ourListenerPort = JettyUtil.getPortForStartedServer(ourListenerServer);
|
||||||
ourListenerServerBase = "http://localhost:" + ourListenerPort + "/fhir/context";
|
ourListenerServerBase = "http://localhost:" + ourListenerPort + "/fhir/context";
|
||||||
ourNotificationListenerServer = "http://localhost:" + ourListenerPort + "/fhir/subscription";
|
ourNotificationListenerServer = "http://localhost:" + ourListenerPort + "/fhir/subscription";
|
||||||
}
|
}
|
||||||
|
|
||||||
@AfterClass
|
@AfterClass
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
package ca.uhn.fhir.util;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import org.hl7.fhir.dstu3.model.Observation;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
public class MetaUtilTest {
|
||||||
|
FhirContext ourFhirContext = FhirContext.forDstu3();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetGetDstu3() {
|
||||||
|
String source = "testSource";
|
||||||
|
Observation observation = new Observation();
|
||||||
|
MetaUtil.setSource(ourFhirContext, observation, source);
|
||||||
|
assertEquals(source, MetaUtil.getSource(ourFhirContext, observation.getMeta()));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue