Merge branch 'master' of github.com:jamesagnew/hapi-fhir

This commit is contained in:
James Agnew 2016-04-18 10:07:22 -04:00
commit 153c3ac5aa
152 changed files with 3447 additions and 1495 deletions

View File

@ -12,6 +12,7 @@ import javax.servlet.http.HttpServletResponse;
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.BundleEntry;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.Include; import ca.uhn.fhir.model.api.Include;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
@ -1111,40 +1112,13 @@ public class TagMethodProvider
//START SNIPPET: transaction //START SNIPPET: transaction
@Transaction @Transaction
public List<IResource> transaction(@TransactionParam List<IResource> theResources) { public Bundle transaction(@TransactionParam Bundle theInput) {
// theResources will contain a complete bundle of all resources to persist for (BundleEntry nextEntry : theInput.getEntries()) {
// in a single transaction // Process entry
for (IResource next : theResources) {
InstantDt deleted = (InstantDt) next.getResourceMetadata().get(ResourceMetadataKeyEnum.DELETED_AT);
if (deleted != null && deleted.isEmpty() == false) {
// delete this resource
} else {
// create or update this resource
}
} }
// According to the specification, a bundle must be returned. This bundle will contain Bundle retVal = new Bundle();
// all of the created/updated/deleted resources, including their new/updated identities. // Populate return bundle
//
// The returned list must be the exact same size as the list of resources
// passed in, and it is acceptable to return the same list instance that was
// passed in.
List<IResource> retVal = new ArrayList<IResource>(theResources);
for (IResource next : theResources) {
/*
* Populate each returned resource with the new ID for that resource,
* including the new version if the server supports versioning.
*/
IdDt newId = new IdDt("Patient", "1", "2");
next.setId(newId);
}
// If wanted, you may optionally also return an OperationOutcome resource
// If present, the OperationOutcome must come first in the returned list.
OperationOutcome oo = new OperationOutcome();
oo.addIssue().setSeverity(IssueSeverityEnum.INFORMATION).setDiagnostics("Completed successfully");
retVal.add(0, oo);
return retVal; return retVal;
} }
//END SNIPPET: transaction //END SNIPPET: transaction

View File

