Work on operation support in client

This commit is contained in:
jamesagnew 2015-03-04 08:44:31 -05:00
parent 533339c92c
commit b68d07b546
29 changed files with 471 additions and 266 deletions

View File

@ -3,6 +3,8 @@ package example;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.omg.Dynamic.Parameter;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.Bundle; import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
@ -12,11 +14,17 @@ import ca.uhn.fhir.model.dstu2.valueset.AdministrativeGenderEnum;
import ca.uhn.fhir.model.dstu2.resource.Observation; import ca.uhn.fhir.model.dstu2.resource.Observation;
import ca.uhn.fhir.model.dstu2.resource.OperationOutcome; import ca.uhn.fhir.model.dstu2.resource.OperationOutcome;
import ca.uhn.fhir.model.dstu2.resource.Organization; import ca.uhn.fhir.model.dstu2.resource.Organization;
import ca.uhn.fhir.model.dstu2.resource.Parameters;
import ca.uhn.fhir.model.dstu2.resource.Patient; import ca.uhn.fhir.model.dstu2.resource.Patient;
import ca.uhn.fhir.model.dstu2.resource.ValueSet;
import ca.uhn.fhir.model.primitive.CodeDt;
import ca.uhn.fhir.model.primitive.DateDt;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.InstantDt; import ca.uhn.fhir.model.primitive.InstantDt;
import ca.uhn.fhir.model.primitive.UriDt;
import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.api.MethodOutcome;
import ca.uhn.fhir.rest.client.IGenericClient; import ca.uhn.fhir.rest.client.IGenericClient;
import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor;
import ca.uhn.fhir.rest.method.SearchStyleEnum; import ca.uhn.fhir.rest.method.SearchStyleEnum;
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException; import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
@ -359,7 +367,28 @@ public class GenericClientExample {
} }
public static void main(String[] args) { public static void main(String[] args) {
fluentSearch(); operation();
}
@SuppressWarnings("unused")
private static void operation() {
// START SNIPPET: operation
// Create a client to talk to the HeathIntersections server
FhirContext ctx = FhirContext.forDstu2();
IGenericClient client = ctx.newRestfulGenericClient("http://fhir-dev.healthintersections.com.au/open");
client.registerInterceptor(new LoggingInterceptor(true));
Parameters inParams = new Parameters();
inParams.addParameter().setName("start").setValue(new DateDt("2001-01-01"));
inParams.addParameter().setName("end").setValue(new DateDt("2015-03-01"));
Parameters outParams = client
.operation()
.ofInstance(new IdDt("Patient", "1"))
.named("$everything")
.withParameters(inParams)
.execute();
// END SNIPPET: operation
} }
} }

View File

@ -0,0 +1,16 @@
<configuration scan="true" scanPeriod="30 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%file:%line] %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>

View File

