diff --git a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogController.java b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogController.java index 5a99551b1a..0779c3ea60 100644 --- a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogController.java +++ b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/controllers/api/ApiCatalogController.java @@ -34,7 +34,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import java.util.stream.StreamSupport; /** @@ -179,6 +178,6 @@ private List toList(final Iterable iterable) { return Collections.emptyList(); } return StreamSupport.stream(iterable.spliterator(), false) - .collect(Collectors.toList()); + .toList(); } } diff --git a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/instance/InstanceInitializeService.java b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/instance/InstanceInitializeService.java index 8e3786c9e6..59b0d994cf 100644 --- a/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/instance/InstanceInitializeService.java +++ b/api-catalog-services/src/main/java/org/zowe/apiml/apicatalog/instance/InstanceInitializeService.java @@ -10,15 +10,6 @@ package org.zowe.apiml.apicatalog.instance; -import org.zowe.apiml.apicatalog.model.APIContainer; -import org.zowe.apiml.apicatalog.services.cached.CachedProductFamilyService; -import org.zowe.apiml.apicatalog.services.cached.CachedServicesService; -import org.zowe.apiml.message.log.ApimlLogger; -import org.zowe.apiml.product.constants.CoreService; -import org.zowe.apiml.product.gateway.GatewayNotAvailableException; -import org.zowe.apiml.product.instance.InstanceInitializationException; -import org.zowe.apiml.product.logging.annotations.InjectApimlLogger; -import org.zowe.apiml.product.registry.CannotRegisterServiceException; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.shared.Application; import com.netflix.discovery.shared.Applications; @@ -29,6 +20,15 @@ import org.springframework.retry.annotation.Recover; import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; +import org.zowe.apiml.apicatalog.model.APIContainer; +import org.zowe.apiml.apicatalog.services.cached.CachedProductFamilyService; +import org.zowe.apiml.apicatalog.services.cached.CachedServicesService; +import org.zowe.apiml.message.log.ApimlLogger; +import org.zowe.apiml.product.constants.CoreService; +import org.zowe.apiml.product.gateway.GatewayNotAvailableException; +import org.zowe.apiml.product.instance.InstanceInitializationException; +import org.zowe.apiml.product.logging.annotations.InjectApimlLogger; +import org.zowe.apiml.product.registry.CannotRegisterServiceException; import java.util.Collection; import java.util.List; @@ -60,8 +60,8 @@ public class InstanceInitializeService { * @throws CannotRegisterServiceException if the fetch fails or the catalog is not registered with the discovery */ @Retryable( - value = {RetryException.class}, - exclude = CannotRegisterServiceException.class, + retryFor = {RetryException.class}, + noRetryFor = CannotRegisterServiceException.class, maxAttempts = 5, backoff = @Backoff(delayExpression = "#{${apiml.service-registry.serviceFetchDelayInMillis}}")) public void retrieveAndRegisterAllInstancesWithCatalog() throws CannotRegisterServiceException { @@ -102,7 +102,7 @@ private void updateCacheWithAllInstances() { List listApplication = discoveryApplications.getRegisteredApplications() .stream() .filter(application -> !application.getInstances().isEmpty()) - .collect(Collectors.toList()); + .toList(); // Return an empty string if no services are found after filtering if (listApplication.isEmpty()) { diff --git a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/instance/InstanceRefreshServiceTest.java b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/instance/InstanceRefreshServiceTest.java index ba07e4f216..10b8cbc25d 100644 --- a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/instance/InstanceRefreshServiceTest.java +++ b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/instance/InstanceRefreshServiceTest.java @@ -11,6 +11,12 @@ package org.zowe.apiml.apicatalog.instance; +import com.netflix.appinfo.InstanceInfo; +import com.netflix.discovery.shared.Application; +import com.netflix.discovery.shared.Applications; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; import org.zowe.apiml.apicatalog.model.APIContainer; import org.zowe.apiml.apicatalog.services.cached.CachedProductFamilyService; import org.zowe.apiml.apicatalog.services.cached.CachedServicesService; @@ -18,26 +24,13 @@ import org.zowe.apiml.apicatalog.util.ContainerServiceState; import org.zowe.apiml.product.constants.CoreService; import org.zowe.apiml.product.gateway.GatewayClient; -import com.netflix.appinfo.InstanceInfo; -import com.netflix.discovery.shared.Application; -import com.netflix.discovery.shared.Applications; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.stream.Collectors; +import static org.mockito.Mockito.*; import static org.zowe.apiml.constants.EurekaMetadataDefinition.CATALOG_ID; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; class InstanceRefreshServiceTest { @@ -79,7 +72,7 @@ void prepareState() { discoveredState.setServices(new ArrayList<>()); discoveredState.setContainers(new ArrayList<>()); discoveredState.setInstances(new ArrayList<>()); - discoveredState.setApplications(new ArrayList<>()); + discoveredState.setApplications(new ArrayList<>()); } @Nested @@ -97,7 +90,7 @@ void prepareApplication() { discoveredState.getInstances().add(newInstanceOfService); Application service5 = new Application("service5", Collections.singletonList(newInstanceOfService)); discoveredState.getApplications().add(service5); - + teachMocks(); } @@ -110,7 +103,7 @@ void addServiceToCache() { verify(cachedProductFamilyService, times(1)) .saveContainerFromInstance("api-five", newInstanceOfService); - } + } } @Nested @@ -123,21 +116,21 @@ void prepareService() { service3 = cachedState.getApplications() .stream() .filter(application -> application.getName().equalsIgnoreCase("service3")) - .collect(Collectors.toList()).get(0); - + .toList().get(0); + changedInstanceOfService = service3.getInstances().get(0); changedInstanceOfService.getMetadata().put(CATALOG_ID, "api-three"); service3.getInstances().add(0, changedInstanceOfService); - discoveredState.getApplications().add(service3); - + discoveredState.getApplications().add(service3); + teachMocks(); - + } @Test void serviceIsRemovedFromCache() { changedInstanceOfService.setActionType(InstanceInfo.ActionType.DELETED); - + underTest.refreshCacheFromDiscovery(); verify(cachedProductFamilyService, times(1)) @@ -149,7 +142,7 @@ void serviceIsRemovedFromCache() { @Test void serviceIsModifiedInCache() { changedInstanceOfService.setActionType(InstanceInfo.ActionType.MODIFIED); - + APIContainer apiContainer3 = cachedState.getContainers() .stream() .filter(apiContainer -> apiContainer.getId().equals("api-three")) diff --git a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/instance/InstanceRetrievalServiceTest.java b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/instance/InstanceRetrievalServiceTest.java index c7e185b15f..fc70b48ade 100644 --- a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/instance/InstanceRetrievalServiceTest.java +++ b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/instance/InstanceRetrievalServiceTest.java @@ -98,12 +98,14 @@ void providedNoInstanceInfoIsReturned_thenInstanceInitializationExceptionIsThrow @Test void testGetInstanceInfo_whenResponseHasEmptyBody() { + HttpClientMockHelper.mockResponse(response, ""); InstanceInfo instanceInfo = instanceRetrievalService.getInstanceInfo(CoreService.API_CATALOG.getServiceId()); assertNull(instanceInfo); } @Test void testGetInstanceInfo_whenResponseCodeIsSuccessWithUnParsedJsonText() { + HttpClientMockHelper.mockResponse(response, "UNPARSABLE_JSON"); InstanceInfo instanceInfo = instanceRetrievalService.getInstanceInfo(CoreService.API_CATALOG.getServiceId()); assertNull(instanceInfo); } diff --git a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/util/ContainerServiceMockUtil.java b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/util/ContainerServiceMockUtil.java index 9fbf6ed628..7757c67dcf 100644 --- a/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/util/ContainerServiceMockUtil.java +++ b/api-catalog-services/src/test/java/org/zowe/apiml/apicatalog/util/ContainerServiceMockUtil.java @@ -10,14 +10,13 @@ package org.zowe.apiml.apicatalog.util; +import com.netflix.appinfo.InstanceInfo; +import com.netflix.discovery.shared.Application; import org.zowe.apiml.apicatalog.model.APIContainer; import org.zowe.apiml.apicatalog.model.APIService; import org.zowe.apiml.apicatalog.services.cached.CachedServicesService; -import com.netflix.appinfo.InstanceInfo; -import com.netflix.discovery.shared.Application; import java.util.*; -import java.util.stream.Collectors; import java.util.stream.Stream; import static org.mockito.Mockito.when; @@ -81,10 +80,8 @@ private int generateInstancesAndServices(ContainerServiceState containerServiceS int limit) { List generatedInstances = Stream.iterate(index, i -> i + 1) .limit(limit) - .map(mIndex -> { - return getInstance(mIndex, serviceId); - }).collect(Collectors.toList()); - + .map(mIndex -> getInstance(mIndex, serviceId)) + .toList(); addApiService(serviceId, containerServiceState.getServices(), services); addInstancesToApplications( diff --git a/api-catalog-ui/frontend/src/components/Error/ErrorFormatter.jsx b/api-catalog-ui/frontend/src/components/Error/ErrorFormatter.jsx index 5ed52de6bc..00c765eb0e 100644 --- a/api-catalog-ui/frontend/src/components/Error/ErrorFormatter.jsx +++ b/api-catalog-ui/frontend/src/components/Error/ErrorFormatter.jsx @@ -31,7 +31,7 @@ function extractAjaxError(error) { return null; } -function formaHtmlError(message, color) { +function formatHtmlError(message, color) { return ( {htmr(message)} @@ -39,51 +39,54 @@ function formaHtmlError(message, color) { ); } -const formatError = (error) => { - let message = 'Could not determine error'; +function handleValidError(error) { + let message = error.error; let color = colorDanger; + const extractedAjaxError = extractAjaxError(error.error); + if (extractedAjaxError) { + const { msg, clr } = extractedAjaxError; + return formatHtmlError(msg, clr); + } + if (error.key !== null && error.key !== undefined) { + message = `${error.key} : ${error.text}`; + switch (error.messageType.levelStr) { + case 'ERROR': + color = colorDanger; + break; + case 'WARNING': + color = colorWarning; + break; + default: + color = colorDanger; + } + } + return formatHtmlError(message, color); +} + +const formatError = (error) => { + const message = 'Could not determine error'; if (error === null || error === undefined) { - return formaHtmlError(message, color); + return formatHtmlError(message, colorDanger); } if (error.id !== undefined && error.timestamp !== undefined) { - message = error.error; - color = colorDanger; - const extractedAjaxError = extractAjaxError(error.error); - if (extractedAjaxError) { - const { msg, clr } = extractedAjaxError; - return formaHtmlError(msg, clr); - } - if (error.key !== null && error.key !== undefined) { - message = `${error.key} : ${error.text}`; - switch (error.messageType.levelStr) { - case 'ERROR': - color = colorDanger; - break; - case 'WARNING': - color = colorWarning; - break; - default: - color = colorDanger; - } - } - return formaHtmlError(message, color); + return handleValidError(error); } if (error.name === 'AjaxError') { const extractedAjaxError = extractAjaxError(error); if (extractedAjaxError) { const { msg, clr } = extractedAjaxError; - return formaHtmlError(msg, clr); + return formatHtmlError(msg, clr); } } if (error.message !== undefined) { - return formaHtmlError(error.message, colorDanger); + return formatHtmlError(error.message, colorDanger); } - return formaHtmlError(message, color); + return formatHtmlError(message, colorDanger); }; export default formatError; diff --git a/apiml-extension-loader/src/main/java/org/zowe/apiml/extension/ExtensionConfigReader.java b/apiml-extension-loader/src/main/java/org/zowe/apiml/extension/ExtensionConfigReader.java index 5d98d05713..21a2a3c905 100644 --- a/apiml-extension-loader/src/main/java/org/zowe/apiml/extension/ExtensionConfigReader.java +++ b/apiml-extension-loader/src/main/java/org/zowe/apiml/extension/ExtensionConfigReader.java @@ -10,7 +10,10 @@ package org.zowe.apiml.extension; -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import lombok.extern.slf4j.Slf4j; +import org.zowe.apiml.extension.ExtensionDefinition.ApimlServices; import java.io.File; import java.nio.charset.Charset; @@ -21,14 +24,8 @@ import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.stream.Collectors; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; - -import org.zowe.apiml.extension.ExtensionDefinition.ApimlServices; -import lombok.extern.slf4j.Slf4j; +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; @Slf4j public class ExtensionConfigReader { @@ -46,7 +43,7 @@ public String[] getBasePackages() { .filter(Objects::nonNull) .map(ApimlServices::getBasePackage) .filter(Objects::nonNull) - .collect(Collectors.toList()) + .toList() .toArray(new String[0]); } diff --git a/apiml-security-common/src/main/java/org/zowe/apiml/security/common/filter/CategorizeCertsFilter.java b/apiml-security-common/src/main/java/org/zowe/apiml/security/common/filter/CategorizeCertsFilter.java index 9b7ec7ceb6..9729c1518e 100644 --- a/apiml-security-common/src/main/java/org/zowe/apiml/security/common/filter/CategorizeCertsFilter.java +++ b/apiml-security-common/src/main/java/org/zowe/apiml/security/common/filter/CategorizeCertsFilter.java @@ -10,6 +10,12 @@ package org.zowe.apiml.security.common.filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import jakarta.servlet.http.HttpServletResponse; import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -20,12 +26,6 @@ import org.zowe.apiml.product.logging.annotations.InjectApimlLogger; import org.zowe.apiml.security.common.verify.CertificateValidator; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletRequestWrapper; -import jakarta.servlet.http.HttpServletResponse; import java.io.ByteArrayInputStream; import java.io.IOException; import java.security.cert.Certificate; @@ -33,7 +33,6 @@ import java.security.cert.X509Certificate; import java.util.*; import java.util.function.Predicate; -import java.util.stream.Collectors; /** * This filter processes certificates on request. It decides, which certificates are considered for client authentication @@ -147,7 +146,7 @@ protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull Ht private X509Certificate[] selectCerts(X509Certificate[] certs, Predicate test) { return Arrays.stream(certs) .filter(test) - .collect(Collectors.toList()).toArray(new X509Certificate[0]); + .toList().toArray(new X509Certificate[0]); } public String base64EncodePublicKey(X509Certificate cert) { diff --git a/apiml-security-common/src/test/java/org/zowe/apiml/security/common/verify/TrustedCertificatesProviderTest.java b/apiml-security-common/src/test/java/org/zowe/apiml/security/common/verify/TrustedCertificatesProviderTest.java index 029367b5aa..0b2832c0f6 100644 --- a/apiml-security-common/src/test/java/org/zowe/apiml/security/common/verify/TrustedCertificatesProviderTest.java +++ b/apiml-security-common/src/test/java/org/zowe/apiml/security/common/verify/TrustedCertificatesProviderTest.java @@ -35,30 +35,32 @@ class TrustedCertificatesProviderTest { private static final String VALID_CERTIFICATE = - "-----BEGIN CERTIFICATE-----\n" + - "MIID7zCCAtegAwIBAgIED0TPEjANBgkqhkiG9w0BAQsFADB6MQswCQYDVQQGEwJD\n" + - "WjEPMA0GA1UECBMGUHJhZ3VlMQ8wDQYDVQQHEwZQcmFndWUxFDASBgNVBAoTC1pv\n" + - "d2UgU2FtcGxlMRwwGgYDVQQLExNBUEkgTWVkaWF0aW9uIExheWVyMRUwEwYDVQQD\n" + - "Ewxab3dlIFNlcnZpY2UwHhcNMTgxMjA3MTQ1NzIyWhcNMjgxMjA0MTQ1NzIyWjB6\n" + - "MQswCQYDVQQGEwJDWjEPMA0GA1UECBMGUHJhZ3VlMQ8wDQYDVQQHEwZQcmFndWUx\n" + - "FDASBgNVBAoTC1pvd2UgU2FtcGxlMRwwGgYDVQQLExNBUEkgTWVkaWF0aW9uIExh\n" + - "eWVyMRUwEwYDVQQDEwxab3dlIFNlcnZpY2UwggEiMA0GCSqGSIb3DQEBAQUAA4IB\n" + - "DwAwggEKAoIBAQC6Orc/EJ5/t2qam1DiYU/xVbHaQrjd6uvpj2HTvOOohtFZ7/Kx\n" + - "yMAezgB8DBR4+77qXXsdP9ngnTl/i22yGwvo7Tlz6dhnQLnks7VFr1eGGC2ks+rL\n" + - "BJsF/RQexmONG9ddexWD8SOYoW9RRapQqETbcllxOenvzXruOEzaXhMazkK9Cg+J\n" + - "ucNb9HcfhIM0rjLZhqG8Gc8dAtCcxF/xHlVyFQq8fr4u2p/wGmARM14iZeQltQV7\n" + - "F3gxmw3djfcNM5S3tirPrHlZb76ZmmQEn4QiLSP198Lm+4QKAOw1dUpMf4eELO4c\n" + - "EFUHXQUCHLWc5NztZxWW40NrDbZEjcRI5ah7AgMBAAGjfTB7MB0GA1UdJQQWMBQG\n" + - "CCsGAQUFBwMCBggrBgEFBQcDATAOBgNVHQ8BAf8EBAMCBPAwKwYDVR0RBCQwIoIV\n" + - "bG9jYWxob3N0LmxvY2FsZG9tYWlugglsb2NhbGhvc3QwHQYDVR0OBBYEFHL1ygBb\n" + - "UCI/ktdk3TgQA6EJlATIMA0GCSqGSIb3DQEBCwUAA4IBAQBHALBlFf0P1TBR1MHQ\n" + - "vXYDFAW+PiyF7zP0HcrvQTAGYhF7uJtRIamapjUdIsDVbqY0RhoFnBOu8ti2z0pW\n" + - "djw47f3X/yj98n+J2aYcO64Ar+ovx93P01MA8+Mz1u/LwXk4pmrbUIcOEtyNu+vT\n" + - "a0jDobC++3Zfv5Y+iD2M8L+jacSMZNCqQByhKtTkAICXg9LMccx4XLYtJ65zGP2h\n" + - "4TEK0MMfO2G1/vUmdb3tq17zKdukj3MUS254mENCck7ioNFR0Cc9lzuSHyBrdb0x\n" + - "M/iHeamNblckK/r1roDjhCAQz9DtmETad/o7qGNFxDTRRShRV9Lww0fFB7PaV7u/\n" + - "VPx2\n" + - "-----END CERTIFICATE-----"; + """ + -----BEGIN CERTIFICATE----- + MIID7zCCAtegAwIBAgIED0TPEjANBgkqhkiG9w0BAQsFADB6MQswCQYDVQQGEwJD + WjEPMA0GA1UECBMGUHJhZ3VlMQ8wDQYDVQQHEwZQcmFndWUxFDASBgNVBAoTC1pv + d2UgU2FtcGxlMRwwGgYDVQQLExNBUEkgTWVkaWF0aW9uIExheWVyMRUwEwYDVQQD + Ewxab3dlIFNlcnZpY2UwHhcNMTgxMjA3MTQ1NzIyWhcNMjgxMjA0MTQ1NzIyWjB6 + MQswCQYDVQQGEwJDWjEPMA0GA1UECBMGUHJhZ3VlMQ8wDQYDVQQHEwZQcmFndWUx + FDASBgNVBAoTC1pvd2UgU2FtcGxlMRwwGgYDVQQLExNBUEkgTWVkaWF0aW9uIExh + eWVyMRUwEwYDVQQDEwxab3dlIFNlcnZpY2UwggEiMA0GCSqGSIb3DQEBAQUAA4IB + DwAwggEKAoIBAQC6Orc/EJ5/t2qam1DiYU/xVbHaQrjd6uvpj2HTvOOohtFZ7/Kx + yMAezgB8DBR4+77qXXsdP9ngnTl/i22yGwvo7Tlz6dhnQLnks7VFr1eGGC2ks+rL + BJsF/RQexmONG9ddexWD8SOYoW9RRapQqETbcllxOenvzXruOEzaXhMazkK9Cg+J + ucNb9HcfhIM0rjLZhqG8Gc8dAtCcxF/xHlVyFQq8fr4u2p/wGmARM14iZeQltQV7 + F3gxmw3djfcNM5S3tirPrHlZb76ZmmQEn4QiLSP198Lm+4QKAOw1dUpMf4eELO4c + EFUHXQUCHLWc5NztZxWW40NrDbZEjcRI5ah7AgMBAAGjfTB7MB0GA1UdJQQWMBQG + CCsGAQUFBwMCBggrBgEFBQcDATAOBgNVHQ8BAf8EBAMCBPAwKwYDVR0RBCQwIoIV + bG9jYWxob3N0LmxvY2FsZG9tYWlugglsb2NhbGhvc3QwHQYDVR0OBBYEFHL1ygBb + UCI/ktdk3TgQA6EJlATIMA0GCSqGSIb3DQEBCwUAA4IBAQBHALBlFf0P1TBR1MHQ + vXYDFAW+PiyF7zP0HcrvQTAGYhF7uJtRIamapjUdIsDVbqY0RhoFnBOu8ti2z0pW + djw47f3X/yj98n+J2aYcO64Ar+ovx93P01MA8+Mz1u/LwXk4pmrbUIcOEtyNu+vT + a0jDobC++3Zfv5Y+iD2M8L+jacSMZNCqQByhKtTkAICXg9LMccx4XLYtJ65zGP2h + 4TEK0MMfO2G1/vUmdb3tq17zKdukj3MUS254mENCck7ioNFR0Cc9lzuSHyBrdb0x + M/iHeamNblckK/r1roDjhCAQz9DtmETad/o7qGNFxDTRRShRV9Lww0fFB7PaV7u/ + VPx2 + -----END CERTIFICATE----- + """.stripIndent(); private static final String VALID_CERT_SUBJECT_DN = "CN=Zowe Service,OU=API Mediation Layer,O=Zowe Sample,L=Prague,ST=Prague,C=CZ"; @@ -158,13 +160,5 @@ void whenGetTrustedCerts_thenNoCertificatesReturned() { assertNotNull(result); assertTrue(result.isEmpty()); } - - @Test - void whenNoStatusLine_thenNoCertificatesReturned() { - HttpClientMockHelper.mockResponse(httpResponse, HttpStatus.SC_BAD_REQUEST); - List result = provider.getTrustedCerts(CERTS_URL); - assertNotNull(result); - assertTrue(result.isEmpty()); - } } } diff --git a/apiml-tomcat-common/src/test/java/org/zowe/apiml/filter/AttlsFilterTest.java b/apiml-tomcat-common/src/test/java/org/zowe/apiml/filter/AttlsFilterTest.java index 9f7dbe6aaf..0ff53ec206 100644 --- a/apiml-tomcat-common/src/test/java/org/zowe/apiml/filter/AttlsFilterTest.java +++ b/apiml-tomcat-common/src/test/java/org/zowe/apiml/filter/AttlsFilterTest.java @@ -10,16 +10,16 @@ package org.zowe.apiml.filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.tomcat.util.codec.binary.Base64; import org.junit.jupiter.api.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.zowe.commons.attls.ContextIsNotInitializedException; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.security.cert.CertificateException; @@ -32,29 +32,30 @@ class AttlsFilterTest { @Test void providedCertificateInCorrectFormat_thenPopulateRequest() throws CertificateException, ContextIsNotInitializedException { AttlsFilter attlsFilter = new AttlsFilter(); - String certificate = - "MIID8TCCAtmgAwIBAgIUVyBCWfHF/ZwZKVsBEpTNIBj9mQcwDQYJKoZIhvcNAQEL\n" + - "BQAwfzELMAkGA1UEBhMCQ1oxDzANBgNVBAgMBlByYWd1ZTEPMA0GA1UEBwwGUHJh\n" + - "Z3VlMREwDwYDVQQKDAhCcm9hZGNvbTEMMAoGA1UECwwDTUZEMS0wKwYDVQQDDCRB\n" + - "UElNTCBFeHRlcm5hbCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMjAwOTA0MTE0\n" + - "MzM2WhcNMjMwNjAxMTE0MzM2WjBiMQswCQYDVQQGEwJDWjEQMA4GA1UECAwHQ3pl\n" + - "Y2hpYTEPMA0GA1UEBwwGUHJhZ3VlMREwDwYDVQQKDAhCcm9hZGNvbTEOMAwGA1UE\n" + - "CwwFQ0EgQ1oxDTALBgNVBAMMBFVTRVIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\n" + - "ggEKAoIBAQDN0NIJjuRJPE43CRvIVEg2hfIUWpos6lNs4ZNEyCxOPU0b6kyNxpTm\n" + - "aSX8LUX0JQ9c5N1Yie6F7k2JJzfkhoHh/x67CsoHYvaV60gJGuhO1PPM/QsGFrXH\n" + - "7Po0fS5jsqmJWnn+B8mUoNWFSqKUuusyuMT+Y8d8cr67g4MmnA7YEDag7F7i2s7x\n" + - "yrBMiU5IcLChMmWsZiar/vl0ykDb5Fsjt8pCFAPeuwT+nLUxCcqY5N5t11qxuS2a\n" + - "roZvM2PHdVkCQagB9dKlIYEtJeD6ZkYS0C/CHiJBqujx9dxAate/WJc5r6rdCkfB\n" + - "RGN0nZQaE7AupgDi4BqoZQzbeyU+DRutAgMBAAGjgYEwfzALBgNVHQ8EBAMCBeAw\n" + - "HQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMB0GA1UdDgQWBBRbQ4fcpM8i\n" + - "paU2mwI4Fl/GRfNy/TARBglghkgBhvhCAQEEBAMCBeAwHwYDVR0jBBgwFoAUcYHv\n" + - "14ClCeqgaHg5n4LYjlmgj3cwDQYJKoZIhvcNAQELBQADggEBANMyHteCcktXSloB\n" + - "w3BrCYe0mup+BKe9lT2ARVoCuamxj/VqKq6IbNUBNqvIIbEK5wIEiSPvQ6VJqmks\n" + - "yw+gr+Dch+2sd9jiCKYAPTeDeoBHzRo88j4L7y+w/FN+13y3QIUxSfzEdrcsSA5Z\n" + - "VwTQsFF5zC6u2k7onDlE6NiYnuU5VUaM4jel1atSeA6xLdD+ePfI70B+m034Nhrk\n" + - "aUUTK+iCCeM9heokpWqpA9bqlHcIP0fliG6Estnt9xaPwA4VpLkQR6t9E49yBDJ5\n" + - "C0lqInPB7xGphhYZ6cV9/c3u/B3r9iK1IHQffhdANStogiQrzGk2yvUg0/t0qmle\n" + - "PzYuxfM="; + String certificate = """ + MIID8TCCAtmgAwIBAgIUVyBCWfHF/ZwZKVsBEpTNIBj9mQcwDQYJKoZIhvcNAQEL + BQAwfzELMAkGA1UEBhMCQ1oxDzANBgNVBAgMBlByYWd1ZTEPMA0GA1UEBwwGUHJh + Z3VlMREwDwYDVQQKDAhCcm9hZGNvbTEMMAoGA1UECwwDTUZEMS0wKwYDVQQDDCRB + UElNTCBFeHRlcm5hbCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMjAwOTA0MTE0 + MzM2WhcNMjMwNjAxMTE0MzM2WjBiMQswCQYDVQQGEwJDWjEQMA4GA1UECAwHQ3pl + Y2hpYTEPMA0GA1UEBwwGUHJhZ3VlMREwDwYDVQQKDAhCcm9hZGNvbTEOMAwGA1UE + CwwFQ0EgQ1oxDTALBgNVBAMMBFVTRVIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw + ggEKAoIBAQDN0NIJjuRJPE43CRvIVEg2hfIUWpos6lNs4ZNEyCxOPU0b6kyNxpTm + aSX8LUX0JQ9c5N1Yie6F7k2JJzfkhoHh/x67CsoHYvaV60gJGuhO1PPM/QsGFrXH + 7Po0fS5jsqmJWnn+B8mUoNWFSqKUuusyuMT+Y8d8cr67g4MmnA7YEDag7F7i2s7x + yrBMiU5IcLChMmWsZiar/vl0ykDb5Fsjt8pCFAPeuwT+nLUxCcqY5N5t11qxuS2a + roZvM2PHdVkCQagB9dKlIYEtJeD6ZkYS0C/CHiJBqujx9dxAate/WJc5r6rdCkfB + RGN0nZQaE7AupgDi4BqoZQzbeyU+DRutAgMBAAGjgYEwfzALBgNVHQ8EBAMCBeAw + HQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMB0GA1UdDgQWBBRbQ4fcpM8i + paU2mwI4Fl/GRfNy/TARBglghkgBhvhCAQEEBAMCBeAwHwYDVR0jBBgwFoAUcYHv + 14ClCeqgaHg5n4LYjlmgj3cwDQYJKoZIhvcNAQELBQADggEBANMyHteCcktXSloB + w3BrCYe0mup+BKe9lT2ARVoCuamxj/VqKq6IbNUBNqvIIbEK5wIEiSPvQ6VJqmks + yw+gr+Dch+2sd9jiCKYAPTeDeoBHzRo88j4L7y+w/FN+13y3QIUxSfzEdrcsSA5Z + VwTQsFF5zC6u2k7onDlE6NiYnuU5VUaM4jel1atSeA6xLdD+ePfI70B+m034Nhrk + aUUTK+iCCeM9heokpWqpA9bqlHcIP0fliG6Estnt9xaPwA4VpLkQR6t9E49yBDJ5 + C0lqInPB7xGphhYZ6cV9/c3u/B3r9iK1IHQffhdANStogiQrzGk2yvUg0/t0qmle + PzYuxfM= + """.stripIndent(); HttpServletRequest request = new MockHttpServletRequest(); attlsFilter.populateRequestWithCertificate(request, Base64.decodeBase64(certificate)); diff --git a/apiml-utility/src/main/java/org/zowe/apiml/product/logging/LogMessageTracker.java b/apiml-utility/src/main/java/org/zowe/apiml/product/logging/LogMessageTracker.java index 8197f90828..f4af63d2b1 100644 --- a/apiml-utility/src/main/java/org/zowe/apiml/product/logging/LogMessageTracker.java +++ b/apiml-utility/src/main/java/org/zowe/apiml/product/logging/LogMessageTracker.java @@ -20,7 +20,6 @@ import java.util.Collections; import java.util.List; import java.util.regex.Pattern; -import java.util.stream.Collectors; /** * Class that contains the content made by a given logger. @@ -106,7 +105,7 @@ public boolean contains(String content, Level level) { public List search(Pattern regex) { return logAppender.list.stream() .filter(event -> regex.matcher(event.getFormattedMessage()).find()) - .collect(Collectors.toList()); + .toList(); } /** @@ -116,7 +115,7 @@ public List search(Pattern regex) { public List search(String content) { return logAppender.list.stream() .filter(event -> event.getFormattedMessage().contains(content)) - .collect(Collectors.toList()); + .toList(); } /** @@ -128,7 +127,7 @@ public List search(Pattern regex, Level level) { return logAppender.list.stream() .filter(event -> regex.matcher(event.getFormattedMessage()).find() && event.getLevel().equals(level)) - .collect(Collectors.toList()); + .toList(); } /** @@ -140,7 +139,7 @@ public List search(String content, Level level) { return logAppender.list.stream() .filter(event -> event.getFormattedMessage().contains(content) && event.getLevel().equals(level)) - .collect(Collectors.toList()); + .toList(); } /** @@ -164,6 +163,6 @@ public List getAllLoggedEvents() { public List getAllLoggedEventsWithLevel(Level level) { return logAppender.list.stream() .filter(event -> event.getLevel().equals(level)) - .collect(Collectors.toList()); + .toList(); } } diff --git a/common-service-core/src/main/java/org/zowe/apiml/config/AdditionalRegistrationCondition.java b/common-service-core/src/main/java/org/zowe/apiml/config/AdditionalRegistrationCondition.java index 4f59a803da..be016f27d7 100644 --- a/common-service-core/src/main/java/org/zowe/apiml/config/AdditionalRegistrationCondition.java +++ b/common-service-core/src/main/java/org/zowe/apiml/config/AdditionalRegistrationCondition.java @@ -18,7 +18,6 @@ import org.springframework.core.type.AnnotatedTypeMetadata; import java.util.List; -import java.util.stream.Collectors; import static org.zowe.apiml.config.AdditionalRegistrationParser.DISCOVERYSERVICEURLS_PATTERN; @@ -30,8 +29,8 @@ public class AdditionalRegistrationCondition implements Condition { public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { String dcUrls = context.getEnvironment().getProperty("apiml.service.additionalRegistration[0].discoveryServiceUrls"); List additionalKeys = ((StandardEnvironment) context.getEnvironment()).getSystemEnvironment() - .entrySet().stream().map(e -> e.getKey().toUpperCase()).filter(key -> DISCOVERYSERVICEURLS_PATTERN.matcher(key).matches()) - .collect(Collectors.toList()); + .keySet().stream().map(String::toUpperCase).filter(key -> DISCOVERYSERVICEURLS_PATTERN.matcher(key).matches()) + .toList(); boolean isAdditionalRegistrationsDetected = dcUrls != null || !additionalKeys.isEmpty(); log.debug("isAdditionalRegistrationsDetected: {}", isAdditionalRegistrationsDetected); return isAdditionalRegistrationsDetected; diff --git a/common-service-core/src/main/java/org/zowe/apiml/config/AdditionalRegistrationParser.java b/common-service-core/src/main/java/org/zowe/apiml/config/AdditionalRegistrationParser.java index 4de9afcc55..badb2b782e 100644 --- a/common-service-core/src/main/java/org/zowe/apiml/config/AdditionalRegistrationParser.java +++ b/common-service-core/src/main/java/org/zowe/apiml/config/AdditionalRegistrationParser.java @@ -13,14 +13,9 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.TreeMap; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import static org.apache.commons.lang.StringUtils.isNotBlank; @@ -48,7 +43,7 @@ public List extractAdditionalRegistrations(Map putRouteGatewayUrl(map, pair, entry.getValue())); } map.values().forEach(registration -> registration.setRoutes(registration.getRoutes().stream() - .filter(AdditionalRegistrationParser::isRouteDefined).collect(Collectors.toList()))); + .filter(AdditionalRegistrationParser::isRouteDefined).toList())); return new ArrayList<>(map.values()); } diff --git a/common-service-core/src/main/java/org/zowe/apiml/eurekaservice/client/util/EurekaMetadataParser.java b/common-service-core/src/main/java/org/zowe/apiml/eurekaservice/client/util/EurekaMetadataParser.java index 93cdf175d2..fe1ea38ac3 100644 --- a/common-service-core/src/main/java/org/zowe/apiml/eurekaservice/client/util/EurekaMetadataParser.java +++ b/common-service-core/src/main/java/org/zowe/apiml/eurekaservice/client/util/EurekaMetadataParser.java @@ -27,7 +27,6 @@ import java.net.URL; import java.util.*; import java.util.function.Supplier; -import java.util.stream.Collectors; import static org.zowe.apiml.constants.EurekaMetadataDefinition.*; @@ -125,7 +124,7 @@ public List parseToListRoute(Map eurekaMetadata) .filter(this::filterMetadata) .map(metadata -> mapMetadataToRoutedService(metadata, routeMap)) .filter(Objects::nonNull) - .collect(Collectors.toList()); + .toList(); } private boolean filterMetadata(Map.Entry metadata) { diff --git a/common-service-core/src/main/java/org/zowe/apiml/message/core/AbstractMessageService.java b/common-service-core/src/main/java/org/zowe/apiml/message/core/AbstractMessageService.java index c18652a78d..6c14b8392e 100644 --- a/common-service-core/src/main/java/org/zowe/apiml/message/core/AbstractMessageService.java +++ b/common-service-core/src/main/java/org/zowe/apiml/message/core/AbstractMessageService.java @@ -76,7 +76,7 @@ public List createMessage(String key, List parameters) { return parameters.stream() .filter(Objects::nonNull) .map(ob -> createMessage(key, ob)) - .collect(Collectors.toList()); + .toList(); } /** diff --git a/common-service-core/src/main/java/org/zowe/apiml/services/BasicInfoService.java b/common-service-core/src/main/java/org/zowe/apiml/services/BasicInfoService.java index 4546245946..397c27e418 100644 --- a/common-service-core/src/main/java/org/zowe/apiml/services/BasicInfoService.java +++ b/common-service-core/src/main/java/org/zowe/apiml/services/BasicInfoService.java @@ -21,11 +21,7 @@ import org.zowe.apiml.config.ApiInfo; import org.zowe.apiml.eurekaservice.client.util.EurekaMetadataParser; -import java.util.AbstractMap; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; import static java.util.stream.Collectors.groupingBy; @@ -33,11 +29,7 @@ import static org.zowe.apiml.constants.EurekaMetadataDefinition.SERVICE_DESCRIPTION; import static org.zowe.apiml.constants.EurekaMetadataDefinition.SERVICE_TITLE; import static org.zowe.apiml.services.ServiceInfo.ApiInfoExtended; -import static org.zowe.apiml.services.ServiceInfoUtils.getBasePath; -import static org.zowe.apiml.services.ServiceInfoUtils.getInstances; -import static org.zowe.apiml.services.ServiceInfoUtils.getMajorVersion; -import static org.zowe.apiml.services.ServiceInfoUtils.getStatus; -import static org.zowe.apiml.services.ServiceInfoUtils.getVersion; +import static org.zowe.apiml.services.ServiceInfoUtils.*; /** * Similar to {@link org.zowe.apiml.gateway.services.ServicesInfoService} service which does not depend on gateway-service components. @@ -136,7 +128,7 @@ private List getAuthentication(List appInstances) .map(instanceInfo -> eurekaMetadataParser.parseAuthentication(instanceInfo.getMetadata())) .filter(a -> !a.isEmpty()) .distinct() - .collect(Collectors.toList()); + .toList(); } private InstanceInfo getInstanceWithHighestVersion(List appInstances) { diff --git a/common-service-core/src/main/java/org/zowe/apiml/util/CacheUtils.java b/common-service-core/src/main/java/org/zowe/apiml/util/CacheUtils.java index cc2d81d6f0..7a3803a52e 100644 --- a/common-service-core/src/main/java/org/zowe/apiml/util/CacheUtils.java +++ b/common-service-core/src/main/java/org/zowe/apiml/util/CacheUtils.java @@ -70,7 +70,7 @@ public void evictSubset(CacheManager cacheManager, String cacheName, Predicate keysToRemove = StreamSupport.stream(spliterator, true) // if the key matches the predicate then evict the record or // if the key is not compositeKey (unknown for evict) evict record (as failover) - .filter(e -> !(e.getKey() instanceof CompositeKey) || keyPredicate.test((CompositeKey) e.getKey())) + .filter(e -> !(e.getKey() instanceof CompositeKey key) || keyPredicate.test(key)) .map(javax.cache.Cache.Entry::getKey) .collect(Collectors.toSet()); ((javax.cache.Cache) nativeCache).removeAll(keysToRemove); @@ -96,7 +96,7 @@ public List getAllRecords(CacheManager cacheManager, String cacheName) { final Object nativeCache = cache.getNativeCache(); if (nativeCache instanceof javax.cache.Cache) { Spliterator> spliterator = ((javax.cache.Cache) nativeCache).spliterator(); - return StreamSupport.stream(spliterator, true).map(javax.cache.Cache.Entry::getValue).collect(Collectors.toList()); + return StreamSupport.stream(spliterator, true).map(javax.cache.Cache.Entry::getValue).toList(); } else if (nativeCache instanceof NoOpCache) { return Collections.emptyList(); } else { diff --git a/common-service-core/src/main/java/org/zowe/apiml/util/Cookies.java b/common-service-core/src/main/java/org/zowe/apiml/util/Cookies.java index 99449c25a1..36f795e6be 100644 --- a/common-service-core/src/main/java/org/zowe/apiml/util/Cookies.java +++ b/common-service-core/src/main/java/org/zowe/apiml/util/Cookies.java @@ -48,7 +48,7 @@ public List get(String needle) { return getAll() .stream() .filter(c -> c.getName().equalsIgnoreCase(needle)) - .collect(Collectors.toList()); + .toList(); } public void set(HttpCookie cookie) { @@ -72,7 +72,7 @@ public void remove(String cookie) { List cookieList = getAllCookiesFromHeader(header); cookieList = cookieList.stream() .filter(c -> !c.getName().equalsIgnoreCase(cookie)) - .collect(Collectors.toList()); + .toList(); if (cookieList.isEmpty()) { request.removeHeaders(HttpHeaders.COOKIE); } else { diff --git a/common-service-core/src/main/java/org/zowe/apiml/util/RequestUtils.java b/common-service-core/src/main/java/org/zowe/apiml/util/RequestUtils.java index 6d9eebfe97..b4dbfef704 100644 --- a/common-service-core/src/main/java/org/zowe/apiml/util/RequestUtils.java +++ b/common-service-core/src/main/java/org/zowe/apiml/util/RequestUtils.java @@ -51,7 +51,7 @@ public List
getHeader(String needle) { return getAllHeaders().stream() .filter(h -> h.getName().equalsIgnoreCase(needle)) - .collect(Collectors.toList()); + .toList(); } public void setHeader(Header newHeader) { @@ -65,14 +65,14 @@ public void setHeader(Header newHeader) { public void removeHeader(String needle) { List
newHeaderList = getAllHeaders().stream() .filter(h -> !h.getName().equalsIgnoreCase(needle)) - .collect(Collectors.toList()); + .toList(); request.setHeaders(newHeaderList.toArray(new Header[] {})); } public List getAllCookies() { List cookieList = new ArrayList<>(); List
cookieHeaders = getAllHeaders().stream() - .filter(h -> h.getName().equalsIgnoreCase(HttpHeaders.COOKIE)).collect(Collectors.toList()); + .filter(h -> h.getName().equalsIgnoreCase(HttpHeaders.COOKIE)).toList(); cookieHeaders.forEach(h -> cookieList.addAll(getAllCookiesFromHeader(h))); return cookieList; @@ -94,7 +94,7 @@ private List getAllCookiesFromHeader(Header header) { } public List getCookie(String needle) { - return getAllCookies().stream().filter(c -> c.getName().equalsIgnoreCase(needle)).collect(Collectors.toList()); + return getAllCookies().stream().filter(c -> c.getName().equalsIgnoreCase(needle)).toList(); } public void setCookie(HttpCookie cookie) { @@ -124,7 +124,7 @@ public void removeCookie(String cookie) { List cookieList = getAllCookiesFromHeader(header); cookieList = cookieList.stream() .filter(c -> !c.getName().equalsIgnoreCase(cookie)) - .collect(Collectors.toList()); + .toList(); if (cookieList.isEmpty()) { removeHeader(HttpHeaders.COOKIE); } else { diff --git a/common-service-core/src/test/java/org/zowe/apiml/security/HttpsFactoryTest.java b/common-service-core/src/test/java/org/zowe/apiml/security/HttpsFactoryTest.java index 865be4a4da..c1a469784d 100644 --- a/common-service-core/src/test/java/org/zowe/apiml/security/HttpsFactoryTest.java +++ b/common-service-core/src/test/java/org/zowe/apiml/security/HttpsFactoryTest.java @@ -21,14 +21,9 @@ import javax.net.ssl.SSLContext; import java.security.KeyStoreException; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; class HttpsFactoryTest { - private static final String EUREKA_URL_NO_SCHEME = "://localhost:10011/eureka/"; - private static final String TEST_SERVICE_ID = "service1"; private static final String INCORRECT_PARAMETER_VALUE = "WRONG"; private HttpsConfig.HttpsConfigBuilder httpsConfigBuilder; diff --git a/discoverable-client/src/main/java/org/zowe/apiml/client/api/PetControllerExceptionHandler.java b/discoverable-client/src/main/java/org/zowe/apiml/client/api/PetControllerExceptionHandler.java index b26cad80b3..e246276f27 100644 --- a/discoverable-client/src/main/java/org/zowe/apiml/client/api/PetControllerExceptionHandler.java +++ b/discoverable-client/src/main/java/org/zowe/apiml/client/api/PetControllerExceptionHandler.java @@ -10,12 +10,6 @@ package org.zowe.apiml.client.api; -import org.zowe.apiml.client.exception.PetIdMismatchException; -import org.zowe.apiml.client.exception.PetNotFoundException; -import org.zowe.apiml.message.api.ApiMessage; -import org.zowe.apiml.message.api.ApiMessageView; -import org.zowe.apiml.message.core.Message; -import org.zowe.apiml.message.core.MessageService; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.exc.InvalidFormatException; import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException; @@ -30,10 +24,15 @@ import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.zowe.apiml.client.exception.PetIdMismatchException; +import org.zowe.apiml.client.exception.PetNotFoundException; +import org.zowe.apiml.message.api.ApiMessage; +import org.zowe.apiml.message.api.ApiMessageView; +import org.zowe.apiml.message.core.Message; +import org.zowe.apiml.message.core.MessageService; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** * This class creates responses for exceptional behavior of the PetController @@ -115,7 +114,7 @@ public ResponseEntity handleMethodArgumentNotValid(MethodArgumen .createMessage("org.zowe.apiml.sampleservice.api.petMethodArgumentNotValid", messages) .stream() .map(Message::mapToApiMessage) - .collect(Collectors.toList()); + .toList(); return ResponseEntity .status(HttpStatus.BAD_REQUEST) diff --git a/discovery-service/src/main/java/org/zowe/apiml/discovery/eureka/RefreshablePeerEurekaNodes.java b/discovery-service/src/main/java/org/zowe/apiml/discovery/eureka/RefreshablePeerEurekaNodes.java index 02eef94a29..f0a3576efb 100644 --- a/discovery-service/src/main/java/org/zowe/apiml/discovery/eureka/RefreshablePeerEurekaNodes.java +++ b/discovery-service/src/main/java/org/zowe/apiml/discovery/eureka/RefreshablePeerEurekaNodes.java @@ -12,6 +12,7 @@ import com.netflix.appinfo.ApplicationInfoManager; import com.netflix.discovery.EurekaClientConfig; +import com.netflix.discovery.converters.wrappers.CodecWrapper; import com.netflix.discovery.provider.DiscoveryJerseyProvider; import com.netflix.discovery.shared.transport.jersey3.EurekaIdentityHeaderFilter; import com.netflix.discovery.shared.transport.jersey3.EurekaJersey3Client; @@ -32,6 +33,7 @@ import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.params.CoreProtocolPNames; @@ -104,43 +106,7 @@ private Jersey3ReplicationClient createReplicationClient(EurekaServerConfig conf String jerseyClientName = "Discovery-PeerNodeClient-" + hostname; var fullJsonCodec = serverCodecs.getFullJsonCodec(); - EurekaJersey3ClientImpl.EurekaJersey3ClientBuilder clientBuilder = new EurekaJersey3ClientImpl.EurekaJersey3ClientBuilder() { - @Override - public EurekaJersey3Client build() { - ClientConfig clientConfig = new ClientConfig() { - { - - DiscoveryJerseyProvider discoveryJerseyProvider = new DiscoveryJerseyProvider(fullJsonCodec, fullJsonCodec); - register(discoveryJerseyProvider); - - // Common properties to all clients - ConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(secureSslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); - Registry registry = RegistryBuilder.create().register("https", socketFactory).build(); - var cm = new PoolingHttpClientConnectionManager(registry); - cm.setDefaultMaxPerRoute(config.getPeerNodeTotalConnectionsPerHost()); - cm.setMaxTotal(config.getPeerNodeTotalConnections()); - property(ApacheClientProperties.CONNECTION_MANAGER, cm); - - String fullUserAgentName = USER_AGENT + "/v" + buildVersion(); - property(CoreProtocolPNames.USER_AGENT, fullUserAgentName); - - // To pin a client to specific server in case redirect happens, we handle redirects directly - // (see DiscoveryClient.makeRemoteCall methods). - property(ClientProperties.FOLLOW_REDIRECTS, Boolean.FALSE); - property(ClientPNames.HANDLE_REDIRECTS, Boolean.FALSE); - } - }; - try { - return new EurekaJersey3ClientImpl( - config.getPeerNodeConnectTimeoutMs(), - config.getPeerNodeReadTimeoutMs(), - config.getPeerNodeConnectionIdleTimeoutSeconds(), - clientConfig); - } catch (Throwable e) { - throw new RuntimeException("Cannot create Jersey client ", e); - } - } - } + EurekaJersey3ClientImpl.EurekaJersey3ClientBuilder clientBuilder = new CustomEurekaJersey3ClientBuilder(fullJsonCodec, config) .withClientName(jerseyClientName).withUserAgent(USER_AGENT) .withEncoderWrapper(fullJsonCodec) .withDecoderWrapper(fullJsonCodec) @@ -212,4 +178,49 @@ protected boolean shouldUpdate(final Set changedKeys) { return false; } + class CustomEurekaJersey3ClientBuilder extends EurekaJersey3ClientImpl.EurekaJersey3ClientBuilder { + private final CodecWrapper fullJsonCodec; + private final EurekaServerConfig config; + + public CustomEurekaJersey3ClientBuilder(CodecWrapper fullJsonCodec, EurekaServerConfig config) { + this.fullJsonCodec = fullJsonCodec; + this.config = config; + } + + @Override + public EurekaJersey3Client build() { + try { + return new EurekaJersey3ClientImpl( + config.getPeerNodeConnectTimeoutMs(), + config.getPeerNodeReadTimeoutMs(), + config.getPeerNodeConnectionIdleTimeoutSeconds(), + new CustomClientConfig(fullJsonCodec, config)); + } catch (Throwable e) { + throw new RuntimeException("Cannot create Jersey client ", e); + } + } + + class CustomClientConfig extends ClientConfig { + public CustomClientConfig(CodecWrapper fullJsonCodec, EurekaServerConfig config) { + DiscoveryJerseyProvider discoveryJerseyProvider = new DiscoveryJerseyProvider(fullJsonCodec, fullJsonCodec); + register(discoveryJerseyProvider); + + // Common properties to all clients + ConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(secureSslContext, NoopHostnameVerifier.INSTANCE); + Registry registry = RegistryBuilder.create().register("https", socketFactory).build(); + var cm = new PoolingHttpClientConnectionManager(registry); + cm.setDefaultMaxPerRoute(config.getPeerNodeTotalConnectionsPerHost()); + cm.setMaxTotal(config.getPeerNodeTotalConnections()); + property(ApacheClientProperties.CONNECTION_MANAGER, cm); + + String fullUserAgentName = USER_AGENT + "/v" + buildVersion(); + property(CoreProtocolPNames.USER_AGENT, fullUserAgentName); + + // To pin a client to specific server in case redirect happens, we handle redirects directly + // (see DiscoveryClient.makeRemoteCall methods). + property(ClientProperties.FOLLOW_REDIRECTS, Boolean.FALSE); + property(ClientPNames.HANDLE_REDIRECTS, Boolean.FALSE); + } + } + } } diff --git a/discovery-service/src/main/java/org/zowe/apiml/discovery/staticdef/ServiceDefinitionProcessor.java b/discovery-service/src/main/java/org/zowe/apiml/discovery/staticdef/ServiceDefinitionProcessor.java index b55b2b8e86..30fe0adcc3 100644 --- a/discovery-service/src/main/java/org/zowe/apiml/discovery/staticdef/ServiceDefinitionProcessor.java +++ b/discovery-service/src/main/java/org/zowe/apiml/discovery/staticdef/ServiceDefinitionProcessor.java @@ -19,6 +19,8 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Component; +import org.zowe.apiml.auth.Authentication; +import org.zowe.apiml.auth.AuthenticationScheme; import org.zowe.apiml.config.ApiInfo; import org.zowe.apiml.eurekaservice.client.util.EurekaMetadataParser; import org.zowe.apiml.exception.MetadataValidationException; @@ -26,8 +28,6 @@ import org.zowe.apiml.message.core.Message; import org.zowe.apiml.message.log.ApimlLogger; import org.zowe.apiml.product.logging.annotations.InjectApimlLogger; -import org.zowe.apiml.auth.Authentication; -import org.zowe.apiml.auth.AuthenticationScheme; import org.zowe.apiml.util.MapUtils; import org.zowe.apiml.util.UrlUtils; @@ -40,7 +40,6 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.*; -import java.util.stream.Collectors; import static org.zowe.apiml.constants.EurekaMetadataDefinition.*; @@ -87,7 +86,7 @@ protected List getFiles(StaticRegistrationResult context, String staticApi } return isDir; }) - .collect(Collectors.toList()); + .toList(); } /** diff --git a/discovery-service/src/test/java/org/zowe/apiml/discovery/EurekaInstanceRegisteredListenerTest.java b/discovery-service/src/test/java/org/zowe/apiml/discovery/EurekaInstanceRegisteredListenerTest.java index 7357bdad33..8abd08fc28 100644 --- a/discovery-service/src/test/java/org/zowe/apiml/discovery/EurekaInstanceRegisteredListenerTest.java +++ b/discovery-service/src/test/java/org/zowe/apiml/discovery/EurekaInstanceRegisteredListenerTest.java @@ -11,8 +11,11 @@ package org.zowe.apiml.discovery; import com.netflix.appinfo.InstanceInfo; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRegisteredEvent; import org.zowe.apiml.discovery.metadata.MetadataDefaultsService; import org.zowe.apiml.discovery.metadata.MetadataTranslationService; @@ -20,38 +23,50 @@ import java.util.HashMap; import java.util.Map; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; +@ExtendWith(MockitoExtension.class) class EurekaInstanceRegisteredListenerTest { + @Mock + private MetadataTranslationService metadataTranslationService; + + @Mock + private MetadataDefaultsService metadataDefaultsService; + + private EurekaInstanceRegisteredListener eurekaInstanceRegisteredListener; + + private final Map metadata = new HashMap<>(); + + @BeforeEach + void setUp() { + eurekaInstanceRegisteredListener = new EurekaInstanceRegisteredListener(metadataTranslationService, metadataDefaultsService); + reset(metadataTranslationService, metadataDefaultsService); + } + @Test void getServiceId() { - MetadataTranslationService metadataTranslationService = Mockito.mock(MetadataTranslationService.class); - MetadataDefaultsService metadataDefaultsService = Mockito.mock(MetadataDefaultsService.class); - - EurekaInstanceRegisteredListener eirl = new EurekaInstanceRegisteredListener(metadataTranslationService, metadataDefaultsService); + var serviceId = "serviceName"; doAnswer( x -> { - assertEquals("serviceName", x.getArgument(0)); + assertEquals(serviceId, x.getArgument(0)); return null; } ).when(metadataDefaultsService).updateMetadata(anyString(), any()); - final Map metadata = new HashMap<>(); - InstanceInfo instanceInfo = mock(InstanceInfo.class); - when(instanceInfo.getInstanceId()).thenReturn("1:serviceName:2"); + when(instanceInfo.getInstanceId()).thenReturn("1:" + serviceId + ":2"); EurekaInstanceRegisteredEvent event = mock(EurekaInstanceRegisteredEvent.class); when(event.getInstanceInfo()).thenReturn(instanceInfo); - eirl.listen(event); + eurekaInstanceRegisteredListener.listen(event); - verify(metadataTranslationService, times(1)).translateMetadata("serviceName", metadata); - verify(metadataDefaultsService, times(1)).updateMetadata("serviceName", metadata); + verifyListenerMetadataOperations(serviceId); } private EurekaInstanceRegisteredEvent createEvent(String instanceId) { @@ -66,12 +81,21 @@ private EurekaInstanceRegisteredEvent createEvent(String instanceId) { @Test void registeredInstanceListen() { - EurekaInstanceRegisteredListener listener = new EurekaInstanceRegisteredListener(Mockito.mock(MetadataTranslationService.class), Mockito.mock(MetadataDefaultsService.class)); - listener.listen(createEvent("host:service:instance")); - listener.listen(createEvent("unknown format")); + assertDoesNotThrow(() -> eurekaInstanceRegisteredListener.listen(createEvent("host:service:instance"))); + verifyListenerMetadataOperations("service"); + + assertDoesNotThrow(() -> eurekaInstanceRegisteredListener.listen(createEvent("unknown format"))); + verifyListenerMetadataOperations(null); + + assertDoesNotThrow(() -> eurekaInstanceRegisteredListener.listen(createEvent("host:GATEWAY:instance"))); + verifyListenerMetadataOperations("GATEWAY"); + + } - listener.listen(createEvent("host:GATEWAY:instance")); + private void verifyListenerMetadataOperations(String serviceId) { + verify(metadataTranslationService, times(1)).translateMetadata(serviceId, metadata); + verify(metadataDefaultsService, times(1)).updateMetadata(serviceId, metadata); } } diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/WebSecurity.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/WebSecurity.java index 328597e0bc..9c864e8dbb 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/WebSecurity.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/WebSecurity.java @@ -304,7 +304,7 @@ private List getClientRegistrations() { .jwkSetUri(c.getProvider().getJwkSetUri()) .clientName(c.getId()) .build() - ).collect(Collectors.toList()); + ).toList(); } public ServerHttpSecurity defaultSecurityConfig(ServerHttpSecurity http) { diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/oidc/ClientConfiguration.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/oidc/ClientConfiguration.java index 28207feed4..52a6d05ca4 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/config/oidc/ClientConfiguration.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/config/oidc/ClientConfiguration.java @@ -19,12 +19,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -44,6 +39,10 @@ public class ClientConfiguration { "^" + SYSTEM_ENV_PREFIX + "(registration|provider)_([^_]+)_.*$" ); + public static final String REGISTRATION_ENV_TYPE = "registration"; + public static final String PROVIDER_ENV_TYPE = "provider"; + + private Map registration = new HashMap<>(); private Map provider = new HashMap<>(); @@ -61,22 +60,22 @@ private void update(String id, String type, String base, Consumer setter } private void update(String id, Registration registration) { - update(id, "registration", "clientId", registration::setClientId); - update(id, "registration", "clientSecret", registration::setClientSecret); - update(id, "registration", "redirectUri", registration::setRedirectUri); + update(id, REGISTRATION_ENV_TYPE, "clientId", registration::setClientId); + update(id, REGISTRATION_ENV_TYPE, "clientSecret", registration::setClientSecret); + update(id, REGISTRATION_ENV_TYPE, "redirectUri", registration::setRedirectUri); - String scope = getSystemEnv(id, "registration", "scope"); + String scope = getSystemEnv(id, REGISTRATION_ENV_TYPE, "scope"); if (scope != null) { registration.setScope(Arrays.asList(scope.split("[,]"))); } } private void update(String id, Provider provider) { - update(id, "provider", "authorizationUri", provider::setAuthorizationUri); - update(id, "provider", "tokenUri", provider::setTokenUri); - update(id, "provider", "userInfoUri", provider::setUserInfoUri); - update(id, "provider", "userNameAttribute", provider::setUserNameAttribute); - update(id, "provider", "jwkSetUri", provider::setJwkSetUri); + update(id, PROVIDER_ENV_TYPE, "authorizationUri", provider::setAuthorizationUri); + update(id, PROVIDER_ENV_TYPE, "tokenUri", provider::setTokenUri); + update(id, PROVIDER_ENV_TYPE, "userInfoUri", provider::setUserInfoUri); + update(id, PROVIDER_ENV_TYPE, "userNameAttribute", provider::setUserNameAttribute); + update(id, PROVIDER_ENV_TYPE, "jwkSetUri", provider::setJwkSetUri); } private Set getRegistrationsIdsFromSystemEnv() { diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/scheduled/GatewayScanJob.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/scheduled/GatewayScanJob.java index a299bc239a..144d4f39dd 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/scheduled/GatewayScanJob.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/scheduled/GatewayScanJob.java @@ -30,7 +30,6 @@ import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import static org.zowe.apiml.constants.EurekaMetadataDefinition.APIML_ID; @@ -84,7 +83,9 @@ private void addLocalServices() { */ protected Flux> doScanExternalGateway() { Mono> registeredGateways = instanceInfoService.getServiceInstance(CoreService.GATEWAY.getServiceId()) - .map(gateways -> gateways.stream().filter(info -> !StringUtils.equals(info.getMetadata().getOrDefault(APIML_ID, "N/A"), currentApimlId)).collect(Collectors.toList())); + .map(gateways -> gateways.stream() + .filter(info -> !StringUtils.equals(info.getMetadata().getOrDefault(APIML_ID, "N/A"), currentApimlId)) + .toList()); Flux serviceInstanceFlux = registeredGateways.flatMapMany(Flux::fromIterable); diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/BasicAuthProvider.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/BasicAuthProvider.java index d3cdf3290b..c88e0b4f84 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/BasicAuthProvider.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/BasicAuthProvider.java @@ -51,7 +51,7 @@ protected Mono processResponse(WebClient.RequestHeadersS }); } - protected WebClient.RequestHeadersSpec createRequest(ServiceInstance instance, String headerValue) { + protected WebClient.RequestHeadersSpec createRequest(ServiceInstance instance, String headerValue) { return webClient.post() .uri(getEndpointUrl(instance)) .headers(httpHeaders -> httpHeaders.set(HttpHeaders.AUTHORIZATION, headerValue)); diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/CentralApimlInfoMapper.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/CentralApimlInfoMapper.java index 527c1eccbb..f8dd1510e2 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/CentralApimlInfoMapper.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/CentralApimlInfoMapper.java @@ -13,9 +13,9 @@ import lombok.NonNull; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import org.zowe.apiml.config.ApiInfo; import org.zowe.apiml.gateway.service.model.ApimlInfo; import org.zowe.apiml.gateway.service.model.CentralServiceInfo; -import org.zowe.apiml.config.ApiInfo; import org.zowe.apiml.services.ServiceInfo; import java.util.*; @@ -37,7 +37,7 @@ public ApimlInfo buildApimlServiceInfo(@NonNull String apimlId, List services = Optional.ofNullable(gatewayServices).orElse(Collections.emptyList()).stream() .filter(Objects::nonNull) .map(this::mapServices) - .collect(Collectors.toList()); + .toList(); return ApimlInfo.builder() .apimlId(apimlId) diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/GatewayIndexService.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/GatewayIndexService.java index 46dd1e318b..92f7898b68 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/GatewayIndexService.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/GatewayIndexService.java @@ -13,6 +13,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.ImmutableMap; +import jakarta.validation.constraints.NotNull; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Qualifier; @@ -28,7 +29,6 @@ import org.zowe.apiml.services.ServiceInfo; import reactor.core.publisher.Mono; -import jakarta.validation.constraints.NotNull; import java.util.*; import java.util.stream.Collectors; @@ -130,7 +130,7 @@ List filterServicesByApiIdAndServiceId(List apimlIdSer .filter(Objects::nonNull) .filter(serviceInfo -> apiId == null || hasSameApiId(serviceInfo, apiId)) .filter(serviceInfo -> serviceId == null || hasSameServiceId(serviceInfo, serviceId)) - .collect(Collectors.toList()); + .toList(); } return Collections.emptyList(); } diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java index 4e5f8ce216..bbb51d53cb 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java @@ -32,19 +32,11 @@ import org.zowe.apiml.util.StringUtils; import reactor.core.publisher.Flux; -import java.util.Comparator; -import java.util.EnumMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.zowe.apiml.constants.EurekaMetadataDefinition.APIML_ID; -import static org.zowe.apiml.constants.EurekaMetadataDefinition.ENABLE_URL_ENCODED_CHARACTERS; -import static org.zowe.apiml.constants.EurekaMetadataDefinition.SERVICE_SUPPORTING_CLIENT_CERT_FORWARDING; +import static org.zowe.apiml.constants.EurekaMetadataDefinition.*; @Service public class RouteLocator implements RouteDefinitionLocator { @@ -176,10 +168,10 @@ private List getAuthFilterPerRoute( setAuth(serviceInstance, routeDefinition, auth); return routeDefinition; - }).collect(Collectors.toList()) + }).toList() ) .flatMap(List::stream) - .collect(Collectors.toList()); + .toList(); } /** diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApimlDiscoveryClientStub.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApimlDiscoveryClientStub.java index 55facc5943..e36b39bf83 100644 --- a/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApimlDiscoveryClientStub.java +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApimlDiscoveryClientStub.java @@ -21,7 +21,6 @@ import org.springframework.context.ApplicationEventPublisher; import java.util.List; -import java.util.stream.Collectors; public class ApimlDiscoveryClientStub extends CloudEurekaClient { private ApplicationRegistry applicationRegistry; @@ -47,7 +46,7 @@ public List getInstancesByVipAddress(String vipAddress, boolean se return applicationRegistry.getInstances().stream() .filter(x -> StringUtils.equalsAnyIgnoreCase(vipAddress, x.getVIPAddress())) .filter(x -> !secure || x.getSecurePort() != 0) - .collect(Collectors.toList()); + .toList(); } @Override @@ -55,7 +54,7 @@ public List getInstancesByVipAddress(String vipAddress, boolean se return applicationRegistry.getInstances().stream() .filter(x -> StringUtils.equalsAnyIgnoreCase(vipAddress, x.getVIPAddress())) .filter(x -> !secure || x.getSecurePort() != 0) - .collect(Collectors.toList()); + .toList(); } } diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApplicationRegistry.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApplicationRegistry.java index 3620460c90..15b726c1cd 100644 --- a/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApplicationRegistry.java +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/acceptance/netflix/ApplicationRegistry.java @@ -86,7 +86,7 @@ public Applications getApplications() { public List getInstances() { return instanceIdToService.values().stream() .map(MockService::getInstanceInfo) - .collect(Collectors.toList()); + .toList(); } public List getServiceInstance(String serviceId) { diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/config/WebSecurityTest.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/config/WebSecurityTest.java index ab43355ddb..3e6b4e7495 100644 --- a/gateway-service/src/test/java/org/zowe/apiml/gateway/config/WebSecurityTest.java +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/config/WebSecurityTest.java @@ -42,7 +42,6 @@ import java.util.HashMap; import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -82,7 +81,7 @@ void shouldAddRegistryAuthorityToAllowedUser() { assertThat(details.getAuthorities()).hasSize(1); assertThat(details.getAuthorities().stream() .map(GrantedAuthority::getAuthority) - .collect(Collectors.toList())) + .toList()) .containsExactly("REGISTRY"); }) .verifyComplete(); @@ -126,7 +125,7 @@ void shouldAddRegistryAuthorityToAllowedUserIgnoringCase() { assertThat(details.getAuthorities()).hasSize(1); assertThat(details.getAuthorities().stream() .map(GrantedAuthority::getAuthority) - .collect(Collectors.toList())) + .toList()) .containsExactly("REGISTRY"); }) .verifyComplete(); @@ -165,7 +164,7 @@ void shouldAddRegistryAuthorityToAnyUser() { assertThat(details.getAuthorities()).hasSize(1); assertThat(details.getAuthorities().stream() .map(GrantedAuthority::getAuthority) - .collect(Collectors.toList())) + .toList()) .containsExactly("REGISTRY"); }) .verifyComplete(); diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java index 1534b038be..9a4736cc77 100644 --- a/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java @@ -33,13 +33,10 @@ import java.util.*; import java.util.function.Consumer; -import java.util.stream.Collectors; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; -import static org.zowe.apiml.constants.EurekaMetadataDefinition.APIML_ID; -import static org.zowe.apiml.constants.EurekaMetadataDefinition.ENABLE_URL_ENCODED_CHARACTERS; -import static org.zowe.apiml.constants.EurekaMetadataDefinition.SERVICE_SUPPORTING_CLIENT_CERT_FORWARDING; +import static org.zowe.apiml.constants.EurekaMetadataDefinition.*; class RouteLocatorTest { @@ -207,7 +204,7 @@ void givenNoApimlId_whenSetCors_thenServiceIdIsUsed() { @Test void givenNonGatewayService_whenGetRoutedService_thenReturnRoutingFromMetadata() { ServiceInstance s = createServiceInstance("myservice", "api/v1", "ui/v1"); - List rs = routeLocator.getRoutedService(s).collect(Collectors.toList()); + List rs = routeLocator.getRoutedService(s).toList(); assertEquals(2, rs.size()); } diff --git a/integration-tests/src/test/java/org/zowe/apiml/integration/graphql/BookControllerTest.java b/integration-tests/src/test/java/org/zowe/apiml/integration/graphql/BookControllerTest.java index 7d5b3885cc..2447845040 100644 --- a/integration-tests/src/test/java/org/zowe/apiml/integration/graphql/BookControllerTest.java +++ b/integration-tests/src/test/java/org/zowe/apiml/integration/graphql/BookControllerTest.java @@ -75,11 +75,14 @@ public void whenGetAllBooks_thenReturnAllBooks() throws SSLException { } } """; - tester.document(document) + + var books = tester.document(document) .execute() .path("getAllBooks") .entityList(Book.class) .get(); + + assertFalse(books.isEmpty()); } @Test diff --git a/integration-tests/src/test/java/org/zowe/apiml/util/config/AuxiliaryUserList.java b/integration-tests/src/test/java/org/zowe/apiml/util/config/AuxiliaryUserList.java index fa2bb288b7..73c4d01852 100644 --- a/integration-tests/src/test/java/org/zowe/apiml/util/config/AuxiliaryUserList.java +++ b/integration-tests/src/test/java/org/zowe/apiml/util/config/AuxiliaryUserList.java @@ -16,7 +16,6 @@ import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; /** * Class is supposed to hold a value string with username,password pairs separated by ; @@ -35,7 +34,7 @@ public List getCredentials() { s.split(",")[2], null) ) - .collect(Collectors.toList()); + .toList(); } public List getCredentials(String key) { @@ -50,6 +49,6 @@ public List getCredentials(String key) { null) ) .filter(credentials -> key.equals(credentials.getKey())) - .collect(Collectors.toList()); + .toList(); } } diff --git a/integration-tests/src/test/java/org/zowe/apiml/util/service/DiscoveryUtils.java b/integration-tests/src/test/java/org/zowe/apiml/util/service/DiscoveryUtils.java index 572fd0aebb..cd30bb66e2 100644 --- a/integration-tests/src/test/java/org/zowe/apiml/util/service/DiscoveryUtils.java +++ b/integration-tests/src/test/java/org/zowe/apiml/util/service/DiscoveryUtils.java @@ -25,7 +25,6 @@ import java.util.LinkedList; import java.util.List; import java.util.function.Predicate; -import java.util.stream.Collectors; import static io.restassured.RestAssured.given; import static org.zowe.apiml.util.SecurityUtils.getConfiguredSslConfig; @@ -46,7 +45,7 @@ public static String getAdditionalDiscoveryUrl() { } public static List getGatewayUrls() { - return getInstances("gateway").stream().filter(InstanceInfo.ONLY_UP).map(InstanceInfo::getUrl).collect(Collectors.toList()); + return getInstances("gateway").stream().filter(InstanceInfo.ONLY_UP).map(InstanceInfo::getUrl).toList(); } public static List getInstances(String serviceId) { diff --git a/integration-tests/src/test/java/org/zowe/apiml/util/service/VirtualService.java b/integration-tests/src/test/java/org/zowe/apiml/util/service/VirtualService.java index 5f24a22c3d..6c863bb472 100644 --- a/integration-tests/src/test/java/org/zowe/apiml/util/service/VirtualService.java +++ b/integration-tests/src/test/java/org/zowe/apiml/util/service/VirtualService.java @@ -42,20 +42,13 @@ import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; import static io.restassured.RestAssured.given; import static org.apache.http.HttpStatus.SC_NO_CONTENT; import static org.apache.http.HttpStatus.SC_OK; import static org.awaitility.Awaitility.await; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.fail; -import static org.zowe.apiml.constants.EurekaMetadataDefinition.AUTHENTICATION_APPLID; -import static org.zowe.apiml.constants.EurekaMetadataDefinition.AUTHENTICATION_SCHEME; -import static org.zowe.apiml.constants.EurekaMetadataDefinition.ROUTES; -import static org.zowe.apiml.constants.EurekaMetadataDefinition.ROUTES_GATEWAY_URL; -import static org.zowe.apiml.constants.EurekaMetadataDefinition.ROUTES_SERVICE_URL; +import static org.junit.jupiter.api.Assertions.*; +import static org.zowe.apiml.constants.EurekaMetadataDefinition.*; /** * This class simulate a service. You can create new instance dynamically in the test. It will register into discovery @@ -576,7 +569,7 @@ private void addDefaultRouteIfMissing() { public List getGatewayUrls() { return DiscoveryUtils.getGatewayUrls().stream() .map(x -> String.format("%s/%s%s", x, serviceId.toLowerCase(), gatewayPath)) - .collect(Collectors.toList()); + .toList(); } /** @@ -584,21 +577,21 @@ public List getGatewayUrls() { * @return list of url to the header servlet, for each registered gateway one */ public List getGatewayHeaderUrls(String headerName) { - return getGatewayUrls().stream().map(x -> x + "/header/" + headerName).collect(Collectors.toList()); + return getGatewayUrls().stream().map(x -> x + "/header/" + headerName).toList(); } /** * @return url of all gateways to this service and health service */ public List getGatewayHealthUrls() { - return getGatewayUrls().stream().map(x -> x + "/application/health").collect(Collectors.toList()); + return getGatewayUrls().stream().map(x -> x + "/application/health").toList(); } /** * @return URL of all gateways to this service and servlet {@link VerifyServlet} */ public List getGatewayVerifyUrls() { - return getGatewayUrls().stream().map(x -> x + "/verify").collect(Collectors.toList()); + return getGatewayUrls().stream().map(x -> x + "/verify").toList(); } @AllArgsConstructor diff --git a/zaas-service/src/main/java/org/zowe/apiml/zaas/security/service/token/ApimlAccessTokenProvider.java b/zaas-service/src/main/java/org/zowe/apiml/zaas/security/service/token/ApimlAccessTokenProvider.java index 3a4a3caa1e..3f1e5e1213 100644 --- a/zaas-service/src/main/java/org/zowe/apiml/zaas/security/service/token/ApimlAccessTokenProvider.java +++ b/zaas-service/src/main/java/org/zowe/apiml/zaas/security/service/token/ApimlAccessTokenProvider.java @@ -16,12 +16,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; -import org.zowe.apiml.zaas.cache.CachingServiceClient; -import org.zowe.apiml.zaas.cache.CachingServiceClientException; -import org.zowe.apiml.zaas.security.service.AuthenticationService; import org.zowe.apiml.models.AccessTokenContainer; import org.zowe.apiml.security.common.token.AccessTokenProvider; import org.zowe.apiml.security.common.token.QueryResponse; +import org.zowe.apiml.zaas.cache.CachingServiceClient; +import org.zowe.apiml.zaas.cache.CachingServiceClientException; +import org.zowe.apiml.zaas.security.service.AuthenticationService; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; @@ -33,7 +33,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -85,7 +84,7 @@ public boolean isInvalidated(String token) throws CachingServiceClientException QueryResponse parsedToken = authenticationService.parseJwtWithSignature(token); String hashedToken = getHash(token); String hashedUserId = getHash(parsedToken.getUserId()); - List hashedServiceIds = parsedToken.getScopes().stream().map(this::getHash).collect(Collectors.toList()); + List hashedServiceIds = parsedToken.getScopes().stream().map(this::getHash).toList(); Map> cacheMap = cachingServiceClient.readAllMaps(); if (cacheMap != null && !cacheMap.isEmpty()) { @@ -93,11 +92,11 @@ public boolean isInvalidated(String token) throws CachingServiceClientException Map invalidUsers = cacheMap.get(INVALID_USERS_KEY); Map invalidScopes = cacheMap.get(INVALID_SCOPES_KEY); Optional isInvalidated = checkInvalidToken(invalidTokens, hashedToken); - if (!isInvalidated.isPresent()) { + if (isInvalidated.isEmpty()) { isInvalidated = checkRule(invalidUsers, hashedUserId, parsedToken); } for (String hashedServiceId : hashedServiceIds) { - if (!isInvalidated.isPresent()) { + if (isInvalidated.isEmpty()) { isInvalidated = checkRule(invalidScopes, hashedServiceId, parsedToken); } else { break; diff --git a/zaas-service/src/main/java/org/zowe/apiml/zaas/security/webfinger/StaticWebFingerProvider.java b/zaas-service/src/main/java/org/zowe/apiml/zaas/security/webfinger/StaticWebFingerProvider.java index a8b0352e0d..85fa01b5d5 100644 --- a/zaas-service/src/main/java/org/zowe/apiml/zaas/security/webfinger/StaticWebFingerProvider.java +++ b/zaas-service/src/main/java/org/zowe/apiml/zaas/security/webfinger/StaticWebFingerProvider.java @@ -20,7 +20,6 @@ import java.io.IOException; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; @RequiredArgsConstructor @Service @@ -44,14 +43,14 @@ public WebFingerResponse getWebFingerConfig(String clientId) throws IOException List clientConfig = webFingerProperties.getWebFinger().stream().filter(webFingerConfig -> webFingerConfig.getClientId().equalsIgnoreCase(clientId)) - .collect(Collectors.toList()); + .toList(); // update the response with stored configuration if any if (!clientConfig.isEmpty()) { List links = clientConfig.stream().map(webFingerConfig -> new WebFingerResponse.Link(webFingerConfig.getWellKnown())) - .collect(Collectors.toList()); + .toList(); response.setLinks(links); } return response; diff --git a/zaas-service/src/test/java/org/zowe/apiml/zaas/security/service/JwtSecurityTest.java b/zaas-service/src/test/java/org/zowe/apiml/zaas/security/service/JwtSecurityTest.java index 83c715667d..b5bff8960b 100644 --- a/zaas-service/src/test/java/org/zowe/apiml/zaas/security/service/JwtSecurityTest.java +++ b/zaas-service/src/test/java/org/zowe/apiml/zaas/security/service/JwtSecurityTest.java @@ -35,7 +35,7 @@ @ExtendWith(SpringExtension.class) class JwtSecurityTest { - public static final String keyAlias = "localhost"; + public static final String KEY_ALIAS = "localhost"; private JwtSecurity underTest; private Providers providers; @@ -54,7 +54,7 @@ void setUp() { class WhenInitializedWithValidJWT { @BeforeEach void setUp() { - underTest = new JwtSecurity(providers, keyAlias, "../keystore/localhost/localhost.keystore.p12", "password".toCharArray(), "password".toCharArray(), eurekaClient); + underTest = new JwtSecurity(providers, KEY_ALIAS, "../keystore/localhost/localhost.keystore.p12", "password".toCharArray(), "password".toCharArray(), eurekaClient); } @Test @@ -124,7 +124,7 @@ class WhenZosmfNotOnlineAndAvailableAtStart { @BeforeEach void setUp() { - underTest = new JwtSecurity(providers, keyAlias, "../keystore/localhost/localhost.keystore.p12", "password".toCharArray(), "password".toCharArray(), eurekaClient); + underTest = new JwtSecurity(providers, KEY_ALIAS, "../keystore/localhost/localhost.keystore.p12", "password".toCharArray(), "password".toCharArray(), eurekaClient); } @Test @@ -192,7 +192,7 @@ void givenCacheRefreshedEvents_thenCheckZosmfForEach() { class GetJwkPublicKey { @BeforeEach void setUp() { - underTest = new JwtSecurity(providers, keyAlias, "../keystore/localhost/localhost.keystore.p12", "password".toCharArray(), "password".toCharArray(), eurekaClient); + underTest = new JwtSecurity(providers, KEY_ALIAS, "../keystore/localhost/localhost.keystore.p12", "password".toCharArray(), "password".toCharArray(), eurekaClient); when(providers.isZosfmUsed()).thenReturn(false); }