diff --git a/hapi-fhir-structures-dstu2/src/main/java/ca/uhn/fhir/rest/server/provider/dstu2/ServerConformanceProvider.java b/hapi-fhir-structures-dstu2/src/main/java/ca/uhn/fhir/rest/server/provider/dstu2/ServerConformanceProvider.java index 9b30bca90f9..5fdbd3f6aab 100644 --- a/hapi-fhir-structures-dstu2/src/main/java/ca/uhn/fhir/rest/server/provider/dstu2/ServerConformanceProvider.java +++ b/hapi-fhir-structures-dstu2/src/main/java/ca/uhn/fhir/rest/server/provider/dstu2/ServerConformanceProvider.java @@ -1,5 +1,6 @@ package ca.uhn.fhir.rest.server.provider.dstu2; +import static org.apache.commons.lang3.StringUtils.isBlank; /* * #%L * HAPI FHIR Structures - DSTU2 (FHIR v1.0.0) @@ -53,6 +54,7 @@ import ca.uhn.fhir.model.dstu2.resource.OperationDefinition.Parameter; import ca.uhn.fhir.model.dstu2.valueset.ConditionalDeleteStatusEnum; import ca.uhn.fhir.model.dstu2.valueset.ConformanceResourceStatusEnum; import ca.uhn.fhir.model.dstu2.valueset.ConformanceStatementKindEnum; +import ca.uhn.fhir.model.dstu2.valueset.OperationKindEnum; import ca.uhn.fhir.model.dstu2.valueset.OperationParameterUseEnum; import ca.uhn.fhir.model.dstu2.valueset.ResourceTypeEnum; import ca.uhn.fhir.model.dstu2.valueset.RestfulConformanceModeEnum; @@ -502,6 +504,7 @@ public class ServerConformanceProvider implements IServerConformanceProvider inParams = new HashSet(); @@ -557,6 +560,21 @@ public class ServerConformanceProvider implements IServerConformanceProvider types = toStrings(opDef.getType()); assertEquals("someOp", opDef.getCode()); assertEquals(true, opDef.getInstance()); - assertEquals(null, opDef.getSystem()); + assertEquals(false, opDef.getSystem()); assertThat(types, containsInAnyOrder("Patient")); assertEquals(2, opDef.getParameter().size()); assertEquals("someOpParam1", opDef.getParameter().get(0).getName()); @@ -291,11 +309,12 @@ public class ServerConformanceProviderDstu2Test { } { OperationDefinition opDef = sc.readOperationDefinition(new IdDt("OperationDefinition/Encounter_i_someOp")); - ourLog.info(ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(opDef)); + validate(opDef); + Set types = toStrings(opDef.getType()); assertEquals("someOp", opDef.getCode()); assertEquals(true, opDef.getInstance()); - assertEquals(null, opDef.getSystem()); + assertEquals(false, opDef.getSystem()); assertThat(types, containsInAnyOrder("Encounter")); assertEquals(2, opDef.getParameter().size()); assertEquals("someOpParam1", opDef.getParameter().get(0).getName()); @@ -305,11 +324,12 @@ public class ServerConformanceProviderDstu2Test { } { OperationDefinition opDef = sc.readOperationDefinition(new IdDt("OperationDefinition/Patient_i_validate")); - ourLog.info(ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(opDef)); + validate(opDef); + Set types = toStrings(opDef.getType()); assertEquals("validate", opDef.getCode()); assertEquals(true, opDef.getInstance()); - assertEquals(null, opDef.getSystem()); + assertEquals(false, opDef.getSystem()); assertThat(types, containsInAnyOrder("Patient")); assertEquals(1, opDef.getParameter().size()); assertEquals("resource", opDef.getParameter().get(0).getName()); @@ -357,9 +377,7 @@ public class ServerConformanceProviderDstu2Test { assertEquals("OperationDefinition/_is_plain", sconf.getRest().get(0).getOperation().get(0).getDefinition().getReference().getValue()); OperationDefinition opDef = sc.readOperationDefinition(new IdDt("OperationDefinition/_is_plain")); - - String conf = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(opDef); - ourLog.info(conf); + validate(opDef); assertEquals("plain", opDef.getCode()); assertEquals(true, opDef.getIdempotent().booleanValue()); diff --git a/hapi-fhir-structures-dstu3/src/main/java/org/hl7/fhir/dstu3/hapi/rest/server/ServerConformanceProvider.java b/hapi-fhir-structures-dstu3/src/main/java/org/hl7/fhir/dstu3/hapi/rest/server/ServerConformanceProvider.java index 4dffdb28946..341df4563d0 100644 --- a/hapi-fhir-structures-dstu3/src/main/java/org/hl7/fhir/dstu3/hapi/rest/server/ServerConformanceProvider.java +++ b/hapi-fhir-structures-dstu3/src/main/java/org/hl7/fhir/dstu3/hapi/rest/server/ServerConformanceProvider.java @@ -1,5 +1,6 @@ package org.hl7.fhir.dstu3.hapi.rest.server; +import static org.apache.commons.lang3.StringUtils.isBlank; /* * #%L * HAPI FHIR Structures - DSTU2 (FHIR v1.0.0) @@ -56,6 +57,7 @@ import org.hl7.fhir.dstu3.model.Conformance.TypeRestfulInteraction; import org.hl7.fhir.dstu3.model.Conformance.UnknownContentCode; import org.hl7.fhir.dstu3.model.Enumerations.ConformanceResourceStatus; import org.hl7.fhir.dstu3.model.OperationDefinition.OperationDefinitionParameterComponent; +import org.hl7.fhir.dstu3.model.OperationDefinition.OperationKind; import org.hl7.fhir.dstu3.model.OperationDefinition.OperationParameterUse; import org.hl7.fhir.dstu3.model.Reference; import org.hl7.fhir.instance.model.api.IBaseResource; @@ -523,6 +525,7 @@ public class ServerConformanceProvider implements IServerConformanceProvider inParams = new HashSet(); @@ -532,6 +535,12 @@ public class ServerConformanceProvider implements IServerConformanceProvider toOperationIdParts(List theOperation) { - ArrayList retVal = Lists.newArrayList(); - for (ConformanceRestOperationComponent next : theOperation) { - retVal.add(next.getDefinition().getReferenceElement().getIdPart()); - } - return retVal; - } - /** See #379 */ @Test public void testOperationAcrossMultipleTypes() throws Exception { @@ -277,12 +280,13 @@ public class ServerConformanceProviderDstu3Test { assertEquals(4, conformance.getRest().get(0).getOperation().size()); List operationNames = toOperationNames(conformance.getRest().get(0).getOperation()); assertThat(operationNames, containsInAnyOrder("someOp", "validate", "someOp", "validate")); - + List operationIdParts = toOperationIdParts(conformance.getRest().get(0).getOperation()); - assertThat(operationIdParts, containsInAnyOrder("Patient_i_someOp","Encounter_i_someOp","Patient_i_validate","Encounter_i_validate")); - + assertThat(operationIdParts, containsInAnyOrder("Patient_i_someOp", "Encounter_i_someOp", "Patient_i_validate", "Encounter_i_validate")); + { OperationDefinition opDef = sc.readOperationDefinition(new IdType("OperationDefinition/Patient_i_someOp")); + validate(opDef); ourLog.info(ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(opDef)); Set types = toStrings(opDef.getType()); assertEquals("someOp", opDef.getCode()); @@ -297,6 +301,7 @@ public class ServerConformanceProviderDstu3Test { } { OperationDefinition opDef = sc.readOperationDefinition(new IdType("OperationDefinition/Encounter_i_someOp")); + validate(opDef); ourLog.info(ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(opDef)); Set types = toStrings(opDef.getType()); assertEquals("someOp", opDef.getCode()); @@ -311,6 +316,7 @@ public class ServerConformanceProviderDstu3Test { } { OperationDefinition opDef = sc.readOperationDefinition(new IdType("OperationDefinition/Patient_i_validate")); + validate(opDef); ourLog.info(ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(opDef)); Set types = toStrings(opDef.getType()); assertEquals("validate", opDef.getCode()); @@ -322,7 +328,7 @@ public class ServerConformanceProviderDstu3Test { assertEquals("Patient", opDef.getParameter().get(0).getType()); } } - + @Test public void testOperationDocumentation() throws Exception { @@ -359,13 +365,13 @@ public class ServerConformanceProviderDstu3Test { rs.init(createServletConfig()); OperationDefinition opDef = sc.readOperationDefinition(new IdType("OperationDefinition/_is_plain")); - - String conf = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(opDef); - ourLog.info(conf); + validate(opDef); assertEquals("plain", opDef.getCode()); assertEquals(true, opDef.getIdempotent()); assertEquals(3, opDef.getParameter().size()); + + assertTrue(opDef.getParameter().get(0).hasName()); assertEquals("start", opDef.getParameter().get(0).getName()); assertEquals("in", opDef.getParameter().get(0).getUse().toCode()); assertEquals("0", opDef.getParameter().get(0).getMinElement().getValueAsString()); @@ -613,6 +619,14 @@ public class ServerConformanceProviderDstu3Test { assertTrue(result.getMessages().toString(), result.isSuccessful()); } + private List toOperationIdParts(List theOperation) { + ArrayList retVal = Lists.newArrayList(); + for (ConformanceRestOperationComponent next : theOperation) { + retVal.add(next.getDefinition().getReferenceElement().getIdPart()); + } + return retVal; + } + private List toOperationNames(List theOperation) { ArrayList retVal = Lists.newArrayList(); for (ConformanceRestOperationComponent next : theOperation) { @@ -629,6 +643,17 @@ public class ServerConformanceProviderDstu3Test { return retVal; } + private void validate(OperationDefinition theOpDef) { + String conf = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(theOpDef); + ourLog.info("Def: {}", conf); + + ValidationResult result = ourValidator.validateWithResult(theOpDef); + String outcome = ourCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(result.toOperationOutcome()); + ourLog.info("Outcome: {}", outcome); + + assertTrue(outcome, result.isSuccessful()); + } + @AfterClass public static void afterClassClearContext() { TestUtil.clearAllStaticFieldsForUnitTest(); diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 8dee2608062..97e6d262627 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -324,6 +324,18 @@ server conformance statement should not include the $ prefix in the operation name or code. Thanks to Dion McMurtrie for reporting! + + Server generated OperationDefinition resources did not validate + due to some missing elements (kind, status, etc.). + Thanks to + Michael Lawley for reporting! + + + Operations that are defined on multiple resource provider types with + the same name (e.g. "$everything") are now automatically exposed by the server + as separate OperationDefinition resources per resource type. Thanks to + Michael Lawley for reporting! + OperationDefinition resources generated automatically by the server for operations that are defined within resource/plain providers incorrectly stated that @@ -332,12 +344,6 @@ annotation describes. Thanks to Michael Lawley for reporting! - - Operations that are defined on multiple resource provider types with - the same name (e.g. "$everything") are now automatically exposed by the server - as separate OperationDefinition resources per resource type. Thanks to - Michael Lawley for reporting! -