Work on build

This commit is contained in:
jamesagnew 2015-02-16 23:02:50 -05:00
parent 54be2634cd
commit 70aa4e812d
37 changed files with 23161 additions and 17628 deletions

View File

@ -20,8 +20,15 @@ public class ClientExamples {
public void createProxy() {
// START SNIPPET: proxy
FhirContext ctx = new FhirContext();
// Set connections to access the network via the HTTP proxy at
// example.com : 8888
ctx.getRestfulClientFactory().setProxy("example.com", 8888);
// If the proxy requires authentication, use the following as well
ctx.getRestfulClientFactory().setProxyCredentials("theUsername", "thePassword");
// Create the client
IGenericClient genericClient = ctx.newRestfulGenericClient("http://localhost:9999/fhir");
// END SNIPPET: proxy
}

View File

@ -18,7 +18,10 @@ import ca.uhn.fhir.rest.client.IGenericClient;
public class HttpProxy {
public static void main(String[] args) {
/*
* This is out ot date - Just keeping
* it in case it's helpful...
*/
final String authUser = "username";
final String authPassword = "password";
CredentialsProvider credsProvider = new BasicCredentialsProvider();

View File

@ -12,7 +12,7 @@
<artifactId>hapi-fhir-android</artifactId>
<packaging>jar</packaging>
<name>HAPI FHIR - Distribution Archive</name>
<name>HAPI FHIR - Android</name>
<dependencies>
<dependency>

View File

@ -488,7 +488,7 @@ class ModelScanner {
Class<?> nextElementType = determineElementType(next);
if (IAnyResource.class.isAssignableFrom(nextElementType)) {
if (IAnyResource.class.isAssignableFrom(nextElementType) || IResource.class.equals(nextElementType)) {
/*
* Child is a resource as a direct child, as in Bundle.entry.resource
*/

View File

@ -38,18 +38,23 @@ import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.hl7.fhir.instance.model.IBase;
import org.hl7.fhir.instance.model.IBaseResource;
import org.hl7.fhir.instance.model.IPrimitiveType;
import org.hl7.fhir.instance.model.api.IAnyResource;
import org.hl7.fhir.instance.model.api.IDomainResource;
import org.hl7.fhir.instance.model.api.IReference;
import ca.uhn.fhir.context.BaseRuntimeChildDefinition;
import ca.uhn.fhir.context.BaseRuntimeDeclaredChildDefinition;
import ca.uhn.fhir.context.BaseRuntimeElementCompositeDefinition;
import ca.uhn.fhir.context.BaseRuntimeElementDefinition;
import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.RuntimeChildChoiceDefinition;
import ca.uhn.fhir.context.RuntimeResourceDefinition;
import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.api.BundleEntry;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.api.TagList;
import ca.uhn.fhir.model.base.composite.BaseResourceReferenceDt;
import ca.uhn.fhir.model.primitive.IdDt;
@ -266,6 +271,57 @@ public abstract class BaseParser implements IParser {
return parseResource(null, theReader);
}
protected abstract <T extends IBaseResource> T doParseResource(Class<T> theResourceType, Reader theReader) throws DataFormatException;
public <T extends IBaseResource> T parseResource(Class<T> theResourceType, Reader theReader) throws DataFormatException {
T retVal = doParseResource(theResourceType, theReader);
RuntimeResourceDefinition def = myContext.getResourceDefinition(retVal);
if ("Bundle".equals(def.getName())) {
List<IBase> base = def.getChildByName("base").getAccessor().getValues(retVal);
if (base != null && base.size() > 0) {
IPrimitiveType<?> baseType = (IPrimitiveType<?>) base.get(0);
IResource res = ((IResource)retVal);
res.setId(new IdDt(baseType.getValueAsString(), def.getName(), res.getId().getIdPart(), res.getId().getVersionIdPart()));
}
BaseRuntimeChildDefinition entryChild = def.getChildByName("entry");
BaseRuntimeElementCompositeDefinition<?> entryDef = (BaseRuntimeElementCompositeDefinition<?>) entryChild.getChildByName("entry");
List<IBase> entries = entryChild.getAccessor().getValues(retVal);
if (entries != null) {
for (IBase nextEntry : entries) {
List<IBase> entryBase = entryDef.getChildByName("base").getAccessor().getValues(nextEntry);
if (entryBase == null || entryBase.isEmpty()) {
entryBase = base;
}
if (entryBase != null && entryBase.size() > 0) {
IPrimitiveType<?> baseType = (IPrimitiveType<?>) entryBase.get(0);
List<IBase> entryResources = entryDef.getChildByName("resource").getAccessor().getValues(nextEntry);
if (entryResources != null && entryResources.size() > 0) {
IResource res = (IResource) entryResources.get(0);
RuntimeResourceDefinition resDef = myContext.getResourceDefinition(res);
String versionIdPart = res.getId().getVersionIdPart();
if (isBlank(versionIdPart)) {
versionIdPart = ResourceMetadataKeyEnum.VERSION.get(res);
}
res.setId(new IdDt(baseType.getValueAsString(), resDef.getName(), res.getId().getIdPart(), versionIdPart));
}
}
}
}
}
return retVal;
}
@Override
public IResource parseResource(String theMessageString) throws ConfigurationException, DataFormatException {
return parseResource(null, theMessageString);

View File

@ -277,6 +277,13 @@ public class JsonParser extends BaseParser implements IParser {
writeOptionalTagWithTextNode(theEventWriter, "base", determineResourceBaseUrl(theBundle.getLinkBase().getValue(), nextEntry));
boolean deleted = nextEntry.getDeletedAt() != null && nextEntry.getDeletedAt().isEmpty() == false;
IResource resource = nextEntry.getResource();
if (resource != null && !resource.isEmpty() && !deleted) {
RuntimeResourceDefinition resDef = myContext.getResourceDefinition(resource);
encodeResourceToJsonStreamWriter(resDef, resource, theEventWriter, "resource", false);
}
if (nextEntry.getSearchMode().isEmpty() == false || nextEntry.getScore().isEmpty() == false) {
theEventWriter.writeStartObject("search");
writeOptionalTagWithTextNode(theEventWriter, "mode", nextEntry.getSearchMode().getValueAsString());
@ -288,11 +295,10 @@ public class JsonParser extends BaseParser implements IParser {
if (nextEntry.getTransactionOperation().isEmpty() == false || nextEntry.getLinkSearch().isEmpty() == false) {
theEventWriter.writeStartObject("transaction");
writeOptionalTagWithTextNode(theEventWriter, "operation", nextEntry.getTransactionOperation().getValue());
writeOptionalTagWithTextNode(theEventWriter, "match", nextEntry.getLinkSearch().getValue());
writeOptionalTagWithTextNode(theEventWriter, "url", nextEntry.getLinkSearch().getValue());
theEventWriter.writeEnd();
}
boolean deleted = nextEntry.getDeletedAt() != null && nextEntry.getDeletedAt().isEmpty() == false;
if (deleted) {
theEventWriter.writeStartObject("deleted");
if (nextEntry.getResource() != null) {
@ -319,11 +325,6 @@ public class JsonParser extends BaseParser implements IParser {
//
// writeAuthor(nextEntry, theEventWriter);
IResource resource = nextEntry.getResource();
if (resource != null && !resource.isEmpty() && !deleted) {
RuntimeResourceDefinition resDef = myContext.getResourceDefinition(resource);
encodeResourceToJsonStreamWriter(resDef, resource, theEventWriter, "resource", false);
}
if (nextEntry.getSummary().isEmpty() == false) {
theEventWriter.write("summary", nextEntry.getSummary().getValueAsString());
@ -1096,7 +1097,7 @@ public class JsonParser extends BaseParser implements IParser {
}
@Override
public <T extends IBaseResource> T parseResource(Class<T> theResourceType, Reader theReader) {
public <T extends IBaseResource> T doParseResource(Class<T> theResourceType, Reader theReader) {
JsonReader reader = Json.createReader(theReader);
JsonObject object = reader.readObject();

View File

@ -1121,7 +1121,7 @@ class ParserState<T> {
public void enteringNewElement(String theNamespaceURI, String theLocalPart) throws DataFormatException {
if ("operation".equals(theLocalPart)) {
push(new PrimitiveState(getPreResourceState(), myEntry.getTransactionOperation()));
} else if ("match".equals(theLocalPart)) {
} else if ("url".equals(theLocalPart)) {
push(new PrimitiveState(getPreResourceState(), myEntry.getLinkSearch()));
} else {
throw new DataFormatException("Unexpected element in Bundle.entry.search: " + theLocalPart);
@ -1658,6 +1658,8 @@ class ParserState<T> {
public void enteringNewElement(String theNamespaceURI, String theLocalPart) throws DataFormatException {
if (theLocalPart.equals("versionId")) {
push(new MetaVersionElementState(getPreResourceState(), myMap));
// } else if (theLocalPart.equals("profile")) {
//
} else if (theLocalPart.equals("lastUpdated")) {
InstantDt updated = new InstantDt();
push(new PrimitiveState(getPreResourceState(), updated));
@ -1759,10 +1761,23 @@ class ParserState<T> {
@Override
public void wereBack() {
super.wereBack();
if (myEntry == null) {
myObject = (T) getCurrentElement();
}
IResource nextResource = (IResource) getCurrentElement();
String version = ResourceMetadataKeyEnum.VERSION.get(nextResource);
String resourceName = myContext.getResourceDefinition(nextResource).getName();
String bundleIdPart = nextResource.getId().getIdPart();
if (isNotBlank(bundleIdPart)) {
// if (isNotBlank(entryBaseUrl)) {
// nextResource.setId(new IdDt(entryBaseUrl, resourceName, bundleIdPart, version));
// } else {
nextResource.setId(new IdDt(null, resourceName, bundleIdPart, version));
// }
}
}
@Override

View File

@ -81,6 +81,7 @@ import ca.uhn.fhir.model.primitive.InstantDt;
import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.model.primitive.XhtmlDt;
import ca.uhn.fhir.narrative.INarrativeGenerator;
import ca.uhn.fhir.rest.method.BaseMethodBinding;
import ca.uhn.fhir.util.NonPrettyPrintWriterWrapper;
import ca.uhn.fhir.util.PrettyPrintWriterWrapper;
import ca.uhn.fhir.util.XmlUtil;
@ -385,8 +386,22 @@ public class XmlParser extends BaseParser implements IParser {
for (BundleEntry nextEntry : theBundle.getEntries()) {
theEventWriter.writeStartElement("entry");
boolean deleted = false;
if (nextEntry.getDeletedAt() != null && nextEntry.getDeletedAt().isEmpty() == false) {
deleted = true;
}
writeOptionalTagWithValue(theEventWriter, "base", determineResourceBaseUrl(bundleBaseUrl, nextEntry));
IResource resource = nextEntry.getResource();
if (resource != null && !resource.isEmpty() && !deleted) {
theEventWriter.writeStartElement("resource");
encodeResourceToXmlStreamWriter(resource, theEventWriter, false);
theEventWriter.writeEndElement(); // content
} else {
ourLog.debug("Bundle entry contains null resource");
}
if (nextEntry.getSearchMode().isEmpty() == false || nextEntry.getScore().isEmpty() == false) {
theEventWriter.writeStartElement("search");
writeOptionalTagWithValue(theEventWriter, "mode", nextEntry.getSearchMode().getValueAsString());
@ -398,13 +413,11 @@ public class XmlParser extends BaseParser implements IParser {
if (nextEntry.getTransactionOperation().isEmpty() == false || nextEntry.getLinkSearch().isEmpty() == false) {
theEventWriter.writeStartElement("transaction");
writeOptionalTagWithValue(theEventWriter, "operation", nextEntry.getTransactionOperation().getValue());
writeOptionalTagWithValue(theEventWriter, "match", nextEntry.getLinkSearch().getValue());
writeOptionalTagWithValue(theEventWriter, "url", nextEntry.getLinkSearch().getValue());
theEventWriter.writeEndElement();
}
boolean deleted = false;
if (nextEntry.getDeletedAt() != null && nextEntry.getDeletedAt().isEmpty() == false) {
deleted = true;
if (deleted) {
theEventWriter.writeStartElement("deleted");
writeOptionalTagWithValue(theEventWriter, "type", nextEntry.getId().getResourceType());
writeOptionalTagWithValue(theEventWriter, "id", nextEntry.getId().getIdPart());
@ -413,15 +426,6 @@ public class XmlParser extends BaseParser implements IParser {
theEventWriter.writeEndElement();
}
IResource resource = nextEntry.getResource();
if (resource != null && !resource.isEmpty() && !deleted) {
theEventWriter.writeStartElement("resource");
encodeResourceToXmlStreamWriter(resource, theEventWriter, false);
theEventWriter.writeEndElement(); // content
} else {
ourLog.debug("Bundle entry contains null resource");
}
theEventWriter.writeEndElement(); // entry
}
@ -488,7 +492,11 @@ public class XmlParser extends BaseParser implements IParser {
break;
}
case RESOURCE: {
throw new IllegalStateException(); // should not happen
theEventWriter.writeStartElement(childName);
IBaseResource resource = (IBaseResource) nextValue;
encodeResourceToXmlStreamWriter(resource, theEventWriter, false);
theEventWriter.writeEndElement();
break;
}
case PRIMITIVE_XHTML: {
XhtmlDt dt = (XhtmlDt) nextValue;
@ -703,7 +711,11 @@ public class XmlParser extends BaseParser implements IParser {
IdDt resourceId = resource.getId();
if (resourceId != null && isNotBlank(resourceId.getVersionIdPart()) || (updated != null && !updated.isEmpty())) {
theEventWriter.writeStartElement("meta");
writeOptionalTagWithValue(theEventWriter, "versionId", resourceId.getVersionIdPart());
String versionIdPart = resourceId.getVersionIdPart();
if (isBlank(versionIdPart)) {
versionIdPart = ResourceMetadataKeyEnum.VERSION.get(resource);
}
writeOptionalTagWithValue(theEventWriter, "versionId", versionIdPart);
if (updated != null) {
writeOptionalTagWithValue(theEventWriter, "lastUpdated", updated.getValueAsString());
}
@ -922,7 +934,7 @@ public class XmlParser extends BaseParser implements IParser {
}
@Override
public <T extends IBaseResource> T parseResource(Class<T> theResourceType, Reader theReader) {
public <T extends IBaseResource> T doParseResource(Class<T> theResourceType, Reader theReader) {
XMLEventReader streamReader = createStreamReader(theReader);
return parseResource(theResourceType, streamReader);
}

View File

@ -150,6 +150,14 @@ public interface IRestfulClientFactory {
*/
void setProxy(String theHost, Integer thePort);
/**
* Sets the credentials to use to authenticate with the HTTP proxy,
* if one is defined. Set to null to use no authentication with the proxy.
* @param theUsername The username
* @param thePassword The password
*/
void setProxyCredentials(String theUsername, String thePassword);
/**
* Sets the server validation mode for any clients created from this factory. Server
* validation involves the client requesting the server's conformance statement

View File

@ -23,6 +23,7 @@ package ca.uhn.fhir.rest.client;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@ -32,9 +33,15 @@ import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.ProxyAuthenticationStrategy;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import ca.uhn.fhir.context.ConfigurationException;
@ -100,18 +107,35 @@ public class RestfulClientFactory implements IRestfulClientFactory {
.setProxy(myProxy)
.build();
myHttpClient = HttpClients.custom()
HttpClientBuilder builder = HttpClients.custom()
.setConnectionManager(connectionManager)
.setDefaultRequestConfig(defaultRequestConfig)
.disableCookieManagement()
.build();
.disableCookieManagement();
if (myProxy != null && StringUtils.isNotBlank(myProxyUsername) && StringUtils.isNotBlank(myProxyPassword)) {
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope(myProxy.getHostName(), myProxy.getPort()), new UsernamePasswordCredentials(myProxyUsername, myProxyPassword));
builder.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy());
builder.setDefaultCredentialsProvider(credsProvider);
}
myHttpClient = builder.build();
//@formatter:on
}
return myHttpClient;
}
private String myProxyUsername;
private String myProxyPassword;
@Override
public void setProxyCredentials(String theUsername, String thePassword) {
myProxyUsername=theUsername;
myProxyPassword=thePassword;
}
@Override
public ServerValidationModeEnum getServerValidationModeEnum() {
return myServerValidationMode;

View File

@ -0,0 +1,7 @@
package org.hl7.fhir.instance.model.api;
import org.hl7.fhir.instance.model.IBaseResource;
public interface IBaseBundle extends IBaseResource {
}

View File

@ -86,25 +86,27 @@ public class HttpProxyTest {
server.start();
try {
final String authUser = "username";
final String authPassword = "password";
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope("127.0.0.1", port), new UsernamePasswordCredentials(authUser, authPassword));
HttpHost myProxy = new HttpHost("127.0.0.1", port);
//@formatter:off
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
clientBuilder
.setProxy(myProxy)
.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy())
.setDefaultCredentialsProvider(credsProvider)
.disableCookieManagement();
CloseableHttpClient httpClient = clientBuilder.build();
//@formatter:on
ourCtx.getRestfulClientFactory().setHttpClient(httpClient);
// final String authUser = "username";
// final String authPassword = "password";
// CredentialsProvider credsProvider = new BasicCredentialsProvider();
// credsProvider.setCredentials(new AuthScope("127.0.0.1", port), new UsernamePasswordCredentials(authUser, authPassword));
//
// HttpHost myProxy = new HttpHost("127.0.0.1", port);
//
// //@formatter:off
// HttpClientBuilder clientBuilder = HttpClientBuilder.create();
// clientBuilder
// .setProxy(myProxy)
// .setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy())
// .setDefaultCredentialsProvider(credsProvider)
// .disableCookieManagement();
// CloseableHttpClient httpClient = clientBuilder.build();
// //@formatter:on
// ourCtx.getRestfulClientFactory().setHttpClient(httpClient);
ourCtx.getRestfulClientFactory().setProxy("127.0.0.1", port);
ourCtx.getRestfulClientFactory().setProxyCredentials("username", "password");
String baseUri = "http://99.99.99.99:" + port + "/rootctx/rcp2/fhirctx/fcp2";
IGenericClient client = ourCtx.newRestfulGenericClient(baseUri);

View File

@ -62,17 +62,17 @@ public class TransactionWithBundleParamTest {
Patient p1 = new Patient();
p1.addName().addFamily("Family1");
BundleEntry entry = b.addEntry();
entry.getId().setValue("1");
p1.getId().setValue("1");
entry.setResource(p1);
Patient p2 = new Patient();
p2.addName().addFamily("Family2");
entry = b.addEntry();
entry.getId().setValue("2");
p2.getId().setValue("2");
entry.setResource(p2);
BundleEntry deletedEntry = b.addEntry();
deletedEntry.setId(new IdDt("Patient/3"));
deletedEntry.setDeletedResourceId(new IdDt("Patient/3"));
deletedEntry.setDeleted(nowInstant);
String bundleString = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(b);
@ -92,17 +92,17 @@ public class TransactionWithBundleParamTest {
assertEquals(3, bundle.size());
BundleEntry entry0 = bundle.getEntries().get(0);
assertEquals("http://localhost:" + ourPort + "/Patient/81", entry0.getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/81/_history/91", entry0.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/81/_history/91", entry0.getLinkSelf().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/1", entry0.getLinkAlternate().getValue());
BundleEntry entry1 = bundle.getEntries().get(1);
assertEquals("http://localhost:" + ourPort + "/Patient/82", entry1.getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/82/_history/92", entry1.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/82/_history/92", entry1.getLinkSelf().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/2", entry1.getLinkAlternate().getValue());
BundleEntry entry2 = bundle.getEntries().get(2);
assertEquals("http://localhost:" + ourPort + "/Patient/3", entry2.getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/3/_history/93", entry2.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/3/_history/93", entry2.getLinkSelf().getValue());
assertEquals(nowInstant.getValueAsString(), entry2.getDeletedAt().getValueAsString());
}
@ -118,17 +118,17 @@ public class TransactionWithBundleParamTest {
Patient p1 = new Patient();
p1.addName().addFamily("Family1");
BundleEntry entry = b.addEntry();
entry.getId().setValue("1");
p1.getId().setValue("1");
entry.setResource(p1);
Patient p2 = new Patient();
p2.addName().addFamily("Family2");
entry = b.addEntry();
entry.getId().setValue("2");
p2.getId().setValue("2");
entry.setResource(p2);
BundleEntry deletedEntry = b.addEntry();
deletedEntry.setId(new IdDt("Patient/3"));
deletedEntry.setDeletedResourceId(new IdDt("Patient/3"));
deletedEntry.setDeleted(nowInstant);
String bundleString = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(b);
@ -151,17 +151,17 @@ public class TransactionWithBundleParamTest {
assertEquals("OperationOutcome (no ID)", bundle.getEntries().get(0).getTitle().getValue());
BundleEntry entry0 = bundle.getEntries().get(1);
assertEquals("http://localhost:" + ourPort + "/Patient/81", entry0.getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/81/_history/91", entry0.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/81/_history/91", entry0.getLinkSelf().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/1", entry0.getLinkAlternate().getValue());
BundleEntry entry1 = bundle.getEntries().get(2);
assertEquals("http://localhost:" + ourPort + "/Patient/82", entry1.getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/82/_history/92", entry1.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/82/_history/92", entry1.getLinkSelf().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/2", entry1.getLinkAlternate().getValue());
BundleEntry entry2 = bundle.getEntries().get(3);
assertEquals("http://localhost:" + ourPort + "/Patient/3", entry2.getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/3/_history/93", entry2.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/3/_history/93", entry2.getLinkSelf().getValue());
assertEquals(nowInstant.getValueAsString(), entry2.getDeletedAt().getValueAsString());
}

View File

@ -204,7 +204,7 @@
<!--<baseResourceName>assessmentdefinition</baseResourceName>-->
<baseResourceName>basic</baseResourceName>
<!--<baseResourceName>binary</baseResourceName>-->
<!--<baseResourceName>bundle</baseResourceName>-->
<baseResourceName>bundle</baseResourceName>
<!--<baseResourceName>careactivity</baseResourceName>-->
<baseResourceName>careplan</baseResourceName>
<baseResourceName>careplan2</baseResourceName>

View File

@ -26,7 +26,7 @@ Copyright (c) 2011+, HL7, Inc
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Generated on Sat, Feb 7, 2015 18:18+0000 for FHIR v0.4.0
Generated on Sat, Feb 14, 2015 16:12-0500 for FHIR v0.4.0
-->
<xs:schema xmlns="http://hl7.org/fhir" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://hl7.org/fhir" elementFormDefault="qualified" version="0.4.0">
<xs:include schemaLocation="alert.xsd"/>
@ -122,6 +122,7 @@ Copyright (c) 2011+, HL7, Inc
<xs:include schemaLocation="specimen.xsd"/>
<xs:include schemaLocation="statusrequest.xsd"/>
<xs:include schemaLocation="statusresponse.xsd"/>
<xs:include schemaLocation="structuredefinition.xsd"/>
<xs:include schemaLocation="subscription.xsd"/>
<xs:include schemaLocation="substance.xsd"/>
<xs:include schemaLocation="supply.xsd"/>

View File

@ -27,7 +27,7 @@
POSSIBILITY OF SUCH DAMAGE.
Generated on Sat, Feb 7, 2015 18:18+0000 for FHIR v0.4.0
Generated on Sat, Feb 14, 2015 16:12-0500 for FHIR v0.4.0
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://hl7.org/fhir" xmlns:xhtml="http://www.w3.org/1999/xhtml" targetNamespace="http://hl7.org/fhir" elementFormDefault="qualified" version="0.4.0">
<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
@ -351,6 +351,7 @@
<xs:element ref="Specimen"/>
<xs:element ref="StatusRequest"/>
<xs:element ref="StatusResponse"/>
<xs:element ref="StructureDefinition"/>
<xs:element ref="Subscription"/>
<xs:element ref="Substance"/>
<xs:element ref="Supply"/>
@ -358,6 +359,7 @@
<xs:element ref="ValueSet"/>
<xs:element ref="VisionClaim"/>
<xs:element ref="VisionPrescription"/>
<xs:element ref="Parameters"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="Extension">
@ -2301,7 +2303,7 @@ P.O. Box number, delivery hints, and similar address information.</xs:documentat
</xs:complexType>
<xs:complexType name="DomainResource">
<xs:annotation>
<xs:documentation></xs:documentation>
<xs:documentation>A resource that includes narrative, extensions, and contained resources.</xs:documentation>
</xs:annotation>
<xs:complexContent>
<xs:extension base="Resource">
@ -2330,6 +2332,41 @@ P.O. Box number, delivery hints, and similar address information.</xs:documentat
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:simpleType name="ExtensionContext-list">
<xs:restriction base="xs:string">
<xs:enumeration value="resource">
<xs:annotation>
<xs:documentation>The context is all elements matching a particular resource element path.</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="datatype">
<xs:annotation>
<xs:documentation>The context is all nodes matching a particular data type element path (root or repeating element) or all elements referencing a particular primitive data type (expressed as the datatype name).</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="mapping">
<xs:annotation>
<xs:documentation>The context is all nodes whose mapping to a specified reference model corresponds to a particular mapping structure. The context identifies the mapping target. The mapping should clearly identify where such an extension could be used.</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="extension">
<xs:annotation>
<xs:documentation>The context is a particular extension from a particular profile. Expressed as uri#name, where uri identifies the profile and #name identifies the extension code.</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="ExtensionContext">
<xs:annotation>
<xs:documentation></xs:documentation>
<xs:documentation>If the element is present, it must have either a @value, an @id, or extensions</xs:documentation>
</xs:annotation>
<xs:complexContent>
<xs:extension base="Element">
<xs:attribute name="value" type="ExtensionContext-list" use="optional"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:simpleType name="DataAbsentReason-list">
<xs:restriction base="xs:string">
<xs:enumeration value="unknown">
@ -2447,7 +2484,7 @@ P.O. Box number, delivery hints, and similar address information.</xs:documentat
<xs:documentation>The value is no longer available</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="nil known">
<xs:enumeration value="nil-known">
<xs:annotation>
<xs:documentation>The are no known applicable values in this context</xs:documentation>
</xs:annotation>
@ -2717,7 +2754,7 @@ P.O. Box number, delivery hints, and similar address information.</xs:documentat
<xs:documentation>The Patient is present for the encounter, however is not currently meeting with a practitioner.</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="in progress">
<xs:enumeration value="in-progress">
<xs:annotation>
<xs:documentation>The Encounter has begun and the patient is present / the practitioner and the patient are meeting.</xs:documentation>
</xs:annotation>
@ -2912,7 +2949,7 @@ P.O. Box number, delivery hints, and similar address information.</xs:documentat
<xs:documentation>The specified property of the code is in the set of codes or concepts specified in the provided value (comma separated list).</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="not in">
<xs:enumeration value="not-in">
<xs:annotation>
<xs:documentation>The specified property of the code is not in the set of codes or concepts specified in the provided value (comma separated list).</xs:documentation>
</xs:annotation>
@ -2942,7 +2979,7 @@ P.O. Box number, delivery hints, and similar address information.</xs:documentat
<xs:documentation>This reference has been superseded by another reference.</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="entered in error">
<xs:enumeration value="entered-in-error">
<xs:annotation>
<xs:documentation>This reference was created in error.</xs:documentation>
</xs:annotation>
@ -3727,6 +3764,11 @@ P.O. Box number, delivery hints, and similar address information.</xs:documentat
<xs:documentation>This resource provides processing status, errors and notes from the processing of a resource.</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="StructureDefinition">
<xs:annotation>
<xs:documentation>A Resource Profile - a statement of use of one or more FHIR Resources. It may include constraints on Resources and Data Types, Terminology Binding Statements and Extension Definitions.</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="Subscription">
<xs:annotation>
<xs:documentation>Todo.</xs:documentation>
@ -4372,6 +4414,11 @@ P.O. Box number, delivery hints, and similar address information.</xs:documentat
<xs:documentation>This resource provides processing status, errors and notes from the processing of a resource.</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="StructureDefinition">
<xs:annotation>
<xs:documentation>A Resource Profile - a statement of use of one or more FHIR Resources. It may include constraints on Resources and Data Types, Terminology Binding Statements and Extension Definitions.</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="Subscription">
<xs:annotation>
<xs:documentation>Todo.</xs:documentation>
@ -4442,7 +4489,7 @@ P.O. Box number, delivery hints, and similar address information.</xs:documentat
<xs:documentation>The composition or document has been modified subsequent to being released as &quot;final&quot;, and is complete and verified by an authorized person.</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="entered in error">
<xs:enumeration value="entered-in-error">
<xs:annotation>
<xs:documentation>The composition or document was originally created/issued in error, and this is an amendment that marks that the entire series should not be considered as valid.</xs:documentation>
</xs:annotation>

View File

@ -94,14 +94,6 @@ public class JsonParserTest {
" }],\n" +
" \"entry\" : [{\n" +
" \"base\" : \"http://foo/fhirBase2\",\n" +
" \"search\" : {\n" +
" \"mode\" : \"match\",\n" +
" \"score\" : 0.123\n" +
" },\n" +
" \"transaction\" : {\n" +
" \"operation\" : \"create\",\n" +
" \"match\" : \"http://foo/Patient?identifier=value\"\n" +
" },\n" +
" \"resource\" : {\n" +
" \"resourceType\" : \"Patient\",\n" +
" \"id\" : \"1\",\n" +
@ -110,7 +102,15 @@ public class JsonParserTest {
" \"lastUpdated\" : \"2001-02-22T11:22:33-05:00\"\n" +
" },\n" +
" \"birthDate\" : \"2012-01-02\"\n" +
" }\n" +
" },\n" +
" \"search\" : {\n" +
" \"mode\" : \"match\",\n" +
" \"score\" : 0.123\n" +
" },\n" +
" \"transaction\" : {\n" +
" \"operation\" : \"create\",\n" +
" \"url\" : \"http://foo/Patient?identifier=value\"\n" +
" }\n" +
" }]\n" +
"}";
//@formatter:on
@ -201,6 +201,48 @@ public class JsonParserTest {
assertEquals(exp, act);
}
@Test
public void testParseAndEncodeBundleNewStyle() throws Exception {
String content = IOUtils.toString(JsonParserTest.class.getResourceAsStream("/bundle-example.json"));
ca.uhn.fhir.model.dstu2.resource.Bundle parsed = ourCtx.newJsonParser().parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, content);
assertEquals("http://example.com/base/Bundle/example/_history/1", parsed.getId().getValue());
assertEquals("1", parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.VERSION));
assertEquals("1", parsed.getId().getVersionIdPart());
assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED));
assertEquals("searchset", parsed.getType());
assertEquals(3, parsed.getTotal().intValue());
assertEquals("http://example.com/base", parsed.getBaseElement().getValueAsString());
assertEquals("https://example.com/base/MedicationPrescription?patient=347&searchId=ff15fd40-ff71-4b48-b366-09c706bed9d0&page=2", parsed.getLink().get(0).getUrlElement().getValueAsString());
assertEquals("https://example.com/base/MedicationPrescription?patient=347&_include=MedicationPrescription.medication", parsed.getLink().get(1).getUrlElement().getValueAsString());
assertEquals(2, parsed.getEntry().size());
MedicationPrescription p = (MedicationPrescription) parsed.getEntry().get(0).getResource();
assertEquals("Patient/347", p.getPatient().getReference().getValue());
assertEquals("2014-08-16T05:31:17Z", ResourceMetadataKeyEnum.UPDATED.get(p).getValueAsString());
assertEquals("http://example.com/base/MedicationPrescription/3123/_history/1", p.getId().getValue());
String reencoded = ourCtx.newJsonParser().setPrettyPrint(true).encodeResourceToString(parsed);
ourLog.info(reencoded);
JsonConfig cfg = new JsonConfig();
JSON expected = JSONSerializer.toJSON(content.trim(), cfg);
JSON actual = JSONSerializer.toJSON(reencoded.trim(), cfg);
String exp = expected.toString().replace("\\r\\n", "\\n"); // .replace("&sect;", "§");
String act = actual.toString().replace("\\r\\n", "\\n");
ourLog.info("Expected: {}", exp);
ourLog.info("Actual : {}", act);
assertEquals(exp, act);
}
@Test
public void testParseAndEncodeNewExtensionFormat() {

View File

@ -85,6 +85,38 @@ public class XmlParserTest {
}
@Test
public void testParseAndEncodeBundleNewStyle() throws Exception {
String content = IOUtils.toString(XmlParserTest.class.getResourceAsStream("/bundle-example.xml"));
ca.uhn.fhir.model.dstu2.resource.Bundle parsed = ourCtx.newXmlParser().parseResource(ca.uhn.fhir.model.dstu2.resource.Bundle.class, content);
assertEquals("http://example.com/base/Bundle/example/_history/1", parsed.getId().getValue());
assertEquals("1", parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.VERSION));
assertEquals(new InstantDt("2014-08-18T01:43:30Z"), parsed.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED));
assertEquals("searchset", parsed.getType());
assertEquals(3, parsed.getTotal().intValue());
assertEquals("http://example.com/base", parsed.getBaseElement().getValueAsString());
assertEquals("https://example.com/base/MedicationPrescription?patient=347&searchId=ff15fd40-ff71-4b48-b366-09c706bed9d0&page=2", parsed.getLink().get(0).getUrlElement().getValueAsString());
assertEquals("https://example.com/base/MedicationPrescription?patient=347&_include=MedicationPrescription.medication", parsed.getLink().get(1).getUrlElement().getValueAsString());
assertEquals(2, parsed.getEntry().size());
assertEquals("http://foo?search", parsed.getEntry().get(0).getTransaction().getUrlElement().getValueAsString());
MedicationPrescription p = (MedicationPrescription) parsed.getEntry().get(0).getResource();
assertEquals("Patient/347", p.getPatient().getReference().getValue());
assertEquals("2014-08-16T05:31:17Z", ResourceMetadataKeyEnum.UPDATED.get(p).getValueAsString());
assertEquals("http://example.com/base/MedicationPrescription/3123/_history/1", p.getId().getValue());
// assertEquals("3123", p.getId().getValue());
String reencoded = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(parsed);
ourLog.info(reencoded);
Diff d = new Diff(new StringReader(content), new StringReader(reencoded));
assertTrue(d.toString(), d.identical());
}
@Test
public void testEncodeAndParseBundleWithoutResourceIds() {
Organization org = new Organization();
@ -144,14 +176,6 @@ public class XmlParserTest {
" </link>\n" +
" <entry>\n" +
" <base value=\"http://foo/fhirBase2\"/>\n" +
" <search>\n" +
" <mode value=\"match\"/>\n" +
" <score value=\"0.123\"/>\n" +
" </search>\n" +
" <transaction>\n" +
" <operation value=\"create\"/>\n" +
" <match value=\"http://foo/Patient?identifier=value\"/>\n" +
" </transaction>\n" +
" <resource>\n" +
" <Patient xmlns=\"http://hl7.org/fhir\">\n" +
" <id value=\"1\"/>\n" +
@ -162,6 +186,14 @@ public class XmlParserTest {
" <birthDate value=\"2012-01-02\"/>\n" +
" </Patient>\n" +
" </resource>\n" +
" <search>\n" +
" <mode value=\"match\"/>\n" +
" <score value=\"0.123\"/>\n" +
" </search>\n" +
" <transaction>\n" +
" <operation value=\"create\"/>\n" +
" <url value=\"http://foo/Patient?identifier=value\"/>\n" +
" </transaction>\n" +
" </entry>\n" +
"</Bundle>";
//@formatter:on

View File

@ -0,0 +1,234 @@
package ca.uhn.fhir.rest.server;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu2.resource.Bundle;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.dstu2.resource.Bundle.Entry;
import ca.uhn.fhir.model.dstu2.resource.OperationOutcome;
import ca.uhn.fhir.model.dstu2.resource.Patient;
import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.InstantDt;
import ca.uhn.fhir.rest.annotation.Transaction;
import ca.uhn.fhir.rest.annotation.TransactionParam;
import ca.uhn.fhir.util.PortUtil;
/**
* Created by dsotnikov on 2/25/2014.
*/
public class TransactionWithBundleResourceParamTest {
private static CloseableHttpClient ourClient;
private static FhirContext ourCtx = new FhirContext();
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(TransactionWithBundleResourceParamTest.class);
private static int ourPort;
private static boolean ourReturnOperationOutcome;
private static Server ourServer;
@Before
public void before() {
ourReturnOperationOutcome = false;
}
@Test
public void testTransaction() throws Exception {
Bundle b = new Bundle();
InstantDt nowInstant = InstantDt.withCurrentTime();
Patient p1 = new Patient();
p1.addName().addFamily("Family1");
Entry entry = b.addEntry();
p1.getId().setValue("1");
entry.setResource(p1);
Patient p2 = new Patient();
p2.addName().addFamily("Family2");
entry = b.addEntry();
p2.getId().setValue("2");
entry.setResource(p2);
Entry deletedEntry = b.addEntry();
deletedEntry.getTransaction().getMethodElement().setDeletedResourceId(new IdDt("Patient/3"));
deletedEntry.setDeleted(nowInstant);
String bundleString = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(b);
ourLog.info(bundleString);
HttpPost httpPost = new HttpPost("http://localhost:" + ourPort + "/");
httpPost.addHeader("Accept", Constants.CT_ATOM_XML + "; pretty=true");
httpPost.setEntity(new StringEntity(bundleString, ContentType.create(Constants.CT_ATOM_XML, "UTF-8")));
HttpResponse status = ourClient.execute(httpPost);
String responseContent = IOUtils.toString(status.getEntity().getContent()); IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
ourLog.info(responseContent);
Bundle bundle = ourCtx.newXmlParser().parseResource(Bundle.class, responseContent);
assertEquals(3, bundle.size());
BundleEntry entry0 = bundle.getEntries().get(0);
assertEquals("http://localhost:" + ourPort + "/Patient/81/_history/91", entry0.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/81/_history/91", entry0.getLinkSelf().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/1", entry0.getLinkAlternate().getValue());
BundleEntry entry1 = bundle.getEntries().get(1);
assertEquals("http://localhost:" + ourPort + "/Patient/82/_history/92", entry1.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/82/_history/92", entry1.getLinkSelf().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/2", entry1.getLinkAlternate().getValue());
BundleEntry entry2 = bundle.getEntries().get(2);
assertEquals("http://localhost:" + ourPort + "/Patient/3/_history/93", entry2.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/3/_history/93", entry2.getLinkSelf().getValue());
assertEquals(nowInstant.getValueAsString(), entry2.getDeletedAt().getValueAsString());
}
@Test
public void testTransactionWithOperationOutcome() throws Exception {
ourReturnOperationOutcome = true;
Bundle b = new Bundle();
InstantDt nowInstant = InstantDt.withCurrentTime();
Patient p1 = new Patient();
p1.addName().addFamily("Family1");
BundleEntry entry = b.addEntry();
p1.getId().setValue("1");
entry.setResource(p1);
Patient p2 = new Patient();
p2.addName().addFamily("Family2");
entry = b.addEntry();
p2.getId().setValue("2");
entry.setResource(p2);
BundleEntry deletedEntry = b.addEntry();
deletedEntry.setDeletedResourceId(new IdDt("Patient/3"));
deletedEntry.setDeleted(nowInstant);
String bundleString = ourCtx.newXmlParser().setPrettyPrint(true).encodeBundleToString(b);
ourLog.info(bundleString);
HttpPost httpPost = new HttpPost("http://localhost:" + ourPort + "/");
httpPost.addHeader("Accept", Constants.CT_ATOM_XML + "; pretty=true");
httpPost.setEntity(new StringEntity(bundleString, ContentType.create(Constants.CT_ATOM_XML, "UTF-8")));
HttpResponse status = ourClient.execute(httpPost);
String responseContent = IOUtils.toString(status.getEntity().getContent()); IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
ourLog.info(responseContent);
Bundle bundle = new FhirContext().newXmlParser().parseBundle(responseContent);
assertEquals(4, bundle.size());
assertEquals(OperationOutcome.class, bundle.getEntries().get(0).getResource().getClass());
assertEquals("OperationOutcome (no ID)", bundle.getEntries().get(0).getTitle().getValue());
BundleEntry entry0 = bundle.getEntries().get(1);
assertEquals("http://localhost:" + ourPort + "/Patient/81/_history/91", entry0.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/81/_history/91", entry0.getLinkSelf().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/1", entry0.getLinkAlternate().getValue());
BundleEntry entry1 = bundle.getEntries().get(2);
assertEquals("http://localhost:" + ourPort + "/Patient/82/_history/92", entry1.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/82/_history/92", entry1.getLinkSelf().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/2", entry1.getLinkAlternate().getValue());
BundleEntry entry2 = bundle.getEntries().get(3);
assertEquals("http://localhost:" + ourPort + "/Patient/3/_history/93", entry2.getResource().getId().getValue());
assertEquals("http://localhost:" + ourPort + "/Patient/3/_history/93", entry2.getLinkSelf().getValue());
assertEquals(nowInstant.getValueAsString(), entry2.getDeletedAt().getValueAsString());
}
@AfterClass
public static void afterClass() throws Exception {
ourServer.stop();
}
@BeforeClass
public static void beforeClass() throws Exception {
ourPort = PortUtil.findFreePort();
ourServer = new Server(ourPort);
DummyProvider patientProvider = new DummyProvider();
RestfulServer server = new RestfulServer();
server.setProviders(patientProvider);
org.eclipse.jetty.servlet.ServletContextHandler proxyHandler = new org.eclipse.jetty.servlet.ServletContextHandler();
proxyHandler.setContextPath("/");
ServletHolder handler = new ServletHolder();
handler.setServlet(server);
proxyHandler.addServlet(handler, "/*");
ourServer.setHandler(proxyHandler);
ourServer.start();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(5000, TimeUnit.MILLISECONDS);
HttpClientBuilder builder = HttpClientBuilder.create();
builder.setConnectionManager(connectionManager);
ourClient = builder.build();
}
/**
* Created by dsotnikov on 2/25/2014.
*/
public static class DummyProvider {
@Transaction
public List<IResource> transaction(@TransactionParam Bundle theResources) {
int index=1;
for (IResource next : theResources.toListOfResources()) {
String newId = "8"+Integer.toString(index);
if (next.getResourceMetadata().containsKey(ResourceMetadataKeyEnum.DELETED_AT)) {
newId = next.getId().getIdPart();
}
next.setId(new IdDt("Patient", newId, "9"+Integer.toString(index)));
index++;
}
List<IResource> retVal = theResources.toListOfResources();
if (ourReturnOperationOutcome) {
retVal = new ArrayList<IResource>();
OperationOutcome oo = new OperationOutcome();
oo.addIssue().setDetails("AAAAA");
retVal.add(oo);
retVal.addAll(theResources.toListOfResources());
}
return retVal;
}
}
}

View File

@ -20,10 +20,6 @@
],
"entry": [
{
"search": {
"mode": "match",
"score": 1
},
"resource": {
"resourceType": "MedicationPrescription",
"id": "3123",
@ -37,15 +33,19 @@
"medication": {
"reference": "Medication/example"
}
},
"search": {
"mode": "match",
"score": 1
}
},
{
"search": {
"mode": "include"
},
"resource": {
"resourceType": "Medication",
"id": "example"
},
"search": {
"mode": "include"
}
}
]

View File

@ -3,7 +3,7 @@
<meta>
<versionId value="1"/>
<lastUpdated value="2014-08-18T01:43:30Z"/>
</meta>
</meta>
<type value="searchset"/>
<base value="http://example.com/base"/>
<total value="3"/>
@ -16,13 +16,6 @@
<url value="https://example.com/base/MedicationPrescription?patient=347&amp;_include=MedicationPrescription.medication"/>
</link>
<entry>
<search>
<mode value="match"/>
<score value="1"/>
</search>
<transaction>
<match value="http://foo?search"/>
</transaction>
<resource>
<MedicationPrescription>
<id value="3123"/>
@ -38,15 +31,22 @@
</medication>
</MedicationPrescription>
</resource>
<search>
<mode value="match"/>
<score value="1"/>
</search>
<transaction>
<url value="http://foo?search"/>
</transaction>
</entry>
<entry>
<search>
<mode value="include"/>
</search>
<resource>
<Medication>
<id value="example"/>
</Medication>
</resource>
<search>
<mode value="include"/>
</search>
</entry>
</Bundle>

View File

@ -13,6 +13,7 @@
</attributes>
</classpathentry>
<classpathentry kind="src" path="src/main/resources"/>
<classpathentry kind="src" path="src/test/resources"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes>
<attribute name="maven.pomderived" value="true"/>

View File

@ -40,12 +40,13 @@ import org.hl7.fhir.instance.model.annotations.Child;
import org.hl7.fhir.instance.model.annotations.Description;
import org.hl7.fhir.instance.model.annotations.ResourceDef;
import org.hl7.fhir.instance.model.annotations.SearchParamDefinition;
import org.hl7.fhir.instance.model.api.IBaseBundle;
import org.hl7.fhir.utilities.Utilities;
/**
* A container for a group of resources.
*/
@ResourceDef(name="Bundle", profile="http://hl7.org/fhir/Profile/Bundle")
public class Bundle extends Resource {
public class Bundle extends Resource implements IBaseBundle {
public enum BundleType {
/**

View File

@ -0,0 +1,52 @@
<Bundle xmlns="http://hl7.org/fhir">
<id value="example"/>
<meta>
<versionId value="1"/>
<lastUpdated value="2014-08-18T01:43:30Z"/>
</meta>
<type value="searchset"/>
<base value="http://example.com/base"/>
<total value="3"/>
<link>
<relation value="next"/>
<url value="https://example.com/base/MedicationPrescription?patient=347&amp;searchId=ff15fd40-ff71-4b48-b366-09c706bed9d0&amp;page=2"/>
</link>
<link>
<relation value="self"/>
<url value="https://example.com/base/MedicationPrescription?patient=347&amp;_include=MedicationPrescription.medication"/>
</link>
<entry>
<resource>
<MedicationPrescription>
<id value="3123"/>
<meta>
<versionId value="1"/>
<lastUpdated value="2014-08-16T05:31:17Z"/>
</meta>
<patient>
<reference value="Patient/347"/>
</patient>
<medication>
<reference value="Medication/example"/>
</medication>
</MedicationPrescription>
</resource>
<search>
<mode value="match"/>
<score value="1"/>
</search>
<transaction>
<url value="http://foo?search"/>
</transaction>
</entry>
<entry>
<resource>
<Medication>
<id value="example"/>
</Medication>
</resource>
<search>
<mode value="include"/>
</search>
</entry>
</Bundle>

View File

@ -92,6 +92,9 @@ public class TinderJpaRestServerMojo extends AbstractMojo {
}
for (String next : keys) {
if (next.startsWith("resource.")) {
if (next.endsWith(".Bundle")) {
continue;
}
baseResourceNames.add(next.substring("resource.".length()).toLowerCase());
}
}

View File

@ -91,7 +91,7 @@ public abstract class BaseElement {
return toStringConstant(myDefinition);
}
private String toStringConstant(String theDefinition) {
static String toStringConstant(String theDefinition) {
if (theDefinition == null) {
return "";
}

View File

@ -129,6 +129,11 @@ public abstract class Child extends BaseElement {
// } else {
// retVal = (elemName + getTypeSuffix());
// }
if (retVal.equals("ResourceDt")) {
retVal = "IResource";
}
return retVal;
}

View File

@ -40,7 +40,7 @@ public class SearchParameter {
}
public String getDescription() {
return StringUtils.defaultString(myDescription);
return BaseElement.toStringConstant(myDescription);
}
public String getFluentConstantName() {

View File

@ -217,6 +217,9 @@ public abstract class BaseStructureParser {
// if ("ResourceReferenceDt".equals(theNextType)) {
// return "ca.uhn.fhir.model." + myVersion + ".composite." + ResourceReferenceDt.class.getSimpleName();
// }
if ("ResourceDt".equals(theNextType)) {
return IResource.class.getCanonicalName();
}
if ("Binary".equals(theNextType)) {
return "ca.uhn.fhir.model." + myVersion + ".resource." + Binary.class.getSimpleName();
}

View File

@ -102,6 +102,7 @@ public class DatatypeGeneratorUsingSpreadsheet extends BaseStructureSpreadsheetP
}
if (!version.equals("dstu")) {
retVal.add(("/dt/" + version + "/meta.xml"));
retVal.add(("/dt/" + version + "/attachment.xml"));
retVal.add(("/dt/" + version + "/contactpoint.xml"));
retVal.add(("/dt/" + version + "/elementdefinition.xml"));

View File

@ -15,7 +15,8 @@ import ca.uhn.fhir.rest.annotation.*;
import ca.uhn.fhir.rest.param.*;
import ca.uhn.fhir.rest.api.SortSpec;
import ca.uhn.fhir.model.dstu.resource.Binary;
// import ca.uhn.fhir.model.dstu2.resource.Bundle;
import ca.uhn.fhir.model.api.Bundle;
public class ${className}ResourceProvider extends JpaResourceProvider<${className}> {

View File

@ -40,7 +40,10 @@ import ${import};
*/
@ResourceDef(name="${elementName}", profile="${profile}", id="${id}")
public class ${className} extends ca.uhn.fhir.model.${version}.resource.BaseResource
implements #{if}( ${className}=="OperationOutcome" || ${className}=="Conformance" || ${className}=="SecurityEvent" ) ca.uhn.fhir.model.base.resource.Base${className} #{else} IResource #{end}
implements #{if}( ${className}=="OperationOutcome" || ${className}=="Conformance" || ${className}=="SecurityEvent" ) ca.uhn.fhir.model.base.resource.Base${className} #{else} IResource #{end}
#if ( ${className} == "Bundle" )
, org.hl7.fhir.instance.model.api.IBaseBundle
#end
{
#foreach ( $param in $searchParams )

View File

@ -51,7 +51,20 @@
}
#foreach ( $child in $childElements )
#if ( $child.primitive && $child.repeatable == false )
#if ( $child.referenceType == 'IResource' )
/**
* Gets the value(s) for <b>${child.elementName}</b> ($esc.html(${child.shortName})).
*
* <p>
* <b>Definition:</b>
* $esc.html(${child.definition})
* </p>
*/
public ${child.referenceType} get${child.methodName}() {
return ${child.variableName};
}
#elseif ( $child.primitive && $child.repeatable == false )
/**
* Gets the value(s) for <b>${child.elementName}</b> ($esc.html(${child.shortName})).
* creating it if it does

View File

@ -714,6 +714,7 @@
<module>hapi-fhir-structures-dstu2</module>
<module>hapi-fhir-structures-dev</module>
<module>hapi-fhir-jpaserver-base</module>
<module>hapi-fhir-jpaserver-example</module>
<module>restful-server-example</module>
<module>restful-server-example-test</module>
<module>hapi-fhir-testpage-overlay</module>