From 6ebef5790ee194e3d745045315aab5abfd670be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20Kn=C3=BCppel?= Date: Wed, 2 Nov 2022 15:36:47 +0100 Subject: [PATCH] Add config-value to set comparators to lower case in client fixes #355 --- .../scim/sdk/client/ScimClientConfig.java | 10 +++- .../scim/sdk/client/builder/ListBuilder.java | 8 ++- .../sdk/client/builder/ListBuilderTest.java | 51 +++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/scim-sdk-client/src/main/java/de/captaingoldfish/scim/sdk/client/ScimClientConfig.java b/scim-sdk-client/src/main/java/de/captaingoldfish/scim/sdk/client/ScimClientConfig.java index 08d54455..d9c420a9 100644 --- a/scim-sdk-client/src/main/java/de/captaingoldfish/scim/sdk/client/ScimClientConfig.java +++ b/scim-sdk-client/src/main/java/de/captaingoldfish/scim/sdk/client/ScimClientConfig.java @@ -96,6 +96,12 @@ public class ScimClientConfig */ private ConfigManipulator configManipulator; + /** + * if the filter-expression-comparators should be sent in lowercase instead of uppercase e.g.: eq instead of + * EQ. + */ + private boolean useLowerCaseInFilterComparators; + @Builder public ScimClientConfig(Integer requestTimeout, Integer socketTimeout, @@ -109,7 +115,8 @@ public ScimClientConfig(Integer requestTimeout, Map httpHeaders, Map httpMultiHeaders, BasicAuth basicAuth, - ConfigManipulator configManipulator) + ConfigManipulator configManipulator, + boolean useLowerCaseInFilterComparators) { this.requestTimeout = requestTimeout == null ? DEFAULT_TIMEOUT : requestTimeout; this.socketTimeout = socketTimeout == null ? DEFAULT_TIMEOUT : socketTimeout; @@ -123,6 +130,7 @@ public ScimClientConfig(Integer requestTimeout, setHeaders(httpHeaders, httpMultiHeaders); this.basicAuth = basicAuth; this.configManipulator = configManipulator; + this.useLowerCaseInFilterComparators = useLowerCaseInFilterComparators; } /** diff --git a/scim-sdk-client/src/main/java/de/captaingoldfish/scim/sdk/client/builder/ListBuilder.java b/scim-sdk-client/src/main/java/de/captaingoldfish/scim/sdk/client/builder/ListBuilder.java index 4e0f7e0f..81239e73 100644 --- a/scim-sdk-client/src/main/java/de/captaingoldfish/scim/sdk/client/builder/ListBuilder.java +++ b/scim-sdk-client/src/main/java/de/captaingoldfish/scim/sdk/client/builder/ListBuilder.java @@ -17,6 +17,7 @@ import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.StringEntity; +import de.captaingoldfish.scim.sdk.client.ScimClientConfig; import de.captaingoldfish.scim.sdk.client.http.HttpResponse; import de.captaingoldfish.scim.sdk.client.http.ScimHttpClient; import de.captaingoldfish.scim.sdk.client.response.ServerResponse; @@ -891,7 +892,10 @@ public FilterBuilder or(boolean openParenthesis, */ private void setExpression(String attributeName, Comparator comparator, Object value) { - filterString.append(attributeName).append(" ").append(comparator.name()); + ScimClientConfig scimClientConfig = scimHttpClient.getScimClientConfig(); + String comparatorString = scimClientConfig.isUseLowerCaseInFilterComparators() ? comparator.name().toLowerCase() + : comparator.name(); + filterString.append(attributeName).append(" ").append(comparatorString); if (value instanceof String) { filterString.append(value == null ? "" : " ").append("\"").append(value == null ? "" : value).append("\""); @@ -911,7 +915,7 @@ public ListBuilder build() { throw new IllegalStateException("error within filter expression\n\topened parentheses: " + openedParenthesis + "\n\tclosed parentheses: " + closedParenthesis + "\n\tfilter: " - + filterString.toString()); + + filterString); } listBuilder.requestParameters.put(AttributeNames.RFC7643.FILTER, filterString.toString()); return listBuilder; diff --git a/scim-sdk-client/src/test/java/de/captaingoldfish/scim/sdk/client/builder/ListBuilderTest.java b/scim-sdk-client/src/test/java/de/captaingoldfish/scim/sdk/client/builder/ListBuilderTest.java index ee17d0c3..1a397805 100644 --- a/scim-sdk-client/src/test/java/de/captaingoldfish/scim/sdk/client/builder/ListBuilderTest.java +++ b/scim-sdk-client/src/test/java/de/captaingoldfish/scim/sdk/client/builder/ListBuilderTest.java @@ -554,6 +554,57 @@ public void testBuildFilterWithErroneousOpenedParenthesis() } } + /** + * verifies that filter comparators are written in lower case if the {@link ScimClientConfig} has the property + * {@link ScimClientConfig#useLowerCaseInFilterComparators} set to true + */ + @Test + public void testFilterComparatorsAreWrittenInLowerCase() + { + ScimClientConfig scimClientConfig = ScimClientConfig.builder().useLowerCaseInFilterComparators(true).build(); + ScimHttpClient scimHttpClient = new ScimHttpClient(scimClientConfig); + ListBuilder listBuilder = new ListBuilder<>(getServerUrl(), EndpointPaths.USERS, User.class, scimHttpClient); + listBuilder.filter("username", Comparator.SW, "hello").and("displayName", Comparator.EW, "world").build(); + + AtomicBoolean wasCalled = new AtomicBoolean(); + setVerifyRequestAttributes((httpExchange, requestBody) -> { + Map requestParams = RequestUtils.getQueryParameters(httpExchange.getRequestURI().getQuery()); + + String filterExpression = requestParams.get(AttributeNames.RFC7643.FILTER); + Assertions.assertEquals("username sw \"hello\" and displayName ew \"world\"", filterExpression); + wasCalled.set(true); + }); + + ServerResponse> response = listBuilder.get().sendRequest(); + Assertions.assertEquals(HttpStatus.OK, response.getHttpStatus()); + Assertions.assertTrue(wasCalled.get()); + } + + /** + * verifies that filter comparators are written in upper case if no configurations are adjusted. + */ + @Test + public void testFilterComparatorsAreWrittenInUpperCase() + { + ScimClientConfig scimClientConfig = new ScimClientConfig(); + ScimHttpClient scimHttpClient = new ScimHttpClient(scimClientConfig); + ListBuilder listBuilder = new ListBuilder<>(getServerUrl(), EndpointPaths.USERS, User.class, scimHttpClient); + listBuilder.filter("username", Comparator.SW, "hello").and("displayName", Comparator.EW, "world").build(); + + AtomicBoolean wasCalled = new AtomicBoolean(); + setVerifyRequestAttributes((httpExchange, requestBody) -> { + Map requestParams = RequestUtils.getQueryParameters(httpExchange.getRequestURI().getQuery()); + + String filterExpression = requestParams.get(AttributeNames.RFC7643.FILTER); + Assertions.assertEquals("username SW \"hello\" and displayName EW \"world\"", filterExpression); + wasCalled.set(true); + }); + + ServerResponse> response = listBuilder.get().sendRequest(); + Assertions.assertEquals(HttpStatus.OK, response.getHttpStatus()); + Assertions.assertTrue(wasCalled.get()); + } + private void parseFilterWithAntlr(String filter) { FilterRuleErrorListener filterRuleErrorListener = new FilterRuleErrorListener();