From abca3214f22b919033fe4c0bde3928796b50c123 Mon Sep 17 00:00:00 2001 From: Luke deGruchy Date: Mon, 20 Jan 2025 14:08:23 -0500 Subject: [PATCH] Fix bug with wrong boolean variable assignment. --- .../ResourceProviderDstu2ValueSetTest.java | 2 -- .../server/method/OperationMethodBinding.java | 2 +- .../server/method/InnerClassesAndMethods.java | 14 ++++++++ .../method/OperationMethodBindingTest.java | 32 +++++++++++++++---- 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/hapi-fhir-jpaserver-test-dstu2/src/test/java/ca/uhn/fhir/jpa/provider/ResourceProviderDstu2ValueSetTest.java b/hapi-fhir-jpaserver-test-dstu2/src/test/java/ca/uhn/fhir/jpa/provider/ResourceProviderDstu2ValueSetTest.java index 4b4971ba0773..72d1d6632e98 100644 --- a/hapi-fhir-jpaserver-test-dstu2/src/test/java/ca/uhn/fhir/jpa/provider/ResourceProviderDstu2ValueSetTest.java +++ b/hapi-fhir-jpaserver-test-dstu2/src/test/java/ca/uhn/fhir/jpa/provider/ResourceProviderDstu2ValueSetTest.java @@ -24,8 +24,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.fail; -import static org.junit.jupiter.api.Assertions.fail; - public class ResourceProviderDstu2ValueSetTest extends BaseResourceProviderDstu2Test { diff --git a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/method/OperationMethodBinding.java b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/method/OperationMethodBinding.java index 64362ff1ec08..2341d8724c05 100644 --- a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/method/OperationMethodBinding.java +++ b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/method/OperationMethodBinding.java @@ -192,7 +192,7 @@ protected OperationMethodBinding( } else { myOtherOperationType = RestOperationTypeEnum.EXTENDED_OPERATION_INSTANCE; myCanOperateAtInstanceLevel = true; - myCanOperateAtServerLevel = myOperationIdParamDetails.setOrReturnPreviousValue(myCanOperateAtServerLevel); + myCanOperateAtTypeLevel = myOperationIdParamDetails.setOrReturnPreviousValue(myCanOperateAtTypeLevel); } myReturnParams = new ArrayList<>(); diff --git a/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/method/InnerClassesAndMethods.java b/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/method/InnerClassesAndMethods.java index 7cfe9ddbbe70..94eb1bd21d1c 100644 --- a/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/method/InnerClassesAndMethods.java +++ b/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/method/InnerClassesAndMethods.java @@ -5,11 +5,14 @@ import ca.uhn.fhir.rest.annotation.OperationEmbeddedParam; import ca.uhn.fhir.rest.annotation.OperationParam; import ca.uhn.fhir.rest.api.server.RequestDetails; +import jakarta.servlet.http.HttpServletRequest; +import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.r4.model.BooleanType; import org.hl7.fhir.r4.model.IdType; import org.hl7.fhir.r4.model.Measure; import org.hl7.fhir.r4.model.MeasureReport; +import org.hl7.fhir.r4.model.Patient; import java.lang.reflect.Method; import java.util.Arrays; @@ -27,6 +30,7 @@ class InnerClassesAndMethods { static final String SAMPLE_METHOD_EMBEDDED_TYPE_MULTIPLE_REQUEST_DETAILS = "sampleMethodEmbeddedTypeMultipleRequestDetails"; static final String SUPER_SIMPLE = "superSimple"; + static final String SIMPLE_OPERATION = "simpleOperation"; static final String INVALID_METHOD_OPERATION_PARAMS_NO_OPERATION = "invalidMethodOperationParamsNoOperationInvalid"; static final String SAMPLE_METHOD_EMBEDDED_TYPE_REQUEST_DETAILS_FIRST_WITH_ID_TYPE = "sampleMethodEmbeddedTypeRequestDetailsFirstWithIdType"; static final String SAMPLE_METHOD_EMBEDDED_TYPE_REQUEST_DETAILS_LAST = "sampleMethodEmbeddedTypeRequestDetailsLast"; @@ -35,6 +39,7 @@ class InnerClassesAndMethods { static final String SAMPLE_METHOD_EMBEDDED_TYPE_NO_REQUEST_DETAILS_WITH_ID_TYPE = "sampleMethodEmbeddedTypeNoRequestDetailsWithIdType"; static final String SAMPLE_METHOD_OPERATION_PARAMS = "sampleMethodOperationParams"; static final String SAMPLE_METHOD_PARAM_NO_EMBEDDED_TYPE = "sampleMethodParamNoEmbeddedType"; + static final String EXPAND = "expand"; Method getDeclaredMethod(String theMethodName, Class... theParamClasses) { try { @@ -272,4 +277,13 @@ MeasureReport sampleMethodEmbeddedTypeNoRequestDetailsWithIdType(SampleParamsWit // return something arbitrary return new MeasureReport(null, null, null, null); } + + @Operation(name = "$expand", idempotent = true, typeName = "ValueSet") + public IBaseResource expand( + HttpServletRequest theServletRequest, + @IdParam(optional = true) IIdType theId, + @OperationParam(name = "valueSet", min = 0, max = 1) IBaseResource theValueSet, + RequestDetails theRequestDetails) { + return new Patient(); + } } diff --git a/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/method/OperationMethodBindingTest.java b/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/method/OperationMethodBindingTest.java index 9c2a0f34f6c0..d1508df1b636 100644 --- a/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/method/OperationMethodBindingTest.java +++ b/hapi-fhir-structures-r4/src/test/java/ca/uhn/fhir/rest/server/method/OperationMethodBindingTest.java @@ -1,14 +1,19 @@ package ca.uhn.fhir.rest.server.method; +import static ca.uhn.fhir.rest.server.method.InnerClassesAndMethods.EXPAND; +import static ca.uhn.fhir.rest.server.method.InnerClassesAndMethods.SAMPLE_METHOD_EMBEDDED_TYPE_NO_REQUEST_DETAILS_WITH_ID_TYPE; +import static ca.uhn.fhir.rest.server.method.InnerClassesAndMethods.SAMPLE_METHOD_OPERATION_PARAMS; import static org.junit.jupiter.api.Assertions.*; import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.rest.annotation.Operation; import ca.uhn.fhir.rest.api.RequestTypeEnum; +import ca.uhn.fhir.rest.api.server.RequestDetails; import ca.uhn.fhir.rest.api.server.SystemRequestDetails; import ca.uhn.fhir.rest.server.exceptions.MethodNotAllowedException; import ca.uhn.fhir.rest.server.method.InnerClassesAndMethods.SampleParamsWithIdParam; +import jakarta.servlet.http.HttpServletRequest; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; import org.hl7.fhir.r4.model.BooleanType; @@ -49,7 +54,7 @@ void constructor_withInvalidOperationName_shouldThrowConfigurationException() { } @Test - void incomingServerRequestMatchesMethod_withMismatchedOperation_shouldReturnNone() throws NoSuchMethodException { + void incomingServerRequestMatchesMethod_withMismatchedOperation_shouldReturnNone() { init("simpleOperation"); final SystemRequestDetails requestDetails = new SystemRequestDetails(); @@ -63,7 +68,7 @@ void incomingServerRequestMatchesMethod_withMismatchedOperation_shouldReturnNone } @Test - void incomingServerRequestMatchesMethod_withMatchingOperation_shouldReturnExact() throws NoSuchMethodException { + void incomingServerRequestMatchesMethod_withMatchingOperation_shouldReturnExact() { init("simpleOperation"); final SystemRequestDetails requestDetails = new SystemRequestDetails(); @@ -77,8 +82,8 @@ void incomingServerRequestMatchesMethod_withMatchingOperation_shouldReturnExact( } @Test - void invokeServer_withUnsupportedRequestType_shouldThrowMethodNotAllowedException() throws NoSuchMethodException { - init("simpleOperation"); + void invokeServer_withUnsupportedRequestType_shouldThrowMethodNotAllowedException() { + init(InnerClassesAndMethods.SIMPLE_OPERATION); final SystemRequestDetails requestDetails = new SystemRequestDetails(); requestDetails.setRequestType(RequestTypeEnum.PUT); @@ -95,7 +100,7 @@ void invokeServer_withUnsupportedRequestType_shouldThrowMethodNotAllowedExceptio @Test void simpleMethodOperationParams() { - init(InnerClassesAndMethods.SAMPLE_METHOD_OPERATION_PARAMS, IIdType.class, String.class, List.class, BooleanType.class); + init(SAMPLE_METHOD_OPERATION_PARAMS, IIdType.class, String.class, List.class, BooleanType.class); final SystemRequestDetails requestDetails = new SystemRequestDetails(); requestDetails.setRequestType(RequestTypeEnum.GET); @@ -111,7 +116,7 @@ void simpleMethodOperationParams() { @Test void simpleMethodEmbeddedParams() { - init(InnerClassesAndMethods.SAMPLE_METHOD_EMBEDDED_TYPE_NO_REQUEST_DETAILS_WITH_ID_TYPE, SampleParamsWithIdParam.class); + init(SAMPLE_METHOD_EMBEDDED_TYPE_NO_REQUEST_DETAILS_WITH_ID_TYPE, SampleParamsWithIdParam.class); final SystemRequestDetails requestDetails = new SystemRequestDetails(); requestDetails.setRequestType(RequestTypeEnum.GET); @@ -125,6 +130,21 @@ void simpleMethodEmbeddedParams() { assertEquals(MethodMatchEnum.EXACT, binding.incomingServerRequestMatchesMethod(requestDetails)); } + @Test + void expandEnsureMethodEnsureCanOperateAtTypeLevel() { + init(EXPAND, HttpServletRequest.class, IIdType.class, IBaseResource.class, RequestDetails.class); + + final SystemRequestDetails requestDetails = new SystemRequestDetails(); + requestDetails.setRequestType(RequestTypeEnum.POST); + requestDetails.setOperation("$expand"); + requestDetails.setResourceName(ResourceType.ValueSet.name()); + + final OperationMethodBinding binding = new OperationMethodBinding( + IBaseResource.class, null, myMethod, ourFhirContext, provider, myOperation); + + assertEquals(MethodMatchEnum.EXACT, binding.incomingServerRequestMatchesMethod(requestDetails)); + } + private void init(String theMethodName, Class... theParamClasses) { myMethod = myInnerClassesAndMethods.getDeclaredMethod(theMethodName, theParamClasses); myOperation = myMethod.getAnnotation(Operation.class);