@ -1,5 +1,25 @@
package ca.uhn.fhir.context; package ca.uhn.fhir.context;
/*
* #%L
* HAPI FHIR - Core Library
* %%
* Copyright (C) 2014 - 2016 University Health Network
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Collections; import java.util.Collections;
import java.util.Set; import java.util.Set;

View File

@ -1,5 +1,25 @@
package ca.uhn.fhir.context; package ca.uhn.fhir.context;
/*
* #%L
* HAPI FHIR - Core Library
* %%
* Copyright (C) 2014 - 2016 University Health Network
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.util.Map; import java.util.Map;
import org.hl7.fhir.instance.model.api.IBase; import org.hl7.fhir.instance.model.api.IBase;

View File

@ -97,7 +97,7 @@ public abstract class BasePrimitive<T> extends BaseIdentifiableElement implement
} }
@Override @Override
public IPrimitiveType<T> setValue(T theValue) throws DataFormatException { public BasePrimitive<T> setValue(T theValue) throws DataFormatException {
myCoercedValue = theValue; myCoercedValue = theValue;
updateStringValue(); updateStringValue();
return this; return this;

View File

@ -42,6 +42,7 @@ import org.apache.commons.lang3.Validate;
import org.hl7.fhir.instance.model.api.IAnyResource; import org.hl7.fhir.instance.model.api.IAnyResource;
import org.hl7.fhir.instance.model.api.IBase; import org.hl7.fhir.instance.model.api.IBase;
import org.hl7.fhir.instance.model.api.IBaseCoding; import org.hl7.fhir.instance.model.api.IBaseCoding;
import org.hl7.fhir.instance.model.api.IBaseElement;
import org.hl7.fhir.instance.model.api.IBaseHasExtensions; import org.hl7.fhir.instance.model.api.IBaseHasExtensions;
import org.hl7.fhir.instance.model.api.IBaseHasModifierExtensions; import org.hl7.fhir.instance.model.api.IBaseHasModifierExtensions;
import org.hl7.fhir.instance.model.api.IBaseMetaType; import org.hl7.fhir.instance.model.api.IBaseMetaType;
@ -65,6 +66,7 @@ import ca.uhn.fhir.context.RuntimeChildNarrativeDefinition;
import ca.uhn.fhir.context.RuntimeResourceDefinition; import ca.uhn.fhir.context.RuntimeResourceDefinition;
import ca.uhn.fhir.model.api.Bundle; import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.api.BundleEntry; import ca.uhn.fhir.model.api.BundleEntry;
import ca.uhn.fhir.model.api.IIdentifiableElement;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.api.ISupportsUndeclaredExtensions; import ca.uhn.fhir.model.api.ISupportsUndeclaredExtensions;
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
@ -105,10 +107,10 @@ public abstract class BaseParser implements IParser {
} }
protected Iterable<CompositeChildElement> compositeChildIterator(IBase theCompositeElement, final boolean theContainedResource, final CompositeChildElement theParent) { protected Iterable<CompositeChildElement> compositeChildIterator(IBase theCompositeElement, final boolean theContainedResource, final CompositeChildElement theParent) {
BaseRuntimeElementCompositeDefinition<?> elementDef = (BaseRuntimeElementCompositeDefinition<?>) myContext.getElementDefinition(theCompositeElement.getClass()); BaseRuntimeElementCompositeDefinition<?> elementDef = (BaseRuntimeElementCompositeDefinition<?>) myContext.getElementDefinition(theCompositeElement.getClass());
final List<BaseRuntimeChildDefinition> children = elementDef.getChildrenAndExtension(); final List<BaseRuntimeChildDefinition> children = elementDef.getChildrenAndExtension();
return new Iterable<BaseParser.CompositeChildElement>() { return new Iterable<BaseParser.CompositeChildElement>() {
@Override @Override
public Iterator<CompositeChildElement> iterator() { public Iterator<CompositeChildElement> iterator() {
@ -143,9 +145,9 @@ public abstract class BaseParser implements IParser {
/* /*
* There are lots of reasons we might skip encoding a particular child * There are lots of reasons we might skip encoding a particular child
*/ */
// if (myNext.getDef().getElementName().equals("extension") || myNext.getDef().getElementName().equals("modifierExtension")) { // if (myNext.getDef().getElementName().equals("extension") || myNext.getDef().getElementName().equals("modifierExtension")) {
// myNext = null; // myNext = null;
// } else // } else
if (myNext.getDef().getElementName().equals("id")) { if (myNext.getDef().getElementName().equals("id")) {
myNext = null; myNext = null;
} else if (!myNext.shouldBeEncoded()) { } else if (!myNext.shouldBeEncoded()) {
@ -377,7 +379,7 @@ public abstract class BaseParser implements IParser {
if (theResource.getStructureFhirVersionEnum() != myContext.getVersion().getVersion()) { if (theResource.getStructureFhirVersionEnum() != myContext.getVersion().getVersion()) {
throw new IllegalArgumentException("This parser is for FHIR version " + myContext.getVersion().getVersion() + " - Can not encode a structure for version " + theResource.getStructureFhirVersionEnum()); throw new IllegalArgumentException("This parser is for FHIR version " + myContext.getVersion().getVersion() + " - Can not encode a structure for version " + theResource.getStructureFhirVersionEnum());
} }
doEncodeResourceToWriter(theResource, theWriter); doEncodeResourceToWriter(theResource, theWriter);
} }
@ -411,6 +413,18 @@ public abstract class BaseParser implements IParser {
return retVal; return retVal;
} }
protected String getCompositeElementId(IBase theElement) {
String elementId = null;
if (!(theElement instanceof IBaseResource)) {
if (theElement instanceof IBaseElement) {
elementId = ((IBaseElement) theElement).getId();
} else if (theElement instanceof IIdentifiableElement) {
elementId = ((IIdentifiableElement) theElement).getElementSpecificId();
}
}
return elementId;
}
ContainedResources getContainedResources() { ContainedResources getContainedResources() {
return myContainedResources; return myContainedResources;
} }
@ -552,14 +566,14 @@ public abstract class BaseParser implements IParser {
@Override @Override
public <T extends IBaseResource> T parseResource(Class<T> theResourceType, Reader theReader) throws DataFormatException { public <T extends IBaseResource> T parseResource(Class<T> theResourceType, Reader theReader) throws DataFormatException {
if (theResourceType != null) { if (theResourceType != null) {
RuntimeResourceDefinition def = myContext.getResourceDefinition(theResourceType); RuntimeResourceDefinition def = myContext.getResourceDefinition(theResourceType);
if (def.getStructureVersion() != myContext.getVersion().getVersion()) { if (def.getStructureVersion() != myContext.getVersion().getVersion()) {
throw new IllegalArgumentException("This parser is for FHIR version " + myContext.getVersion().getVersion() + " - Can not parse a structure for version " + def.getStructureVersion()); throw new IllegalArgumentException("This parser is for FHIR version " + myContext.getVersion().getVersion() + " - Can not parse a structure for version " + def.getStructureVersion());
} }
} }
T retVal = doParseResource(theResourceType, theReader); T retVal = doParseResource(theResourceType, theReader);
RuntimeResourceDefinition def = myContext.getResourceDefinition(retVal); RuntimeResourceDefinition def = myContext.getResourceDefinition(retVal);
@ -684,20 +698,20 @@ public abstract class BaseParser implements IParser {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
List<IBase> retVal = (List<IBase>) theValues; List<IBase> retVal = (List<IBase>) theValues;
for (int i = 0; i < retVal.size(); i++) { for (int i = 0; i < retVal.size(); i++) {
IBase next = retVal.get(i); IBase next = retVal.get(i);
/* /*
* If we have automatically contained any resources via * If we have automatically contained any resources via
* their references, this ensures that we output the new * their references, this ensures that we output the new
* local reference * local reference
*/ */
if (next instanceof IBaseReference) { if (next instanceof IBaseReference) {
IBaseReference nextRef = (IBaseReference)next; IBaseReference nextRef = (IBaseReference) next;
String refText = determineReferenceText(nextRef); String refText = determineReferenceText(nextRef);
if (!StringUtils.equals(refText, nextRef.getReferenceElement().getValue())) { if (!StringUtils.equals(refText, nextRef.getReferenceElement().getValue())) {
if (retVal == theValues) { if (retVal == theValues) {
retVal = new ArrayList<IBase>(theValues); retVal = new ArrayList<IBase>(theValues);
} }
@ -705,11 +719,11 @@ public abstract class BaseParser implements IParser {
myContext.newTerser().cloneInto(nextRef, newRef, true); myContext.newTerser().cloneInto(nextRef, newRef, true);
newRef.setReference(refText); newRef.setReference(refText);
retVal.set(i, newRef); retVal.set(i, newRef);
} }
} }
} }
return retVal; return retVal;
} }

View File

@ -56,6 +56,7 @@ import org.hl7.fhir.instance.model.api.IBase;
import org.hl7.fhir.instance.model.api.IBaseBinary; 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.IBaseDecimalDatatype; import org.hl7.fhir.instance.model.api.IBaseDecimalDatatype;
import org.hl7.fhir.instance.model.api.IBaseElement;
import org.hl7.fhir.instance.model.api.IBaseExtension; import org.hl7.fhir.instance.model.api.IBaseExtension;
import org.hl7.fhir.instance.model.api.IBaseHasExtensions; import org.hl7.fhir.instance.model.api.IBaseHasExtensions;
import org.hl7.fhir.instance.model.api.IBaseHasModifierExtensions; import org.hl7.fhir.instance.model.api.IBaseHasModifierExtensions;
@ -140,7 +141,7 @@ public class JsonParser extends BaseParser implements IParser {
myContext = theContext; myContext = theContext;
} }
private void addToHeldComments(int valueIdx, List<String> theCommentsToAdd, ArrayList<ArrayList<String>> theListToAddTo) { private boolean addToHeldComments(int valueIdx, List<String> theCommentsToAdd, ArrayList<ArrayList<String>> theListToAddTo) {
if (theCommentsToAdd.size() > 0) { if (theCommentsToAdd.size() > 0) {
theListToAddTo.ensureCapacity(valueIdx); theListToAddTo.ensureCapacity(valueIdx);
while (theListToAddTo.size() <= valueIdx) { while (theListToAddTo.size() <= valueIdx) {
@ -150,10 +151,13 @@ public class JsonParser extends BaseParser implements IParser {
theListToAddTo.set(valueIdx, new ArrayList<String>()); theListToAddTo.set(valueIdx, new ArrayList<String>());
} }
theListToAddTo.get(valueIdx).addAll(theCommentsToAdd); theListToAddTo.get(valueIdx).addAll(theCommentsToAdd);
return true;
} else {
return false;
} }
} }
private void addToHeldExtensions(int valueIdx, List<? extends IBaseExtension<?, ?>> ext, ArrayList<ArrayList<HeldExtension>> list, boolean theIsModifier) { private boolean addToHeldExtensions(int valueIdx, List<? extends IBaseExtension<?, ?>> ext, ArrayList<ArrayList<HeldExtension>> list, boolean theIsModifier) {
if (ext.size() > 0) { if (ext.size() > 0) {
list.ensureCapacity(valueIdx); list.ensureCapacity(valueIdx);
while (list.size() <= valueIdx) { while (list.size() <= valueIdx) {
@ -165,6 +169,9 @@ public class JsonParser extends BaseParser implements IParser {
for (IBaseExtension<?, ?> next : ext) { for (IBaseExtension<?, ?> next : ext) {
list.get(valueIdx).add(new HeldExtension(next, theIsModifier)); list.get(valueIdx).add(new HeldExtension(next, theIsModifier));
} }
return true;
} else {
return false;
} }
} }
@ -400,8 +407,8 @@ public class JsonParser extends BaseParser implements IParser {
theEventWriter.writeEnd(); theEventWriter.writeEnd();
} }
private void encodeChildElementToStreamWriter(RuntimeResourceDefinition theResDef, IBaseResource theResource, JsonGenerator theWriter, IBase theNextValue, BaseRuntimeElementDefinition<?> theChildDef, String theChildName, boolean theContainedResource, CompositeChildElement theChildElem) private void encodeChildElementToStreamWriter(RuntimeResourceDefinition theResDef, IBaseResource theResource, JsonGenerator theWriter, IBase theNextValue, BaseRuntimeElementDefinition<?> theChildDef, String theChildName, boolean theContainedResource, CompositeChildElement theChildElem,
throws IOException { boolean theForceEmpty) throws IOException {
switch (theChildDef.getChildType()) { switch (theChildDef.getChildType()) {
case ID_DATATYPE: { case ID_DATATYPE: {
@ -420,6 +427,9 @@ public class JsonParser extends BaseParser implements IParser {
case PRIMITIVE_DATATYPE: { case PRIMITIVE_DATATYPE: {
final IPrimitiveType<?> value = (IPrimitiveType<?>) theNextValue; final IPrimitiveType<?> value = (IPrimitiveType<?>) theNextValue;
if (isBlank(value.getValueAsString())) { if (isBlank(value.getValueAsString())) {
if (theForceEmpty) {
theWriter.writeNull();
}
break; break;
} }
@ -460,7 +470,7 @@ public class JsonParser extends BaseParser implements IParser {
} }
break; break;
} }
case RESOURCE_REF: case RESOURCE_REF:
case RESOURCE_BLOCK: case RESOURCE_BLOCK:
case COMPOSITE_DATATYPE: { case COMPOSITE_DATATYPE: {
if (theChildName != null) { if (theChildName != null) {
@ -523,14 +533,20 @@ public class JsonParser extends BaseParser implements IParser {
} }
private void encodeCompositeElementChildrenToStreamWriter(RuntimeResourceDefinition theResDef, IBaseResource theResource, IBase theElement, JsonGenerator theEventWriter, boolean theContainedResource, CompositeChildElement theParent) private void encodeCompositeElementChildrenToStreamWriter(RuntimeResourceDefinition theResDef, IBaseResource theResource, IBase theElement, JsonGenerator theEventWriter, boolean theContainedResource, CompositeChildElement theParent) throws IOException {
throws IOException {
{
String elementId = getCompositeElementId(theElement);
if (isNotBlank(elementId)) {
theEventWriter.write("id", elementId);
}
}
boolean haveWrittenExtensions = false; boolean haveWrittenExtensions = false;
for (CompositeChildElement nextChildElem : super.compositeChildIterator(theElement, theContainedResource, theParent)) { for (CompositeChildElement nextChildElem : super.compositeChildIterator(theElement, theContainedResource, theParent)) {
BaseRuntimeChildDefinition nextChild = nextChildElem.getDef(); BaseRuntimeChildDefinition nextChild = nextChildElem.getDef();
if (nextChildElem.getDef().getElementName().equals("extension") || nextChildElem.getDef().getElementName().equals("modifierExtension") || nextChild instanceof RuntimeChildDeclaredExtensionDefinition) { if (nextChildElem.getDef().getElementName().equals("extension") || nextChildElem.getDef().getElementName().equals("modifierExtension") || nextChild instanceof RuntimeChildDeclaredExtensionDefinition) {
if (!haveWrittenExtensions) { if (!haveWrittenExtensions) {
extractAndWriteExtensionsAsDirectChild(theElement, theEventWriter, myContext.getElementDefinition(theElement.getClass()), theResDef, theResource); extractAndWriteExtensionsAsDirectChild(theElement, theEventWriter, myContext.getElementDefinition(theElement.getClass()), theResDef, theResource);
@ -538,7 +554,7 @@ public class JsonParser extends BaseParser implements IParser {
} }
continue; continue;
} }
if (nextChild instanceof RuntimeChildNarrativeDefinition) { if (nextChild instanceof RuntimeChildNarrativeDefinition) {
INarrativeGenerator gen = myContext.getNarrativeGenerator(); INarrativeGenerator gen = myContext.getNarrativeGenerator();
if (gen != null) { if (gen != null) {
@ -556,7 +572,7 @@ public class JsonParser extends BaseParser implements IParser {
RuntimeChildNarrativeDefinition child = (RuntimeChildNarrativeDefinition) nextChild; RuntimeChildNarrativeDefinition child = (RuntimeChildNarrativeDefinition) nextChild;
String childName = nextChild.getChildNameByDatatype(child.getDatatype()); String childName = nextChild.getChildNameByDatatype(child.getDatatype());
BaseRuntimeElementDefinition<?> type = child.getChildByName(childName); BaseRuntimeElementDefinition<?> type = child.getChildByName(childName);
encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, narr, type, childName, theContainedResource, nextChildElem); encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, narr, type, childName, theContainedResource, nextChildElem, false);
continue; continue;
} }
} }
@ -564,7 +580,7 @@ public class JsonParser extends BaseParser implements IParser {
} else if (nextChild instanceof RuntimeChildContainedResources) { } else if (nextChild instanceof RuntimeChildContainedResources) {
String childName = nextChild.getValidChildNames().iterator().next(); String childName = nextChild.getValidChildNames().iterator().next();
BaseRuntimeElementDefinition<?> child = nextChild.getChildByName(childName); BaseRuntimeElementDefinition<?> child = nextChild.getChildByName(childName);
encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, null, child, childName, theContainedResource, nextChildElem); encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, null, child, childName, theContainedResource, nextChildElem, false);
continue; continue;
} }
@ -581,6 +597,7 @@ public class JsonParser extends BaseParser implements IParser {
ArrayList<ArrayList<HeldExtension>> extensions = new ArrayList<ArrayList<HeldExtension>>(0); ArrayList<ArrayList<HeldExtension>> extensions = new ArrayList<ArrayList<HeldExtension>>(0);
ArrayList<ArrayList<HeldExtension>> modifierExtensions = new ArrayList<ArrayList<HeldExtension>>(0); ArrayList<ArrayList<HeldExtension>> modifierExtensions = new ArrayList<ArrayList<HeldExtension>>(0);
ArrayList<ArrayList<String>> comments = new ArrayList<ArrayList<String>>(0); ArrayList<ArrayList<String>> comments = new ArrayList<ArrayList<String>>(0);
ArrayList<String> ids = new ArrayList<String>(0);
int valueIdx = 0; int valueIdx = 0;
for (IBase nextValue : values) { for (IBase nextValue : values) {
@ -596,13 +613,10 @@ public class JsonParser extends BaseParser implements IParser {
} }
Class<? extends IBase> type = nextValue.getClass(); Class<? extends IBase> type = nextValue.getClass();
String childName = nextChild.getChildNameByDatatype(type); String childName = nextChild.getChildNameByDatatype(type);
BaseRuntimeElementDefinition<?> childDef = nextChild.getChildElementDefinitionByDatatype(type); BaseRuntimeElementDefinition<?> childDef = nextChild.getChildElementDefinitionByDatatype(type);
if (childDef == null) { if (childDef == null) {
// if (IBaseExtension.class.isAssignableFrom(type)) {
// continue;
// }
super.throwExceptionForUnknownChildType(nextChild, type); super.throwExceptionForUnknownChildType(nextChild, type);
} }
boolean primitive = childDef.getChildType() == ChildTypeEnum.PRIMITIVE_DATATYPE; boolean primitive = childDef.getChildType() == ChildTypeEnum.PRIMITIVE_DATATYPE;
@ -611,55 +625,54 @@ public class JsonParser extends BaseParser implements IParser {
continue; continue;
} }
// if (nextChild instanceof RuntimeChildDeclaredExtensionDefinition) { boolean force = false;
// RuntimeChildDeclaredExtensionDefinition extDef = (RuntimeChildDeclaredExtensionDefinition) nextChild; if (primitive) {
// new HeldExtension(extDef, nextValue).write(theResDef, theResource, theEventWriter); if (nextValue instanceof ISupportsUndeclaredExtensions) {
// } else { List<ExtensionDt> ext = ((ISupportsUndeclaredExtensions) nextValue).getUndeclaredExtensions();
force |= addToHeldExtensions(valueIdx, ext, extensions, false);
if (currentChildName == null || !currentChildName.equals(childName)) { ext = ((ISupportsUndeclaredExtensions) nextValue).getUndeclaredModifierExtensions();
if (inArray) { force |= addToHeldExtensions(valueIdx, ext, modifierExtensions, true);
theEventWriter.writeEnd();
}
if (nextChild.getMax() > 1 || nextChild.getMax() == Child.MAX_UNLIMITED) {
theEventWriter.writeStartArray(childName);
inArray = true;
encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, nextValue, childDef, null, theContainedResource, nextChildElem);
} else if (nextChild instanceof RuntimeChildNarrativeDefinition && theContainedResource) {
// suppress narratives from contained resources
} else {
encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, nextValue, childDef, childName, theContainedResource, nextChildElem);
}
currentChildName = childName;
} else { } else {
encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, nextValue, childDef, null, theContainedResource, nextChildElem); if (nextValue instanceof IBaseHasExtensions) {
} IBaseHasExtensions element = (IBaseHasExtensions) nextValue;
List<? extends IBaseExtension<?, ?>> ext = element.getExtension();
if (primitive) { force |= addToHeldExtensions(valueIdx, ext, extensions, false);
if (nextValue instanceof ISupportsUndeclaredExtensions) {
List<ExtensionDt> ext = ((ISupportsUndeclaredExtensions) nextValue).getUndeclaredExtensions();
addToHeldExtensions(valueIdx, ext, extensions, false);
ext = ((ISupportsUndeclaredExtensions) nextValue).getUndeclaredModifierExtensions();
addToHeldExtensions(valueIdx, ext, modifierExtensions, true);
} else {
if (nextValue instanceof IBaseHasExtensions) {
IBaseHasExtensions element = (IBaseHasExtensions) nextValue;
List<? extends IBaseExtension<?, ?>> ext = element.getExtension();
addToHeldExtensions(valueIdx, ext, extensions, false);
}
if (nextValue instanceof IBaseHasModifierExtensions) {
IBaseHasModifierExtensions element = (IBaseHasModifierExtensions) nextValue;
List<? extends IBaseExtension<?, ?>> ext = element.getModifierExtension();
addToHeldExtensions(valueIdx, ext, extensions, true);
}
} }
if (nextValue.hasFormatComment()) { if (nextValue instanceof IBaseHasModifierExtensions) {
addToHeldComments(valueIdx, nextValue.getFormatCommentsPre(), comments); IBaseHasModifierExtensions element = (IBaseHasModifierExtensions) nextValue;
addToHeldComments(valueIdx, nextValue.getFormatCommentsPost(), comments); List<? extends IBaseExtension<?, ?>> ext = element.getModifierExtension();
force |= addToHeldExtensions(valueIdx, ext, extensions, true);
} }
} }
if (nextValue.hasFormatComment()) {
force |= addToHeldComments(valueIdx, nextValue.getFormatCommentsPre(), comments);
force |= addToHeldComments(valueIdx, nextValue.getFormatCommentsPost(), comments);
}
String elementId = getCompositeElementId(nextValue);
if (isNotBlank(elementId)) {
force = true;
addToHeldIds(valueIdx, ids, elementId);
}
}
// } if (currentChildName == null || !currentChildName.equals(childName)) {
if (inArray) {
theEventWriter.writeEnd();
}
if (nextChild.getMax() > 1 || nextChild.getMax() == Child.MAX_UNLIMITED) {
theEventWriter.writeStartArray(childName);
inArray = true;
encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, nextValue, childDef, null, theContainedResource, nextChildElem, force);
} else if (nextChild instanceof RuntimeChildNarrativeDefinition && theContainedResource) {
// suppress narratives from contained resources
} else {
encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, nextValue, childDef, childName, theContainedResource, nextChildElem, false);
}
currentChildName = childName;
} else {
encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, nextValue, childDef, null, theContainedResource, nextChildElem, force);
}
valueIdx++; valueIdx++;
} }
@ -701,12 +714,21 @@ public class JsonParser extends BaseParser implements IParser {
haveContent = true; haveContent = true;
} }
String elementId = null;
if (ids.size() > i) {
elementId = ids.get(i);
haveContent |= isNotBlank(elementId);
}
if (!haveContent) { if (!haveContent) {
theEventWriter.writeNull(); theEventWriter.writeNull();
} else { } else {
if (inArray) { if (inArray) {
theEventWriter.writeStartObject(); theEventWriter.writeStartObject();
} }
if (isNotBlank(elementId)) {
theEventWriter.write("id", elementId);
}
if (nextComments != null && !nextComments.isEmpty()) { if (nextComments != null && !nextComments.isEmpty()) {
theEventWriter.writeStartArray("fhir_comments"); theEventWriter.writeStartArray("fhir_comments");
for (String next : nextComments) { for (String next : nextComments) {
@ -726,8 +748,17 @@ public class JsonParser extends BaseParser implements IParser {
} }
} }
private void encodeCompositeElementToStreamWriter(RuntimeResourceDefinition theResDef, IBaseResource theResource, IBase theNextValue, JsonGenerator theEventWriter, boolean theContainedResource, CompositeChildElement theParent) private void addToHeldIds(int theValueIdx, ArrayList<String> theListToAddTo, String theId) {
throws IOException, DataFormatException { theListToAddTo.ensureCapacity(theValueIdx);
while (theListToAddTo.size() <= theValueIdx) {
theListToAddTo.add(null);
}
if (theListToAddTo.get(theValueIdx) == null) {
theListToAddTo.set(theValueIdx, theId);
}
}
private void encodeCompositeElementToStreamWriter(RuntimeResourceDefinition theResDef, IBaseResource theResource, IBase theNextValue, JsonGenerator theEventWriter, boolean theContainedResource, CompositeChildElement theParent) throws IOException, DataFormatException {
writeCommentsPreAndPost(theNextValue, theEventWriter); writeCommentsPreAndPost(theNextValue, theEventWriter);
encodeCompositeElementChildrenToStreamWriter(theResDef, theResource, theNextValue, theEventWriter, theContainedResource, theParent); encodeCompositeElementChildrenToStreamWriter(theResDef, theResource, theNextValue, theEventWriter, theContainedResource, theParent);
@ -802,7 +833,7 @@ public class JsonParser extends BaseParser implements IParser {
List<BaseCodingDt> securityLabels = extractMetadataListNotNull(resource, ResourceMetadataKeyEnum.SECURITY_LABELS); List<BaseCodingDt> securityLabels = extractMetadataListNotNull(resource, ResourceMetadataKeyEnum.SECURITY_LABELS);
List<? extends IIdType> profiles = extractMetadataListNotNull(resource, ResourceMetadataKeyEnum.PROFILES); List<? extends IIdType> profiles = extractMetadataListNotNull(resource, ResourceMetadataKeyEnum.PROFILES);
profiles = super.getProfileTagsForEncoding(resource, profiles); profiles = super.getProfileTagsForEncoding(resource, profiles);
TagList tags = getMetaTagsForEncoding(resource); TagList tags = getMetaTagsForEncoding(resource);
InstantDt updated = (InstantDt) resource.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED); InstantDt updated = (InstantDt) resource.getResourceMetadata().get(ResourceMetadataKeyEnum.UPDATED);
IdDt resourceId = resource.getId(); IdDt resourceId = resource.getId();
@ -1305,6 +1336,9 @@ public class JsonParser extends BaseParser implements IParser {
theState.endingElement(); theState.endingElement();
break; break;
case NULL: case NULL:
theState.enteringNewElement(null, theName);
parseAlternates(theAlternateVal, theState, theAlternateName);
theState.endingElement();
break; break;
} }
} }
@ -1564,7 +1598,7 @@ public class JsonParser extends BaseParser implements IParser {
public void write(RuntimeResourceDefinition theResDef, IBaseResource theResource, JsonGenerator theEventWriter) throws IOException { public void write(RuntimeResourceDefinition theResDef, IBaseResource theResource, JsonGenerator theEventWriter) throws IOException {
if (myUndeclaredExtension != null) { if (myUndeclaredExtension != null) {
writeUndeclaredExtInDstu1Format(theResDef, theResource, theEventWriter, myUndeclaredExtension); writeUndeclaredExtension(theResDef, theResource, theEventWriter, myUndeclaredExtension);
} else { } else {
theEventWriter.writeStartObject(); theEventWriter.writeStartObject();
@ -1577,14 +1611,14 @@ public class JsonParser extends BaseParser implements IParser {
extractAndWriteExtensionsAsDirectChild(myValue, theEventWriter, def, theResDef, theResource); extractAndWriteExtensionsAsDirectChild(myValue, theEventWriter, def, theResDef, theResource);
} else { } else {
String childName = myDef.getChildNameByDatatype(myValue.getClass()); String childName = myDef.getChildNameByDatatype(myValue.getClass());
encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, myValue, def, childName, false, null); encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, myValue, def, childName, false, null, false);
} }
theEventWriter.writeEnd(); theEventWriter.writeEnd();
} }
} }
private void writeUndeclaredExtInDstu1Format(RuntimeResourceDefinition theResDef, IBaseResource theResource, JsonGenerator theEventWriter, IBaseExtension<?, ?> ext) throws IOException { private void writeUndeclaredExtension(RuntimeResourceDefinition theResDef, IBaseResource theResource, JsonGenerator theEventWriter, IBaseExtension<?, ?> ext) throws IOException {
IBase value = ext.getValue(); IBase value = ext.getValue();
String extensionUrl = ext.getUrl(); String extensionUrl = ext.getUrl();
@ -1592,6 +1626,11 @@ public class JsonParser extends BaseParser implements IParser {
writeCommentsPreAndPost(myUndeclaredExtension, theEventWriter); writeCommentsPreAndPost(myUndeclaredExtension, theEventWriter);
String elementId = getCompositeElementId(ext);
if (isNotBlank(elementId)) {
theEventWriter.write("id", getCompositeElementId(ext));
}
theEventWriter.write("url", extensionUrl); theEventWriter.write("url", extensionUrl);
boolean noValue = value == null || value.isEmpty(); boolean noValue = value == null || value.isEmpty();
@ -1606,17 +1645,17 @@ public class JsonParser extends BaseParser implements IParser {
} }
for (Object next : ext.getExtension()) { for (Object next : ext.getExtension()) {
writeUndeclaredExtInDstu1Format(theResDef, theResource, theEventWriter, (IBaseExtension<?, ?>) next); writeUndeclaredExtension(theResDef, theResource, theEventWriter, (IBaseExtension<?, ?>) next);
} }
theEventWriter.writeEnd(); theEventWriter.writeEnd();
} else { } else {
/* /*
* Pre-process value - This is called in case the value is a reference * Pre-process value - This is called in case the value is a reference
* since we might modify the text * since we might modify the text
*/ */
value = JsonParser.super.preProcessValues(myDef, theResource, Collections.singletonList(value)).get(0); value = JsonParser.super.preProcessValues(myDef, theResource, Collections.singletonList(value)).get(0);
RuntimeChildUndeclaredExtensionDefinition extDef = myContext.getRuntimeChildUndeclaredExtensionDefinition(); RuntimeChildUndeclaredExtensionDefinition extDef = myContext.getRuntimeChildUndeclaredExtensionDefinition();
String childName = extDef.getChildNameByDatatype(value.getClass()); String childName = extDef.getChildNameByDatatype(value.getClass());
if (childName == null) { if (childName == null) {
@ -1626,7 +1665,7 @@ public class JsonParser extends BaseParser implements IParser {
if (childDef == null) { if (childDef == null) {
throw new ConfigurationException("Unable to encode extension, unregognized child element type: " + value.getClass().getCanonicalName()); throw new ConfigurationException("Unable to encode extension, unregognized child element type: " + value.getClass().getCanonicalName());
} }
encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, value, childDef, childName, true, null); encodeChildElementToStreamWriter(theResDef, theResource, theEventWriter, value, childDef, childName, true, null, false);
} }
// theEventWriter.name(myUndeclaredExtension.get); // theEventWriter.name(myUndeclaredExtension.get);

View File

@ -94,15 +94,15 @@ import ca.uhn.fhir.util.IModelVisitor;
class ParserState<T> { class ParserState<T> {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ParserState.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ParserState.class);
private List<String> myComments = new ArrayList<String>(2); private List<String> myComments = new ArrayList<String>(2);
private final FhirContext myContext; private final FhirContext myContext;
private final IParserErrorHandler myErrorHandler; private final IParserErrorHandler myErrorHandler;
private final boolean myJsonMode; private final boolean myJsonMode;
private T myObject; private T myObject;
private BaseState myState;
private IBase myPreviousElement;
private final IParser myParser; private final IParser myParser;
private IBase myPreviousElement;
private BaseState myState;
private ParserState(IParser theParser, FhirContext theContext, boolean theJsonMode, IParserErrorHandler theErrorHandler) { private ParserState(IParser theParser, FhirContext theContext, boolean theJsonMode, IParserErrorHandler theErrorHandler) {
myParser = theParser; myParser = theParser;
myContext = theContext; myContext = theContext;
@ -1121,10 +1121,6 @@ class ParserState<T> {
} }
} }
protected BundleEntry getEntry() {
return myEntry;
}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private void populateResourceMetadata() { private void populateResourceMetadata() {
if (myEntry.getResource() == null) { if (myEntry.getResource() == null) {
@ -1624,6 +1620,13 @@ class ParserState<T> {
try { try {
child = myDefinition.getChildByNameOrThrowDataFormatException(theChildName); child = myDefinition.getChildByNameOrThrowDataFormatException(theChildName);
} catch (DataFormatException e) { } catch (DataFormatException e) {
if (theChildName.equals("id")) {
if (getCurrentElement() instanceof IIdentifiableElement) {
push(new IdentifiableElementIdState(getPreResourceState(), (IIdentifiableElement) getCurrentElement()));
return;
}
}
/* /*
* This means we've found an element that doesn't exist on the structure. If the error handler doesn't throw * This means we've found an element that doesn't exist on the structure. If the error handler doesn't throw
* an exception, swallow the element silently along with any child elements * an exception, swallow the element silently along with any child elements
@ -1751,6 +1754,27 @@ class ParserState<T> {
} }
public class ElementIdState extends BaseState {
private IBaseElement myElement;
public ElementIdState(ParserState<T>.PreResourceState thePreResourceState, IBaseElement theElement) {
super(thePreResourceState);
myElement = theElement;
}
@Override
public void attributeValue(String theName, String theValue) throws DataFormatException {
myElement.setId(theValue);
}
@Override
public void endingElement() {
pop();
}
}
private class ExtensionState extends BaseState { private class ExtensionState extends BaseState {
private IBaseExtension<?, ?> myExtension; private IBaseExtension<?, ?> myExtension;
@ -1767,6 +1791,15 @@ class ParserState<T> {
// of "value" like every single other place // of "value" like every single other place
return; return;
} }
if ("id".equals(theName)) {
if (getCurrentElement() instanceof IBaseElement) {
((IBaseElement)getCurrentElement()).setId(theValue);
return;
} else if (getCurrentElement() instanceof IIdentifiableElement) {
((IIdentifiableElement)getCurrentElement()).setElementSpecificId(theValue);
return;
}
}
super.attributeValue(theName, theValue); super.attributeValue(theName, theValue);
} }
@ -1780,6 +1813,16 @@ class ParserState<T> {
@Override @Override
public void enteringNewElement(String theNamespaceUri, String theLocalPart) throws DataFormatException { public void enteringNewElement(String theNamespaceUri, String theLocalPart) throws DataFormatException {
if (theLocalPart.equals("id")) {
if (getCurrentElement() instanceof IBaseElement) {
push(new ElementIdState(getPreResourceState(), (IBaseElement)getCurrentElement()));
return;
} else if (getCurrentElement() instanceof IIdentifiableElement) {
push(new IdentifiableElementIdState(getPreResourceState(), (IIdentifiableElement)getCurrentElement()));
return;
}
}
BaseRuntimeElementDefinition<?> target = myContext.getRuntimeChildUndeclaredExtensionDefinition().getChildByName(theLocalPart); BaseRuntimeElementDefinition<?> target = myContext.getRuntimeChildUndeclaredExtensionDefinition().getChildByName(theLocalPart);
if (target == null) { if (target == null) {
myErrorHandler.unknownElement(null, theLocalPart); myErrorHandler.unknownElement(null, theLocalPart);
@ -1836,6 +1879,27 @@ class ParserState<T> {
} }
public class IdentifiableElementIdState extends BaseState {
private IIdentifiableElement myElement;
public IdentifiableElementIdState(ParserState<T>.PreResourceState thePreResourceState, IIdentifiableElement theElement) {
super(thePreResourceState);
myElement = theElement;
}
@Override
public void attributeValue(String theName, String theValue) throws DataFormatException {
myElement.setElementSpecificId(theValue);
}
@Override
public void endingElement() {
pop();
}
}
private class MetaElementState extends BaseState { private class MetaElementState extends BaseState {
private ResourceMetadataMap myMap; private ResourceMetadataMap myMap;

View File

@ -518,6 +518,10 @@ public class XmlParser extends BaseParser implements IParser {
String value = pd.getValueAsString(); String value = pd.getValueAsString();
if (value != null || super.hasExtensions(pd)) { if (value != null || super.hasExtensions(pd)) {
theEventWriter.writeStartElement(childName); theEventWriter.writeStartElement(childName);
String elementId = getCompositeElementId(theElement);
if (isNotBlank(elementId)) {
theEventWriter.writeAttribute("id", elementId);
}
if (value != null) { if (value != null) {
theEventWriter.writeAttribute("value", value); theEventWriter.writeAttribute("value", value);
} }
@ -530,10 +534,13 @@ public class XmlParser extends BaseParser implements IParser {
case RESOURCE_BLOCK: case RESOURCE_BLOCK:
case COMPOSITE_DATATYPE: { case COMPOSITE_DATATYPE: {
theEventWriter.writeStartElement(childName); theEventWriter.writeStartElement(childName);
String elementId = getCompositeElementId(theElement);
if (isNotBlank(elementId)) {
theEventWriter.writeAttribute("id", elementId);
}
if (isNotBlank(theExtensionUrl)) { if (isNotBlank(theExtensionUrl)) {
theEventWriter.writeAttribute("url", theExtensionUrl); theEventWriter.writeAttribute("url", theExtensionUrl);
} }
BaseRuntimeElementCompositeDefinition<?> childCompositeDef = (BaseRuntimeElementCompositeDefinition<?>) childDef;
encodeCompositeElementToStreamWriter(theResource, theElement, theEventWriter, theIncludedResource, theParent); encodeCompositeElementToStreamWriter(theResource, theElement, theEventWriter, theIncludedResource, theParent);
theEventWriter.writeEndElement(); theEventWriter.writeEndElement();
break; break;
@ -592,6 +599,7 @@ public class XmlParser extends BaseParser implements IParser {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private void encodeCompositeElementToStreamWriter(IBaseResource theResource, IBase theElement, XMLStreamWriter theEventWriter, boolean theContainedResource, CompositeChildElement theParent) private void encodeCompositeElementToStreamWriter(IBaseResource theResource, IBase theElement, XMLStreamWriter theEventWriter, boolean theContainedResource, CompositeChildElement theParent)
throws XMLStreamException, DataFormatException { throws XMLStreamException, DataFormatException {
for (CompositeChildElement nextChildElem : super.compositeChildIterator(theElement, theContainedResource, theParent)) { for (CompositeChildElement nextChildElem : super.compositeChildIterator(theElement, theContainedResource, theParent)) {
BaseRuntimeChildDefinition nextChild = nextChildElem.getDef(); BaseRuntimeChildDefinition nextChild = nextChildElem.getDef();
@ -701,6 +709,11 @@ public class XmlParser extends BaseParser implements IParser {
theEventWriter.writeStartElement("extension"); theEventWriter.writeStartElement("extension");
} }
String elementId = getCompositeElementId(nextValue);
if (isNotBlank(elementId)) {
theEventWriter.writeAttribute("id", elementId);
}
theEventWriter.writeAttribute("url", extensionUrl); theEventWriter.writeAttribute("url", extensionUrl);
encodeChildElementToStreamWriter(theResource, theEventWriter, nextValue, childName, childDef, null, theContainedResource, nextChildElem); encodeChildElementToStreamWriter(theResource, theEventWriter, nextValue, childName, childDef, null, theContainedResource, nextChildElem);
theEventWriter.writeEndElement(); theEventWriter.writeEndElement();
@ -892,18 +905,23 @@ public class XmlParser extends BaseParser implements IParser {
} }
} }
private void encodeUndeclaredExtensions(IBaseResource theResource, XMLStreamWriter theWriter, List<? extends IBaseExtension<?, ?>> theExtensions, String tagName, boolean theIncludedResource) throws XMLStreamException, DataFormatException { private void encodeUndeclaredExtensions(IBaseResource theResource, XMLStreamWriter theEventWriter, List<? extends IBaseExtension<?, ?>> theExtensions, String tagName, boolean theIncludedResource) throws XMLStreamException, DataFormatException {
for (IBaseExtension<?, ?> next : theExtensions) { for (IBaseExtension<?, ?> next : theExtensions) {
if (next == null || (ElementUtil.isEmpty(next.getValue()) && next.getExtension().isEmpty())) { if (next == null || (ElementUtil.isEmpty(next.getValue()) && next.getExtension().isEmpty())) {
continue; continue;
} }
writeCommentsPre(theWriter, next); writeCommentsPre(theEventWriter, next);
theWriter.writeStartElement(tagName); theEventWriter.writeStartElement(tagName);
String elementId = getCompositeElementId(next);
if (isNotBlank(elementId)) {
theEventWriter.writeAttribute("id", elementId);
}
String url = next.getUrl(); String url = next.getUrl();
theWriter.writeAttribute("url", url); theEventWriter.writeAttribute("url", url);
if (next.getValue() != null) { if (next.getValue() != null) {
IBaseDatatype value = next.getValue(); IBaseDatatype value = next.getValue();
@ -923,15 +941,15 @@ public class XmlParser extends BaseParser implements IParser {
throw new ConfigurationException("Unable to encode extension, unrecognized child element type: " + value.getClass().getCanonicalName()); throw new ConfigurationException("Unable to encode extension, unrecognized child element type: " + value.getClass().getCanonicalName());
} }
} }
encodeChildElementToStreamWriter(theResource, theWriter, value, childName, childDef, null, theIncludedResource, null); encodeChildElementToStreamWriter(theResource, theEventWriter, value, childName, childDef, null, theIncludedResource, null);
} }
// child extensions // child extensions
encodeExtensionsIfPresent(theResource, theWriter, next, theIncludedResource); encodeExtensionsIfPresent(theResource, theEventWriter, next, theIncludedResource);
theWriter.writeEndElement(); theEventWriter.writeEndElement();
writeCommentsPost(theWriter, next); writeCommentsPost(theEventWriter, next);
} }
} }

View File

@ -21,6 +21,7 @@ package ca.uhn.fhir.rest.server.interceptor;
*/ */
import java.io.IOException; import java.io.IOException;
import java.util.List;
import java.util.Map; import java.util.Map;
import javax.servlet.ServletException; import javax.servlet.ServletException;
@ -39,6 +40,7 @@ import ca.uhn.fhir.rest.annotation.ResourceParam;
import ca.uhn.fhir.rest.annotation.Search; import ca.uhn.fhir.rest.annotation.Search;
import ca.uhn.fhir.rest.api.RestOperationTypeEnum; import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
import ca.uhn.fhir.rest.method.RequestDetails; import ca.uhn.fhir.rest.method.RequestDetails;
import ca.uhn.fhir.rest.server.IRestfulServerDefaults;
import ca.uhn.fhir.rest.server.exceptions.AuthenticationException; import ca.uhn.fhir.rest.server.exceptions.AuthenticationException;
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException; import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
@ -441,6 +443,25 @@ public interface IServerInterceptor {
myResource = theObject; myResource = theObject;
} }
/**
* This method may be invoked by user code to notify interceptors that a nested
* operation is being invoked which is denoted by this request details.
*/
public void notifyIncomingRequestPreHandled(RestOperationTypeEnum theOperationType) {
RequestDetails requestDetails = getRequestDetails();
if (requestDetails == null) {
return;
}
IRestfulServerDefaults server = requestDetails.getServer();
if (server == null) {
return;
}
List<IServerInterceptor> interceptors = server.getInterceptors();
for (IServerInterceptor next : interceptors) {
next.incomingRequestPreHandled(theOperationType, this);
}
}
} }
} }

View File

@ -39,6 +39,7 @@ import ca.uhn.fhir.model.api.TagList;
import ca.uhn.fhir.rest.api.RestOperationTypeEnum; import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
import ca.uhn.fhir.rest.method.RequestDetails; import ca.uhn.fhir.rest.method.RequestDetails;
import ca.uhn.fhir.rest.server.exceptions.AuthenticationException; import ca.uhn.fhir.rest.server.exceptions.AuthenticationException;
import ca.uhn.fhir.rest.server.exceptions.ForbiddenOperationException;
import ca.uhn.fhir.rest.server.interceptor.IServerOperationInterceptor; import ca.uhn.fhir.rest.server.interceptor.IServerOperationInterceptor;
import ca.uhn.fhir.rest.server.interceptor.InterceptorAdapter; import ca.uhn.fhir.rest.server.interceptor.InterceptorAdapter;
import ca.uhn.fhir.util.BundleUtil; import ca.uhn.fhir.util.BundleUtil;
@ -49,7 +50,7 @@ import ca.uhn.fhir.util.CoverageIgnore;
* inspect requests and responses to determine whether the calling user * inspect requests and responses to determine whether the calling user
* has permission to perform the given action. * has permission to perform the given action.
*/ */
public class AuthorizationInterceptor extends InterceptorAdapter implements IServerOperationInterceptor { public class AuthorizationInterceptor extends InterceptorAdapter implements IServerOperationInterceptor, IRuleApplier {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(AuthorizationInterceptor.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(AuthorizationInterceptor.class);
@ -72,9 +73,8 @@ public class AuthorizationInterceptor extends InterceptorAdapter implements ISer
setDefaultPolicy(theDefaultPolicy); setDefaultPolicy(theDefaultPolicy);
} }
private void applyRulesAndFailIfDeny(List<IAuthRule> theRules, RestOperationTypeEnum theOperation, RequestDetails theRequestDetails, IBaseResource theInputResource, IBaseResource theOutputResource) { private void applyRulesAndFailIfDeny(RestOperationTypeEnum theOperation, RequestDetails theRequestDetails, IBaseResource theInputResource, IBaseResource theOutputResource) {
ourLog.trace("Applying {} rules to render an auth decision for operation {}", theRules.size(), theOperation); Verdict decision = applyRulesAndReturnDecision(theOperation, theRequestDetails, theInputResource, theOutputResource);
Verdict decision = applyRulesAndReturnDecision(theRules, theOperation, theRequestDetails, theInputResource, theOutputResource);
if (decision.getDecision() == PolicyEnum.ALLOW) { if (decision.getDecision() == PolicyEnum.ALLOW) {
return; return;
@ -83,38 +83,26 @@ public class AuthorizationInterceptor extends InterceptorAdapter implements ISer
handleDeny(decision); handleDeny(decision);
} }
private Verdict applyRulesAndReturnDecision(List<IAuthRule> theRules, RestOperationTypeEnum theOperation, RequestDetails theRequestDetails, IBaseResource theInputResource, IBaseResource theOutputResource) { @Override
PolicyEnum result = null; public Verdict applyRulesAndReturnDecision(RestOperationTypeEnum theOperation, RequestDetails theRequestDetails, IBaseResource theInputResource, IBaseResource theOutputResource) {
// PolicyEnum preference = null; List<IAuthRule> rules = buildRuleList(theRequestDetails);
IAuthRule decidingRule = null; ourLog.trace("Applying {} rules to render an auth decision for operation {}", rules.size(), theOperation);
for (IAuthRule nextRule : theRules) { Verdict verdict = null;
RuleVerdictEnum decision = nextRule.applyRule(theOperation, theRequestDetails, theInputResource, theOutputResource); for (IAuthRule nextRule : rules) {
verdict = nextRule.applyRule(theOperation, theRequestDetails, theInputResource, theOutputResource, this);
switch (decision) { if (verdict != null) {
case NO_DECISION: ourLog.trace("Rule {} returned decision {}", nextRule, verdict.getDecision());
continue;
case ALLOW:
result = PolicyEnum.ALLOW;
decidingRule = nextRule;
break;
case DENY:
result = PolicyEnum.DENY;
decidingRule = nextRule;
break;
}
if (result != null) {
ourLog.trace("Rule {} returned decision {}", nextRule, result);
break; break;
} }
} }
if (result == null) { if (verdict == null) {
ourLog.trace("No rules returned a decision, applying default {}", myDefaultPolicy); ourLog.trace("No rules returned a decision, applying default {}", myDefaultPolicy);
result = myDefaultPolicy; return new Verdict(myDefaultPolicy, null);
} }
return new Verdict(result, decidingRule);
return verdict;
} }
/** /**
@ -197,22 +185,21 @@ public class AuthorizationInterceptor extends InterceptorAdapter implements ISer
* Handle an access control verdict of {@link PolicyEnum#DENY}. * Handle an access control verdict of {@link PolicyEnum#DENY}.
* <p> * <p>
* Subclasses may override to implement specific behaviour, but default is to * Subclasses may override to implement specific behaviour, but default is to
* throw {@link AuthenticationException} (HTTP 401) with error message citing the * throw {@link ForbiddenOperationException} (HTTP 403) with error message citing the
* rule name which trigered failure * rule name which trigered failure
* </p> * </p>
*/ */
protected void handleDeny(Verdict decision) { protected void handleDeny(Verdict decision) {
if (decision.getDecidingRule() != null) { if (decision.getDecidingRule() != null) {
String ruleName = defaultString(decision.getDecidingRule().getName(), "(unnamed rule)"); String ruleName = defaultString(decision.getDecidingRule().getName(), "(unnamed rule)");
throw new AuthenticationException("Access denied by rule: " + ruleName); throw new ForbiddenOperationException("Access denied by rule: " + ruleName);
} else { } else {
throw new AuthenticationException("Access denied by default policy (no applicable rules)"); throw new ForbiddenOperationException("Access denied by default policy (no applicable rules)");
} }
} }
private void handleUserOperation(RequestDetails theRequest, IBaseResource theResource, RestOperationTypeEnum operation) { private void handleUserOperation(RequestDetails theRequest, IBaseResource theResource, RestOperationTypeEnum operation) {
List<IAuthRule> rules = buildRuleList(theRequest); applyRulesAndFailIfDeny(operation, theRequest, theResource, null);
applyRulesAndFailIfDeny(rules, operation, theRequest, theResource, null);
} }
@Override @Override
@ -227,8 +214,7 @@ public class AuthorizationInterceptor extends InterceptorAdapter implements ISer
} }
RequestDetails requestDetails = theProcessedRequest.getRequestDetails(); RequestDetails requestDetails = theProcessedRequest.getRequestDetails();
List<IAuthRule> rules = buildRuleList(requestDetails); applyRulesAndFailIfDeny(theOperation, requestDetails, theProcessedRequest.getResource(), null);
applyRulesAndFailIfDeny(rules, theOperation, requestDetails, theProcessedRequest.getResource(), null);
} }
@Override @Override
@ -281,7 +267,7 @@ public class AuthorizationInterceptor extends InterceptorAdapter implements ISer
} }
for (IBaseResource nextResponse : resources) { for (IBaseResource nextResponse : resources) {
applyRulesAndFailIfDeny(rules, theRequestDetails.getRestOperationType(), theRequestDetails, null, nextResponse); applyRulesAndFailIfDeny(theRequestDetails.getRestOperationType(), theRequestDetails, null, nextResponse);
} }
return true; return true;

View File

@ -24,6 +24,7 @@ import org.hl7.fhir.instance.model.api.IBaseResource;
import ca.uhn.fhir.rest.api.RestOperationTypeEnum; import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
import ca.uhn.fhir.rest.method.RequestDetails; import ca.uhn.fhir.rest.method.RequestDetails;
import ca.uhn.fhir.rest.server.interceptor.auth.AuthorizationInterceptor.Verdict;
public interface IAuthRule { public interface IAuthRule {
@ -38,9 +39,12 @@ public interface IAuthRule {
* The resource being input by the client, or <code>null</code> * The resource being input by the client, or <code>null</code>
* @param theOutputResource * @param theOutputResource
* The resource being returned by the server, or <code>null</code> * The resource being returned by the server, or <code>null</code>
* @return Returns a policy decision, or {@link RuleVerdictEnum#NO_DECISION} if the rule does not apply * @param theRuleApplier
* The rule applying module (this can be used by rules to apply the rule set to
* nested objects in the request, such as nested requests in a transaction)
* @return Returns a policy decision, or <code>null</code> if the rule does not apply
*/ */
RuleVerdictEnum applyRule(RestOperationTypeEnum theOperation, RequestDetails theRequestDetails, IBaseResource theInputResource, IBaseResource theOutputResource); Verdict applyRule(RestOperationTypeEnum theOperation, RequestDetails theRequestDetails, IBaseResource theInputResource, IBaseResource theOutputResource, IRuleApplier theRuleApplier);
/** /**
* Returns a name for this rule, to be used in logs and error messages * Returns a name for this rule, to be used in logs and error messages

View File

@ -22,6 +22,11 @@ package ca.uhn.fhir.rest.server.interceptor.auth;
public interface IAuthRuleBuilderRule { public interface IAuthRuleBuilderRule {
/**
* This rule applies to the FHIR delete operation
*/
IAuthRuleBuilderRuleOp delete();
/** /**
* This rules applies to the metadata operation (retrieve the * This rules applies to the metadata operation (retrieve the
* server's conformance statement) * server's conformance statement)

View File

@ -20,8 +20,14 @@ package ca.uhn.fhir.rest.server.interceptor.auth;
* #L% * #L%
*/ */
enum RuleVerdictEnum { import org.hl7.fhir.instance.model.api.IBaseResource;
ALLOW,
DENY, import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
NO_DECISION import ca.uhn.fhir.rest.method.RequestDetails;
import ca.uhn.fhir.rest.server.interceptor.auth.AuthorizationInterceptor.Verdict;
public interface IRuleApplier {
Verdict applyRulesAndReturnDecision(RestOperationTypeEnum theOperation, RequestDetails theRequestDetails, IBaseResource theInputResource, IBaseResource theOutputResource);
} }

View File

@ -21,16 +21,23 @@ package ca.uhn.fhir.rest.server.interceptor.auth;
*/ */
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Set; import java.util.Set;
import org.apache.commons.lang3.Validate;
import org.hl7.fhir.instance.model.api.IBaseBundle; import org.hl7.fhir.instance.model.api.IBaseBundle;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.instance.model.api.IIdType;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.RuntimeResourceDefinition;
import ca.uhn.fhir.rest.api.RequestTypeEnum;
import ca.uhn.fhir.rest.api.RestOperationTypeEnum; import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
import ca.uhn.fhir.rest.method.RequestDetails; import ca.uhn.fhir.rest.method.RequestDetails;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import ca.uhn.fhir.rest.server.interceptor.auth.AuthorizationInterceptor.Verdict;
import ca.uhn.fhir.util.BundleUtil; import ca.uhn.fhir.util.BundleUtil;
import ca.uhn.fhir.util.BundleUtil.BundleEntryParts;
import ca.uhn.fhir.util.FhirTerser; import ca.uhn.fhir.util.FhirTerser;
class Rule implements IAuthRule { class Rule implements IAuthRule {
@ -40,7 +47,7 @@ class Rule implements IAuthRule {
private String myClassifierCompartmentName; private String myClassifierCompartmentName;
private Collection<? extends IIdType> myClassifierCompartmentOwners; private Collection<? extends IIdType> myClassifierCompartmentOwners;
private ClassifierTypeEnum myClassifierType; private ClassifierTypeEnum myClassifierType;
private RuleVerdictEnum myMode; private PolicyEnum myMode;
private String myName; private String myName;
private RuleOpEnum myOp; private RuleOpEnum myOp;
private TransactionAppliesToEnum myTransactionAppliesToOp; private TransactionAppliesToEnum myTransactionAppliesToOp;
@ -50,33 +57,107 @@ class Rule implements IAuthRule {
} }
@Override @Override
public RuleVerdictEnum applyRule(RestOperationTypeEnum theOperation, RequestDetails theRequestDetails, IBaseResource theInputResource, IBaseResource theOutputResource) { public Verdict applyRule(RestOperationTypeEnum theOperation, RequestDetails theRequestDetails, IBaseResource theInputResource, IBaseResource theOutputResource, IRuleApplier theRuleApplier) {
FhirContext ctx = theRequestDetails.getServer().getFhirContext(); FhirContext ctx = theRequestDetails.getServer().getFhirContext();
IBaseResource appliesTo; IBaseResource appliesTo;
switch (myOp) { switch (myOp) {
case READ: case READ:
if (theOutputResource == null) {
return null;
}
appliesTo = theOutputResource; appliesTo = theOutputResource;
break; break;
case WRITE: case WRITE:
if (theInputResource == null) {
return null;
}
appliesTo = theInputResource; appliesTo = theInputResource;
break; break;
case DELETE:
if (theOperation == RestOperationTypeEnum.DELETE) {
if (theInputResource == null) {
return new Verdict(myMode, this);
} else {
appliesTo = theInputResource;
}
} else {
return null;
}
break;
case BATCH: case BATCH:
case TRANSACTION: case TRANSACTION:
if (requestAppliesToTransaction(ctx, myOp, theInputResource)) { if (theInputResource != null && requestAppliesToTransaction(ctx, myOp, theInputResource)) {
return myMode; if (myMode == PolicyEnum.DENY) {
return new Verdict(PolicyEnum.DENY, this);
} else {
List<BundleEntryParts> inputResources = BundleUtil.toListOfEntries(ctx, (IBaseBundle) theInputResource);
Verdict verdict = null;
for (BundleEntryParts nextPart : inputResources) {
IBaseResource inputResource = nextPart.getResource();
RestOperationTypeEnum operation = null;
if (nextPart.getRequestType() == RequestTypeEnum.GET) {
continue;
}
if (nextPart.getRequestType() == RequestTypeEnum.POST) {
operation = RestOperationTypeEnum.CREATE;
} else if (nextPart.getRequestType() == RequestTypeEnum.PUT) {
operation = RestOperationTypeEnum.UPDATE;
} else {
throw new InvalidRequestException("Can not handle transaction with operation of type " + nextPart.getRequestType());
}
/*
* This is basically just being conservative - Be careful of transactions containing
* nested operations and nested transactions. We block the by default. At some point
* it would be nice to be more nuanced here.
*/
RuntimeResourceDefinition resourceDef = ctx.getResourceDefinition(nextPart.getResource());
if ("Parameters".equals(resourceDef.getName()) || "Bundle".equals(resourceDef.getName())) {
throw new InvalidRequestException("Can not handle transaction with nested resource of type " + resourceDef.getName());
}
Verdict newVerdict = theRuleApplier.applyRulesAndReturnDecision(operation, theRequestDetails, inputResource, null);
if (newVerdict == null) {
continue;
} else if (verdict == null) {
verdict = newVerdict;
} else if (verdict.getDecision() == PolicyEnum.ALLOW && newVerdict.getDecision() == PolicyEnum.DENY) {
verdict = newVerdict;
}
}
return verdict;
}
} else if (theOutputResource != null) {
List<BundleEntryParts> inputResources = BundleUtil.toListOfEntries(ctx, (IBaseBundle) theInputResource);
Verdict verdict = null;
for (BundleEntryParts nextPart : inputResources) {
if (nextPart.getResource() == null) {
continue;
}
Verdict newVerdict = theRuleApplier.applyRulesAndReturnDecision(RestOperationTypeEnum.READ, theRequestDetails, null, nextPart.getResource());
if (newVerdict == null) {
continue;
} else if (verdict == null) {
verdict = newVerdict;
} else if (verdict.getDecision() == PolicyEnum.ALLOW && newVerdict.getDecision() == PolicyEnum.DENY) {
verdict = newVerdict;
}
}
return verdict;
} else { } else {
return RuleVerdictEnum.NO_DECISION; return null;
} }
case ALLOW_ALL: case ALLOW_ALL:
return RuleVerdictEnum.ALLOW; return new Verdict(PolicyEnum.ALLOW, this);
case DENY_ALL: case DENY_ALL:
return RuleVerdictEnum.DENY; return new Verdict(PolicyEnum.DENY, this);
case METADATA: case METADATA:
if (theOperation == RestOperationTypeEnum.METADATA) { if (theOperation == RestOperationTypeEnum.METADATA) {
return myMode; return new Verdict(myMode, this);
} else { } else {
return RuleVerdictEnum.NO_DECISION; return null;
} }
default: default:
// Should not happen // Should not happen
@ -88,7 +169,7 @@ class Rule implements IAuthRule {
break; break;
case TYPES: case TYPES:
if (myAppliesToTypes.contains(appliesTo.getClass()) == false) { if (myAppliesToTypes.contains(appliesTo.getClass()) == false) {
return RuleVerdictEnum.NO_DECISION; return null;
} }
break; break;
default: default:
@ -108,17 +189,21 @@ class Rule implements IAuthRule {
} }
} }
if (!foundMatch) { if (!foundMatch) {
return RuleVerdictEnum.NO_DECISION; return null;
} }
break; break;
default: default:
throw new IllegalStateException("Unable to apply security to event of applies to type " + myAppliesTo); throw new IllegalStateException("Unable to apply security to event of applies to type " + myAppliesTo);
} }
return myMode; return new Verdict(myMode, this);
} }
private boolean requestAppliesToTransaction(FhirContext theContext, RuleOpEnum theOp, IBaseResource theInputResource) { private boolean requestAppliesToTransaction(FhirContext theContext, RuleOpEnum theOp, IBaseResource theInputResource) {
if (!"Bundle".equals(theContext.getResourceDefinition(theInputResource).getName())) {
return false;
}
IBaseBundle request = (IBaseBundle) theInputResource; IBaseBundle request = (IBaseBundle) theInputResource;
String bundleType = BundleUtil.getBundleType(theContext, request); String bundleType = BundleUtil.getBundleType(theContext, request);
switch (theOp) { switch (theOp) {
@ -160,7 +245,7 @@ class Rule implements IAuthRule {
myClassifierType = theClassifierType; myClassifierType = theClassifierType;
} }
public void setMode(RuleVerdictEnum theRuleMode) { public void setMode(PolicyEnum theRuleMode) {
myMode = theRuleMode; myMode = theRuleMode;
} }

View File

@ -46,7 +46,7 @@ public class RuleBuilder implements IAuthRuleBuilder {
@Override @Override
public IAuthRuleBuilderRule allow(String theRuleName) { public IAuthRuleBuilderRule allow(String theRuleName) {
return new RuleBuilderRule(RuleVerdictEnum.ALLOW, theRuleName); return new RuleBuilderRule(PolicyEnum.ALLOW, theRuleName);
} }
@Override @Override
@ -72,7 +72,7 @@ public class RuleBuilder implements IAuthRuleBuilder {
@Override @Override
public IAuthRuleBuilderRule deny(String theRuleName) { public IAuthRuleBuilderRule deny(String theRuleName) {
return new RuleBuilderRule(RuleVerdictEnum.DENY, theRuleName); return new RuleBuilderRule(PolicyEnum.DENY, theRuleName);
} }
@Override @Override
@ -101,15 +101,21 @@ public class RuleBuilder implements IAuthRuleBuilder {
private class RuleBuilderRule implements IAuthRuleBuilderRule { private class RuleBuilderRule implements IAuthRuleBuilderRule {
private RuleOpEnum myRuleOp; private PolicyEnum myRuleMode;
private RuleVerdictEnum myRuleMode;
private String myRuleName; private String myRuleName;
private RuleOpEnum myRuleOp;
public RuleBuilderRule(RuleVerdictEnum theRuleMode, String theRuleName) { public RuleBuilderRule(PolicyEnum theRuleMode, String theRuleName) {
myRuleMode = theRuleMode; myRuleMode = theRuleMode;
myRuleName = theRuleName; myRuleName = theRuleName;
} }
@Override
public IAuthRuleBuilderRuleOp delete() {
myRuleOp = RuleOpEnum.DELETE;
return new RuleBuilderRuleOp();
}
@Override @Override
public RuleBuilderFinished metadata() { public RuleBuilderFinished metadata() {
Rule rule = new Rule(myRuleName); Rule rule = new Rule(myRuleName);
@ -118,13 +124,13 @@ public class RuleBuilder implements IAuthRuleBuilder {
myRules.add(rule); myRules.add(rule);
return new RuleBuilderFinished(); return new RuleBuilderFinished();
} }
@Override @Override
public IAuthRuleBuilderRuleOp read() { public IAuthRuleBuilderRuleOp read() {
myRuleOp = RuleOpEnum.READ; myRuleOp = RuleOpEnum.READ;
return new RuleBuilderRuleOp(); return new RuleBuilderRuleOp();
} }
@Override @Override
public IAuthRuleBuilderRuleTransaction transaction() { public IAuthRuleBuilderRuleTransaction transaction() {
myRuleOp = RuleOpEnum.TRANSACTION; myRuleOp = RuleOpEnum.TRANSACTION;
@ -136,7 +142,7 @@ public class RuleBuilder implements IAuthRuleBuilder {
myRuleOp = RuleOpEnum.WRITE; myRuleOp = RuleOpEnum.WRITE;
return new RuleBuilderRuleOp(); return new RuleBuilderRuleOp();
} }
private class RuleBuilderRuleOp implements IAuthRuleBuilderRuleOp { private class RuleBuilderRuleOp implements IAuthRuleBuilderRuleOp {
private AppliesTypeEnum myAppliesTo; private AppliesTypeEnum myAppliesTo;

View File

@ -27,5 +27,6 @@ enum RuleOpEnum {
DENY_ALL, DENY_ALL,
TRANSACTION, TRANSACTION,
METADATA, METADATA,
BATCH BATCH,
DELETE
} }

View File

@ -1,5 +1,7 @@
package ca.uhn.fhir.util; package ca.uhn.fhir.util;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
/* /*
* #%L * #%L
* HAPI FHIR - Core Library * HAPI FHIR - Core Library
@ -33,33 +35,13 @@ import ca.uhn.fhir.context.BaseRuntimeChildDefinition;
import ca.uhn.fhir.context.BaseRuntimeElementCompositeDefinition; import ca.uhn.fhir.context.BaseRuntimeElementCompositeDefinition;
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.rest.api.RequestTypeEnum;
/** /**
* Fetch resources from a bundle * Fetch resources from a bundle
*/ */
public class BundleUtil { public class BundleUtil {
/**
* Extract all of the resources from a given bundle
*/
public static List<IBaseResource> toListOfResources(FhirContext theContext, IBaseBundle theBundle) {
List<IBaseResource> retVal = new ArrayList<IBaseResource>();
RuntimeResourceDefinition def = theContext.getResourceDefinition(theBundle);
BaseRuntimeChildDefinition entryChild = def.getChildByName("entry");
List<IBase> entries = entryChild.getAccessor().getValues(theBundle);
BaseRuntimeElementCompositeDefinition<?> entryChildElem = (BaseRuntimeElementCompositeDefinition<?>) entryChild.getChildByName("entry");
BaseRuntimeChildDefinition resourceChild = entryChildElem.getChildByName("resource");
for (IBase nextEntry : entries) {
for (IBase next : resourceChild.getAccessor().getValues(nextEntry)) {
retVal.add((IBaseResource) next);
}
}
return retVal;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static List<Pair<String, IBaseResource>> getBundleEntryUrlsAndResources(FhirContext theContext, IBaseBundle theBundle) { public static List<Pair<String, IBaseResource>> getBundleEntryUrlsAndResources(FhirContext theContext, IBaseBundle theBundle) {
RuntimeResourceDefinition def = theContext.getResourceDefinition(theBundle); RuntimeResourceDefinition def = theContext.getResourceDefinition(theBundle);
@ -96,7 +78,7 @@ public class BundleUtil {
return retVal; return retVal;
} }
public static String getBundleType(FhirContext theContext, IBaseBundle theBundle) { public static String getBundleType(FhirContext theContext, IBaseBundle theBundle) {
RuntimeResourceDefinition def = theContext.getResourceDefinition(theBundle); RuntimeResourceDefinition def = theContext.getResourceDefinition(theBundle);
BaseRuntimeChildDefinition entryChild = def.getChildByName("type"); BaseRuntimeChildDefinition entryChild = def.getChildByName("type");
@ -108,4 +90,96 @@ public class BundleUtil {
return null; return null;
} }
/**
* Extract all of the resources from a given bundle
*/
public static List<BundleEntryParts> toListOfEntries(FhirContext theContext, IBaseBundle theBundle) {
List<BundleEntryParts> retVal = new ArrayList<BundleEntryParts>();
RuntimeResourceDefinition def = theContext.getResourceDefinition(theBundle);
BaseRuntimeChildDefinition entryChild = def.getChildByName("entry");
List<IBase> entries = entryChild.getAccessor().getValues(theBundle);
BaseRuntimeElementCompositeDefinition<?> entryChildElem = (BaseRuntimeElementCompositeDefinition<?>) entryChild.getChildByName("entry");
BaseRuntimeChildDefinition resourceChild = entryChildElem.getChildByName("resource");
BaseRuntimeChildDefinition requestChild = entryChildElem.getChildByName("request");
BaseRuntimeElementCompositeDefinition<?> requestElem = (BaseRuntimeElementCompositeDefinition<?>) requestChild.getChildByName("request");
BaseRuntimeChildDefinition urlChild = requestElem.getChildByName("url");
BaseRuntimeChildDefinition methodChild = requestElem.getChildByName("method");
IBaseResource resource = null;
String url = null;
RequestTypeEnum requestType = null;
for (IBase nextEntry : entries) {
for (IBase next : resourceChild.getAccessor().getValues(nextEntry)) {
resource = (IBaseResource) next;
}
for (IBase nextRequest : requestChild.getAccessor().getValues(nextEntry)) {
for (IBase nextUrl : urlChild.getAccessor().getValues(nextRequest)) {
url = ((IPrimitiveType<?>)nextUrl).getValueAsString();
}
for (IBase nextUrl : methodChild.getAccessor().getValues(nextRequest)) {
String methodString = ((IPrimitiveType<?>)nextUrl).getValueAsString();
if (isNotBlank(methodString)) {
requestType = RequestTypeEnum.valueOf(methodString);
}
}
}
/*
* All 3 might be null - That's ok because we still want to know the
* order in the original bundle.
*/
retVal.add(new BundleEntryParts(requestType, url, resource));
}
return retVal;
}
/**
* Extract all of the resources from a given bundle
*/
public static List<IBaseResource> toListOfResources(FhirContext theContext, IBaseBundle theBundle) {
List<IBaseResource> retVal = new ArrayList<IBaseResource>();
RuntimeResourceDefinition def = theContext.getResourceDefinition(theBundle);
BaseRuntimeChildDefinition entryChild = def.getChildByName("entry");
List<IBase> entries = entryChild.getAccessor().getValues(theBundle);
BaseRuntimeElementCompositeDefinition<?> entryChildElem = (BaseRuntimeElementCompositeDefinition<?>) entryChild.getChildByName("entry");
BaseRuntimeChildDefinition resourceChild = entryChildElem.getChildByName("resource");
for (IBase nextEntry : entries) {
for (IBase next : resourceChild.getAccessor().getValues(nextEntry)) {
retVal.add((IBaseResource) next);
}
}
return retVal;
}
public static class BundleEntryParts
{
private final RequestTypeEnum myRequestType;
private final IBaseResource myResource;
private final String myUrl;
public BundleEntryParts(RequestTypeEnum theRequestType, String theUrl, IBaseResource theResource) {
super();
myRequestType = theRequestType;
myUrl = theUrl;
myResource = theResource;
}
public RequestTypeEnum getRequestType() {
return myRequestType;
}
public IBaseResource getResource() {
return myResource;
}
public String getUrl() {
return myUrl;
}
}
} }

View File

@ -1,5 +1,25 @@
package ca.uhn.fhir.util; package ca.uhn.fhir.util;
/*
* #%L
* HAPI FHIR - Core Library
* %%
* Copyright (C) 2014 - 2016 University Health Network
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.Arrays; import java.util.Arrays;

View File

@ -24,4 +24,6 @@ public interface IBaseElement {
IBaseElement setId(String theValue); IBaseElement setId(String theValue);
String getId();
} }

View File

@ -190,11 +190,13 @@ public class App {
System.err.println(" " + ansi().fg(Color.RED).bold() + e.getMessage()); System.err.println(" " + ansi().fg(Color.RED).bold() + e.getMessage());
System.err.println("" + ansi().fg(Color.WHITE).boldOff()); System.err.println("" + ansi().fg(Color.WHITE).boldOff());
logCommandUsageNoHeader(command); logCommandUsageNoHeader(command);
return; System.exit(1);
} catch (CommandFailureException e) { } catch (CommandFailureException e) {
ourLog.error(e.getMessage()); ourLog.error(e.getMessage());
System.exit(1);
} catch (Exception e) { } catch (Exception e) {
ourLog.error("Error during execution: ", e); ourLog.error("Error during execution: ", e);
System.exit(1);
} }
} }

View File

@ -6,6 +6,10 @@ public class CommandFailureException extends Error {
super(theMessage); super(theMessage);
} }
public CommandFailureException(String theString, Exception theCause) {
super(theString, theCause);
}
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }

View File

@ -6,6 +6,7 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.SocketException;
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; import javax.servlet.ServletContextListener;
@ -61,9 +62,7 @@ public class RunServerCommand extends BaseCommand {
ContextHolder.setCtx(getSpecVersionContext(theCommandLine)); ContextHolder.setCtx(getSpecVersionContext(theCommandLine));
// ((ch.qos.logback.classic.Logger)LoggerFactory.getLogger("/")).setLevel(Level.ERROR); ourLog.info("Preparing HAPI FHIR JPA server on port {}", myPort);
ourLog.info("Preparing HAPI FHIR JPA server");
File tempWarFile; File tempWarFile;
try { try {
tempWarFile = File.createTempFile("hapi-fhir", ".war"); tempWarFile = File.createTempFile("hapi-fhir", ".war");
@ -113,9 +112,11 @@ public class RunServerCommand extends BaseCommand {
myServer.setHandler(root); myServer.setHandler(root);
try { try {
myServer.start(); myServer.start();
} catch (SocketException e) {
throw new CommandFailureException("Server failed to start on port " + myPort + " because of the following error \"" + e.toString() + "\". Note that you can use the '-p' option to specify an alternate port.");
} catch (Exception e) { } catch (Exception e) {
ourLog.error("Server failed to start", e); ourLog.error("Server failed to start", e);
return; throw new CommandFailureException("Server failed to start", e);
} }
ourLog.info("Server started on port {}", myPort); ourLog.info("Server started on port {}", myPort);
@ -125,21 +126,25 @@ public class RunServerCommand extends BaseCommand {
} }
public void run(String[] theArgs) { public static void main(String[] theArgs) {
getOptions();
// myServer = new Server(myPort); Server server = new Server(22);
// String path = "../hapi-fhir-cli-jpaserver";
// WebAppContext webAppContext = new WebAppContext(); WebAppContext webAppContext = new WebAppContext();
// webAppContext.setContextPath("/"); webAppContext.setContextPath("/");
// webAppContext.setDescriptor(path + "/src/main/webapp/WEB-INF/web.xml"); webAppContext.setDescriptor(path + "/src/main/webapp/WEB-INF/web.xml");
// webAppContext.setResourceBase(path + "/target/hapi-fhir-jpaserver-example"); webAppContext.setResourceBase(path + "/target/hapi-fhir-jpaserver-example");
// webAppContext.setParentLoaderPriority(true); webAppContext.setParentLoaderPriority(true);
//
// myServer.setHandler(webAppContext); server.setHandler(webAppContext);
// myServer.start(); try {
server.start();
} catch (Exception e) {
e.printStackTrace();
}
ourLog.info("Started");
} }
@Override @Override

View File

@ -55,7 +55,7 @@ public class ValidateCommand extends BaseCommand {
addFhirVersionOption(retVal); addFhirVersionOption(retVal);
OptionGroup source = new OptionGroup(); OptionGroup source = new OptionGroup();
source.addOption(new Option("f", "file", true, "The name of the file to validate")); source.addOption(new Option("n", "file", true, "The name of the file to validate"));
source.addOption(new Option("d", "data", true, "The text to validate")); source.addOption(new Option("d", "data", true, "The text to validate"));
retVal.addOptionGroup(source); retVal.addOptionGroup(source);
@ -72,13 +72,13 @@ public class ValidateCommand extends BaseCommand {
@Override @Override
public void run(CommandLine theCommandLine) throws ParseException, Exception { public void run(CommandLine theCommandLine) throws ParseException, Exception {
String fileName = theCommandLine.getOptionValue("f"); String fileName = theCommandLine.getOptionValue("n");
String contents = theCommandLine.getOptionValue("c"); String contents = theCommandLine.getOptionValue("c");
if (isNotBlank(fileName) && isNotBlank(contents)) { if (isNotBlank(fileName) && isNotBlank(contents)) {
throw new ParseException("Can not supply both a file (-f) and data (-d)"); throw new ParseException("Can not supply both a file (-n) and data (-d)");
} }
if (isBlank(fileName) && isBlank(contents)) { if (isBlank(fileName) && isBlank(contents)) {
throw new ParseException("Must supply either a file (-f) or data (-d)"); throw new ParseException("Must supply either a file (-n) or data (-d)");
} }
if (isNotBlank(fileName)) { if (isNotBlank(fileName)) {

View File

@ -1,3 +1,5 @@
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.cli.App; import ca.uhn.fhir.cli.App;
@ -5,24 +7,31 @@ import ca.uhn.fhir.cli.App;
public class ValidateTest { public class ValidateTest {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ValidateTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ValidateTest.class);
@Before
public void before() {
System.setProperty("noexit", "true");
}
@Test @Test
@Ignore
public void testValidateLocalProfile() { public void testValidateLocalProfile() {
String profilePath = ValidateTest.class.getResource("/uslab-patient.profile.xml").getFile(); String profilePath = ValidateTest.class.getResource("/uslab-patient.profile.xml").getFile();
String resourcePath = ValidateTest.class.getResource("/patient-uslab-example1.xml").getFile(); String resourcePath = ValidateTest.class.getResource("/patient-uslab-example1.xml").getFile();
ourLog.info(profilePath); ourLog.info(profilePath);
ourLog.info(resourcePath); ourLog.info(resourcePath);
App.main(new String[] {"validate", "-p", "-f", resourcePath, "-l", profilePath}); App.main(new String[] {"validate", "-p", "-n", resourcePath, "-l", profilePath});
} }
@Test @Test
@Ignore
public void testValidateLocalProfileWithReferenced() { public void testValidateLocalProfileWithReferenced() {
String profilePath = ValidateTest.class.getResource("/nl/nl-core-patient.dstu2.xml").getFile(); String profilePath = ValidateTest.class.getResource("/nl/nl-core-patient.dstu2.xml").getFile();
String resourcePath = ValidateTest.class.getResource("/nl/patient-example-a.xml").getFile(); String resourcePath = ValidateTest.class.getResource("/nl/patient-example-a.xml").getFile();
ourLog.info(profilePath); ourLog.info(profilePath);
ourLog.info(resourcePath); ourLog.info(resourcePath);
App.main(new String[] {"validate", "-p", "-f", resourcePath, "-l", profilePath}); App.main(new String[] {"validate", "-p", "-n", resourcePath, "-l", profilePath});
} }
} }

View File

@ -1,5 +1,9 @@
package ca.uhn.fhir.jpa.config; package ca.uhn.fhir.jpa.config;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
/* /*
* #%L * #%L
* HAPI FHIR JPA Server * HAPI FHIR JPA Server
@ -34,6 +38,8 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler;
import org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@ -110,11 +116,22 @@ public class BaseConfig implements SchedulingConfigurer {
return new StaleSearchDeletingSvc(); return new StaleSearchDeletingSvc();
} }
@Bean()
public ScheduledExecutorFactoryBean scheduledExecutorService() {
ScheduledExecutorFactoryBean b = new ScheduledExecutorFactoryBean();
b.setPoolSize(5);
return b;
}
@Bean @Bean
public TaskScheduler taskScheduler() { public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler retVal = new ThreadPoolTaskScheduler(); ConcurrentTaskScheduler retVal = new ConcurrentTaskScheduler();
retVal.setPoolSize(5); retVal.setConcurrentExecutor(scheduledExecutorService().getObject());
retVal.setScheduledExecutor(scheduledExecutorService().getObject());
return retVal; return retVal;
// ThreadPoolTaskScheduler retVal = new ThreadPoolTaskScheduler();
// retVal.setPoolSize(5);
// return retVal;
} }
@Bean(autowire = Autowire.BY_TYPE) @Bean(autowire = Autowire.BY_TYPE)

View File

@ -665,18 +665,21 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
theProvider.setSearchResultDao(mySearchResultDao); theProvider.setSearchResultDao(mySearchResultDao);
} }
protected void notifyInterceptors(RestOperationTypeEnum operationType, ActionRequestDetails requestDetails) { protected void notifyInterceptors(RestOperationTypeEnum theOperationType, ActionRequestDetails requestDetails) {
if (requestDetails.getId() != null && requestDetails.getId().hasResourceType() && isNotBlank(requestDetails.getResourceType())) { if (requestDetails.getId() != null && requestDetails.getId().hasResourceType() && isNotBlank(requestDetails.getResourceType())) {
if (requestDetails.getId().getResourceType().equals(requestDetails.getResourceType()) == false) { if (requestDetails.getId().getResourceType().equals(requestDetails.getResourceType()) == false) {
throw new InternalErrorException("Inconsistent server state - Resource types don't match: " + requestDetails.getId().getResourceType() + " / " + requestDetails.getResourceType()); throw new InternalErrorException("Inconsistent server state - Resource types don't match: " + requestDetails.getId().getResourceType() + " / " + requestDetails.getResourceType());
} }
} }
requestDetails.notifyIncomingRequestPreHandled(theOperationType);
List<IServerInterceptor> interceptors = getConfig().getInterceptors(); List<IServerInterceptor> interceptors = getConfig().getInterceptors();
if (interceptors == null) { if (interceptors == null) {
return; return;
} }
for (IServerInterceptor next : interceptors) { for (IServerInterceptor next : interceptors) {
next.incomingRequestPreHandled(operationType, requestDetails); next.incomingRequestPreHandled(theOperationType, requestDetails);
} }
} }

View File

@ -18,6 +18,7 @@ import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.instance.model.api.IIdType;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.mockito.Mockito;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionCallback;
@ -50,6 +51,7 @@ import ca.uhn.fhir.model.dstu2.resource.Bundle;
import ca.uhn.fhir.model.dstu2.resource.Bundle.Entry; import ca.uhn.fhir.model.dstu2.resource.Bundle.Entry;
import ca.uhn.fhir.rest.method.IRequestOperationCallback; import ca.uhn.fhir.rest.method.IRequestOperationCallback;
import ca.uhn.fhir.rest.server.IBundleProvider; import ca.uhn.fhir.rest.server.IBundleProvider;
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails; import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
import ca.uhn.fhir.util.TestUtil; import ca.uhn.fhir.util.TestUtil;
@ -71,8 +73,9 @@ public class BaseJpaTest {
@Before @Before
public void beforeCreateSrd() { public void beforeCreateSrd() {
mySrd = mock(ServletRequestDetails.class); mySrd = mock(ServletRequestDetails.class, Mockito.RETURNS_DEEP_STUBS);
when(mySrd.getRequestOperationCallback()).thenReturn(mock(IRequestOperationCallback.class)); when(mySrd.getRequestOperationCallback()).thenReturn(mock(IRequestOperationCallback.class));
when(mySrd.getServer().getInterceptors()).thenReturn(new ArrayList<IServerInterceptor>());
} }
protected List<IIdType> toUnqualifiedVersionlessIds(Bundle theFound) { protected List<IIdType> toUnqualifiedVersionlessIds(Bundle theFound) {

View File

@ -9,7 +9,6 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
@ -46,7 +45,6 @@ import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.dstu2.composite.MetaDt; import ca.uhn.fhir.model.dstu2.composite.MetaDt;
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.rest.method.RequestDetails;
import ca.uhn.fhir.rest.param.TokenParam; import ca.uhn.fhir.rest.param.TokenParam;
import ca.uhn.fhir.rest.server.IBundleProvider; import ca.uhn.fhir.rest.server.IBundleProvider;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
@ -61,7 +59,6 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
private static IFhirResourceDao<Observation> ourObservationDao; private static IFhirResourceDao<Observation> ourObservationDao;
private static IFhirResourceDao<Patient> ourPatientDao; private static IFhirResourceDao<Patient> ourPatientDao;
private static IFhirSystemDao<List<IResource>, MetaDt> ourSystemDao; private static IFhirSystemDao<List<IResource>, MetaDt> ourSystemDao;
private RequestDetails myRequestDetails;
private static EntityManager ourEntityManager; private static EntityManager ourEntityManager;
private static PlatformTransactionManager ourTxManager; private static PlatformTransactionManager ourTxManager;
@ -74,7 +71,6 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
@Before @Before
public void before() { public void before() {
myRequestDetails = mock(RequestDetails.class);
super.purgeDatabase(ourEntityManager, ourTxManager); super.purgeDatabase(ourEntityManager, ourTxManager);
} }
@ -163,7 +159,7 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
obs.getName().addCoding().setSystem("urn:system").setCode("testPersistWithSimpleLinkO01"); obs.getName().addCoding().setSystem("urn:system").setCode("testPersistWithSimpleLinkO01");
obs.setSubject(new ResourceReferenceDt("Patient/testPersistWithSimpleLinkP01")); obs.setSubject(new ResourceReferenceDt("Patient/testPersistWithSimpleLinkP01"));
ourSystemDao.transaction(myRequestDetails, Arrays.asList((IResource) patient, obs)); ourSystemDao.transaction(mySrd, Arrays.asList((IResource) patient, obs));
String patientId = (patient.getId().getIdPart()); String patientId = (patient.getId().getIdPart());
String obsId = (obs.getId().getIdPart()); String obsId = (obs.getId().getIdPart());
@ -192,7 +188,7 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
patient.addIdentifier().setSystem("urn:system").setValue("testPersistWithSimpleLinkP02"); patient.addIdentifier().setSystem("urn:system").setValue("testPersistWithSimpleLinkP02");
obs.getName().addCoding().setSystem("urn:system").setCode("testPersistWithSimpleLinkO02"); obs.getName().addCoding().setSystem("urn:system").setCode("testPersistWithSimpleLinkO02");
ourSystemDao.transaction(myRequestDetails, Arrays.asList((IResource) patient, obs)); ourSystemDao.transaction(mySrd, Arrays.asList((IResource) patient, obs));
String patientId2 = (patient.getId().getIdPart()); String patientId2 = (patient.getId().getIdPart());
String patientVersion2 = (patient.getId().getVersionIdPart()); String patientVersion2 = (patient.getId().getVersionIdPart());
@ -213,7 +209,7 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
obs.setSubject(new ResourceReferenceDt("Patient/999998888888")); obs.setSubject(new ResourceReferenceDt("Patient/999998888888"));
try { try {
ourSystemDao.transaction(myRequestDetails, Arrays.asList((IResource) obs)); ourSystemDao.transaction(mySrd, Arrays.asList((IResource) obs));
} catch (InvalidRequestException e) { } catch (InvalidRequestException e) {
assertThat(e.getMessage(), containsString("Resource Patient/999998888888 not found, specified in path: Observation.subject")); assertThat(e.getMessage(), containsString("Resource Patient/999998888888 not found, specified in path: Observation.subject"));
} }
@ -223,7 +219,7 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
obs.setSubject(new ResourceReferenceDt("Patient/1.2.3.4")); obs.setSubject(new ResourceReferenceDt("Patient/1.2.3.4"));
try { try {
ourSystemDao.transaction(myRequestDetails, Arrays.asList((IResource) obs)); ourSystemDao.transaction(mySrd, Arrays.asList((IResource) obs));
} catch (InvalidRequestException e) { } catch (InvalidRequestException e) {
assertThat(e.getMessage(), containsString("Resource Patient/1.2.3.4 not found, specified in path: Observation.subject")); assertThat(e.getMessage(), containsString("Resource Patient/1.2.3.4 not found, specified in path: Observation.subject"));
} }
@ -313,7 +309,7 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
patient2.setId(new IdDt("Patient/testTransactionFailsWithDusplicateIds")); patient2.setId(new IdDt("Patient/testTransactionFailsWithDusplicateIds"));
patient2.addIdentifier().setSystem("urn:system").setValue("testPersistWithSimpleLinkP02"); patient2.addIdentifier().setSystem("urn:system").setValue("testPersistWithSimpleLinkP02");
ourSystemDao.transaction(myRequestDetails, Arrays.asList((IResource) patient1, patient2)); ourSystemDao.transaction(mySrd, Arrays.asList((IResource) patient1, patient2));
} }
@Test @Test
@ -323,7 +319,7 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
Bundle bundle = ourFhirContext.newXmlParser().parseBundle(new InputStreamReader(bundleRes)); Bundle bundle = ourFhirContext.newXmlParser().parseBundle(new InputStreamReader(bundleRes));
List<IResource> res = bundle.toListOfResources(); List<IResource> res = bundle.toListOfResources();
ourSystemDao.transaction(myRequestDetails, res); ourSystemDao.transaction(mySrd, res);
Patient p1 = (Patient) res.get(0); Patient p1 = (Patient) res.get(0);
String id = p1.getId().getValue(); String id = p1.getId().getValue();
@ -356,7 +352,7 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
o2.setSubject(new ResourceReferenceDt("Patient/cid:patient1")); o2.setSubject(new ResourceReferenceDt("Patient/cid:patient1"));
res.add(o2); res.add(o2);
ourSystemDao.transaction(myRequestDetails, res); ourSystemDao.transaction(mySrd, res);
assertTrue(p1.getId().getValue(), p1.getId().getIdPart().matches("^[0-9]+$")); assertTrue(p1.getId().getValue(), p1.getId().getIdPart().matches("^[0-9]+$"));
assertTrue(o1.getId().getValue(), o1.getId().getIdPart().matches("^[0-9]+$")); assertTrue(o1.getId().getValue(), o1.getId().getIdPart().matches("^[0-9]+$"));
@ -378,7 +374,7 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
res.add(next.getResource()); res.add(next.getResource());
} }
List<IResource> response = ourSystemDao.transaction(myRequestDetails, res); List<IResource> response = ourSystemDao.transaction(mySrd, res);
String encodeResourceToString = ourFhirContext.newXmlParser().setPrettyPrint(true).encodeResourceToString(response.get(0)); String encodeResourceToString = ourFhirContext.newXmlParser().setPrettyPrint(true).encodeResourceToString(response.get(0));
ourLog.info(encodeResourceToString); ourLog.info(encodeResourceToString);
@ -411,7 +407,7 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
o2.setSubject(new ResourceReferenceDt("cid:patient1")); o2.setSubject(new ResourceReferenceDt("cid:patient1"));
res.add(o2); res.add(o2);
ourSystemDao.transaction(myRequestDetails, res); ourSystemDao.transaction(mySrd, res);
assertTrue(p1.getId().getValue(), p1.getId().getIdPart().matches("^[0-9]+$")); assertTrue(p1.getId().getValue(), p1.getId().getIdPart().matches("^[0-9]+$"));
assertTrue(o1.getId().getValue(), o1.getId().getIdPart().matches("^[0-9]+$")); assertTrue(o1.getId().getValue(), o1.getId().getIdPart().matches("^[0-9]+$"));
@ -444,7 +440,7 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
p3.addIdentifier().setSystem("urn:system").setValue("testTransactionWithDelete"); p3.addIdentifier().setSystem("urn:system").setValue("testTransactionWithDelete");
res.add(p3); res.add(p3);
ourSystemDao.transaction(myRequestDetails, res); ourSystemDao.transaction(mySrd, res);
/* /*
* Verify * Verify
@ -470,7 +466,7 @@ public class FhirSystemDaoDstu1Test extends BaseJpaTest {
ResourceMetadataKeyEnum.DELETED_AT.put(p2, InstantDt.withCurrentTime()); ResourceMetadataKeyEnum.DELETED_AT.put(p2, InstantDt.withCurrentTime());
res.add(p2); res.add(p2);
ourSystemDao.transaction(myRequestDetails, res); ourSystemDao.transaction(mySrd, res);
/* /*
* Verify * Verify

View File

@ -18,6 +18,7 @@ import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;

View File

@ -82,19 +82,13 @@ import ca.uhn.fhir.util.TestUtil;
//@formatter:on //@formatter:on
public abstract class BaseJpaDstu3Test extends BaseJpaTest { public abstract class BaseJpaDstu3Test extends BaseJpaTest {
private static IFhirResourceDaoValueSet<ValueSet, Coding, CodeableConcept> ourValueSetDao;
private static JpaValidationSupportChainDstu3 ourJpaValidationSupportChainDstu3; private static JpaValidationSupportChainDstu3 ourJpaValidationSupportChainDstu3;
private static IFhirResourceDaoValueSet<ValueSet, Coding, CodeableConcept> ourValueSetDao;
@AfterClass
public static void afterClassClearContext() throws Exception {
TestUtil.clearAllStaticFieldsForUnitTest();
}
@Autowired
private JpaValidationSupportChainDstu3 myJpaValidationSupportChainDstu3;
@Autowired @Autowired
protected ApplicationContext myAppCtx; protected ApplicationContext myAppCtx;
@Autowired @Autowired
@Qualifier("myCodeSystemDaoDstu3") @Qualifier("myCodeSystemDaoDstu3")
protected IFhirResourceDao<CodeSystem> myCodeSystemDao; protected IFhirResourceDao<CodeSystem> myCodeSystemDao;
@ -126,6 +120,8 @@ public abstract class BaseJpaDstu3Test extends BaseJpaTest {
protected IFhirResourceDao<Immunization> myImmunizationDao; protected IFhirResourceDao<Immunization> myImmunizationDao;
protected IServerInterceptor myInterceptor; protected IServerInterceptor myInterceptor;
@Autowired @Autowired
private JpaValidationSupportChainDstu3 myJpaValidationSupportChainDstu3;
@Autowired
@Qualifier("myLocationDaoDstu3") @Qualifier("myLocationDaoDstu3")
protected IFhirResourceDao<Location> myLocationDao; protected IFhirResourceDao<Location> myLocationDao;
@Autowired @Autowired
@ -140,14 +136,14 @@ public abstract class BaseJpaDstu3Test extends BaseJpaTest {
@Autowired @Autowired
@Qualifier("myNamingSystemDaoDstu3") @Qualifier("myNamingSystemDaoDstu3")
protected IFhirResourceDao<NamingSystem> myNamingSystemDao; protected IFhirResourceDao<NamingSystem> myNamingSystemDao;
@Autowired
@Qualifier("myObservationDaoDstu3")
protected IFhirResourceDao<Observation> myObservationDao;
@Autowired @Autowired
@Qualifier("myObservationDaoDstu3") @Qualifier("myOrganizationDaoDstu3")
protected IFhirResourceDao<Observation> myObservationDao; protected IFhirResourceDao<Organization> myOrganizationDao;
@Autowired
@Qualifier("myOrganizationDaoDstu3")
protected IFhirResourceDao<Organization> myOrganizationDao;
@Autowired @Autowired
@Qualifier("myPatientDaoDstu3") @Qualifier("myPatientDaoDstu3")
protected IFhirResourceDaoPatient<Patient> myPatientDao; protected IFhirResourceDaoPatient<Patient> myPatientDao;
@ -204,7 +200,6 @@ protected IFhirResourceDao<Observation> myObservationDao;
myInterceptor = mock(IServerInterceptor.class); myInterceptor = mock(IServerInterceptor.class);
myDaoConfig.setInterceptors(myInterceptor); myDaoConfig.setInterceptors(myInterceptor);
} }
@Before @Before
@Transactional @Transactional
public void beforeFlushFT() { public void beforeFlushFT() {
@ -230,7 +225,6 @@ protected IFhirResourceDao<Observation> myObservationDao;
myDaoConfig.setIncludeLimit(2000); myDaoConfig.setIncludeLimit(2000);
} }
protected <T extends IBaseResource> T loadResourceFromClasspath(Class<T> type, String resourceName) throws IOException { protected <T extends IBaseResource> T loadResourceFromClasspath(Class<T> type, String resourceName) throws IOException {
InputStream stream = FhirResourceDaoDstu2SearchNoFtTest.class.getResourceAsStream(resourceName); InputStream stream = FhirResourceDaoDstu2SearchNoFtTest.class.getResourceAsStream(resourceName);
if (stream == null) { if (stream == null) {
@ -241,6 +235,7 @@ protected IFhirResourceDao<Observation> myObservationDao;
return newJsonParser.parseResource(type, string); return newJsonParser.parseResource(type, string);
} }
public TransactionTemplate newTxTemplate() { public TransactionTemplate newTxTemplate() {
TransactionTemplate retVal = new TransactionTemplate(myTxManager); TransactionTemplate retVal = new TransactionTemplate(myTxManager);
retVal.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); retVal.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
@ -249,9 +244,10 @@ protected IFhirResourceDao<Observation> myObservationDao;
} }
@AfterClass @AfterClass
public static void afterFlushCaches() { public static void afterClassClearContextBaseJpaDstu3Test() throws Exception {
ourValueSetDao.purgeCaches(); ourValueSetDao.purgeCaches();
ourJpaValidationSupportChainDstu3.flush(); ourJpaValidationSupportChainDstu3.flush();
TestUtil.clearAllStaticFieldsForUnitTest();
} }
} }

View File

@ -0,0 +1,267 @@
package ca.uhn.fhir.jpa.provider.dstu3;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.containsInRelativeOrder;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.hasItems;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.startsWith;
import static org.hamcrest.Matchers.stringContainsInOrder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.hl7.fhir.dstu3.model.BaseResource;
import org.hl7.fhir.dstu3.model.Bundle;
import org.hl7.fhir.dstu3.model.Bundle.BundleEntryComponent;
import org.hl7.fhir.dstu3.model.Bundle.BundleType;
import org.hl7.fhir.dstu3.model.Bundle.HTTPVerb;
import org.hl7.fhir.dstu3.model.Bundle.SearchEntryMode;
import org.hl7.fhir.dstu3.model.CodeSystem;
import org.hl7.fhir.dstu3.model.Coding;
import org.hl7.fhir.dstu3.model.Condition;
import org.hl7.fhir.dstu3.model.DateTimeType;
import org.hl7.fhir.dstu3.model.DateType;
import org.hl7.fhir.dstu3.model.Device;
import org.hl7.fhir.dstu3.model.DiagnosticOrder;
import org.hl7.fhir.dstu3.model.DocumentManifest;
import org.hl7.fhir.dstu3.model.DocumentReference;
import org.hl7.fhir.dstu3.model.Encounter;
import org.hl7.fhir.dstu3.model.Encounter.EncounterClass;
import org.hl7.fhir.dstu3.model.Encounter.EncounterLocationComponent;
import org.hl7.fhir.dstu3.model.Encounter.EncounterState;
import org.hl7.fhir.dstu3.model.Enumerations.AdministrativeGender;
import org.hl7.fhir.dstu3.model.IdType;
import org.hl7.fhir.dstu3.model.ImagingStudy;
import org.hl7.fhir.dstu3.model.InstantType;
import org.hl7.fhir.dstu3.model.Location;
import org.hl7.fhir.dstu3.model.Medication;
import org.hl7.fhir.dstu3.model.MedicationOrder;
import org.hl7.fhir.dstu3.model.Meta;
import org.hl7.fhir.dstu3.model.Narrative.NarrativeStatus;
import org.hl7.fhir.dstu3.model.Observation;
import org.hl7.fhir.dstu3.model.OperationOutcome;
import org.hl7.fhir.dstu3.model.Organization;
import org.hl7.fhir.dstu3.model.Parameters;
import org.hl7.fhir.dstu3.model.Patient;
import org.hl7.fhir.dstu3.model.Period;
import org.hl7.fhir.dstu3.model.Practitioner;
import org.hl7.fhir.dstu3.model.Questionnaire;
import org.hl7.fhir.dstu3.model.Questionnaire.QuestionnaireItemType;
import org.hl7.fhir.dstu3.model.QuestionnaireResponse;
import org.hl7.fhir.dstu3.model.Reference;
import org.hl7.fhir.dstu3.model.StringType;
import org.hl7.fhir.dstu3.model.Subscription;
import org.hl7.fhir.dstu3.model.Subscription.SubscriptionChannelType;
import org.hl7.fhir.dstu3.model.Subscription.SubscriptionStatus;
import org.hl7.fhir.dstu3.model.TemporalPrecisionEnum;
import org.hl7.fhir.dstu3.model.UnsignedIntType;
import org.hl7.fhir.dstu3.model.ValueSet;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType;
import org.junit.AfterClass;
import org.junit.Ignore;
import org.junit.Test;
import ca.uhn.fhir.jpa.dao.SearchParameterMap;
import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.model.primitive.UriDt;
import ca.uhn.fhir.rest.api.MethodOutcome;
import ca.uhn.fhir.rest.api.SummaryEnum;
import ca.uhn.fhir.rest.client.IGenericClient;
import ca.uhn.fhir.rest.method.RequestDetails;
import ca.uhn.fhir.rest.param.DateRangeParam;
import ca.uhn.fhir.rest.param.ParamPrefixEnum;
import ca.uhn.fhir.rest.param.StringAndListParam;
import ca.uhn.fhir.rest.param.StringOrListParam;
import ca.uhn.fhir.rest.param.StringParam;
import ca.uhn.fhir.rest.param.TokenParam;
import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.rest.server.IBundleProvider;
import ca.uhn.fhir.rest.server.exceptions.AuthenticationException;
import ca.uhn.fhir.rest.server.exceptions.ForbiddenOperationException;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
import ca.uhn.fhir.rest.server.exceptions.ResourceGoneException;
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
import ca.uhn.fhir.rest.server.interceptor.auth.AuthorizationInterceptor;
import ca.uhn.fhir.rest.server.interceptor.auth.IAuthRule;
import ca.uhn.fhir.rest.server.interceptor.auth.PolicyEnum;
import ca.uhn.fhir.rest.server.interceptor.auth.RuleBuilder;
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
import ca.uhn.fhir.util.TestUtil;
import ca.uhn.fhir.util.UrlUtil;
public class AuthorizationInterceptorResourceProviderDstu3Test extends BaseResourceProviderDstu3Test {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(AuthorizationInterceptorResourceProviderDstu3Test.class);
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
@Override
public void before() throws Exception {
super.before();
myDaoConfig.setAllowMultipleDelete(true);
unregisterInterceptors();
}
private void unregisterInterceptors() {
for (IServerInterceptor next : new ArrayList<IServerInterceptor>(ourRestServer.getInterceptors())) {
if (next instanceof AuthorizationInterceptor) {
ourRestServer.unregisterInterceptor(next);
}
}
}
@Test
public void testCreateConditional() {
Patient patient = new Patient();
patient.addIdentifier().setSystem("http://uhn.ca/mrns").setValue("100");
patient.addName().addFamily("Tester").addGiven("Raghad");
final MethodOutcome output1 = ourClient.update().resource(patient).conditionalByUrl("Patient?identifier=http://uhn.ca/mrns|100").execute();
ourRestServer.registerInterceptor(new AuthorizationInterceptor(PolicyEnum.DENY) {
@Override
public List<IAuthRule> buildRuleList(RequestDetails theRequestDetails) {
//@formatter:off
return new RuleBuilder()
.allow("Rule 2").write().allResources().inCompartment("Patient", new IdDt("Patient/" + output1.getId().getIdPart())).andThen()
.build();
//@formatter:on
}
});
patient = new Patient();
patient.setId(output1.getId().toUnqualifiedVersionless());
patient.addIdentifier().setSystem("http://uhn.ca/mrns").setValue("100");
patient.addName().addFamily("Tester").addGiven("Raghad");
MethodOutcome output2 = ourClient.update().resource(patient).conditionalByUrl("Patient?identifier=http://uhn.ca/mrns|100").execute();
assertEquals(output1.getId().getIdPart(), output2.getId().getIdPart());
patient = new Patient();
patient.addIdentifier().setSystem("http://uhn.ca/mrns").setValue("100");
patient.addName().addFamily("Tester").addGiven("Raghad");
try {
ourClient.update().resource(patient).conditionalByUrl("Patient?identifier=http://uhn.ca/mrns|101").execute();
fail();
} catch (ForbiddenOperationException e) {
assertEquals("HTTP 403 Forbidden: Access denied by default policy (no applicable rules)", e.getMessage());
}
patient = new Patient();
patient.setId("999");
patient.addIdentifier().setSystem("http://uhn.ca/mrns").setValue("100");
patient.addName().addFamily("Tester").addGiven("Raghad");
try {
ourClient.update().resource(patient).execute();
fail();
} catch (ForbiddenOperationException e) {
assertEquals("HTTP 403 Forbidden: Access denied by default policy (no applicable rules)", e.getMessage());
}
}
@Test
public void testDeleteResourceConditional() throws IOException {
String methodName = "testDeleteResourceConditional";
Patient pt = new Patient();
pt.addName().addFamily(methodName);
String resource = myFhirCtx.newXmlParser().encodeResourceToString(pt);
HttpPost post = new HttpPost(ourServerBase + "/Patient");
post.setEntity(new StringEntity(resource, ContentType.create(Constants.CT_FHIR_XML, "UTF-8")));
CloseableHttpResponse response = ourHttpClient.execute(post);
final IdType id;
try {
assertEquals(201, response.getStatusLine().getStatusCode());
String newIdString = response.getFirstHeader(Constants.HEADER_LOCATION_LC).getValue();
assertThat(newIdString, startsWith(ourServerBase + "/Patient/"));
id = new IdType(newIdString);
} finally {
response.close();
}
pt = new Patient();
pt.addName().addFamily("FOOFOOFOO");
resource = myFhirCtx.newXmlParser().encodeResourceToString(pt);
post = new HttpPost(ourServerBase + "/Patient");
post.setEntity(new StringEntity(resource, ContentType.create(Constants.CT_FHIR_XML, "UTF-8")));
response = ourHttpClient.execute(post);
final IdType id2;
try {
assertEquals(201, response.getStatusLine().getStatusCode());
String newIdString = response.getFirstHeader(Constants.HEADER_LOCATION_LC).getValue();
assertThat(newIdString, startsWith(ourServerBase + "/Patient/"));
id2 = new IdType(newIdString);
} finally {
response.close();
}
ourRestServer.registerInterceptor(new AuthorizationInterceptor(PolicyEnum.DENY) {
@Override
public List<IAuthRule> buildRuleList(RequestDetails theRequestDetails) {
//@formatter:off
return new RuleBuilder()
.allow("Rule 2").delete().allResources().inCompartment("Patient", new IdDt("Patient/" + id.getIdPart())).andThen()
.build();
//@formatter:on
}
});
HttpDelete delete = new HttpDelete(ourServerBase + "/Patient?name=" + methodName);
response = ourHttpClient.execute(delete);
try {
assertEquals(204, response.getStatusLine().getStatusCode());
} finally {
response.close();
}
delete = new HttpDelete(ourServerBase + "/Patient?name=FOOFOOFOO");
response = ourHttpClient.execute(delete);
try {
assertEquals(403, response.getStatusLine().getStatusCode());
} finally {
response.close();
}
}
}

View File

@ -42,48 +42,19 @@ import ca.uhn.fhir.util.TestUtil;
public abstract class BaseResourceProviderDstu3Test extends BaseJpaDstu3Test { public abstract class BaseResourceProviderDstu3Test extends BaseJpaDstu3Test {
private static JpaValidationSupportChainDstu3 myValidationSupport;
protected static IGenericClient ourClient; protected static IGenericClient ourClient;
protected static CloseableHttpClient ourHttpClient; protected static CloseableHttpClient ourHttpClient;
protected static int ourPort; protected static int ourPort;
protected static RestfulServer ourRestServer;
private static Server ourServer; private static Server ourServer;
protected static String ourServerBase; protected static String ourServerBase;
protected static RestfulServer ourRestServer;
private static JpaValidationSupportChainDstu3 myValidationSupport;
private static GenericWebApplicationContext ourWebApplicationContext; private static GenericWebApplicationContext ourWebApplicationContext;
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
public BaseResourceProviderDstu3Test() { public BaseResourceProviderDstu3Test() {
super(); super();
} }
protected List<String> toNameList(Bundle resp) {
List<String> names = new ArrayList<String>();
for (BundleEntryComponent next : resp.getEntry()) {
Patient nextPt = (Patient) next.getResource();
String nextStr = nextPt.getName().size() > 0 ? nextPt.getName().get(0).getGivenAsSingleString() + " " + nextPt.getName().get(0).getFamilyAsSingleString() : "";
if (isNotBlank(nextStr)) {
names.add(nextStr);
}
}
return names;
}
@AfterClass
public static void afterClass() throws Exception {
ourServer.stop();
ourHttpClient.close();
ourServer = null;
ourHttpClient = null;
myValidationSupport.flush();
myValidationSupport = null;
ourWebApplicationContext.close();
ourWebApplicationContext = null;
}
@After @After
public void after() throws Exception { public void after() throws Exception {
@ -159,4 +130,29 @@ public abstract class BaseResourceProviderDstu3Test extends BaseJpaDstu3Test {
} }
} }
protected List<String> toNameList(Bundle resp) {
List<String> names = new ArrayList<String>();
for (BundleEntryComponent next : resp.getEntry()) {
Patient nextPt = (Patient) next.getResource();
String nextStr = nextPt.getName().size() > 0 ? nextPt.getName().get(0).getGivenAsSingleString() + " " + nextPt.getName().get(0).getFamilyAsSingleString() : "";
if (isNotBlank(nextStr)) {
names.add(nextStr);
}
}
return names;
}
@AfterClass
public static void afterClassClearContextBaseResourceProviderDstu3Test() throws Exception {
ourServer.stop();
ourHttpClient.close();
ourServer = null;
ourHttpClient = null;
myValidationSupport.flush();
myValidationSupport = null;
ourWebApplicationContext.close();
ourWebApplicationContext = null;
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,6 +2,7 @@ package ca.uhn.fhir.context;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
@ -14,6 +15,7 @@ import ca.uhn.fhir.model.dstu.resource.Observation;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.dstu.resource.Profile; import ca.uhn.fhir.model.dstu.resource.Profile;
import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by Bill de Beaubien on 12/10/2014. * Created by Bill de Beaubien on 12/10/2014.
@ -79,4 +81,10 @@ public class DuplicateExtensionTest extends TestCase {
@ProvidesResources(resources = CustomPatient.class) @ProvidesResources(resources = CustomPatient.class)
public static class CustomPatientProvider { public static class CustomPatientProvider {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -5,6 +5,7 @@ import static org.junit.Assert.*;
import java.io.IOException; import java.io.IOException;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.model.primitive.DateTimeDt; import ca.uhn.fhir.model.primitive.DateTimeDt;
@ -12,6 +13,7 @@ import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.parser.DataFormatException; import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.parser.IParser; import ca.uhn.fhir.parser.IParser;
import ca.uhn.fhir.parser.MyPatient; import ca.uhn.fhir.parser.MyPatient;
import ca.uhn.fhir.util.TestUtil;
public class ExtensionTest { public class ExtensionTest {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ExtensionTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ExtensionTest.class);
@ -84,4 +86,10 @@ public class ExtensionTest {
} }
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -3,11 +3,13 @@ package ca.uhn.fhir.context;
import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.dstu.resource.ValueSet; import ca.uhn.fhir.model.dstu.resource.ValueSet;
import ca.uhn.fhir.util.TestUtil;
public class FhirContextDstu1Test { public class FhirContextDstu1Test {
@ -58,4 +60,10 @@ public class FhirContextDstu1Test {
} }
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,8 +2,11 @@ package ca.uhn.fhir.context;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.util.TestUtil;
public class FhirVersionEnumTest { public class FhirVersionEnumTest {
@Test @Test
@ -11,4 +14,10 @@ public class FhirVersionEnumTest {
assertFalse(FhirVersionEnum.DSTU1.isNewerThan(FhirVersionEnum.DSTU2)); assertFalse(FhirVersionEnum.DSTU1.isNewerThan(FhirVersionEnum.DSTU2));
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -3,10 +3,12 @@ package ca.uhn.fhir.context;
import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.model.api.annotation.ResourceDef; import ca.uhn.fhir.model.api.annotation.ResourceDef;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.util.TestUtil;
public class InvalidResourceTypeTest { public class InvalidResourceTypeTest {
@ -28,4 +30,10 @@ public class InvalidResourceTypeTest {
// nothing // nothing
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,12 +2,14 @@ package ca.uhn.fhir.context;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.parser.DataFormatException; import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.parser.IParser; import ca.uhn.fhir.parser.IParser;
import ca.uhn.fhir.parser.MyOrganization; import ca.uhn.fhir.parser.MyOrganization;
import ca.uhn.fhir.parser.MyPatient; import ca.uhn.fhir.parser.MyPatient;
import ca.uhn.fhir.util.TestUtil;
public class ModelExtensionTest { public class ModelExtensionTest {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ModelExtensionTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ModelExtensionTest.class);
@ -35,4 +37,10 @@ public class ModelExtensionTest {
// assertEquals("arg0", parsedOrg.getName().getValue()); // assertEquals("arg0", parsedOrg.getName().getValue());
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import org.junit.AfterClass;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
@ -14,6 +15,7 @@ import ca.uhn.fhir.model.dstu.resource.CarePlan;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.parser.DataFormatException; import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.parser.MyPatient; import ca.uhn.fhir.parser.MyPatient;
import ca.uhn.fhir.util.TestUtil;
public class ModelScannerDstu1Test { public class ModelScannerDstu1Test {
@ -129,4 +131,10 @@ public class ModelScannerDstu1Test {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -4,11 +4,13 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.IResource;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.rest.method.RestSearchParameterTypeEnum; import ca.uhn.fhir.rest.method.RestSearchParameterTypeEnum;
import ca.uhn.fhir.util.TestUtil;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.reflect.ClassPath; import com.google.common.reflect.ClassPath;
@ -80,5 +82,10 @@ public class NameChanges {
} }
}
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
}

View File

@ -3,12 +3,15 @@ package ca.uhn.fhir.context;
import ca.uhn.fhir.model.api.annotation.ProvidesResources; import ca.uhn.fhir.model.api.annotation.ProvidesResources;
import ca.uhn.fhir.model.api.annotation.ResourceDef; import ca.uhn.fhir.model.api.annotation.ResourceDef;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.util.TestUtil;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import org.junit.AfterClass;
public class ProvidedResourceScannerTest extends TestCase { public class ProvidedResourceScannerTest extends TestCase {
@Test @Test
public void testScannerShouldAddProvidedResources() { public void testScannerShouldAddProvidedResources() {
@ -33,4 +36,10 @@ public class ProvidedResourceScannerTest extends TestCase {
@ProvidesResources(resources = { CustomPatient.class, ResourceWithExtensionsA.class }) @ProvidesResources(resources = { CustomPatient.class, ResourceWithExtensionsA.class })
public static class TestResourceProviderB { public static class TestResourceProviderB {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,6 +2,8 @@ package ca.uhn.fhir.context;
import java.util.List; import java.util.List;
import org.junit.AfterClass;
import ca.uhn.fhir.model.api.BaseIdentifiableElement; import ca.uhn.fhir.model.api.BaseIdentifiableElement;
import ca.uhn.fhir.model.api.IElement; import ca.uhn.fhir.model.api.IElement;
import ca.uhn.fhir.model.api.IExtension; import ca.uhn.fhir.model.api.IExtension;
@ -12,6 +14,7 @@ import ca.uhn.fhir.model.dstu.resource.BaseResource;
import ca.uhn.fhir.model.primitive.DateDt; 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.StringDt; import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.util.TestUtil;
@ResourceDef(name = "ResourceWithExtensionsA", id="0001") @ResourceDef(name = "ResourceWithExtensionsA", id="0001")
public class ResourceWithExtensionsA extends BaseResource { public class ResourceWithExtensionsA extends BaseResource {
@ -212,4 +215,10 @@ public class ResourceWithExtensionsA extends BaseResource {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -8,6 +8,9 @@ import ca.uhn.fhir.model.dstu.resource.Profile.Structure;
import ca.uhn.fhir.model.dstu.resource.Profile.StructureElement; import ca.uhn.fhir.model.dstu.resource.Profile.StructureElement;
import ca.uhn.fhir.model.dstu.resource.ValueSet; import ca.uhn.fhir.model.dstu.resource.ValueSet;
import ca.uhn.fhir.model.dstu.valueset.DataTypeEnum; import ca.uhn.fhir.model.dstu.valueset.DataTypeEnum;
import ca.uhn.fhir.util.TestUtil;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import java.util.List; import java.util.List;
@ -147,4 +150,10 @@ public class RuntimeResourceDefinitionTest {
public static class PatientWithShortProfile extends Patient { public static class PatientWithShortProfile extends Patient {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -6,10 +6,12 @@ import static org.junit.Assert.*;
import java.util.Arrays; import java.util.Arrays;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.util.TestUtil;
public class TagListTest { public class TagListTest {
@ -78,4 +80,10 @@ public class TagListTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,7 +2,11 @@ package ca.uhn.fhir.model.base.composite;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import ca.uhn.fhir.model.dstu.composite.CodingDt; import ca.uhn.fhir.model.dstu.composite.CodingDt;
import ca.uhn.fhir.util.TestUtil;
import org.junit.Test; import org.junit.Test;
/** /**
@ -68,4 +72,10 @@ public class BaseCodingDtTest {
public void whenTokenIncludesEmptySystem_CodeWithSystem_shouldNotMatch() { public void whenTokenIncludesEmptySystem_CodeWithSystem_shouldNotMatch() {
assertFalse(new CodingDt("http://bar.org", "53").matchesToken(myTokenWithEmptySystem)); assertFalse(new CodingDt("http://bar.org", "53").matchesToken(myTokenWithEmptySystem));
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -1,7 +1,10 @@
package ca.uhn.fhir.model.primitive; package ca.uhn.fhir.model.primitive;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.util.TestUtil;
public class Base64BinaryDtTest { public class Base64BinaryDtTest {
@ -10,4 +13,10 @@ public class Base64BinaryDtTest {
new Base64BinaryDt().setValueAsString(null); new Base64BinaryDt().setValueAsString(null);
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -12,6 +12,7 @@ import java.util.TimeZone;
import org.apache.commons.lang3.time.FastDateFormat; import org.apache.commons.lang3.time.FastDateFormat;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.AfterClass;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -21,6 +22,7 @@ import ca.uhn.fhir.model.api.TemporalPrecisionEnum;
import ca.uhn.fhir.model.dstu.resource.Condition; import ca.uhn.fhir.model.dstu.resource.Condition;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.parser.DataFormatException; import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.util.TestUtil;
import ca.uhn.fhir.validation.ValidationResult; import ca.uhn.fhir.validation.ValidationResult;
public class BaseDateTimeDtTest { public class BaseDateTimeDtTest {
@ -279,4 +281,10 @@ public class BaseDateTimeDtTest {
assertEquals("2014-06-20T20:22:09Z", i.getValueAsString()); assertEquals("2014-06-20T20:22:09Z", i.getValueAsString());
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,10 +2,12 @@ package ca.uhn.fhir.model.primitive;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu.composite.CodingDt; import ca.uhn.fhir.model.dstu.composite.CodingDt;
import ca.uhn.fhir.util.TestUtil;
public class CodingDtTest { public class CodingDtTest {
@ -55,4 +57,10 @@ public class CodingDtTest {
assertEquals("|b\\|c", dt.getValueAsQueryToken(ourCtx)); assertEquals("|b\\|c", dt.getValueAsQueryToken(ourCtx));
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,8 +2,11 @@ package ca.uhn.fhir.model.primitive;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.util.TestUtil;
public class DecimalDtTest { public class DecimalDtTest {
@Test @Test
@ -13,4 +16,10 @@ public class DecimalDtTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -5,12 +5,14 @@ import static org.junit.Assert.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt; import ca.uhn.fhir.model.dstu.composite.ResourceReferenceDt;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.util.TestUtil;
public class IdDtTest { public class IdDtTest {
@ -230,4 +232,10 @@ public class IdDtTest {
ourCtx = FhirContext.forDstu1(); ourCtx = FhirContext.forDstu1();
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,10 +2,12 @@ package ca.uhn.fhir.model.primitive;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu.composite.IdentifierDt; import ca.uhn.fhir.model.dstu.composite.IdentifierDt;
import ca.uhn.fhir.util.TestUtil;
public class IdentifierDtTest { public class IdentifierDtTest {
private static FhirContext ourCtx = FhirContext.forDstu1(); private static FhirContext ourCtx = FhirContext.forDstu1();
@ -56,4 +58,10 @@ public class IdentifierDtTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,8 +2,11 @@ package ca.uhn.fhir.model.primitive;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.util.TestUtil;
public class StringDtTest { public class StringDtTest {
@Test @Test
@ -13,4 +16,10 @@ public class StringDtTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,8 +2,11 @@ package ca.uhn.fhir.model.primitive;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.util.TestUtil;
public class UriDtTest { public class UriDtTest {
@Test @Test
public void testEquals() { public void testEquals() {
@ -16,4 +19,10 @@ public class UriDtTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -3,9 +3,11 @@ package ca.uhn.fhir.model.primitive;
import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.parser.DataFormatException; import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.util.TestUtil;
public class XhtmlDtTest { public class XhtmlDtTest {
@ -97,4 +99,10 @@ public class XhtmlDtTest {
} }
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -4,6 +4,7 @@ import static org.junit.Assert.*;
import java.util.List; import java.util.List;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
@ -11,6 +12,7 @@ import ca.uhn.fhir.model.api.ExtensionDt;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.primitive.IntegerDt; import ca.uhn.fhir.model.primitive.IntegerDt;
import ca.uhn.fhir.parser.IParser; import ca.uhn.fhir.parser.IParser;
import ca.uhn.fhir.util.TestUtil;
public class ViewGeneratorTest { public class ViewGeneratorTest {
@ -107,4 +109,10 @@ public class ViewGeneratorTest {
assertEquals(0, va.getAllUndeclaredExtensions().size()); assertEquals(0, va.getAllUndeclaredExtensions().size());
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,8 +2,11 @@ package ca.uhn.fhir.narrative;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.util.TestUtil;
public class BaseThymeleafNarrativeGeneratorTest { public class BaseThymeleafNarrativeGeneratorTest {
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseThymeleafNarrativeGeneratorTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(BaseThymeleafNarrativeGeneratorTest.class);
@ -59,4 +62,10 @@ public class BaseThymeleafNarrativeGeneratorTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -3,11 +3,13 @@ package ca.uhn.fhir.narrative;
import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu.composite.NarrativeDt; import ca.uhn.fhir.model.dstu.composite.NarrativeDt;
import ca.uhn.fhir.model.dstu.resource.Practitioner; import ca.uhn.fhir.model.dstu.resource.Practitioner;
import ca.uhn.fhir.util.TestUtil;
public class CustomThymeleafNarrativeGeneratorTest { public class CustomThymeleafNarrativeGeneratorTest {
@ -35,4 +37,10 @@ public class CustomThymeleafNarrativeGeneratorTest {
assertThat(actual, containsString("<h1>Name</h1><div class=\"nameElement\"> given <b>FAM1 </b></div><h1>Address</h1><div><span>line1 </span><br /><span>line2 </span><br /></div></div>")); assertThat(actual, containsString("<h1>Name</h1><div class=\"nameElement\"> given <b>FAM1 </b></div><h1>Address</h1><div><span>line1 </span><br /><span>line2 </span><br /></div></div>"));
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -6,6 +6,7 @@ import java.io.InputStreamReader;
import java.util.Date; import java.util.Date;
import org.hamcrest.core.StringContains; import org.hamcrest.core.StringContains;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -33,6 +34,7 @@ import ca.uhn.fhir.model.dstu.valueset.ObservationStatusEnum;
import ca.uhn.fhir.model.primitive.DateTimeDt; import ca.uhn.fhir.model.primitive.DateTimeDt;
import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.parser.DataFormatException; import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.util.TestUtil;
public class DefaultThymeleafNarrativeGeneratorTest { public class DefaultThymeleafNarrativeGeneratorTest {
private FhirContext myCtx; private FhirContext myCtx;
@ -238,4 +240,10 @@ public class DefaultThymeleafNarrativeGeneratorTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -5,11 +5,13 @@ import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.stringContainsInOrder; import static org.hamcrest.Matchers.stringContainsInOrder;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu.resource.AllergyIntolerance; import ca.uhn.fhir.model.dstu.resource.AllergyIntolerance;
import ca.uhn.fhir.model.dstu.resource.Composition; import ca.uhn.fhir.model.dstu.resource.Composition;
import ca.uhn.fhir.util.TestUtil;
public class BaseParserTest { public class BaseParserTest {
@ -156,4 +158,10 @@ public class BaseParserTest {
assertEquals(WorkflowActionEnum.SIGNOFF, res.getWorkflowAction().getValueAsEnum()); assertEquals(WorkflowActionEnum.SIGNOFF, res.getWorkflowAction().getValueAsEnum());
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -7,6 +7,7 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
import org.junit.AfterClass;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -31,6 +32,7 @@ import ca.uhn.fhir.model.dstu.valueset.NameUseEnum;
import ca.uhn.fhir.model.dstu.valueset.PractitionerRoleEnum; import ca.uhn.fhir.model.dstu.valueset.PractitionerRoleEnum;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.rest.server.IVersionSpecificBundleFactory; import ca.uhn.fhir.rest.server.IVersionSpecificBundleFactory;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Initially contributed by Alexander Kley for bug #29 * Initially contributed by Alexander Kley for bug #29
@ -249,4 +251,10 @@ public class ContainedResourceEncodingTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -26,6 +26,7 @@ import org.hamcrest.core.StringContains;
import org.hamcrest.text.StringContainsInOrder; import org.hamcrest.text.StringContainsInOrder;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.INarrative; import org.hl7.fhir.instance.model.api.INarrative;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Ignore; import org.junit.Ignore;
@ -74,6 +75,7 @@ import ca.uhn.fhir.model.primitive.InstantDt;
import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.model.primitive.XhtmlDt; import ca.uhn.fhir.model.primitive.XhtmlDt;
import ca.uhn.fhir.narrative.INarrativeGenerator; import ca.uhn.fhir.narrative.INarrativeGenerator;
import ca.uhn.fhir.util.TestUtil;
import net.sf.json.JSON; import net.sf.json.JSON;
import net.sf.json.JSONSerializer; import net.sf.json.JSONSerializer;
@ -1484,4 +1486,10 @@ public class JsonParserTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -22,6 +22,7 @@ import org.hamcrest.core.StringContains;
import org.hamcrest.text.StringContainsInOrder; import org.hamcrest.text.StringContainsInOrder;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.INarrative; import org.hl7.fhir.instance.model.api.INarrative;
import org.junit.AfterClass;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
@ -72,6 +73,7 @@ import ca.uhn.fhir.narrative.DefaultThymeleafNarrativeGenerator;
import ca.uhn.fhir.narrative.INarrativeGenerator; import ca.uhn.fhir.narrative.INarrativeGenerator;
import ca.uhn.fhir.parser.JsonParserTest.MyPatientWithOneDeclaredAddressExtension; import ca.uhn.fhir.parser.JsonParserTest.MyPatientWithOneDeclaredAddressExtension;
import ca.uhn.fhir.parser.JsonParserTest.MyPatientWithOneDeclaredExtension; import ca.uhn.fhir.parser.JsonParserTest.MyPatientWithOneDeclaredExtension;
import ca.uhn.fhir.util.TestUtil;
public class XmlParserTest { public class XmlParserTest {
@ -1957,4 +1959,10 @@ public class XmlParserTest {
System.setProperty("file.encoding", "ISO-8859-1"); System.setProperty("file.encoding", "ISO-8859-1");
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -15,6 +15,7 @@ import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
@ -25,6 +26,7 @@ import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.rest.client.interceptor.BasicAuthInterceptor; import ca.uhn.fhir.rest.client.interceptor.BasicAuthInterceptor;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
@ -100,4 +102,10 @@ public class BasicAuthInterceptorTest {
ourCtx = FhirContext.forDstu1(); ourCtx = FhirContext.forDstu1();
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -15,6 +15,7 @@ import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
@ -25,6 +26,7 @@ import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.rest.client.interceptor.BearerTokenAuthInterceptor; import ca.uhn.fhir.rest.client.interceptor.BearerTokenAuthInterceptor;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
@ -85,4 +87,10 @@ public class BearerTokenAuthInterceptorTest {
ourCtx = FhirContext.forDstu1(); ourCtx = FhirContext.forDstu1();
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -16,6 +16,7 @@ import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
@ -33,6 +34,7 @@ import ca.uhn.fhir.rest.annotation.ResourceParam;
import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.api.MethodOutcome;
import ca.uhn.fhir.rest.client.api.IBasicClient; import ca.uhn.fhir.rest.client.api.IBasicClient;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.util.TestUtil;
public class BinaryClientTest { public class BinaryClientTest {
@ -106,4 +108,10 @@ public class BinaryClientTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -37,6 +37,7 @@ import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.hamcrest.core.StringContains; import org.hamcrest.core.StringContains;
import org.hamcrest.core.StringEndsWith; import org.hamcrest.core.StringEndsWith;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
@ -86,6 +87,7 @@ import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException; import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException;
import ca.uhn.fhir.util.TestUtil;
import ca.uhn.fhir.util.UrlUtil; import ca.uhn.fhir.util.UrlUtil;
public class ClientDstu1Test { public class ClientDstu1Test {
@ -1410,4 +1412,10 @@ public class ClientDstu1Test {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -15,6 +15,7 @@ import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.After; import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -28,6 +29,7 @@ import ca.uhn.fhir.rest.client.api.IBasicClient;
import ca.uhn.fhir.rest.server.IResourceProvider; import ca.uhn.fhir.rest.server.IResourceProvider;
import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.rest.server.RestfulServer;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
public class ClientIntegrationTest { public class ClientIntegrationTest {
@ -116,4 +118,10 @@ public class ClientIntegrationTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -15,6 +15,7 @@ import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
@ -29,6 +30,7 @@ import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.primitive.UriDt; import ca.uhn.fhir.model.primitive.UriDt;
import ca.uhn.fhir.rest.client.exceptions.FhirClientInappropriateForServerException; import ca.uhn.fhir.rest.client.exceptions.FhirClientInappropriateForServerException;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.util.TestUtil;
public class ClientServerValidationTestDstu { public class ClientServerValidationTestDstu {
@ -106,4 +108,10 @@ public class ClientServerValidationTestDstu {
assertThat(e.toString(), containsString("The server at base URL \"http://foo/metadata\" returned a conformance statement indicating that it supports FHIR version \"0.4.0\" which corresponds to DSTU2, but this client is configured to use DSTU1 (via the FhirContext)")); assertThat(e.toString(), containsString("The server at base URL \"http://foo/metadata\" returned a conformance statement indicating that it supports FHIR version \"0.4.0\" which corresponds to DSTU2, but this client is configured to use DSTU1 (via the FhirContext)"));
} }
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -14,6 +14,7 @@ import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.hamcrest.core.StringContains; import org.hamcrest.core.StringContains;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
@ -30,6 +31,7 @@ import ca.uhn.fhir.rest.annotation.Read;
import ca.uhn.fhir.rest.client.api.IRestfulClient; import ca.uhn.fhir.rest.client.api.IRestfulClient;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
import ca.uhn.fhir.util.TestUtil;
public class ExceptionHandlingTest { public class ExceptionHandlingTest {
@ -182,4 +184,10 @@ public class ExceptionHandlingTest {
Patient read(@IdParam IdDt theId); Patient read(@IdParam IdDt theId);
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -33,6 +33,7 @@ import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.hamcrest.core.StringContains; import org.hamcrest.core.StringContains;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
@ -62,6 +63,7 @@ import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.rest.server.EncodingEnum; import ca.uhn.fhir.rest.server.EncodingEnum;
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import ca.uhn.fhir.util.TestUtil;
import ca.uhn.fhir.util.UrlUtil; import ca.uhn.fhir.util.UrlUtil;
public class GenericClientTest { public class GenericClientTest {
@ -1675,4 +1677,10 @@ public class GenericClientTest {
ourCtx = FhirContext.forDstu1(); ourCtx = FhirContext.forDstu1();
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -21,6 +21,7 @@ import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.AfterClass;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
@ -33,6 +34,7 @@ import ca.uhn.fhir.rest.annotation.Read;
import ca.uhn.fhir.rest.server.IResourceProvider; import ca.uhn.fhir.rest.server.IResourceProvider;
import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.rest.server.RestfulServer;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
public class HttpProxyTest { public class HttpProxyTest {
private static FhirContext ourCtx; private static FhirContext ourCtx;
@ -148,4 +150,10 @@ public class HttpProxyTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -15,6 +15,7 @@ import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
@ -30,6 +31,7 @@ import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.rest.server.IncludeTest; import ca.uhn.fhir.rest.server.IncludeTest;
import ca.uhn.fhir.rest.server.IncludeTest.ExtPatient; import ca.uhn.fhir.rest.server.IncludeTest.ExtPatient;
import ca.uhn.fhir.util.TestUtil;
public class IncludedResourceStitchingClientTest { public class IncludedResourceStitchingClientTest {
@ -245,4 +247,10 @@ public class IncludedResourceStitchingClientTest {
//@formatter:off //@formatter:off
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -28,6 +28,7 @@ import ca.uhn.fhir.rest.client.interceptor.LoggingInterceptor;
import ca.uhn.fhir.rest.server.IResourceProvider; import ca.uhn.fhir.rest.server.IResourceProvider;
import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.rest.server.RestfulServer;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
import ch.qos.logback.classic.BasicConfigurator; import ch.qos.logback.classic.BasicConfigurator;
import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.LoggerContext;
@ -42,11 +43,16 @@ import ch.qos.logback.core.Appender;
*/ */
public class LoggingInterceptorTest { public class LoggingInterceptorTest {
private static final FhirContext ourCtx = FhirContext.forDstu1();
private static int ourPort; private static int ourPort;
private static Server ourServer; private static Server ourServer;
private static final FhirContext ourCtx = FhirContext.forDstu1();
private Appender<ILoggingEvent> myMockAppender;
private Logger myLoggerRoot; private Logger myLoggerRoot;
private Appender<ILoggingEvent> myMockAppender;
@After
public void after() {
myLoggerRoot.detachAppender(myMockAppender);
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Before @Before
@ -64,11 +70,6 @@ public class LoggingInterceptorTest {
myLoggerRoot.addAppender(myMockAppender); myLoggerRoot.addAppender(myMockAppender);
} }
@After
public void after() {
myLoggerRoot.detachAppender(myMockAppender);
}
@Test @Test
public void testLogger() throws Exception { public void testLogger() throws Exception {
System.out.println("Starting testLogger"); System.out.println("Starting testLogger");
@ -88,8 +89,9 @@ public class LoggingInterceptorTest {
} }
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClassClearContext() throws Exception {
ourServer.stop(); ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
} }
@BeforeClass @BeforeClass
@ -119,6 +121,7 @@ public class LoggingInterceptorTest {
ourCtx.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER); ourCtx.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER);
} }
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
*/ */

View File

@ -15,6 +15,7 @@ import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
@ -29,6 +30,7 @@ import ca.uhn.fhir.rest.annotation.Search;
import ca.uhn.fhir.rest.client.api.IBasicClient; import ca.uhn.fhir.rest.client.api.IBasicClient;
import ca.uhn.fhir.rest.param.ReferenceParam; import ca.uhn.fhir.rest.param.ReferenceParam;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.util.TestUtil;
public class ReferenceClientTest { public class ReferenceClientTest {
@ -125,4 +127,10 @@ public class ReferenceClientTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -23,6 +23,7 @@ import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
@ -41,6 +42,7 @@ import ca.uhn.fhir.rest.param.TokenOrListParam;
import ca.uhn.fhir.rest.param.TokenParam; import ca.uhn.fhir.rest.param.TokenParam;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException; import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
import ca.uhn.fhir.util.TestUtil;
public class SearchClientDstu1Test { public class SearchClientDstu1Test {
@ -127,4 +129,10 @@ public class SearchClientDstu1Test {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -15,6 +15,7 @@ import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
@ -32,6 +33,7 @@ import ca.uhn.fhir.rest.api.SortSpec;
import ca.uhn.fhir.rest.client.api.IBasicClient; import ca.uhn.fhir.rest.client.api.IBasicClient;
import ca.uhn.fhir.rest.param.StringParam; import ca.uhn.fhir.rest.param.StringParam;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.util.TestUtil;
public class SortClientTest { public class SortClientTest {
@ -98,4 +100,10 @@ public class SortClientTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -15,6 +15,7 @@ import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
@ -29,6 +30,7 @@ import ca.uhn.fhir.rest.annotation.Search;
import ca.uhn.fhir.rest.client.api.IBasicClient; import ca.uhn.fhir.rest.client.api.IBasicClient;
import ca.uhn.fhir.rest.param.StringParam; import ca.uhn.fhir.rest.param.StringParam;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.util.TestUtil;
public class StringClientTest { public class StringClientTest {
@ -113,4 +115,10 @@ public class StringClientTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -17,6 +17,7 @@ import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
@ -36,6 +37,7 @@ import ca.uhn.fhir.rest.annotation.TagListParam;
import ca.uhn.fhir.rest.annotation.VersionIdParam; import ca.uhn.fhir.rest.annotation.VersionIdParam;
import ca.uhn.fhir.rest.client.api.IBasicClient; import ca.uhn.fhir.rest.client.api.IBasicClient;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.util.TestUtil;
public class TagsClientTest { public class TagsClientTest {
@ -290,4 +292,10 @@ public class TagsClientTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -17,6 +17,7 @@ import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicStatusLine; import org.apache.http.message.BasicStatusLine;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
@ -34,6 +35,7 @@ import ca.uhn.fhir.rest.annotation.Transaction;
import ca.uhn.fhir.rest.annotation.TransactionParam; import ca.uhn.fhir.rest.annotation.TransactionParam;
import ca.uhn.fhir.rest.client.api.IBasicClient; import ca.uhn.fhir.rest.client.api.IBasicClient;
import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.Constants;
import ca.uhn.fhir.util.TestUtil;
public class TransactionClientTest { public class TransactionClientTest {
@ -155,4 +157,10 @@ public class TransactionClientTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,10 +2,12 @@ package ca.uhn.fhir.rest.method;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.api.TagList; import ca.uhn.fhir.model.api.TagList;
import ca.uhn.fhir.util.TestUtil;
public class BaseOutcomeReturningMethodBindingTest { public class BaseOutcomeReturningMethodBindingTest {
@ -193,4 +195,10 @@ public class BaseOutcomeReturningMethodBindingTest {
} }
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -4,8 +4,11 @@ import static org.junit.Assert.*;
import java.util.List; import java.util.List;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.util.TestUtil;
public class QualifiedParamListTest { public class QualifiedParamListTest {
@Test @Test
@ -32,4 +35,10 @@ public class QualifiedParamListTest {
assertEquals("b,bb", actual.get(1)); assertEquals("b,bb", actual.get(1));
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -8,6 +8,7 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.model.dstu.valueset.QuantityCompararatorEnum; import ca.uhn.fhir.model.dstu.valueset.QuantityCompararatorEnum;
@ -15,10 +16,11 @@ import ca.uhn.fhir.model.primitive.DateTimeDt;
import ca.uhn.fhir.model.primitive.InstantDt; import ca.uhn.fhir.model.primitive.InstantDt;
import ca.uhn.fhir.rest.method.QualifiedParamList; import ca.uhn.fhir.rest.method.QualifiedParamList;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import ca.uhn.fhir.util.TestUtil;
public class DateRangeParamTest { public class DateRangeParamTest {
private static SimpleDateFormat ourFmt; private static final SimpleDateFormat ourFmt;
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(DateRangeParamTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(DateRangeParamTest.class);
static { static {
@ -167,4 +169,10 @@ public class DateRangeParamTest {
return new Date(ourFmt.parse(theString).getTime() - 1L); return new Date(ourFmt.parse(theString).getTime() - 1L);
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,10 +2,12 @@ package ca.uhn.fhir.rest.param;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.model.dstu.valueset.QuantityCompararatorEnum; import ca.uhn.fhir.model.dstu.valueset.QuantityCompararatorEnum;
import ca.uhn.fhir.util.TestUtil;
public class QuantityParamTest { public class QuantityParamTest {
private static FhirContext ourCtx = FhirContext.forDstu1(); private static FhirContext ourCtx = FhirContext.forDstu1();
@ -57,4 +59,10 @@ public class QuantityParamTest {
assertEquals("5.4||", p.getValueAsQueryToken(ourCtx)); assertEquals("5.4||", p.getValueAsQueryToken(ourCtx));
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -2,8 +2,11 @@ package ca.uhn.fhir.rest.param;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import ca.uhn.fhir.util.TestUtil;
public class ReferenceParamTest { public class ReferenceParamTest {
@Test @Test
@ -26,4 +29,10 @@ public class ReferenceParamTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -3,7 +3,9 @@ package ca.uhn.fhir.rest.param;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import ca.uhn.fhir.model.dstu.composite.CodingDt; import ca.uhn.fhir.model.dstu.composite.CodingDt;
import ca.uhn.fhir.rest.method.QualifiedParamList; import ca.uhn.fhir.rest.method.QualifiedParamList;
import ca.uhn.fhir.util.TestUtil;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import java.util.ArrayList; import java.util.ArrayList;
@ -62,4 +64,10 @@ public class TokenOrListParamTest {
assertEquals("code-include-but-not-end-with-comma,suffix", params.getListAsCodings().get(0).getCodeElement().getValue()); assertEquals("code-include-but-not-end-with-comma,suffix", params.getListAsCodings().get(0).getCodeElement().getValue());
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -24,6 +24,7 @@ import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.rest.annotation.IdParam; import ca.uhn.fhir.rest.annotation.IdParam;
import ca.uhn.fhir.rest.annotation.Read; import ca.uhn.fhir.rest.annotation.Read;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
@ -31,9 +32,9 @@ import ca.uhn.fhir.util.PortUtil;
public class AcceptHeaderTest { public class AcceptHeaderTest {
private static CloseableHttpClient ourClient; private static CloseableHttpClient ourClient;
private static FhirContext ourCtx = FhirContext.forDstu1();
private static int ourPort; private static int ourPort;
private static Server ourServer; private static Server ourServer;
private static FhirContext ourCtx = FhirContext.forDstu1();
@Test @Test
public void testReadNoHeader() throws Exception { public void testReadNoHeader() throws Exception {
@ -54,16 +55,6 @@ public class AcceptHeaderTest {
assertEquals(Constants.CT_FHIR_XML + Constants.CHARSET_UTF8_CTSUFFIX.replace(" ", "").toLowerCase(), status.getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue().replace(" ", "").replace("UTF", "utf")); assertEquals(Constants.CT_FHIR_XML + Constants.CHARSET_UTF8_CTSUFFIX.replace(" ", "").toLowerCase(), status.getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue().replace(" ", "").replace("UTF", "utf"));
} }
@Test
public void testReadXmlHeaderHigherPriorityWithStar() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient/1");
httpGet.addHeader(Constants.HEADER_ACCEPT, "*/*; q=1.0, " + Constants.CT_FHIR_XML + "; q=1.0, " + Constants.CT_FHIR_JSON + "; q=0.9");
HttpResponse status = ourClient.execute(httpGet);
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(Constants.CT_FHIR_XML + Constants.CHARSET_UTF8_CTSUFFIX.replace(" ", "").toLowerCase(), status.getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue().replace(" ", "").replace("UTF", "utf"));
}
@Test @Test
public void testReadXmlHeaderHigherPriorityBackwards() throws Exception { public void testReadXmlHeaderHigherPriorityBackwards() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient/1"); HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient/1");
@ -82,9 +73,20 @@ public class AcceptHeaderTest {
assertEquals(Constants.CT_FHIR_XML + Constants.CHARSET_UTF8_CTSUFFIX.replace(" ", "").toLowerCase(), status.getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue().replace(" ", "").replace("UTF", "utf")); assertEquals(Constants.CT_FHIR_XML + Constants.CHARSET_UTF8_CTSUFFIX.replace(" ", "").toLowerCase(), status.getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue().replace(" ", "").replace("UTF", "utf"));
} }
@Test
public void testReadXmlHeaderHigherPriorityWithStar() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient/1");
httpGet.addHeader(Constants.HEADER_ACCEPT, "*/*; q=1.0, " + Constants.CT_FHIR_XML + "; q=1.0, " + Constants.CT_FHIR_JSON + "; q=0.9");
HttpResponse status = ourClient.execute(httpGet);
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(Constants.CT_FHIR_XML + Constants.CHARSET_UTF8_CTSUFFIX.replace(" ", "").toLowerCase(), status.getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue().replace(" ", "").replace("UTF", "utf"));
}
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClassClearContext() throws Exception {
ourServer.stop(); ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
} }
@BeforeClass @BeforeClass
@ -108,11 +110,17 @@ public class AcceptHeaderTest {
} }
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
*/ */
public static class PatientProvider implements IResourceProvider { public static class PatientProvider implements IResourceProvider {
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
@Read(version = true) @Read(version = true)
public Patient read(@IdParam IdDt theId) { public Patient read(@IdParam IdDt theId) {
Patient patient = new Patient(); Patient patient = new Patient();
@ -121,11 +129,6 @@ public class AcceptHeaderTest {
return patient; return patient;
} }
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
} }
} }

View File

@ -37,6 +37,7 @@ import ca.uhn.fhir.rest.annotation.ResourceParam;
import ca.uhn.fhir.rest.annotation.Search; import ca.uhn.fhir.rest.annotation.Search;
import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.api.MethodOutcome;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
public class BinaryTest { public class BinaryTest {
@ -55,53 +56,6 @@ public class BinaryTest {
ourLast=null; ourLast=null;
} }
@Test
public void testRead() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Binary/foo");
HttpResponse status = ourClient.execute(httpGet);
byte[] responseContent = IOUtils.toByteArray(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
assertEquals("foo", status.getFirstHeader("content-type").getValue());
assertArrayEquals(new byte[] { 1, 2, 3, 4 }, responseContent);
}
@Test
public void testReadWithExplicitTypeXml() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Binary/foo?_format=xml");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent(), "UTF-8");
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode());
assertThat(status.getFirstHeader("content-type").getValue(), startsWith(Constants.CT_FHIR_XML + ";"));
Binary bin = ourCtx.newXmlParser().parseResource(Binary.class, responseContent);
assertEquals("foo", bin.getContentType());
assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent());
}
@Test
public void testReadWithExplicitTypeJson() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Binary/foo?_format=json");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent(), "UTF-8");
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode());
assertThat(status.getFirstHeader("content-type").getValue(), startsWith(Constants.CT_FHIR_JSON + ";"));
Binary bin = ourCtx.newJsonParser().parseResource(Binary.class, responseContent);
assertEquals("foo", bin.getContentType());
assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent());
}
@Test @Test
public void testCreate() throws Exception { public void testCreate() throws Exception {
HttpPost http = new HttpPost("http://localhost:" + ourPort + "/Binary"); HttpPost http = new HttpPost("http://localhost:" + ourPort + "/Binary");
@ -132,6 +86,53 @@ public class BinaryTest {
} }
@Test
public void testRead() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Binary/foo");
HttpResponse status = ourClient.execute(httpGet);
byte[] responseContent = IOUtils.toByteArray(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
assertEquals("foo", status.getFirstHeader("content-type").getValue());
assertArrayEquals(new byte[] { 1, 2, 3, 4 }, responseContent);
}
@Test
public void testReadWithExplicitTypeJson() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Binary/foo?_format=json");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent(), "UTF-8");
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode());
assertThat(status.getFirstHeader("content-type").getValue(), startsWith(Constants.CT_FHIR_JSON + ";"));
Binary bin = ourCtx.newJsonParser().parseResource(Binary.class, responseContent);
assertEquals("foo", bin.getContentType());
assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent());
}
@Test
public void testReadWithExplicitTypeXml() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Binary/foo?_format=xml");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent(), "UTF-8");
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(200, status.getStatusLine().getStatusCode());
assertThat(status.getFirstHeader("content-type").getValue(), startsWith(Constants.CT_FHIR_XML + ";"));
Binary bin = ourCtx.newXmlParser().parseResource(Binary.class, responseContent);
assertEquals("foo", bin.getContentType());
assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent());
}
@Test @Test
public void testSearch() throws Exception { public void testSearch() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Binary?"); HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Binary?");
@ -150,11 +151,13 @@ public class BinaryTest {
assertEquals("text/plain", bin.getContentType()); assertEquals("text/plain", bin.getContentType());
assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent()); assertArrayEquals(new byte[] { 1, 2, 3, 4 }, bin.getContent());
} }
@AfterClass
public static void afterClass() throws Exception {
ourServer.stop();
}
@AfterClass
public static void afterClassClearContext() throws Exception {
ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
}
@BeforeClass @BeforeClass
public static void beforeClass() throws Exception { public static void beforeClass() throws Exception {
ourPort = PortUtil.findFreePort(); ourPort = PortUtil.findFreePort();
@ -176,7 +179,8 @@ public class BinaryTest {
ourClient = builder.build(); ourClient = builder.build();
} }
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
*/ */

View File

@ -33,6 +33,7 @@ import ca.uhn.fhir.rest.param.CompositeParam;
import ca.uhn.fhir.rest.param.DateParam; import ca.uhn.fhir.rest.param.DateParam;
import ca.uhn.fhir.rest.param.StringParam; import ca.uhn.fhir.rest.param.StringParam;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
@ -94,8 +95,9 @@ public class CompositeParameterTest {
} }
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClassClearContext() throws Exception {
ourServer.stop(); ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
} }
@BeforeClass @BeforeClass
@ -119,6 +121,7 @@ public class CompositeParameterTest {
ourClient = builder.build(); ourClient = builder.build();
} }
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
*/ */

View File

@ -31,6 +31,7 @@ import ca.uhn.fhir.parser.DataFormatException;
import ca.uhn.fhir.rest.annotation.IdParam; import ca.uhn.fhir.rest.annotation.IdParam;
import ca.uhn.fhir.rest.annotation.Read; import ca.uhn.fhir.rest.annotation.Read;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
@ -38,21 +39,11 @@ import ca.uhn.fhir.util.PortUtil;
public class CompressionTest { public class CompressionTest {
private static CloseableHttpClient ourClient; private static CloseableHttpClient ourClient;
private static final FhirContext ourCtx = FhirContext.forDstu1();
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(CompressionTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(CompressionTest.class);
private static int ourPort; private static int ourPort;
private static Server ourServer; private static Server ourServer;
private static final FhirContext ourCtx = FhirContext.forDstu1();
public static String decompress(byte[] theResource) {
GZIPInputStream is;
try {
is = new GZIPInputStream(new ByteArrayInputStream(theResource));
return IOUtils.toString(is, "UTF-8");
} catch (IOException e) {
throw new DataFormatException("Failed to decompress contents", e);
}
}
@Test @Test
public void testRead() throws Exception { public void testRead() throws Exception {
{ {
@ -79,7 +70,7 @@ public class CompressionTest {
} }
} }
@Test @Test
public void testVRead() throws Exception { public void testVRead() throws Exception {
{ {
@ -95,8 +86,9 @@ public class CompressionTest {
} }
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClassClearContext() throws Exception {
ourServer.stop(); ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
} }
@BeforeClass @BeforeClass
@ -127,6 +119,17 @@ public class CompressionTest {
} }
public static String decompress(byte[] theResource) {
GZIPInputStream is;
try {
is = new GZIPInputStream(new ByteArrayInputStream(theResource));
return IOUtils.toString(is, "UTF-8");
} catch (IOException e) {
throw new DataFormatException("Failed to decompress contents", e);
}
}
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
*/ */

View File

@ -25,6 +25,7 @@ import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.AfterClass;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
@ -33,6 +34,7 @@ import ca.uhn.fhir.model.api.Bundle;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.rest.server.RestfulServerSelfReferenceTest.DummyPatientResourceProvider; import ca.uhn.fhir.rest.server.RestfulServerSelfReferenceTest.DummyPatientResourceProvider;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
public class CorsTest { public class CorsTest {
private static CloseableHttpClient ourClient; private static CloseableHttpClient ourClient;
@ -148,4 +150,10 @@ public class CorsTest {
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -45,6 +45,7 @@ import ca.uhn.fhir.rest.annotation.Search;
import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.api.MethodOutcome;
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException; import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
@ -90,50 +91,6 @@ public class CreateTest {
assertEquals(EncodingEnum.XML, ourLastEncoding); assertEquals(EncodingEnum.XML, ourLastEncoding);
} }
@Test
public void testCreateWithWrongContentTypeXml() throws Exception {
Patient patient = new Patient();
patient.addIdentifier().setValue("001");
patient.addIdentifier().setValue("002");
HttpPost httpPost = new HttpPost("http://localhost:" + ourPort + "/Patient");
String inputString = ourCtx.newJsonParser().encodeResourceToString(patient);
ContentType inputCt = ContentType.create(Constants.CT_FHIR_XML, "UTF-8");
httpPost.setEntity(new StringEntity(inputString, inputCt));
HttpResponse status = ourClient.execute(httpPost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info("Response was:\n{}", responseContent);
assertEquals(500, status.getStatusLine().getStatusCode());
assertThat(responseContent, containsString("Unexpected character"));
}
@Test
public void testCreateWithWrongContentTypeJson() throws Exception {
Patient patient = new Patient();
patient.addIdentifier().setValue("001");
patient.addIdentifier().setValue("002");
HttpPost httpPost = new HttpPost("http://localhost:" + ourPort + "/Patient");
String inputString = ourCtx.newXmlParser().encodeResourceToString(patient);
ContentType inputCt = ContentType.create(Constants.CT_FHIR_JSON, "UTF-8");
httpPost.setEntity(new StringEntity(inputString, inputCt));
HttpResponse status = ourClient.execute(httpPost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info("Response was:\n{}", responseContent);
assertEquals(500, status.getStatusLine().getStatusCode());
assertThat(responseContent, containsString("Unexpected char"));
}
@Test @Test
public void testCreateById() throws Exception { public void testCreateById() throws Exception {
@ -249,11 +206,56 @@ public class CreateTest {
} }
@AfterClass @Test
public static void afterClass() throws Exception { public void testCreateWithWrongContentTypeJson() throws Exception {
ourServer.stop();
Patient patient = new Patient();
patient.addIdentifier().setValue("001");
patient.addIdentifier().setValue("002");
HttpPost httpPost = new HttpPost("http://localhost:" + ourPort + "/Patient");
String inputString = ourCtx.newXmlParser().encodeResourceToString(patient);
ContentType inputCt = ContentType.create(Constants.CT_FHIR_JSON, "UTF-8");
httpPost.setEntity(new StringEntity(inputString, inputCt));
HttpResponse status = ourClient.execute(httpPost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info("Response was:\n{}", responseContent);
assertEquals(500, status.getStatusLine().getStatusCode());
assertThat(responseContent, containsString("Unexpected char"));
} }
@Test
public void testCreateWithWrongContentTypeXml() throws Exception {
Patient patient = new Patient();
patient.addIdentifier().setValue("001");
patient.addIdentifier().setValue("002");
HttpPost httpPost = new HttpPost("http://localhost:" + ourPort + "/Patient");
String inputString = ourCtx.newJsonParser().encodeResourceToString(patient);
ContentType inputCt = ContentType.create(Constants.CT_FHIR_XML, "UTF-8");
httpPost.setEntity(new StringEntity(inputString, inputCt));
HttpResponse status = ourClient.execute(httpPost);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info("Response was:\n{}", responseContent);
assertEquals(500, status.getStatusLine().getStatusCode());
assertThat(responseContent, containsString("Unexpected character"));
}
@AfterClass
public static void afterClassClearContext() throws Exception {
ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
}
@BeforeClass @BeforeClass
public static void beforeClass() throws Exception { public static void beforeClass() throws Exception {
ourPort = PortUtil.findFreePort(); ourPort = PortUtil.findFreePort();
@ -279,6 +281,7 @@ public class CreateTest {
ourClient = builder.build(); ourClient = builder.build();
} }
@ResourceDef(name = "Observation") @ResourceDef(name = "Observation")
public static class CustomObservation extends Observation { public static class CustomObservation extends Observation {
@ -315,7 +318,7 @@ public class CreateTest {
} }
} }
public static class DiagnosticReportProvider implements IResourceProvider { public static class DiagnosticReportProvider implements IResourceProvider {
private TagList myLastTags; private TagList myLastTags;
@ -392,6 +395,7 @@ public class CreateTest {
} }
public static class PatientProvider implements IResourceProvider { public static class PatientProvider implements IResourceProvider {
@Create() @Create()

View File

@ -36,6 +36,7 @@ import ca.uhn.fhir.rest.annotation.OptionalParam;
import ca.uhn.fhir.rest.annotation.Search; import ca.uhn.fhir.rest.annotation.Search;
import ca.uhn.fhir.rest.param.StringParam; import ca.uhn.fhir.rest.param.StringParam;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
@ -44,9 +45,68 @@ public class CustomTypeTest {
private static CloseableHttpClient ourClient; private static CloseableHttpClient ourClient;
private static FhirContext ourCtx = new FhirContext(ExtendedPatient.class); private static FhirContext ourCtx = new FhirContext(ExtendedPatient.class);
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(CustomTypeTest.class);
private static int ourPort; private static int ourPort;
private static boolean ourReturnExtended = false;
private static Server ourServer; private static Server ourServer;
private static RestfulServer ourServlet; private static RestfulServer ourServlet;
@Test
public void testFindProfileItself() throws Exception {
ourServlet.setAddProfileTag(AddProfileTagEnum.ONLY_FOR_CUSTOM);
ourReturnExtended=true;
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Profile/prof2?_pretty=true");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
ourLog.info(responseContent);
Profile bundle = ourCtx.newXmlParser().parseResource(Profile.class, responseContent);
}
@Test
public void testSearchReturnsNoProfileForExtendedType() throws Exception {
ourServlet.setAddProfileTag(AddProfileTagEnum.NEVER);
ourReturnExtended=true;
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_id=aaa");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
BundleEntry entry = bundle.getEntries().get(0);
List<Tag> profileTags = entry.getCategories().getTagsWithScheme(Tag.HL7_ORG_PROFILE_TAG);
assertEquals(0, profileTags.size());
}
@Test
public void testSearchReturnsNoProfileForNormalType() throws Exception {
ourServlet.setAddProfileTag(AddProfileTagEnum.ONLY_FOR_CUSTOM);
ourReturnExtended=false;
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_id=aaa");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
BundleEntry entry = bundle.getEntries().get(0);
List<Tag> profileTags = entry.getCategories().getTagsWithScheme(Tag.HL7_ORG_PROFILE_TAG);
assertEquals(0, profileTags.size());
}
@Test @Test
@ -71,64 +131,7 @@ public class CustomTypeTest {
assertEquals("idaaa", p.getNameFirstRep().getFamilyAsSingleString()); assertEquals("idaaa", p.getNameFirstRep().getFamilyAsSingleString());
} }
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(CustomTypeTest.class);
@Test
public void testFindProfileItself() throws Exception {
ourServlet.setAddProfileTag(AddProfileTagEnum.ONLY_FOR_CUSTOM);
ourReturnExtended=true;
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Profile/prof2?_pretty=true");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
ourLog.info(responseContent);
Profile bundle = ourCtx.newXmlParser().parseResource(Profile.class, responseContent);
}
@Test
public void testSearchReturnsNoProfileForNormalType() throws Exception {
ourServlet.setAddProfileTag(AddProfileTagEnum.ONLY_FOR_CUSTOM);
ourReturnExtended=false;
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_id=aaa");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
BundleEntry entry = bundle.getEntries().get(0);
List<Tag> profileTags = entry.getCategories().getTagsWithScheme(Tag.HL7_ORG_PROFILE_TAG);
assertEquals(0, profileTags.size());
}
@Test
public void testSearchReturnsNoProfileForExtendedType() throws Exception {
ourServlet.setAddProfileTag(AddProfileTagEnum.NEVER);
ourReturnExtended=true;
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?_id=aaa");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
BundleEntry entry = bundle.getEntries().get(0);
List<Tag> profileTags = entry.getCategories().getTagsWithScheme(Tag.HL7_ORG_PROFILE_TAG);
assertEquals(0, profileTags.size());
}
@Test @Test
public void testSearchReturnsProfileForNormalType() throws Exception { public void testSearchReturnsProfileForNormalType() throws Exception {
ourServlet.setAddProfileTag(AddProfileTagEnum.ALWAYS); ourServlet.setAddProfileTag(AddProfileTagEnum.ALWAYS);
@ -152,11 +155,13 @@ public class CustomTypeTest {
} }
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClassClearContext() throws Exception {
ourServer.stop(); ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
} }
@BeforeClass @BeforeClass
public static void beforeClass() throws Exception { public static void beforeClass() throws Exception {
ourPort = PortUtil.findFreePort(); ourPort = PortUtil.findFreePort();
@ -183,8 +188,31 @@ public class CustomTypeTest {
fhirContext.getResourceDefinition(ExtendedPatient.class); fhirContext.getResourceDefinition(ExtendedPatient.class);
} }
public static class DummyPatientResourceProvider implements IResourceProvider {
@Search
public List<Patient> findPatient(@OptionalParam(name = "_id") StringParam theParam) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = ourReturnExtended ? new ExtendedPatient() : new Patient();
patient.setId("1");
patient.addIdentifier("system", "identifier123");
if (theParam != null) {
patient.addName().addFamily("id" + theParam.getValue());
}
retVal.add(patient);
return retVal;
}
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
}
@ResourceDef(name="Patient", profile="http://foo/profiles/Profile", id="prof2") @ResourceDef(name="Patient", profile="http://foo/profiles/Profile", id="prof2")
public static class ExtendedPatient extends Patient { public static class ExtendedPatient extends Patient {
@ -211,30 +239,5 @@ public class CustomTypeTest {
} }
} }
private static boolean ourReturnExtended = false;
public static class DummyPatientResourceProvider implements IResourceProvider {
@Search
public List<Patient> findPatient(@OptionalParam(name = "_id") StringParam theParam) {
ArrayList<Patient> retVal = new ArrayList<Patient>();
Patient patient = ourReturnExtended ? new ExtendedPatient() : new Patient();
patient.setId("1");
patient.addIdentifier("system", "identifier123");
if (theParam != null) {
patient.addName().addFamily("id" + theParam.getValue());
}
retVal.add(patient);
return retVal;
}
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
}
} }

View File

@ -29,6 +29,7 @@ import ca.uhn.fhir.rest.annotation.Search;
import ca.uhn.fhir.rest.param.DateRangeParam; import ca.uhn.fhir.rest.param.DateRangeParam;
import ca.uhn.fhir.rest.param.DateRangeParamTest; import ca.uhn.fhir.rest.param.DateRangeParamTest;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
@ -36,9 +37,28 @@ import ca.uhn.fhir.util.PortUtil;
public class DateRangeParamSearchTest { public class DateRangeParamSearchTest {
private static CloseableHttpClient ourClient; private static CloseableHttpClient ourClient;
private static int ourPort;
private static Server ourServer;
private static final FhirContext ourCtx = FhirContext.forDstu1(); private static final FhirContext ourCtx = FhirContext.forDstu1();
private static DateRangeParam ourLastDateRange;
private static int ourPort;
private static Server ourServer;
@Before
public void before() {
ourLastDateRange = null;
}
@Test
public void testSearchForMultipleUnqualifiedDate() throws Exception {
String baseUrl = "http://localhost:" + ourPort + "/Patient?" + Patient.SP_BIRTHDATE + "=";
HttpGet httpGet = new HttpGet(baseUrl + "2012-01-01&" + Patient.SP_BIRTHDATE + "=2012-02-03");
HttpResponse status = ourClient.execute(httpGet);
IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(400, status.getStatusLine().getStatusCode());
}
@Test @Test
public void testSearchForOneUnqualifiedDate() throws Exception { public void testSearchForOneUnqualifiedDate() throws Exception {
@ -56,27 +76,12 @@ public class DateRangeParamSearchTest {
assertEquals(DateRangeParamTest.parseM1("2012-01-02 00:00:00.0000"), ourLastDateRange.getUpperBoundAsInstant()); assertEquals(DateRangeParamTest.parseM1("2012-01-02 00:00:00.0000"), ourLastDateRange.getUpperBoundAsInstant());
} }
@Test
public void testSearchForMultipleUnqualifiedDate() throws Exception {
String baseUrl = "http://localhost:" + ourPort + "/Patient?" + Patient.SP_BIRTHDATE + "=";
HttpGet httpGet = new HttpGet(baseUrl + "2012-01-01&" + Patient.SP_BIRTHDATE + "=2012-02-03");
HttpResponse status = ourClient.execute(httpGet);
IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(400, status.getStatusLine().getStatusCode());
}
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClassClearContext() throws Exception {
ourServer.stop(); ourServer.stop();
} TestUtil.clearAllStaticFieldsForUnitTest();
@Before
public void before() {
ourLastDateRange = null;
} }
@BeforeClass @BeforeClass
@ -103,13 +108,18 @@ public class DateRangeParamSearchTest {
} }
private static DateRangeParam ourLastDateRange;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
*/ */
public static class DummyPatientResourceProvider implements IResourceProvider { public static class DummyPatientResourceProvider implements IResourceProvider {
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
@Search() @Search()
public List<Patient> search(@RequiredParam(name=Patient.SP_BIRTHDATE) DateRangeParam theDateRange) { public List<Patient> search(@RequiredParam(name=Patient.SP_BIRTHDATE) DateRangeParam theDateRange) {
ourLastDateRange = theDateRange; ourLastDateRange = theDateRange;
@ -123,12 +133,6 @@ public class DateRangeParamSearchTest {
return retVal; return retVal;
} }
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
} }
} }

View File

@ -35,14 +35,15 @@ import ca.uhn.fhir.model.primitive.IdDt;
import ca.uhn.fhir.rest.annotation.IdParam; import ca.uhn.fhir.rest.annotation.IdParam;
import ca.uhn.fhir.rest.annotation.Read; import ca.uhn.fhir.rest.annotation.Read;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
public class DefaultEncodingTest { public class DefaultEncodingTest {
private static CloseableHttpClient ourClient; private static CloseableHttpClient ourClient;
private static int ourPort;
private static Server ourServer;
private static final FhirContext ourCtx = FhirContext.forDstu1(); private static final FhirContext ourCtx = FhirContext.forDstu1();
private static int ourPort;
private static RestfulServer ourRestfulServer; private static RestfulServer ourRestfulServer;
private static Server ourServer;
@Test @Test
public void testHonoursAcceptHeader() throws Exception { public void testHonoursAcceptHeader() throws Exception {
@ -174,8 +175,9 @@ public class DefaultEncodingTest {
} }
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClassClearContext() throws Exception {
ourServer.stop(); ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
} }
@BeforeClass @BeforeClass
@ -198,11 +200,17 @@ public class DefaultEncodingTest {
} }
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
*/ */
public static class PatientProvider implements IResourceProvider { public static class PatientProvider implements IResourceProvider {
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
@Read(version = true) @Read(version = true)
public Patient read(@IdParam IdDt theId) { public Patient read(@IdParam IdDt theId) {
Patient patient = new Patient(); Patient patient = new Patient();
@ -211,11 +219,6 @@ public class DefaultEncodingTest {
return patient; return patient;
} }
@Override
public Class<? extends IResource> getResourceType() {
return Patient.class;
}
} }
} }

View File

@ -6,6 +6,7 @@ import java.util.Arrays;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner; import org.mockito.runners.MockitoJUnitRunner;
@ -17,6 +18,7 @@ import ca.uhn.fhir.rest.annotation.Create;
import ca.uhn.fhir.rest.annotation.Destroy; import ca.uhn.fhir.rest.annotation.Destroy;
import ca.uhn.fhir.rest.annotation.ResourceParam; import ca.uhn.fhir.rest.annotation.ResourceParam;
import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.api.MethodOutcome;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by Bill de Beaubien on 11/10/2014. * Created by Bill de Beaubien on 11/10/2014.
@ -93,4 +95,10 @@ public class DestroyTest {
return new MethodOutcome(); return new MethodOutcome();
} }
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -9,6 +9,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IBaseResource;
import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
@ -25,6 +26,7 @@ import ca.uhn.fhir.model.dstu.resource.Observation;
import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.dstu.resource.Patient;
import ca.uhn.fhir.model.dstu.resource.Practitioner; import ca.uhn.fhir.model.dstu.resource.Practitioner;
import ca.uhn.fhir.model.dstu.resource.Specimen; import ca.uhn.fhir.model.dstu.resource.Specimen;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by Bill de Beaubien on 3/3/2015. * Created by Bill de Beaubien on 3/3/2015.
@ -188,4 +190,10 @@ public class Dstu1BundleFactoryTest {
} }
return resources; return resources;
} }
@AfterClass
public static void afterClassClearContext() {
TestUtil.clearAllStaticFieldsForUnitTest();
}
} }

View File

@ -33,6 +33,7 @@ import ca.uhn.fhir.rest.param.StringAndListParam;
import ca.uhn.fhir.rest.param.StringOrListParam; import ca.uhn.fhir.rest.param.StringOrListParam;
import ca.uhn.fhir.rest.param.StringParam; import ca.uhn.fhir.rest.param.StringParam;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
@ -41,18 +42,31 @@ public class DynamicSearchTest {
private static CloseableHttpClient ourClient; private static CloseableHttpClient ourClient;
private static FhirContext ourCtx = FhirContext.forDstu1(); private static FhirContext ourCtx = FhirContext.forDstu1();
private static SearchParameterMap ourLastSearchParams;
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(DynamicSearchTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(DynamicSearchTest.class);
private static int ourPort; private static int ourPort;
private static Server ourServer; private static Server ourServer;
private static SearchParameterMap ourLastSearchParams;
@Before @Before
public void before() { public void before() {
ourLastSearchParams = null; ourLastSearchParams = null;
} }
@Test
public void testConformance() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/metadata?_pretty=true");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Conformance conf = ourCtx.newXmlParser().parseResource(Conformance.class,responseContent);
ourLog.info(responseContent);
}
@Test @Test
public void testSearchOneStringParam() throws Exception { public void testSearchOneStringParam() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?param1=param1value"); HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?param1=param1value");
@ -72,28 +86,6 @@ public class DynamicSearchTest {
assertEquals("param1value", param1.getValue()); assertEquals("param1value", param1.getValue());
} }
@Test
public void testSearchOneStringParamWithOr() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?param1=param1value,param1value2");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode());
Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
assertEquals(1, ourLastSearchParams.size());
StringAndListParam andList =(StringAndListParam) ourLastSearchParams.get("param1");
assertEquals(1,andList.getValuesAsQueryTokens().size());
StringOrListParam orList = andList.getValuesAsQueryTokens().get(0);
assertEquals(2,orList.getValuesAsQueryTokens().size());
StringParam param1 = orList.getValuesAsQueryTokens().get(0);
assertEquals("param1value", param1.getValue());
StringParam param1b = orList.getValuesAsQueryTokens().get(1);
assertEquals("param1value2", param1b.getValue());
}
@Test @Test
public void testSearchOneStringParamWithAnd() throws Exception { public void testSearchOneStringParamWithAnd() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?param1=param1value&param1=param1value2"); HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?param1=param1value&param1=param1value2");
@ -119,21 +111,31 @@ public class DynamicSearchTest {
} }
@Test @Test
public void testConformance() throws Exception { public void testSearchOneStringParamWithOr() throws Exception {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/metadata?_pretty=true"); HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?param1=param1value,param1value2");
HttpResponse status = ourClient.execute(httpGet); HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent()); String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent()); IOUtils.closeQuietly(status.getEntity().getContent());
assertEquals(200, status.getStatusLine().getStatusCode()); assertEquals(200, status.getStatusLine().getStatusCode());
Conformance conf = ourCtx.newXmlParser().parseResource(Conformance.class,responseContent); Bundle bundle = ourCtx.newXmlParser().parseBundle(responseContent);
assertEquals(1, bundle.getEntries().size());
ourLog.info(responseContent);
assertEquals(1, ourLastSearchParams.size());
StringAndListParam andList =(StringAndListParam) ourLastSearchParams.get("param1");
assertEquals(1,andList.getValuesAsQueryTokens().size());
StringOrListParam orList = andList.getValuesAsQueryTokens().get(0);
assertEquals(2,orList.getValuesAsQueryTokens().size());
StringParam param1 = orList.getValuesAsQueryTokens().get(0);
assertEquals("param1value", param1.getValue());
StringParam param1b = orList.getValuesAsQueryTokens().get(1);
assertEquals("param1value2", param1b.getValue());
} }
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClassClearContext() throws Exception {
ourServer.stop(); ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
} }
@BeforeClass @BeforeClass
@ -193,4 +195,5 @@ public class DynamicSearchTest {
} }
} }

View File

@ -44,6 +44,7 @@ import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor; import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
import ca.uhn.fhir.rest.server.interceptor.InterceptorAdapter; import ca.uhn.fhir.rest.server.interceptor.InterceptorAdapter;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
import junit.framework.AssertionFailedError; import junit.framework.AssertionFailedError;
/** /**
@ -53,13 +54,13 @@ public class ExceptionTest {
private static final String OPERATION_OUTCOME_DETAILS = "OperationOutcomeDetails"; private static final String OPERATION_OUTCOME_DETAILS = "OperationOutcomeDetails";
private static CloseableHttpClient ourClient; private static CloseableHttpClient ourClient;
private static final FhirContext ourCtx = FhirContext.forDstu1();
private static Class<? extends Exception> ourExceptionType; private static Class<? extends Exception> ourExceptionType;
private static boolean ourGenerateOperationOutcome; private static boolean ourGenerateOperationOutcome;
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ExceptionTest.class); private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ExceptionTest.class);
private static int ourPort; private static int ourPort;
private static Server ourServer; private static Server ourServer;
private static RestfulServer servlet; private static RestfulServer servlet;
private static final FhirContext ourCtx = FhirContext.forDstu1();
@Before @Before
public void before() { public void before() {
@ -67,21 +68,6 @@ public class ExceptionTest {
ourExceptionType = null; ourExceptionType = null;
} }
@Test
public void testInternalError() throws Exception {
{
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?throwInternalError=aaa");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(500, status.getStatusLine().getStatusCode());
OperationOutcome oo = (OperationOutcome) servlet.getFhirContext().newXmlParser().parseResource(responseContent);
assertThat(oo.getIssueFirstRep().getDetails().getValue(), StringContains.containsString("Exception Text"));
assertThat(oo.getIssueFirstRep().getDetails().getValue(), not(StringContains.containsString("InternalErrorException")));
}
}
@Test @Test
public void testAuthorizationFailureInPreProcessInterceptor() throws Exception { public void testAuthorizationFailureInPreProcessInterceptor() throws Exception {
IServerInterceptor interceptor = new InterceptorAdapter() { IServerInterceptor interceptor = new InterceptorAdapter() {
@ -106,18 +92,17 @@ public class ExceptionTest {
} }
@Test @Test
public void testResourceNotFound() throws Exception { public void testInternalError() throws Exception {
ourExceptionType = ResourceNotFoundException.class;
ourGenerateOperationOutcome = false;
{ {
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient/123"); HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?throwInternalError=aaa");
HttpResponse status = ourClient.execute(httpGet); HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent()); String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent()); IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent); ourLog.info(responseContent);
assertEquals(404, status.getStatusLine().getStatusCode()); assertEquals(500, status.getStatusLine().getStatusCode());
OperationOutcome oo = (OperationOutcome) servlet.getFhirContext().newXmlParser().parseResource(responseContent); OperationOutcome oo = (OperationOutcome) servlet.getFhirContext().newXmlParser().parseResource(responseContent);
assertThat(oo.getIssueFirstRep().getDetails().getValue(), StringContains.containsString("Resource Patient/123 is not known")); assertThat(oo.getIssueFirstRep().getDetails().getValue(), StringContains.containsString("Exception Text"));
assertThat(oo.getIssueFirstRep().getDetails().getValue(), not(StringContains.containsString("InternalErrorException")));
} }
} }
@ -149,6 +134,36 @@ public class ExceptionTest {
assertThat(oo.getIssueFirstRep().getDetails().getValue(), not(StringContains.containsString("InternalErrorException"))); assertThat(oo.getIssueFirstRep().getDetails().getValue(), not(StringContains.containsString("InternalErrorException")));
} }
@Test
public void testMethodNotAllowed() throws Exception {
{
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?throwMethodNotAllowed=aaa&_format=true");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
ourLog.info(status.toString());
assertEquals(MethodNotAllowedException.STATUS_CODE, status.getStatusLine().getStatusCode());
assertEquals("POST,PUT", status.getFirstHeader(Constants.HEADER_ALLOW).getValue());
}
}
@Test
public void testResourceNotFound() throws Exception {
ourExceptionType = ResourceNotFoundException.class;
ourGenerateOperationOutcome = false;
{
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient/123");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
assertEquals(404, status.getStatusLine().getStatusCode());
OperationOutcome oo = (OperationOutcome) servlet.getFhirContext().newXmlParser().parseResource(responseContent);
assertThat(oo.getIssueFirstRep().getDetails().getValue(), StringContains.containsString("Resource Patient/123 is not known"));
}
}
@Test @Test
public void testResourceReturning() throws Exception { public void testResourceReturning() throws Exception {
// No OO // No OO
@ -209,23 +224,11 @@ public class ExceptionTest {
} }
} }
@Test
public void testMethodNotAllowed() throws Exception {
{
HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient?throwMethodNotAllowed=aaa&_format=true");
HttpResponse status = ourClient.execute(httpGet);
String responseContent = IOUtils.toString(status.getEntity().getContent());
IOUtils.closeQuietly(status.getEntity().getContent());
ourLog.info(responseContent);
ourLog.info(status.toString());
assertEquals(MethodNotAllowedException.STATUS_CODE, status.getStatusLine().getStatusCode());
assertEquals("POST,PUT", status.getFirstHeader(Constants.HEADER_ALLOW).getValue());
}
}
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClassClearContext() throws Exception {
ourServer.stop(); ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
} }
@BeforeClass @BeforeClass
@ -250,6 +253,7 @@ public class ExceptionTest {
} }
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
*/ */
@ -282,13 +286,13 @@ public class ExceptionTest {
} }
@Search() @Search()
public List<Patient> throwUnprocessableEntity(@RequiredParam(name = "throwUnprocessableEntity") StringParam theParam) { public List<Patient> throwMethodNotAllowed(@RequiredParam(name = "throwMethodNotAllowed") StringParam theParam) {
throw new UnprocessableEntityException("Exception Text"); throw new MethodNotAllowedException("Exception Text", RequestTypeEnum.POST, RequestTypeEnum.PUT);
} }
@Search() @Search()
public List<Patient> throwMethodNotAllowed(@RequiredParam(name = "throwMethodNotAllowed") StringParam theParam) { public List<Patient> throwUnprocessableEntity(@RequiredParam(name = "throwUnprocessableEntity") StringParam theParam) {
throw new MethodNotAllowedException("Exception Text", RequestTypeEnum.POST, RequestTypeEnum.PUT); throw new UnprocessableEntityException("Exception Text");
} }
@Search @Search

View File

@ -30,6 +30,7 @@ import ca.uhn.fhir.rest.annotation.IdParam;
import ca.uhn.fhir.rest.annotation.Read; import ca.uhn.fhir.rest.annotation.Read;
import ca.uhn.fhir.rest.annotation.Since; import ca.uhn.fhir.rest.annotation.Since;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
@ -115,8 +116,9 @@ public class HistoryTest {
} }
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClassClearContext() throws Exception {
ourServer.stop(); ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
} }
@BeforeClass @BeforeClass
@ -142,7 +144,8 @@ public class HistoryTest {
ourClient = builder.build(); ourClient = builder.build();
} }
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
*/ */
@ -169,8 +172,7 @@ public class HistoryTest {
} }
public static class DummyResourceProvider implements IResourceProvider { public static class DummyResourceProvider implements IResourceProvider {
@Override @Override
@ -223,4 +225,5 @@ public class HistoryTest {
} }
} }

View File

@ -47,6 +47,7 @@ import ca.uhn.fhir.rest.annotation.RequiredParam;
import ca.uhn.fhir.rest.annotation.Search; import ca.uhn.fhir.rest.annotation.Search;
import ca.uhn.fhir.util.ElementUtil; import ca.uhn.fhir.util.ElementUtil;
import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.PortUtil;
import ca.uhn.fhir.util.TestUtil;
/** /**
* Created by dsotnikov on 2/25/2014. * Created by dsotnikov on 2/25/2014.
@ -272,9 +273,11 @@ public class IncludeTest {
} }
@AfterClass @AfterClass
public static void afterClass() throws Exception { public static void afterClassClearContext() throws Exception {
ourServer.stop(); ourServer.stop();
TestUtil.clearAllStaticFieldsForUnitTest();
} }
@BeforeClass @BeforeClass
@ -478,6 +481,7 @@ public class IncludeTest {
} }
@ResourceDef(name = "Patient") @ResourceDef(name = "Patient")
public static class ExtPatient extends Patient { public static class ExtPatient extends Patient {
@Child(name = "secondOrg") @Child(name = "secondOrg")

Some files were not shown because too many files have changed in this diff Show More