From a2feaf9b65cbba66181fb560b5815a62427d65cc Mon Sep 17 00:00:00 2001 From: vasraz Date: Fri, 5 May 2023 11:57:56 +0100 Subject: Support SIP TLS Signed-off-by: Vasyl Razinkov Change-Id: Icbadd04cfa87302491c59f2e4a39ef92aaafcaa3 Issue-ID: SDC-4483 --- .../sdc/be/config/ConfigurationManager.java | 9 +- .../common/http/client/api/HttpClientFactory.java | 34 +++-- .../sdc/common/http/client/api/HttpResponse.java | 36 +----- .../sdc/common/listener/AppContextListener.java | 2 + .../ApacheClientLogRequestInterceptor.java | 63 --------- .../ApacheClientLogResponseInterceptor.java | 51 -------- .../org/openecomp/sdc/common/util/StreamUtils.java | 132 ------------------- .../sdc/fe/config/ConfigurationManager.java | 5 +- .../http/client/api/HttpClientFactoryTest.java | 16 +-- .../common/http/client/api/HttpResponseTest.java | 26 ++-- .../sdc/common/util/StreamUtilsTests.java | 142 --------------------- 11 files changed, 61 insertions(+), 455 deletions(-) delete mode 100644 common-app-api/src/main/java/org/openecomp/sdc/common/log/interceptors/ApacheClientLogRequestInterceptor.java delete mode 100644 common-app-api/src/main/java/org/openecomp/sdc/common/log/interceptors/ApacheClientLogResponseInterceptor.java delete mode 100644 common-app-api/src/main/java/org/openecomp/sdc/common/util/StreamUtils.java delete mode 100644 common-app-api/src/test/java/org/openecomp/sdc/common/util/StreamUtilsTests.java (limited to 'common-app-api/src') diff --git a/common-app-api/src/main/java/org/openecomp/sdc/be/config/ConfigurationManager.java b/common-app-api/src/main/java/org/openecomp/sdc/be/config/ConfigurationManager.java index 7241decd62..03cbc5952a 100644 --- a/common-app-api/src/main/java/org/openecomp/sdc/be/config/ConfigurationManager.java +++ b/common-app-api/src/main/java/org/openecomp/sdc/be/config/ConfigurationManager.java @@ -20,8 +20,6 @@ package org.openecomp.sdc.be.config; import com.google.common.annotations.VisibleForTesting; -import java.util.HashMap; -import java.util.Map; import org.openecomp.sdc.be.config.validation.ArtifactConfigValidator; import org.openecomp.sdc.common.api.ArtifactTypeEnum; import org.openecomp.sdc.common.api.BasicConfiguration; @@ -31,11 +29,14 @@ import org.openecomp.sdc.common.api.FileChangeCallback; import org.openecomp.sdc.common.config.EcompErrorConfiguration; import org.openecomp.sdc.common.config.IEcompConfigurationManager; +import java.util.HashMap; +import java.util.Map; + public class ConfigurationManager implements FileChangeCallback, IEcompConfigurationManager { private static ConfigurationManager instance; final Map configurations = new HashMap<>(); - ConfigurationSource configurationSource = null; + private ConfigurationSource configurationSource; @VisibleForTesting public ConfigurationManager() { @@ -67,7 +68,7 @@ public class ConfigurationManager implements FileChangeCallback, IEcompConfigura final Object configurationObj = configurations.get(getKey(Configuration.class)); if (configurationObj instanceof Configuration) { final ArtifactConfigValidator artifactConfigValidator = new ArtifactConfigValidator((Configuration) configurationObj, - ArtifactTypeEnum.getBaseArtifacts()); + ArtifactTypeEnum.getBaseArtifacts()); artifactConfigValidator.validate(); } } diff --git a/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpClientFactory.java b/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpClientFactory.java index d45deb328b..599c43ac67 100644 --- a/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpClientFactory.java +++ b/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpClientFactory.java @@ -23,15 +23,17 @@ import org.apache.http.client.HttpRequestRetryHandler; import org.apache.http.client.UserTokenHandler; import org.apache.http.client.config.RequestConfig; import org.apache.http.conn.HttpClientConnectionManager; -import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; +import org.onap.config.api.JettySSLUtils; import org.openecomp.sdc.common.api.Constants; import org.openecomp.sdc.common.http.config.ClientCertificate; -import org.openecomp.sdc.common.log.wrappers.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class HttpClientFactory { - private static final Logger logger = Logger.getLogger(HttpClientFactory.class.getName()); + private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientFactory.class); private static final UserTokenHandler userTokenHandler = context -> null; private final HttpConnectionMngFactory connectionMngFactory; @@ -40,13 +42,25 @@ public class HttpClientFactory { } HttpClient createClient(String protocol, HttpClientConfigImmutable config) { - logger.debug("Create {} client based on {}", protocol, config); - ClientCertificate clientCertificate = Constants.HTTPS.equals(protocol) ? config.getClientCertificate() : null; - HttpClientConnectionManager connectionManager = connectionMngFactory.getOrCreate(clientCertificate); - RequestConfig requestConfig = createClientTimeoutConfiguration(config); - CloseableHttpClient client = HttpClients.custom().setDefaultRequestConfig(requestConfig).setConnectionManager(connectionManager) - .setUserTokenHandler(userTokenHandler).setRetryHandler(resolveRetryHandler(config)).build(); - return new HttpClient(client, config); + LOGGER.debug("Create {} client based on {}", protocol, config); + final ClientCertificate clientCertificate = Constants.HTTPS.equals(protocol) ? config.getClientCertificate() : null; + final HttpClientConnectionManager connectionManager = connectionMngFactory.getOrCreate(clientCertificate); + final RequestConfig requestConfig = createClientTimeoutConfiguration(config); + + try { + final HttpClientBuilder httpClientBuilder = HttpClients.custom() + .setDefaultRequestConfig(requestConfig) + .setConnectionManager(connectionManager) + .setUserTokenHandler(userTokenHandler) + .setRetryHandler(resolveRetryHandler(config)); + if (clientCertificate != null) { + httpClientBuilder.setSSLContext(JettySSLUtils.getSslContext()); + } + return new HttpClient(httpClientBuilder.build(), config); + } catch (Exception e) { + LOGGER.error("Failed to createClient", e); + throw new RuntimeException(e); + } } private HttpRequestRetryHandler resolveRetryHandler(HttpClientConfigImmutable config) { diff --git a/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpResponse.java b/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpResponse.java index 573c97f130..bd5990eed5 100644 --- a/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpResponse.java +++ b/common-app-api/src/main/java/org/openecomp/sdc/common/http/client/api/HttpResponse.java @@ -19,8 +19,12 @@ */ package org.openecomp.sdc.common.http.client.api; +import lombok.AllArgsConstructor; +import lombok.Getter; import org.apache.commons.lang3.StringUtils; +@Getter +@AllArgsConstructor public class HttpResponse { private final T response; @@ -28,39 +32,11 @@ public class HttpResponse { private final String description; public HttpResponse(T response, int statusCode) { - this.response = response; - this.statusCode = statusCode; - this.description = StringUtils.EMPTY; - } - - public HttpResponse(T response, int statusCode, String description) { - this.response = response; - this.statusCode = statusCode; - this.description = description; - } - - public T getResponse() { - return response; - } - - public int getStatusCode() { - return statusCode; - } - - public String getDescription() { - return description; + this(response, statusCode, StringUtils.EMPTY); } @Override public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("HttpResponse [response="); - builder.append(response); - builder.append(", statusCode="); - builder.append(statusCode); - builder.append(", description="); - builder.append(description); - builder.append("]"); - return builder.toString(); + return "HttpResponse [response=" + response + ", statusCode=" + statusCode + ", description=" + description + "]"; } } diff --git a/common-app-api/src/main/java/org/openecomp/sdc/common/listener/AppContextListener.java b/common-app-api/src/main/java/org/openecomp/sdc/common/listener/AppContextListener.java index 70a94fd460..d85dab0db6 100644 --- a/common-app-api/src/main/java/org/openecomp/sdc/common/listener/AppContextListener.java +++ b/common-app-api/src/main/java/org/openecomp/sdc/common/listener/AppContextListener.java @@ -39,6 +39,7 @@ public class AppContextListener implements ServletContextListener { private static Logger log = Logger.getLogger(AppContextListener.class.getName()); + @Override public void contextInitialized(ServletContextEvent context) { log.debug("ServletContextListener initialized "); log.debug("After read values from Manifest {}", getManifestInfo(context.getServletContext())); @@ -57,6 +58,7 @@ public class AppContextListener implements ServletContextListener { ExternalConfiguration.listenForChanges(); } + @Override public void contextDestroyed(ServletContextEvent context) { log.debug("ServletContextListener destroyed"); ExternalConfiguration.stopListenForFileChanges(); diff --git a/common-app-api/src/main/java/org/openecomp/sdc/common/log/interceptors/ApacheClientLogRequestInterceptor.java b/common-app-api/src/main/java/org/openecomp/sdc/common/log/interceptors/ApacheClientLogRequestInterceptor.java deleted file mode 100644 index 82bf295762..0000000000 --- a/common-app-api/src/main/java/org/openecomp/sdc/common/log/interceptors/ApacheClientLogRequestInterceptor.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.openecomp.sdc.common.log.interceptors; - -import java.io.IOException; -import java.net.URI; -import org.apache.http.HttpException; -import org.apache.http.HttpMessage; -import org.apache.http.HttpRequest; -import org.apache.http.HttpRequestInterceptor; -import org.apache.http.HttpResponse; -import org.apache.http.protocol.HttpContext; -import org.onap.logging.filter.base.AbstractMetricLogFilter; -import org.onap.logging.ref.slf4j.ONAPLogConstants; -import org.openecomp.sdc.common.log.elements.LogFieldsMdcHandler; - -public class ApacheClientLogRequestInterceptor extends AbstractMetricLogFilter implements - HttpRequestInterceptor { - - private String previousInvocationId; - - @Override - protected void addHeader(HttpMessage httpMessage, String s, String s1) { - httpMessage.addHeader(s, s1); - } - - @Override - protected String getTargetServiceName(HttpRequest httpRequest) { - return httpRequest.getRequestLine().getUri(); - } - - @Override - protected String getServiceName(HttpRequest httpRequest) { - return URI.create(httpRequest.getRequestLine().getUri()).getPath(); - } - - @Override - protected int getHttpStatusCode(HttpResponse httpResponse) { - return httpResponse.getStatusLine().getStatusCode(); - } - - @Override - protected String getResponseCode(HttpResponse httpResponse) { - return String.valueOf(httpResponse.getStatusLine().getStatusCode()); - } - - @Override - protected String getTargetEntity(HttpRequest httpRequest) { - //fallback to default value that provided by AbstractMetricLogFilter - return null; - } - - @Override - protected void additionalPre(HttpRequest httpRequest, HttpMessage httpMessage) { - String outgoingInvocationId = httpMessage.getFirstHeader(ONAPLogConstants.Headers.INVOCATION_ID).getValue(); - LogFieldsMdcHandler.getInstance().setOutgoingInvocationId(outgoingInvocationId); - LogFieldsMdcHandler.getInstance().setKeyInvocationId(previousInvocationId); - } - - @Override - public void process(HttpRequest httpRequest, HttpContext httpContext) throws HttpException, IOException { - previousInvocationId = LogFieldsMdcHandler.getInstance().getKeyInvocationId(); - super.pre(httpRequest, httpRequest); - } -} diff --git a/common-app-api/src/main/java/org/openecomp/sdc/common/log/interceptors/ApacheClientLogResponseInterceptor.java b/common-app-api/src/main/java/org/openecomp/sdc/common/log/interceptors/ApacheClientLogResponseInterceptor.java deleted file mode 100644 index 26c7c2540b..0000000000 --- a/common-app-api/src/main/java/org/openecomp/sdc/common/log/interceptors/ApacheClientLogResponseInterceptor.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.openecomp.sdc.common.log.interceptors; - -import java.io.IOException; -import java.net.URI; -import org.apache.http.HttpException; -import org.apache.http.HttpMessage; -import org.apache.http.HttpRequest; -import org.apache.http.HttpResponse; -import org.apache.http.HttpResponseInterceptor; -import org.apache.http.protocol.HttpContext; -import org.onap.logging.filter.base.AbstractMetricLogFilter; - -public class ApacheClientLogResponseInterceptor extends AbstractMetricLogFilter implements - HttpResponseInterceptor { - - @Override - protected void addHeader(HttpMessage httpMessage, String s, String s1) { - httpMessage.addHeader(s, s1); - } - - @Override - protected String getTargetServiceName(HttpRequest httpRequest) { - return httpRequest.getRequestLine().getUri(); - } - - @Override - protected String getServiceName(HttpRequest httpRequest) { - return URI.create(httpRequest.getRequestLine().getUri()).getPath(); - } - - @Override - protected int getHttpStatusCode(HttpResponse httpResponse) { - return httpResponse.getStatusLine().getStatusCode(); - } - - @Override - protected String getResponseCode(HttpResponse httpResponse) { - return String.valueOf(httpResponse.getStatusLine().getStatusCode()); - } - - @Override - protected String getTargetEntity(HttpRequest httpRequest) { - //fallback to default value that provided by AbstractMetricLogFilter - return null; - } - - @Override - public void process(HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException { - super.post(null, httpResponse); - } -} diff --git a/common-app-api/src/main/java/org/openecomp/sdc/common/util/StreamUtils.java b/common-app-api/src/main/java/org/openecomp/sdc/common/util/StreamUtils.java deleted file mode 100644 index 37769fbaef..0000000000 --- a/common-app-api/src/main/java/org/openecomp/sdc/common/util/StreamUtils.java +++ /dev/null @@ -1,132 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ -package org.openecomp.sdc.common.util; - -import java.util.ArrayList; -import java.util.List; -import java.util.Spliterator; -import java.util.Spliterators.AbstractSpliterator; -import java.util.function.Consumer; -import java.util.function.Predicate; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -/** - * Utility Class For Actions On Streams - * - * @author mshitrit - */ -public final class StreamUtils { - - private StreamUtils() { - throw new UnsupportedOperationException(); - } - - /** - * Breaks the stream when the predicate is not met.
Does not evaluate elements after the stream breaks.
This method evaluates the - * stream.
- * - * @param stream - * @param predicate - * @return - */ - public static Stream takeWhilePlusOneNoEval(Stream stream, Predicate predicate) { - List results = new ArrayList<>(); - Consumer listAdder = results::add; - stream.map(e -> { - listAdder.accept(e); - return e; - }).filter(e -> !predicate.test(e)).findFirst(); - return results.stream(); - } - - public static Stream takeWhile(Stream stream, Predicate predicate) { - return StreamSupport.stream(takeWhile(stream.spliterator(), predicate), false); - } - - public static Stream takeWhilePlusOne(Stream stream, Predicate predicate) { - return StreamSupport.stream(takeWhile(stream.spliterator(), new StopAfterFailPredicate<>(predicate)), false); - } - - private static Spliterator takeWhile(Spliterator splitr, Predicate predicate) { - return new MySplitIterator<>(splitr, predicate); - } - - public static class MySplitIterator extends AbstractSpliterator implements Spliterator { - - boolean stillGoing = true; - private Spliterator innerItr; - private Predicate innerPred; - - private MySplitIterator(Spliterator splitItr, Predicate pred) { - super(splitItr.estimateSize(), 0); - innerItr = splitItr; - innerPred = pred; - } - - @Override - public boolean tryAdvance(Consumer action) { - boolean canAdvance = true; - if (stillGoing) { - stillGoing = innerItr.tryAdvance(createConsumerWrapper(action)); - } else { - canAdvance = false; - } - return canAdvance; - } - - private Consumer createConsumerWrapper(Consumer action) { - return new Consumer() { - @Override - public void accept(T t) { - stillGoing = innerPred.test(t); - if (stillGoing) { - action.accept(t); - } - } - }; - } - } - - public static class StopAfterFailPredicate implements Predicate { - - boolean hasNotFailed; - Predicate innerPredicate; - - private StopAfterFailPredicate(Predicate pred) { - hasNotFailed = true; - innerPredicate = pred; - } - - ; - - @Override - public boolean test(T t) { - boolean isPassed; - if (hasNotFailed) { - isPassed = true; - hasNotFailed = innerPredicate.test(t); - } else { - isPassed = false; - } - return isPassed; - } - } -} diff --git a/common-app-api/src/main/java/org/openecomp/sdc/fe/config/ConfigurationManager.java b/common-app-api/src/main/java/org/openecomp/sdc/fe/config/ConfigurationManager.java index 0d5cf62cb1..798bacf9a3 100644 --- a/common-app-api/src/main/java/org/openecomp/sdc/fe/config/ConfigurationManager.java +++ b/common-app-api/src/main/java/org/openecomp/sdc/fe/config/ConfigurationManager.java @@ -34,8 +34,8 @@ public class ConfigurationManager implements FileChangeCallback, IEcompConfigura private static final Logger log = Logger.getLogger(ConfigurationManager.class.getName()); private static ConfigurationManager instance; - ConfigurationSource configurationSource = null; - Map configurations = new HashMap<>(); + private final ConfigurationSource configurationSource; + private final Map configurations = new HashMap<>(); public ConfigurationManager(ConfigurationSource configurationSource) { super(); @@ -101,6 +101,7 @@ public class ConfigurationManager implements FileChangeCallback, IEcompConfigura return (Configuration) configurations.get(getKey(Configuration.class)); } + @Override public void reconfigure(BasicConfiguration obj) { // diff --git a/common-app-api/src/test/java/org/openecomp/sdc/common/http/client/api/HttpClientFactoryTest.java b/common-app-api/src/test/java/org/openecomp/sdc/common/http/client/api/HttpClientFactoryTest.java index 4958202811..feb49d0cc8 100644 --- a/common-app-api/src/test/java/org/openecomp/sdc/common/http/client/api/HttpClientFactoryTest.java +++ b/common-app-api/src/test/java/org/openecomp/sdc/common/http/client/api/HttpClientFactoryTest.java @@ -20,11 +20,11 @@ package org.openecomp.sdc.common.http.client.api; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.onap.sdc.security.SecurityUtil; import org.openecomp.sdc.common.http.config.BasicAuthorization; import org.openecomp.sdc.common.http.config.ClientCertificate; @@ -36,15 +36,15 @@ import java.util.Map; import static junit.framework.TestCase.assertNotNull; -@RunWith(MockitoJUnitRunner.class) -public class HttpClientFactoryTest { +@ExtendWith(MockitoExtension.class) +class HttpClientFactoryTest { @Mock - HttpConnectionMngFactory httpConnectionMngFactory; + private HttpConnectionMngFactory httpConnectionMngFactory; @Test - public void validateNewClientCreationReturnsValidClient() throws HttpExecuteException { - HttpClient httpClient = new HttpClientFactory(httpConnectionMngFactory).createClient("Http",prepareTestClientConfigImmutable()); + void validateNewClientCreationReturnsValidClient() { + final HttpClient httpClient = new HttpClientFactory(httpConnectionMngFactory).createClient("Http", prepareTestClientConfigImmutable()); assertNotNull(httpClient); httpClient.close(); } diff --git a/common-app-api/src/test/java/org/openecomp/sdc/common/http/client/api/HttpResponseTest.java b/common-app-api/src/test/java/org/openecomp/sdc/common/http/client/api/HttpResponseTest.java index d96f071e3c..85246a1b45 100644 --- a/common-app-api/src/test/java/org/openecomp/sdc/common/http/client/api/HttpResponseTest.java +++ b/common-app-api/src/test/java/org/openecomp/sdc/common/http/client/api/HttpResponseTest.java @@ -21,38 +21,38 @@ package org.openecomp.sdc.common.http.client.api; import org.apache.http.HttpStatus; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; -public class HttpResponseTest { +class HttpResponseTest { @Test - public void validateNoDescriptionConstructor() { + void validateNoDescriptionConstructor() { final String testResponse = "test response"; HttpResponse httpResponseTest = new HttpResponse<>(testResponse, HttpStatus.SC_OK); - assertEquals(httpResponseTest.getStatusCode(),HttpStatus.SC_OK); - assertEquals(httpResponseTest.getResponse(),testResponse); - assertEquals(httpResponseTest.getDescription(),""); + assertEquals(httpResponseTest.getStatusCode(), HttpStatus.SC_OK); + assertEquals(httpResponseTest.getResponse(), testResponse); + assertEquals(httpResponseTest.getDescription(), ""); } @Test - public void validateAllArgsConstructor() { + void validateAllArgsConstructor() { final String testResponse = "test response"; final String testDescription = "test description"; HttpResponse httpResponseTest = new HttpResponse<>(testResponse, HttpStatus.SC_OK, testDescription); - assertEquals(httpResponseTest.getStatusCode(),HttpStatus.SC_OK); - assertEquals(httpResponseTest.getResponse(),testResponse); - assertEquals(httpResponseTest.getDescription(),testDescription); + assertEquals(httpResponseTest.getStatusCode(), HttpStatus.SC_OK); + assertEquals(httpResponseTest.getResponse(), testResponse); + assertEquals(httpResponseTest.getDescription(), testDescription); } @Test - public void validateToStringConstructor() { + void validateToStringConstructor() { final String testResponse = "test response"; final String testDescription = "test description"; diff --git a/common-app-api/src/test/java/org/openecomp/sdc/common/util/StreamUtilsTests.java b/common-app-api/src/test/java/org/openecomp/sdc/common/util/StreamUtilsTests.java deleted file mode 100644 index 5ee8f42b6b..0000000000 --- a/common-app-api/src/test/java/org/openecomp/sdc/common/util/StreamUtilsTests.java +++ /dev/null @@ -1,142 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.openecomp.sdc.common.util; - -import fj.data.Either; -import static org.junit.Assert.assertEquals; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.junit.Assert.assertTrue; - -public class StreamUtilsTests { - @Test - public void testTakeWhilePredicateNotMet() { - List> list = buildListWith10Integers(); - - assertEquals(10, StreamUtils.takeWhile(list.stream(), Either::isLeft).count()); - } - - @Test - public void testTakeWhilePredicateIsMet() { - List> list = buildListWith10Integers(); - addToBooleansToList(list); - - final Stream> takeWhileStream = StreamUtils.takeWhile(list.stream(), Either::isLeft); - assertEquals(0, takeWhileStream.filter(Either::isRight).count()); - } - - @Test - public void testTakeErrorEvalOnlyOnce() { - List bucket = new ArrayList<>(); - // API - Function> cons = num -> { - Either ret; - bucket.add(num); - if (num > 5) { - ret = Either.right(false); - } else { - ret = Either.left(num); - } - ; - return ret; - }; - - List num1to10 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); - Stream> streamEithers = num1to10.stream().map(cons::apply); - List> collect = StreamUtils.takeWhilePlusOneNoEval(streamEithers, Either::isLeft) - .collect(Collectors.toList()); - assertTrue(bucket.size() <= 6); - assertTrue(collect.size() <= 6); - assertEquals(1, collect.stream().filter(Either::isRight).count()); - - } - - @Test - public void testTakeWhilePlusOnePredicateNotMet() { - List> list = buildListWith10Integers(); - - assertEquals(10, StreamUtils.takeWhilePlusOne(list.stream(), Either::isLeft).count()); - } - - @Test - public void testTakeWhilePlusOnePredicateIsMet() { - List> list = buildListWith10Integers(); - addToBooleansToList(list); - - final Stream> takeWhilePlusOneStream = StreamUtils.takeWhilePlusOne(list.stream(), - Either::isLeft); - assertEquals(1, takeWhilePlusOneStream.filter(Either::isRight).count()); - } - - private void addToBooleansToList(List> list) { - list.add(Either.right(false)); - list.add(Either.right(false)); - } - - private List> buildListWith10Integers() { - List> list = new ArrayList<>(); - for (int i = 0; i < 10; i++) { - list.add(Either.left(i)); - } - return list; - } - - @Test - public void myTest() { - List list = new ArrayList<>(); - for (int i = 0; i < 10; i++) { - list.add(i); - } - - List> container = new ArrayList<>(); - list.stream().map(e -> myBusinessLogic(e, container)).filter(Either::isRight).findAny(); - // Actual Results are in container - assertEquals(6, container.size()); - - } - - private Either myBusinessLogic(int e, List> cobtainerList) { - Either eitherElement = similuteDBAccess(e); - // Keep The results in external List - cobtainerList.add(eitherElement); - - return eitherElement; - } - - private Either similuteDBAccess(int e) { - Either eitherElement; - if (e < 5) { - // DB Success - eitherElement = Either.left(e); - } else { - // DB Fail - eitherElement = Either.right(true); - } - return eitherElement; - } -} -- cgit 1.2.3-korg