@ -51,11 +51,13 @@ import javax.json.stream.JsonParsingException;
import ca.uhn.fhir.model.base.composite.BaseCodingDt; import ca.uhn.fhir.model.base.composite.BaseCodingDt;
import ca.uhn.fhir.model.primitive.*; import ca.uhn.fhir.model.primitive.*;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.Validate;
import org.hl7.fhir.instance.model.IBase; import org.hl7.fhir.instance.model.IBase;
import org.hl7.fhir.instance.model.IBaseResource; import org.hl7.fhir.instance.model.IBaseResource;
import org.hl7.fhir.instance.model.IPrimitiveType; import org.hl7.fhir.instance.model.IPrimitiveType;
import org.hl7.fhir.instance.model.api.IBaseBinary;
import org.hl7.fhir.instance.model.api.IAnyResource; import org.hl7.fhir.instance.model.api.IAnyResource;
import org.hl7.fhir.instance.model.api.IBaseBooleanDatatype; import org.hl7.fhir.instance.model.api.IBaseBooleanDatatype;
import org.hl7.fhir.instance.model.api.IBaseDatatype; import org.hl7.fhir.instance.model.api.IBaseDatatype;
@ -92,7 +94,6 @@ import ca.uhn.fhir.model.api.annotation.Child;
import ca.uhn.fhir.model.base.composite.BaseContainedDt; import ca.uhn.fhir.model.base.composite.BaseContainedDt;
import ca.uhn.fhir.model.base.composite.BaseNarrativeDt; import ca.uhn.fhir.model.base.composite.BaseNarrativeDt;
import ca.uhn.fhir.model.base.composite.BaseResourceReferenceDt; import ca.uhn.fhir.model.base.composite.BaseResourceReferenceDt;
import ca.uhn.fhir.model.base.resource.BaseBinary;
import ca.uhn.fhir.model.primitive.DecimalDt; import ca.uhn.fhir.model.primitive.DecimalDt;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.IntegerDt; import ca.uhn.fhir.model.primitive.IntegerDt;
@ -693,8 +694,8 @@ public class JsonParser extends BaseParser implements IParser {
} }
} }
if (theResource instanceof BaseBinary) { if (theResource instanceof IBaseBinary) {
BaseBinary bin = (BaseBinary) theResource; IBaseBinary bin = (IBaseBinary) theResource;
theEventWriter.write("contentType", bin.getContentType()); theEventWriter.write("contentType", bin.getContentType());
theEventWriter.write("content", bin.getContentAsBase64()); theEventWriter.write("content", bin.getContentAsBase64());
} else { } else {

View File

@ -38,6 +38,7 @@ import org.hl7.fhir.instance.model.IBase;
import org.hl7.fhir.instance.model.IBaseResource; import org.hl7.fhir.instance.model.IBaseResource;
import org.hl7.fhir.instance.model.ICompositeType; import org.hl7.fhir.instance.model.ICompositeType;
import org.hl7.fhir.instance.model.IPrimitiveType; import org.hl7.fhir.instance.model.IPrimitiveType;
import org.hl7.fhir.instance.model.api.IBaseBinary;
import org.hl7.fhir.instance.model.api.IAnyResource; import org.hl7.fhir.instance.model.api.IAnyResource;
import org.hl7.fhir.instance.model.api.IBaseDatatype; import org.hl7.fhir.instance.model.api.IBaseDatatype;
import org.hl7.fhir.instance.model.api.IBaseElement; import org.hl7.fhir.instance.model.api.IBaseElement;
@ -74,7 +75,6 @@ import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.api.Tag; import ca.uhn.fhir.model.api.Tag;
import ca.uhn.fhir.model.api.TagList; import ca.uhn.fhir.model.api.TagList;
import ca.uhn.fhir.model.base.composite.BaseResourceReferenceDt; import ca.uhn.fhir.model.base.composite.BaseResourceReferenceDt;
import ca.uhn.fhir.model.base.resource.BaseBinary;
import ca.uhn.fhir.model.base.resource.ResourceMetadataMap; import ca.uhn.fhir.model.base.resource.ResourceMetadataMap;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.InstantDt; import ca.uhn.fhir.model.primitive.InstantDt;
@ -886,10 +886,10 @@ class ParserState<T> {
private static final int SUBSTATE_CONTENT = 2; private static final int SUBSTATE_CONTENT = 2;
private static final int SUBSTATE_CT = 1; private static final int SUBSTATE_CT = 1;
private String myData; private String myData;
private BaseBinary myInstance; private IBaseBinary myInstance;
private int mySubState = 0; private int mySubState = 0;
public BinaryResourceStateForDstu1(PreResourceState thePreResourceState, BaseBinary theInstance) { public BinaryResourceStateForDstu1(PreResourceState thePreResourceState, IBaseBinary theInstance) {
super(thePreResourceState); super(thePreResourceState);
myInstance = theInstance; myInstance = theInstance;
} }
@ -900,7 +900,7 @@ class ParserState<T> {
if (myInstance instanceof IIdentifiableElement) { if (myInstance instanceof IIdentifiableElement) {
((IIdentifiableElement) myInstance).setElementSpecificId((theValue)); ((IIdentifiableElement) myInstance).setElementSpecificId((theValue));
} else { } else {
(myInstance).setId(new IdDt(theValue)); ((IResource)myInstance).setId(new IdDt(theValue));
} }
} else if ("contentType".equals(theName)) { } else if ("contentType".equals(theName)) {
myInstance.setContentType(theValue); myInstance.setContentType(theValue);
@ -1923,7 +1923,7 @@ class ParserState<T> {
String resourceName = def.getName(); String resourceName = def.getName();
if ("Binary".equals(resourceName) && myContext.getVersion().getVersion() == FhirVersionEnum.DSTU1) { if ("Binary".equals(resourceName) && myContext.getVersion().getVersion() == FhirVersionEnum.DSTU1) {
push(new BinaryResourceStateForDstu1(getRootPreResourceState(), (BaseBinary) myInstance)); push(new BinaryResourceStateForDstu1(getRootPreResourceState(), (IBaseBinary) myInstance));
} else if (myInstance instanceof IResource) { } else if (myInstance instanceof IResource) {
push(new ResourceStateHapi(getRootPreResourceState(), def, (IResource) myInstance)); push(new ResourceStateHapi(getRootPreResourceState(), def, (IResource) myInstance));
} else { } else {

View File

@ -49,6 +49,7 @@ import org.apache.commons.lang3.StringUtils;
import org.hl7.fhir.instance.model.IBase; import org.hl7.fhir.instance.model.IBase;
import org.hl7.fhir.instance.model.IBaseResource; import org.hl7.fhir.instance.model.IBaseResource;
import org.hl7.fhir.instance.model.IPrimitiveType; import org.hl7.fhir.instance.model.IPrimitiveType;
import org.hl7.fhir.instance.model.api.IBaseBinary;
import org.hl7.fhir.instance.model.api.IAnyResource; import org.hl7.fhir.instance.model.api.IAnyResource;
import org.hl7.fhir.instance.model.api.IBaseDatatype; import org.hl7.fhir.instance.model.api.IBaseDatatype;
import org.hl7.fhir.instance.model.api.IBaseExtension; import org.hl7.fhir.instance.model.api.IBaseExtension;
@ -79,7 +80,6 @@ import ca.uhn.fhir.model.base.composite.BaseCodingDt;
import ca.uhn.fhir.model.base.composite.BaseContainedDt; import ca.uhn.fhir.model.base.composite.BaseContainedDt;
import ca.uhn.fhir.model.base.composite.BaseNarrativeDt; import ca.uhn.fhir.model.base.composite.BaseNarrativeDt;
import ca.uhn.fhir.model.base.composite.BaseResourceReferenceDt; import ca.uhn.fhir.model.base.composite.BaseResourceReferenceDt;
import ca.uhn.fhir.model.base.resource.BaseBinary;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.InstantDt; import ca.uhn.fhir.model.primitive.InstantDt;
import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.model.primitive.StringDt;
@ -766,8 +766,8 @@ public class XmlParser extends BaseParser implements IParser {
theEventWriter.writeEndElement(); theEventWriter.writeEndElement();
} }
if (theResource instanceof BaseBinary) { if (theResource instanceof IBaseBinary) {
BaseBinary bin = (BaseBinary) theResource; IBaseBinary bin = (IBaseBinary) theResource;
writeOptionalTagWithValue(theEventWriter, "contentType", bin.getContentType()); writeOptionalTagWithValue(theEventWriter, "contentType", bin.getContentType());
writeOptionalTagWithValue(theEventWriter, "content", bin.getContentAsBase64()); writeOptionalTagWithValue(theEventWriter, "content", bin.getContentAsBase64());
} else { } else {
@ -781,8 +781,8 @@ public class XmlParser extends BaseParser implements IParser {
theEventWriter.writeAttribute("id", theResourceId); theEventWriter.writeAttribute("id", theResourceId);
} }
if (theResource instanceof BaseBinary) { if (theResource instanceof IBaseBinary) {
BaseBinary bin = (BaseBinary) theResource; IBaseBinary bin = (IBaseBinary) theResource;
if (bin.getContentType() != null) { if (bin.getContentType() != null) {
theEventWriter.writeAttribute("contentType", bin.getContentType()); theEventWriter.writeAttribute("contentType", bin.getContentType());
} }

View File

@ -20,8 +20,7 @@ package ca.uhn.fhir.rest.client;
* #L% * #L%
*/ */
import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.*;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
@ -39,6 +38,7 @@ import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.methods.HttpRequestBase;
import org.hl7.fhir.instance.model.IBaseResource; import org.hl7.fhir.instance.model.IBaseResource;
import org.hl7.fhir.instance.model.api.IBaseBundle; import org.hl7.fhir.instance.model.api.IBaseBundle;
import org.hl7.fhir.instance.model.api.IBaseParameters;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.context.FhirVersionEnum;
@ -76,6 +76,9 @@ import ca.uhn.fhir.rest.gclient.IHistory;
import ca.uhn.fhir.rest.gclient.IHistoryTyped; import ca.uhn.fhir.rest.gclient.IHistoryTyped;
import ca.uhn.fhir.rest.gclient.IHistoryUntyped; import ca.uhn.fhir.rest.gclient.IHistoryUntyped;
import ca.uhn.fhir.rest.gclient.IOperation; import ca.uhn.fhir.rest.gclient.IOperation;
import ca.uhn.fhir.rest.gclient.IOperationUnnamed;
import ca.uhn.fhir.rest.gclient.IOperationUntyped;
import ca.uhn.fhir.rest.gclient.IOperationUntypedWithInput;
import ca.uhn.fhir.rest.gclient.IParam; import ca.uhn.fhir.rest.gclient.IParam;
import ca.uhn.fhir.rest.gclient.IQuery; import ca.uhn.fhir.rest.gclient.IQuery;
import ca.uhn.fhir.rest.gclient.IRead; import ca.uhn.fhir.rest.gclient.IRead;
@ -95,9 +98,11 @@ import ca.uhn.fhir.rest.method.DeleteMethodBinding;
import ca.uhn.fhir.rest.method.HistoryMethodBinding; import ca.uhn.fhir.rest.method.HistoryMethodBinding;
import ca.uhn.fhir.rest.method.HttpDeleteClientInvocation; import ca.uhn.fhir.rest.method.HttpDeleteClientInvocation;
import ca.uhn.fhir.rest.method.HttpGetClientInvocation; import ca.uhn.fhir.rest.method.HttpGetClientInvocation;
import ca.uhn.fhir.rest.method.HttpPostClientInvocation;
import ca.uhn.fhir.rest.method.HttpSimpleGetClientInvocation; import ca.uhn.fhir.rest.method.HttpSimpleGetClientInvocation;
import ca.uhn.fhir.rest.method.IClientResponseHandler; import ca.uhn.fhir.rest.method.IClientResponseHandler;
import ca.uhn.fhir.rest.method.MethodUtil; import ca.uhn.fhir.rest.method.MethodUtil;
import ca.uhn.fhir.rest.method.OperationMethodBinding;
import ca.uhn.fhir.rest.method.ReadMethodBinding; import ca.uhn.fhir.rest.method.ReadMethodBinding;
import ca.uhn.fhir.rest.method.SearchMethodBinding; import ca.uhn.fhir.rest.method.SearchMethodBinding;
import ca.uhn.fhir.rest.method.SearchStyleEnum; import ca.uhn.fhir.rest.method.SearchStyleEnum;
@ -117,6 +122,72 @@ import ca.uhn.fhir.util.ICallable;
*/ */
public class GenericClient extends BaseClient implements IGenericClient { public class GenericClient extends BaseClient implements IGenericClient {
@SuppressWarnings("rawtypes")
public class OperationInternal extends BaseClientExecutable implements IOperation, IOperationUnnamed, IOperationUntyped, IOperationUntypedWithInput {
private IdDt myId;
private Class<? extends IBaseResource> myType;
private IBaseParameters myParameters;
private String myOperationName;
@Override
public IOperationUnnamed ofServer() {
return this;
}
@Override
public IOperationUnnamed ofType(Class<? extends IBaseResource> theResourceType) {
myType = theResourceType;
return this;
}
@Override
public IOperationUnnamed ofInstance(IdDt theId) {
myId = theId;
return this;
}
@SuppressWarnings({ "unchecked" })
@Override
public IOperationUntypedWithInput withParameters(IBaseParameters theParameters) {
Validate.notNull(theParameters, "theParameters can not be null");
myParameters = theParameters;
return this;
}
@SuppressWarnings("unchecked")
@Override
public Object execute() {
String resourceName;
String id;
if (myType != null) {
resourceName = myContext.getResourceDefinition(myType).getName();
id = null;
} else if (myId != null) {
resourceName = myId.getResourceType();
id = myId.getIdPart();
} else {
resourceName = null;
id = null;
}
HttpPostClientInvocation invocation = OperationMethodBinding.createOperationInvocation(myContext, resourceName, id, myOperationName, myParameters);
IClientResponseHandler handler;
handler = new ResourceResponseHandler(myParameters.getClass(), null);
return invoke(null, handler, invocation);
}
@Override
public IOperationUntyped named(String theName) {
Validate.notBlank(theName, "theName can not be null");
myOperationName =theName;
return this;
}
}
private static final String I18N_CANNOT_DETEMINE_RESOURCE_TYPE = "ca.uhn.fhir.rest.client.GenericClient.cannotDetermineResourceTypeFromUri"; private static final String I18N_CANNOT_DETEMINE_RESOURCE_TYPE = "ca.uhn.fhir.rest.client.GenericClient.cannotDetermineResourceTypeFromUri";
private static final String I18N_INCOMPLETE_URI_FOR_READ = "ca.uhn.fhir.rest.client.GenericClient.incompleteUriForRead"; private static final String I18N_INCOMPLETE_URI_FOR_READ = "ca.uhn.fhir.rest.client.GenericClient.incompleteUriForRead";
@ -340,8 +411,7 @@ public class GenericClient extends BaseClient implements IGenericClient {
@Override @Override
public IOperation operation() { public IOperation operation() {
// TODO Auto-generated method stub return new OperationInternal();
return null;
} }
@Override @Override

View File

@ -34,9 +34,7 @@ import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.UriDt; import ca.uhn.fhir.model.primitive.UriDt;
import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.api.MethodOutcome;
import ca.uhn.fhir.rest.client.api.IRestfulClient; import ca.uhn.fhir.rest.client.api.IRestfulClient;
import ca.uhn.fhir.rest.gclient.IClientExecutable;
import ca.uhn.fhir.rest.gclient.ICreate; import ca.uhn.fhir.rest.gclient.ICreate;
import ca.uhn.fhir.rest.gclient.ICreateTyped;
import ca.uhn.fhir.rest.gclient.IDelete; import ca.uhn.fhir.rest.gclient.IDelete;
import ca.uhn.fhir.rest.gclient.IGetPage; import ca.uhn.fhir.rest.gclient.IGetPage;
import ca.uhn.fhir.rest.gclient.IGetTags; import ca.uhn.fhir.rest.gclient.IGetTags;

View File

@ -1,6 +1,6 @@
package ca.uhn.fhir.rest.gclient; package ca.uhn.fhir.rest.gclient;
public interface IOperation { public interface IOperation extends IBaseOn<IOperationUnnamed> {

View File

@ -0,0 +1,8 @@
package ca.uhn.fhir.rest.gclient;
public interface IOperationUnnamed {
IOperationUntyped named(String theName);
}

View File

@ -0,0 +1,9 @@
package ca.uhn.fhir.rest.gclient;
import org.hl7.fhir.instance.model.api.IBaseParameters;
public interface IOperationUntyped {
<T extends IBaseParameters> IOperationUntypedWithInput<T> withParameters(T theParameters);
}

View File

@ -0,0 +1,7 @@
package ca.uhn.fhir.rest.gclient;
import org.hl7.fhir.instance.model.api.IBaseParameters;
public interface IOperationUntypedWithInput<T extends IBaseParameters> extends IClientExecutable<IOperationUntypedWithInput<T>, T> {
}

View File

@ -20,10 +20,6 @@ package ca.uhn.fhir.rest.method;
* #L% * #L%
*/ */
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -36,16 +32,14 @@ import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.AbstractHttpEntity; import org.apache.http.entity.AbstractHttpEntity;
import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicNameValuePair; import org.apache.http.message.BasicNameValuePair;
import org.hl7.fhir.instance.model.IBaseResource; import org.hl7.fhir.instance.model.IBaseResource;
import org.hl7.fhir.instance.model.api.IBaseBinary;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.Bundle; import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.TagList; import ca.uhn.fhir.model.api.TagList;
import ca.uhn.fhir.model.base.resource.BaseBinary;
import ca.uhn.fhir.model.valueset.BundleTypeEnum; import ca.uhn.fhir.model.valueset.BundleTypeEnum;
import ca.uhn.fhir.parser.DataFormatException; import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.parser.IParser; import ca.uhn.fhir.parser.IParser;
@ -69,7 +63,7 @@ abstract class BaseHttpClientInvocationWithContents extends BaseHttpClientInvoca
private Map<String, List<String>> myIfNoneExistParams; private Map<String, List<String>> myIfNoneExistParams;
private String myIfNoneExistString; private String myIfNoneExistString;
private Map<String, List<String>> myParams; private Map<String, List<String>> myParams;
private final IResource myResource; private final IBaseResource myResource;
private final List<IResource> myResources; private final List<IResource> myResources;
private final TagList myTagList; private final TagList myTagList;
private final String myUrlPath; private final String myUrlPath;
@ -85,7 +79,7 @@ abstract class BaseHttpClientInvocationWithContents extends BaseHttpClientInvoca
myBundleType = null; myBundleType = null;
} }
public BaseHttpClientInvocationWithContents(FhirContext theContext, IResource theResource, Map<String, List<String>> theParams, String... theUrlPath) { public BaseHttpClientInvocationWithContents(FhirContext theContext, IBaseResource theResource, Map<String, List<String>> theParams, String... theUrlPath) {
myContext = theContext; myContext = theContext;
myResource = theResource; myResource = theResource;
myTagList = null; myTagList = null;
@ -98,7 +92,7 @@ abstract class BaseHttpClientInvocationWithContents extends BaseHttpClientInvoca
myBundleType = null; myBundleType = null;
} }
public BaseHttpClientInvocationWithContents(FhirContext theContext, IResource theResource, String theUrlPath) { public BaseHttpClientInvocationWithContents(FhirContext theContext, IBaseResource theResource, String theUrlPath) {
super(); super();
myContext = theContext; myContext = theContext;
myResource = theResource; myResource = theResource;
@ -209,8 +203,8 @@ abstract class BaseHttpClientInvocationWithContents extends BaseHttpClientInvoca
appendExtraParamsWithQuestionMark(theExtraParams, url, url.indexOf("?") == -1); appendExtraParamsWithQuestionMark(theExtraParams, url, url.indexOf("?") == -1);
if (myResource != null && BaseBinary.class.isAssignableFrom(myResource.getClass())) { if (myResource != null && IBaseBinary.class.isAssignableFrom(myResource.getClass())) {
BaseBinary binary = (BaseBinary) myResource; IBaseBinary binary = (IBaseBinary) myResource;
/* /*
* Note: Be careful about changing which constructor we use for ByteArrayEntity, * Note: Be careful about changing which constructor we use for ByteArrayEntity,

View File

@ -26,11 +26,11 @@ import java.lang.reflect.Modifier;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.hl7.fhir.instance.model.IBaseResource; import org.hl7.fhir.instance.model.IBaseResource;
import org.hl7.fhir.instance.model.api.IBaseBinary;
import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.base.resource.BaseBinary;
import ca.uhn.fhir.rest.annotation.ResourceParam; import ca.uhn.fhir.rest.annotation.ResourceParam;
import ca.uhn.fhir.rest.client.BaseHttpClientInvocation; import ca.uhn.fhir.rest.client.BaseHttpClientInvocation;
import ca.uhn.fhir.rest.param.ResourceParameter; import ca.uhn.fhir.rest.param.ResourceParameter;
@ -64,7 +64,7 @@ abstract class BaseOutcomeReturningMethodBindingWithResourceParam extends BaseOu
providerResourceType = ((IResourceProvider) theProvider).getResourceType(); providerResourceType = ((IResourceProvider) theProvider).getResourceType();
} }
if (BaseBinary.class.isAssignableFrom(providerResourceType)) { if (IBaseBinary.class.isAssignableFrom(providerResourceType)) {
myBinary = true; myBinary = true;
} }
@ -99,11 +99,11 @@ abstract class BaseOutcomeReturningMethodBindingWithResourceParam extends BaseOu
String ct = theRequest.getServletRequest().getHeader(Constants.HEADER_CONTENT_TYPE); String ct = theRequest.getServletRequest().getHeader(Constants.HEADER_CONTENT_TYPE);
byte[] contents = IOUtils.toByteArray(theRequest.getServletRequest().getInputStream()); byte[] contents = IOUtils.toByteArray(theRequest.getServletRequest().getInputStream());
BaseBinary binary = (BaseBinary) getContext().getResourceDefinition("Binary").newInstance(); IBaseBinary binary = (IBaseBinary) getContext().getResourceDefinition("Binary").newInstance();
binary.setContentType(ct); binary.setContentType(ct);
binary.setContent(contents); binary.setContent(contents);
return binary; return (IResource) binary;
} else { } else {
return super.parseIncomingServerResource(theRequest); return super.parseIncomingServerResource(theRequest);
} }

View File

@ -96,6 +96,11 @@ public class HistoryMethodBinding extends BaseResourceReturningMethodBinding {
return myResourceOperationType; return myResourceOperationType;
} }
@Override
protected BundleTypeEnum getResponseBundleType() {
return BundleTypeEnum.HISTORY;
}
@Override @Override
public ReturnTypeEnum getReturnType() { public ReturnTypeEnum getReturnType() {
return ReturnTypeEnum.BUNDLE; return ReturnTypeEnum.BUNDLE;
@ -106,110 +111,6 @@ public class HistoryMethodBinding extends BaseResourceReturningMethodBinding {
return mySystemOperationType; return mySystemOperationType;
} }
@Override
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
IdDt id = null;
String resourceName = myResourceName;
if (myIdParamIndex != null) {
id = (IdDt) theArgs[myIdParamIndex];
if (id == null || isBlank(id.getValue())) {
throw new NullPointerException("ID can not be null");
}
}
String historyId = id != null ? id.getIdPart() : null;
HttpGetClientInvocation retVal = createHistoryInvocation(resourceName, historyId, null, null);
if (theArgs != null) {
for (int idx = 0; idx < theArgs.length; idx++) {
IParameter nextParam = getParameters().get(idx);
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], retVal.getParameters());
}
}
return retVal;
}
@Override
protected BundleTypeEnum getResponseBundleType() {
return BundleTypeEnum.HISTORY;
}
public static HttpGetClientInvocation createHistoryInvocation(String theResourceName, String theId, BaseDateTimeDt theSince, Integer theLimit) {
StringBuilder b = new StringBuilder();
if (theResourceName != null) {
b.append(theResourceName);
if (isNotBlank(theId)) {
b.append('/');
b.append(theId);
}
}
if (b.length() > 0) {
b.append('/');
}
b.append(Constants.PARAM_HISTORY);
boolean haveParam = false;
if (theSince != null && !theSince.isEmpty()) {
haveParam = true;
b.append('?').append(Constants.PARAM_SINCE).append('=').append(theSince.getValueAsString());
}
if (theLimit != null) {
b.append(haveParam ? '&' : '?');
b.append(Constants.PARAM_COUNT).append('=').append(theLimit);
}
HttpGetClientInvocation retVal = new HttpGetClientInvocation(b.toString());
return retVal;
}
@Override
public IBundleProvider invokeServer(RequestDetails theRequest, Object[] theMethodParams) throws InvalidRequestException, InternalErrorException {
if (myIdParamIndex != null) {
theMethodParams[myIdParamIndex] = theRequest.getId();
}
Object response = invokeServerMethod(theMethodParams);
final IBundleProvider resources = toResourceList(response);
/*
* We wrap the response so we can verify that it has the ID and version set,
* as is the contract for history
*/
return new IBundleProvider() {
@Override
public int size() {
return resources.size();
}
@Override
public List<IResource> getResources(int theFromIndex, int theToIndex) {
List<IResource> retVal = resources.getResources(theFromIndex, theToIndex);
int index = theFromIndex;
for (IResource nextResource : retVal) {
if (nextResource.getId() == null || isBlank(nextResource.getId().getIdPart())) {
throw new InternalErrorException("Server provided resource at index " + index + " with no ID set (using IResource#setId(IdDt))");
}
if (isBlank(nextResource.getId().getVersionIdPart())) {
IdDt versionId = (IdDt) ResourceMetadataKeyEnum.VERSION_ID.get(nextResource);
if (versionId == null || versionId.isEmpty()) {
throw new InternalErrorException("Server provided resource at index " + index + " with no Version ID set (using IResource#setId(IdDt))");
}
}
index++;
}
return retVal;
}
@Override
public InstantDt getPublished() {
return resources.getPublished();
}
};
}
// ObjectUtils.equals is replaced by a JDK7 method.. // ObjectUtils.equals is replaced by a JDK7 method..
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override @Override
@ -239,6 +140,105 @@ public class HistoryMethodBinding extends BaseResourceReturningMethodBinding {
return true; return true;
} }
@Override
public BaseHttpClientInvocation invokeClient(Object[] theArgs) throws InternalErrorException {
IdDt id = null;
String resourceName = myResourceName;
if (myIdParamIndex != null) {
id = (IdDt) theArgs[myIdParamIndex];
if (id == null || isBlank(id.getValue())) {
throw new NullPointerException("ID can not be null");
}
}
String historyId = id != null ? id.getIdPart() : null;
HttpGetClientInvocation retVal = createHistoryInvocation(resourceName, historyId, null, null);
if (theArgs != null) {
for (int idx = 0; idx < theArgs.length; idx++) {
IParameter nextParam = getParameters().get(idx);
nextParam.translateClientArgumentIntoQueryArgument(getContext(), theArgs[idx], retVal.getParameters());
}
}
return retVal;
}
@Override
public IBundleProvider invokeServer(RequestDetails theRequest, Object[] theMethodParams) throws InvalidRequestException, InternalErrorException {
if (myIdParamIndex != null) {
theMethodParams[myIdParamIndex] = theRequest.getId();
}
Object response = invokeServerMethod(theMethodParams);
final IBundleProvider resources = toResourceList(response);
/*
* We wrap the response so we can verify that it has the ID and version set,
* as is the contract for history
*/
return new IBundleProvider() {
@Override
public InstantDt getPublished() {
return resources.getPublished();
}
@Override
public List<IResource> getResources(int theFromIndex, int theToIndex) {
List<IResource> retVal = resources.getResources(theFromIndex, theToIndex);
int index = theFromIndex;
for (IResource nextResource : retVal) {
if (nextResource.getId() == null || isBlank(nextResource.getId().getIdPart())) {
throw new InternalErrorException("Server provided resource at index " + index + " with no ID set (using IResource#setId(IdDt))");
}
if (isBlank(nextResource.getId().getVersionIdPart())) {
IdDt versionId = (IdDt) ResourceMetadataKeyEnum.VERSION_ID.get(nextResource);
if (versionId == null || versionId.isEmpty()) {
throw new InternalErrorException("Server provided resource at index " + index + " with no Version ID set (using IResource#setId(IdDt))");
}
}
index++;
}
return retVal;
}
@Override
public int size() {
return resources.size();
}
};
}
public static HttpGetClientInvocation createHistoryInvocation(String theResourceName, String theId, BaseDateTimeDt theSince, Integer theLimit) {
StringBuilder b = new StringBuilder();
if (theResourceName != null) {
b.append(theResourceName);
if (isNotBlank(theId)) {
b.append('/');
b.append(theId);
}
}
if (b.length() > 0) {
b.append('/');
}
b.append(Constants.PARAM_HISTORY);
boolean haveParam = false;
if (theSince != null && !theSince.isEmpty()) {
haveParam = true;
b.append('?').append(Constants.PARAM_SINCE).append('=').append(theSince.getValueAsString());
}
if (theLimit != null) {
b.append(haveParam ? '&' : '?');
b.append(Constants.PARAM_COUNT).append('=').append(theLimit);
}
HttpGetClientInvocation retVal = new HttpGetClientInvocation(b.toString());
return retVal;
}
private static Class<? extends IBaseResource> toReturnType(Method theMethod, Object theProvider) { private static Class<? extends IBaseResource> toReturnType(Method theMethod, Object theProvider) {
if (theProvider instanceof IResourceProvider) { if (theProvider instanceof IResourceProvider) {
return ((IResourceProvider) theProvider).getResourceType(); return ((IResourceProvider) theProvider).getResourceType();

View File

@ -25,6 +25,7 @@ import java.util.Map;
import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.AbstractHttpEntity; import org.apache.http.entity.AbstractHttpEntity;
import org.hl7.fhir.instance.model.IBaseResource;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.Bundle; import ca.uhn.fhir.model.api.Bundle;
@ -35,7 +36,7 @@ import ca.uhn.fhir.model.valueset.BundleTypeEnum;
public class HttpPostClientInvocation extends BaseHttpClientInvocationWithContents { public class HttpPostClientInvocation extends BaseHttpClientInvocationWithContents {
public HttpPostClientInvocation(FhirContext theContext, IResource theResource, String theUrlExtension) { public HttpPostClientInvocation(FhirContext theContext, IBaseResource theResource, String theUrlExtension) {
super(theContext, theResource, theUrlExtension); super(theContext, theResource, theUrlExtension);
} }

View File

@ -0,0 +1,31 @@
package ca.uhn.fhir.rest.method;
import static org.apache.commons.lang3.StringUtils.*;
import org.hl7.fhir.instance.model.api.IBaseParameters;
import ca.uhn.fhir.context.FhirContext;
public class OperationMethodBinding {
public static HttpPostClientInvocation createOperationInvocation(FhirContext theContext, String theResourceName, String theId, String theOperationName, IBaseParameters theInput) {
StringBuilder b = new StringBuilder();
if (theResourceName != null) {
b.append(theResourceName);
if (isNotBlank(theId)) {
b.append('/');
b.append(theId);
}
}
if (b.length() > 0) {
b.append('/');
}
if (!theOperationName.startsWith("$")) {
b.append("$");
}
b.append(theOperationName);
return new HttpPostClientInvocation(theContext, theInput, b.toString());
}
}

View File

@ -32,12 +32,12 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.Validate;
import org.hl7.fhir.instance.model.IBaseResource; import org.hl7.fhir.instance.model.IBaseResource;
import org.hl7.fhir.instance.model.api.IBaseBinary;
import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.Bundle; import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.base.resource.BaseBinary;
import ca.uhn.fhir.model.dstu.valueset.RestfulOperationSystemEnum; import ca.uhn.fhir.model.dstu.valueset.RestfulOperationSystemEnum;
import ca.uhn.fhir.model.dstu.valueset.RestfulOperationTypeEnum; import ca.uhn.fhir.model.dstu.valueset.RestfulOperationTypeEnum;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
@ -174,19 +174,19 @@ public class ReadMethodBinding extends BaseResourceReturningMethodBinding implem
public Object invokeClient(String theResponseMimeType, InputStream theResponseReader, int theResponseStatusCode, Map<String, List<String>> theHeaders) throws IOException, BaseServerResponseException { public Object invokeClient(String theResponseMimeType, InputStream theResponseReader, int theResponseStatusCode, Map<String, List<String>> theHeaders) throws IOException, BaseServerResponseException {
byte[] contents = IOUtils.toByteArray(theResponseReader); byte[] contents = IOUtils.toByteArray(theResponseReader);
BaseBinary resource = (BaseBinary) getContext().getResourceDefinition("Binary").newInstance(); IBaseBinary resource = (IBaseBinary) getContext().getResourceDefinition("Binary").newInstance();
resource.setContentType(theResponseMimeType); resource.setContentType(theResponseMimeType);
resource.setContent(contents); resource.setContent(contents);
switch (getMethodReturnType()) { switch (getMethodReturnType()) {
case BUNDLE: case BUNDLE:
return Bundle.withSingleResource(resource); return Bundle.withSingleResource((IResource) resource);
case LIST_OF_RESOURCES: case LIST_OF_RESOURCES:
return Collections.singletonList(resource); return Collections.singletonList(resource);
case RESOURCE: case RESOURCE:
return resource; return resource;
case BUNDLE_PROVIDER: case BUNDLE_PROVIDER:
return new SimpleBundleProvider(resource); return new SimpleBundleProvider((IResource) resource);
} }
throw new IllegalStateException("" + getMethodReturnType()); // should not happen throw new IllegalStateException("" + getMethodReturnType()); // should not happen

View File

@ -18,6 +18,7 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.utils.DateUtils; import org.apache.http.client.utils.DateUtils;
import org.hl7.fhir.instance.model.api.IBaseBinary;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.RuntimeResourceDefinition; import ca.uhn.fhir.context.RuntimeResourceDefinition;
@ -26,7 +27,6 @@ import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
import ca.uhn.fhir.model.api.Tag; import ca.uhn.fhir.model.api.Tag;
import ca.uhn.fhir.model.api.TagList; import ca.uhn.fhir.model.api.TagList;
import ca.uhn.fhir.model.base.resource.BaseBinary;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.InstantDt; import ca.uhn.fhir.model.primitive.InstantDt;
import ca.uhn.fhir.parser.IParser; import ca.uhn.fhir.parser.IParser;
@ -73,8 +73,8 @@ public class RestfulServerUtils {
} }
} }
if (theResource instanceof BaseBinary && theResponseEncoding == null) { if (theResource instanceof IBaseBinary && theResponseEncoding == null) {
BaseBinary bin = (BaseBinary) theResource; IBaseBinary bin = (IBaseBinary) theResource;
if (isNotBlank(bin.getContentType())) { if (isNotBlank(bin.getContentType())) {
theHttpResponse.setContentType(bin.getContentType()); theHttpResponse.setContentType(bin.getContentType());
} else { } else {

View File

@ -1,4 +1,4 @@
package ca.uhn.fhir.model.base.resource; package org.hl7.fhir.instance.model.api;
/* /*
* #%L * #%L
@ -20,9 +20,9 @@ package ca.uhn.fhir.model.base.resource;
* #L% * #L%
*/ */
import ca.uhn.fhir.model.api.IResource; import org.hl7.fhir.instance.model.IBaseResource;
public interface BaseBinary extends IResource { public interface IBaseBinary extends IBaseResource {
byte[] getContent(); byte[] getContent();
@ -30,9 +30,9 @@ public interface BaseBinary extends IResource {
String getContentType(); String getContentType();
BaseBinary setContent(byte[] theContent); IBaseBinary setContent(byte[] theContent);
BaseBinary setContentAsBase64(String theContent); IBaseBinary setContentAsBase64(String theContent);
BaseBinary setContentType(String theContentType); IBaseBinary setContentType(String theContentType);
} }

View File

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

View File

@ -27,7 +27,7 @@
<attribute name="org.eclipse.jst.component.nondependency" value=""/> <attribute name="org.eclipse.jst.component.nondependency" value=""/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes> <attributes>
<attribute name="owner.project.facets" value="java"/> <attribute name="owner.project.facets" value="java"/>
</attributes> </attributes>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<faceted-project> <faceted-project>
<installed facet="jst.utility" version="1.0"/> <installed facet="jst.utility" version="1.0"/>
<installed facet="java" version="1.7"/> <installed facet="java" version="1.6"/>
</faceted-project> </faceted-project>

View File

@ -23,17 +23,18 @@ package ca.uhn.fhir.model.dev.resource;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.hl7.fhir.instance.model.api.IBaseBinary;
import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.context.FhirVersionEnum;
import ca.uhn.fhir.model.api.IElement; import ca.uhn.fhir.model.api.IElement;
import ca.uhn.fhir.model.api.annotation.Child; import ca.uhn.fhir.model.api.annotation.Child;
import ca.uhn.fhir.model.api.annotation.ResourceDef; import ca.uhn.fhir.model.api.annotation.ResourceDef;
import ca.uhn.fhir.model.base.resource.BaseBinary;
import ca.uhn.fhir.model.primitive.Base64BinaryDt; import ca.uhn.fhir.model.primitive.Base64BinaryDt;
import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.util.ElementUtil; import ca.uhn.fhir.util.ElementUtil;
@ResourceDef(name = "Binary", profile = "http://hl7.org/fhir/profiles/Binary", id = "binary") @ResourceDef(name = "Binary", profile = "http://hl7.org/fhir/profiles/Binary", id = "binary")
public class Binary extends BaseResource implements BaseBinary { public class Binary extends BaseResource implements IBaseBinary {
@Child(name = "content", order = 1) @Child(name = "content", order = 1)
private Base64BinaryDt myContent = new Base64BinaryDt(); private Base64BinaryDt myContent = new Base64BinaryDt();

View File

@ -23,18 +23,18 @@ package ca.uhn.fhir.model.dstu.resource;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.hl7.fhir.instance.model.api.IBaseBinary;
import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.context.FhirVersionEnum;
import ca.uhn.fhir.model.api.IElement; import ca.uhn.fhir.model.api.IElement;
import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.annotation.Child; import ca.uhn.fhir.model.api.annotation.Child;
import ca.uhn.fhir.model.api.annotation.ResourceDef; import ca.uhn.fhir.model.api.annotation.ResourceDef;
import ca.uhn.fhir.model.base.resource.BaseBinary;
import ca.uhn.fhir.model.primitive.Base64BinaryDt; import ca.uhn.fhir.model.primitive.Base64BinaryDt;
import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.util.ElementUtil; import ca.uhn.fhir.util.ElementUtil;
@ResourceDef(name = "Binary", profile = "http://hl7.org/fhir/profiles/Binary", id = "binary") @ResourceDef(name = "Binary", profile = "http://hl7.org/fhir/profiles/Binary", id = "binary")
public class Binary extends BaseResource implements BaseBinary { public class Binary extends BaseResource implements IBaseBinary {
@Child(name = "content", order = 1) @Child(name = "content", order = 1)
private Base64BinaryDt myContent = new Base64BinaryDt(); private Base64BinaryDt myContent = new Base64BinaryDt();

View File

@ -4,12 +4,12 @@ import static org.junit.Assert.*;
import java.util.Properties; import java.util.Properties;
import org.hl7.fhir.instance.model.api.IBaseBinary;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.RuntimeResourceDefinition; import ca.uhn.fhir.context.RuntimeResourceDefinition;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.base.resource.BaseBinary;
import ca.uhn.fhir.model.dstu2.resource.Binary; import ca.uhn.fhir.model.dstu2.resource.Binary;
public class ModelInstantiationTest { public class ModelInstantiationTest {
@ -18,7 +18,7 @@ public class ModelInstantiationTest {
@Test @Test
public void testBinaryIsBaseBinary() { public void testBinaryIsBaseBinary() {
assertTrue(BaseBinary.class.isAssignableFrom(Binary.class)); assertTrue(IBaseBinary.class.isAssignableFrom(Binary.class));
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@ -38,6 +38,7 @@ import ca.uhn.fhir.model.dstu2.resource.Parameters;
import ca.uhn.fhir.model.dstu2.resource.Patient; import ca.uhn.fhir.model.dstu2.resource.Patient;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.parser.IParser;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.rest.server.EncodingEnum; import ca.uhn.fhir.rest.server.EncodingEnum;
@ -93,7 +94,8 @@ public class GenericClientTestDstu2 {
@Override @Override
public InputStream answer(InvocationOnMock theInvocation) throws Throwable { public InputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8")); return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"));
}}); }
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
@ -134,7 +136,6 @@ public class GenericClientTestDstu2 {
idx++; idx++;
} }
@Test @Test
public void testSearchByString() throws Exception { public void testSearchByString() throws Exception {
String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}"; String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}";
@ -160,29 +161,42 @@ public class GenericClientTestDstu2 {
} }
@Test @Test
public void testOperationWithListOfParameters() throws Exception { public void testOperationWithListOfParameterResponse() throws Exception {
IParser p = ourCtx.newXmlParser();
Parameters inParams = new Parameters(); Parameters inParams = new Parameters();
inParams.addParameter().setValue(new StringDt("STRINGVALIN1")); inParams.addParameter().setValue(new StringDt("STRINGVALIN1"));
inParams.addParameter().setValue(new StringDt("STRINGVALIN2")); inParams.addParameter().setValue(new StringDt("STRINGVALIN2"));
String reqString = ourCtx.newXmlParser().encodeResourceToString(inParams); String reqString = p.encodeResourceToString(inParams);
Parameters outParams = new Parameters(); Parameters outParams = new Parameters();
outParams.addParameter().setValue(new StringDt("STRINGVALOUT1")); outParams.addParameter().setValue(new StringDt("STRINGVALOUT1"));
outParams.addParameter().setValue(new StringDt("STRINGVALOUT2")); outParams.addParameter().setValue(new StringDt("STRINGVALOUT2"));
final String respString = ourCtx.newXmlParser().encodeResourceToString(outParams); final String respString = p.encodeResourceToString(outParams);
ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class); ArgumentCaptor<HttpUriRequest> capt = ArgumentCaptor.forClass(HttpUriRequest.class);
when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse); when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse);
when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK")); when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8")); when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8"));
when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() { when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer<ReaderInputStream>() {
@Override @Override
public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable { public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable {
return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8")); }}); return new ReaderInputStream(new StringReader(respString), Charset.forName("UTF-8"));
}
});
IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir");
// client.operation().onServer().withParameters(inParams); int idx = 0;
Parameters resp = client.operation().ofServer().named("$SOMEOPERATION").withParameters(inParams).execute();
assertEquals(respString, p.encodeResourceToString(resp));
assertEquals(1, capt.getAllValues().get(idx).getHeaders(Constants.HEADER_CONTENT_TYPE).length);
assertEquals(EncodingEnum.XML.getResourceContentType() + Constants.HEADER_SUFFIX_CT_UTF_8, capt.getAllValues().get(idx).getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue());
assertEquals(extractBody(capt, idx), reqString);
assertEquals("POST", capt.getAllValues().get(idx).getRequestLine().getMethod());
idx++;
} }
@Test @Test

View File

@ -39,11 +39,12 @@ import org.hl7.fhir.instance.model.annotations.SearchParamDefinition;
import org.hl7.fhir.instance.model.annotations.Block; import org.hl7.fhir.instance.model.annotations.Block;
import org.hl7.fhir.instance.model.annotations.Child; import org.hl7.fhir.instance.model.annotations.Child;
import org.hl7.fhir.instance.model.annotations.Description; import org.hl7.fhir.instance.model.annotations.Description;
import org.hl7.fhir.instance.model.api.IBaseBinary;
/** /**
* A binary resource can contain any content, whether text, image, pdf, zip archive, etc. * A binary resource can contain any content, whether text, image, pdf, zip archive, etc.
*/ */
@ResourceDef(name="Binary", profile="http://hl7.org/fhir/Profile/Binary") @ResourceDef(name="Binary", profile="http://hl7.org/fhir/Profile/Binary")
public class Binary extends Resource { public class Binary extends Resource implements IBaseBinary {
/** /**
* MimeType of the binary content represented as a standard MimeType (BCP 13). * MimeType of the binary content represented as a standard MimeType (BCP 13).
@ -212,5 +213,20 @@ public class Binary extends Resource {
@SearchParamDefinition(name="contenttype", path="Binary.contentType", description="MimeType of the binary content", type="token" ) @SearchParamDefinition(name="contenttype", path="Binary.contentType", description="MimeType of the binary content", type="token" )
public static final String SP_CONTENTTYPE = "contenttype"; public static final String SP_CONTENTTYPE = "contenttype";
@Override
public String getContentAsBase64() {
return getContentElement().getValueAsString();
}
@Override
public Binary setContentAsBase64(String theContent) {
if (theContent != null) {
getContentElement().setValueAsString(theContent);
} else {
setContent(null);
}
return this;
}
} }

View File

@ -1,12 +1,11 @@
package ca.uhn.fhir.model; package ca.uhn.fhir.model;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.hl7.fhir.instance.model.Address; import org.hl7.fhir.instance.model.Address;
import org.hl7.fhir.instance.model.BackboneElement; import org.hl7.fhir.instance.model.BackboneElement;
import org.hl7.fhir.instance.model.Base; import org.hl7.fhir.instance.model.Base;
import org.hl7.fhir.instance.model.Binary;
import org.hl7.fhir.instance.model.BooleanType; import org.hl7.fhir.instance.model.BooleanType;
import org.hl7.fhir.instance.model.Bundle; import org.hl7.fhir.instance.model.Bundle;
import org.hl7.fhir.instance.model.Coding; import org.hl7.fhir.instance.model.Coding;
@ -19,6 +18,7 @@ import org.hl7.fhir.instance.model.ICompositeType;
import org.hl7.fhir.instance.model.IPrimitiveType; import org.hl7.fhir.instance.model.IPrimitiveType;
import org.hl7.fhir.instance.model.IdType; import org.hl7.fhir.instance.model.IdType;
import org.hl7.fhir.instance.model.Identifier; import org.hl7.fhir.instance.model.Identifier;
import org.hl7.fhir.instance.model.Identifier.IdentifierUseEnumFactory;
import org.hl7.fhir.instance.model.IntegerType; import org.hl7.fhir.instance.model.IntegerType;
import org.hl7.fhir.instance.model.Meta; import org.hl7.fhir.instance.model.Meta;
import org.hl7.fhir.instance.model.Narrative; import org.hl7.fhir.instance.model.Narrative;
@ -27,11 +27,11 @@ import org.hl7.fhir.instance.model.Reference;
import org.hl7.fhir.instance.model.Resource; import org.hl7.fhir.instance.model.Resource;
import org.hl7.fhir.instance.model.Timing; import org.hl7.fhir.instance.model.Timing;
import org.hl7.fhir.instance.model.Type; import org.hl7.fhir.instance.model.Type;
import org.hl7.fhir.instance.model.Identifier.IdentifierUseEnumFactory;
import org.hl7.fhir.instance.model.annotations.Block; import org.hl7.fhir.instance.model.annotations.Block;
import org.hl7.fhir.instance.model.annotations.Child; import org.hl7.fhir.instance.model.annotations.Child;
import org.hl7.fhir.instance.model.api.IAnyResource; import org.hl7.fhir.instance.model.api.IAnyResource;
import org.hl7.fhir.instance.model.api.IBackboneElement; import org.hl7.fhir.instance.model.api.IBackboneElement;
import org.hl7.fhir.instance.model.api.IBaseBinary;
import org.hl7.fhir.instance.model.api.IBaseBooleanDatatype; import org.hl7.fhir.instance.model.api.IBaseBooleanDatatype;
import org.hl7.fhir.instance.model.api.IBaseBundle; import org.hl7.fhir.instance.model.api.IBaseBundle;
import org.hl7.fhir.instance.model.api.IBaseDatatype; import org.hl7.fhir.instance.model.api.IBaseDatatype;
@ -49,8 +49,7 @@ import org.hl7.fhir.instance.model.api.IReference;
import org.junit.Test; import org.junit.Test;
public class ModelInheritanceTest { public class ModelInheritanceTest {
/*
/**
* <pre> * <pre>
* Other changes: * Other changes:
* *
@ -71,11 +70,6 @@ public class ModelInheritanceTest {
* </pre> * </pre>
*/ */
@Test
public void testType() {
assertTrue(IBaseDatatype.class.isAssignableFrom(Type.class));
}
/** /**
* This one should apply to all composite types * This one should apply to all composite types
*/ */
@ -84,76 +78,6 @@ public class ModelInheritanceTest {
assertTrue(ICompositeType.class.isAssignableFrom(Address.class)); assertTrue(ICompositeType.class.isAssignableFrom(Address.class));
} }
@Test
public void testBase() {
assertTrue(IBase.class.isAssignableFrom(Base.class));
}
public void testIdentifierUse() throws Exception {
Child child = Identifier.class.getField("use").getAnnotation(Child.class);
assertEquals(IdentifierUseEnumFactory.class, child.enumFactory());
}
/**
* Should be "implements IBaseExtension<Extension>"
*/
@Test
public void testExtension() {
assertTrue(IBaseExtension.class.isAssignableFrom(Extension.class));
assertTrue(IBaseHasExtensions.class.isAssignableFrom(Extension.class));
}
@Test
public void testNarrative() {
assertTrue(INarrative.class.isAssignableFrom(Narrative.class));
}
@Test
public void testBooleanType() {
assertTrue(IBaseBooleanDatatype.class.isAssignableFrom(BooleanType.class));
}
@Test
public void testDecimalType() {
assertTrue(IBaseDecimalDatatype.class.isAssignableFrom(DecimalType.class));
}
@Test
public void testIntegerType() {
assertTrue(IBaseIntegerDatatype.class.isAssignableFrom(IntegerType.class));
}
@Test
public void testPrimitiveType() {
assertTrue(IPrimitiveType.class.isAssignableFrom(PrimitiveType.class));
assertTrue(IBaseHasExtensions.class.isAssignableFrom(PrimitiveType.class));
}
@Test
public void testResource() {
assertTrue(IAnyResource.class.isAssignableFrom(Resource.class));
}
@Test
public void testBundle() {
assertTrue(IBaseBundle.class.isAssignableFrom(Bundle.class));
}
public void testIdType() {
assertTrue(IIdType.class.isAssignableFrom(IdType.class));
}
@Test
public void testReference() {
assertTrue(IReference.class.isAssignableFrom(Reference.class));
}
@Test
public void testMeta() {
assertTrue(IMetaType.class.isAssignableFrom(Meta.class));
}
@Test @Test
public void testBackboneElement() { public void testBackboneElement() {
assertTrue(IBackboneElement.class.isAssignableFrom(BackboneElement.class)); assertTrue(IBackboneElement.class.isAssignableFrom(BackboneElement.class));
@ -162,8 +86,36 @@ public class ModelInheritanceTest {
} }
@Test @Test
public void testElement() { public void testBase() {
assertTrue(IBaseHasExtensions.class.isAssignableFrom(Element.class)); assertTrue(IBase.class.isAssignableFrom(Base.class));
}
@Test
public void testBinary() {
assertTrue(IBaseBinary.class.isAssignableFrom(Binary.class));
}
@Test
public void testBooleanType() {
assertTrue(IBaseBooleanDatatype.class.isAssignableFrom(BooleanType.class));
}
@Test
public void testBundle() {
assertTrue(IBaseBundle.class.isAssignableFrom(Bundle.class));
}
@Test
public void testCoding() {
assertTrue(ICoding.class.isAssignableFrom(Coding.class));
}
@Test
public void testDecimalType() {
assertTrue(IBaseDecimalDatatype.class.isAssignableFrom(DecimalType.class));
} }
@Test @Test
@ -173,8 +125,57 @@ public class ModelInheritanceTest {
} }
@Test @Test
public void testCoding() { public void testElement() {
assertTrue(ICoding.class.isAssignableFrom(Coding.class)); assertTrue(IBaseHasExtensions.class.isAssignableFrom(Element.class));
}
/**
* Should be "implements IBaseExtension<Extension>"
*/
@Test
public void testExtension() {
assertTrue(IBaseExtension.class.isAssignableFrom(Extension.class));
assertTrue(IBaseHasExtensions.class.isAssignableFrom(Extension.class));
}
public void testIdentifierUse() throws Exception {
Child child = Identifier.class.getField("use").getAnnotation(Child.class);
assertEquals(IdentifierUseEnumFactory.class, child.enumFactory());
}
public void testIdType() {
assertTrue(IIdType.class.isAssignableFrom(IdType.class));
}
@Test
public void testIntegerType() {
assertTrue(IBaseIntegerDatatype.class.isAssignableFrom(IntegerType.class));
}
@Test
public void testMeta() {
assertTrue(IMetaType.class.isAssignableFrom(Meta.class));
}
@Test
public void testNarrative() {
assertTrue(INarrative.class.isAssignableFrom(Narrative.class));
}
@Test
public void testPrimitiveType() {
assertTrue(IPrimitiveType.class.isAssignableFrom(PrimitiveType.class));
assertTrue(IBaseHasExtensions.class.isAssignableFrom(PrimitiveType.class));
}
@Test
public void testReference() {
assertTrue(IReference.class.isAssignableFrom(Reference.class));
}
@Test
public void testResource() {
assertTrue(IAnyResource.class.isAssignableFrom(Resource.class));
} }
@Test @Test
@ -183,4 +184,9 @@ public class ModelInheritanceTest {
assertNotNull(Timing.TimingRepeatComponent.class.getAnnotation(Block.class)); assertNotNull(Timing.TimingRepeatComponent.class.getAnnotation(Block.class));
} }
@Test
public void testType() {
assertTrue(IBaseDatatype.class.isAssignableFrom(Type.class));
}
} }

View File

@ -41,11 +41,8 @@ import ${import};
@ResourceDef(name="${elementName}", profile="${profile}", id="${id}") @ResourceDef(name="${elementName}", profile="${profile}", id="${id}")
public class ${className} extends ca.uhn.fhir.model.${version}.resource.BaseResource 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" ) #if ( ${className} == "Bundle" || ${className} == "Parameters" || ${className} == "Binary" )
, org.hl7.fhir.instance.model.api.IBaseBundle , org.hl7.fhir.instance.model.api.IBase${className}
#end
#if ( ${className}=="Binary" )
, ca.uhn.fhir.model.base.resource.Base${className}
#end #end
{ {