From e1a6d9cab76fd9475a603613493df73633d535f4 Mon Sep 17 00:00:00 2001 From: Lucas Echeverz Date: Tue, 12 Jan 2021 16:30:01 -0300 Subject: [PATCH 1/8] Creating FactoryInstantiationService --- .../java/io/split/client/SplitFactoryImpl.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/client/src/main/java/io/split/client/SplitFactoryImpl.java b/client/src/main/java/io/split/client/SplitFactoryImpl.java index f233c2113..efff85934 100644 --- a/client/src/main/java/io/split/client/SplitFactoryImpl.java +++ b/client/src/main/java/io/split/client/SplitFactoryImpl.java @@ -72,19 +72,7 @@ public class SplitFactoryImpl implements SplitFactory { public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyntaxException { _apiToken = apiToken; - if (USED_API_TOKENS.contains(apiToken)) { - String message = String.format("factory instantiation: You already have %s with this API Key. " + - "We recommend keeping only one instance of the factory at all times (Singleton pattern) and reusing " + - "it throughout your application.", - USED_API_TOKENS.count(apiToken) == 1 ? "1 factory" : String.format("%s factories", USED_API_TOKENS.count(apiToken))); - _log.warn(message); - } else if (!USED_API_TOKENS.isEmpty()) { - String message = "factory instantiation: You already have an instance of the Split factory. " + - "Make sure you definitely want this additional instance. We recommend keeping only one instance of " + - "the factory at all times (Singleton pattern) and reusing it throughout your application.“"; - _log.warn(message); - } - USED_API_TOKENS.add(apiToken); + FactoryInstantiationsService.getFactoryInstantiationsServiceInstance().addToken(apiToken); if (config.blockUntilReady() == -1) { //BlockUntilReady not been set @@ -209,7 +197,7 @@ public void destroy() { synchronized (SplitFactoryImpl.class) { if (!isTerminated) { destroyer.run(); - USED_API_TOKENS.remove(_apiToken); + FactoryInstantiationsService.getFactoryInstantiationsServiceInstance().removeToken(_apiToken); isTerminated = true; } } From 7d0699546d4a8ad24530f24444ca7b0993a873fe Mon Sep 17 00:00:00 2001 From: Lucas Echeverz Date: Tue, 12 Jan 2021 16:30:28 -0300 Subject: [PATCH 2/8] Adding files were forgotten in last commit --- .../client/FactoryInstantiationsService.java | 58 +++++++++++++++++++ .../FactoryInstantiationsServiceTest.java | 8 +++ 2 files changed, 66 insertions(+) create mode 100644 client/src/main/java/io/split/client/FactoryInstantiationsService.java create mode 100644 client/src/test/java/io/split/client/FactoryInstantiationsServiceTest.java diff --git a/client/src/main/java/io/split/client/FactoryInstantiationsService.java b/client/src/main/java/io/split/client/FactoryInstantiationsService.java new file mode 100644 index 000000000..167896dae --- /dev/null +++ b/client/src/main/java/io/split/client/FactoryInstantiationsService.java @@ -0,0 +1,58 @@ +package io.split.client; + +import com.google.common.collect.ConcurrentHashMultiset; +import com.google.common.collect.Multiset; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FactoryInstantiationsService { + + private static final Logger _log = LoggerFactory.getLogger(FactoryInstantiationsService.class); + private static volatile FactoryInstantiationsService _factoryInstantiationsService; + private static final Multiset USED_API_TOKENS = ConcurrentHashMultiset.create(); + + + private FactoryInstantiationsService() {} + + public static FactoryInstantiationsService getFactoryInstantiationsServiceInstance() { + if(_factoryInstantiationsService == null) { + synchronized (FactoryInstantiationsService.class) { + if (_factoryInstantiationsService == null) { + _factoryInstantiationsService = new FactoryInstantiationsService(); + } + } + } + + return _factoryInstantiationsService; + } + + public void addToken(String apiToken) { + String message; + if (USED_API_TOKENS.contains(apiToken)) { + message = String.format("factory instantiation: You already have %s with this API Key. " + + "We recommend keeping only one instance of the factory at all times (Singleton pattern) and reusing " + + "it throughout your application.", + USED_API_TOKENS.count(apiToken) == 1 ? "1 factory" : String.format("%s factories", USED_API_TOKENS.count(apiToken))); + _log.warn(message); + } else if (!USED_API_TOKENS.isEmpty()) { + message = "factory instantiation: You already have an instance of the Split factory. " + + "Make sure you definitely want this additional instance. We recommend keeping only one instance of " + + "the factory at all times (Singleton pattern) and reusing it throughout your application.“"; + _log.warn(message); + } + USED_API_TOKENS.add(apiToken); + } + + public void removeToken(String apiToken) { + USED_API_TOKENS.remove(apiToken); + } + + /** + * Just for test + * @param apiToken + * @return + */ + public boolean isTokenPresent(String apiToken){ + return USED_API_TOKENS.contains(apiToken); + } +} diff --git a/client/src/test/java/io/split/client/FactoryInstantiationsServiceTest.java b/client/src/test/java/io/split/client/FactoryInstantiationsServiceTest.java new file mode 100644 index 000000000..f4aad8478 --- /dev/null +++ b/client/src/test/java/io/split/client/FactoryInstantiationsServiceTest.java @@ -0,0 +1,8 @@ +package io.split.client; + +import junit.framework.TestCase; + +public class FactoryInstantiationsServiceTest extends TestCase { + + +} \ No newline at end of file From d61a8fb8511fa4eb670474e0d2a414f8a18422ea Mon Sep 17 00:00:00 2001 From: Lucas Echeverz Date: Tue, 12 Jan 2021 19:01:20 -0300 Subject: [PATCH 3/8] Final commit, editing name and adding some key words --- ...java => FactoryInstantiationsCounter.java} | 34 +++++++++---- .../io/split/client/SplitFactoryImpl.java | 11 ++-- .../FactoryInstantiationsCounterTest.java | 50 +++++++++++++++++++ .../FactoryInstantiationsServiceTest.java | 8 --- 4 files changed, 78 insertions(+), 25 deletions(-) rename client/src/main/java/io/split/client/{FactoryInstantiationsService.java => FactoryInstantiationsCounter.java} (65%) create mode 100644 client/src/test/java/io/split/client/FactoryInstantiationsCounterTest.java delete mode 100644 client/src/test/java/io/split/client/FactoryInstantiationsServiceTest.java diff --git a/client/src/main/java/io/split/client/FactoryInstantiationsService.java b/client/src/main/java/io/split/client/FactoryInstantiationsCounter.java similarity index 65% rename from client/src/main/java/io/split/client/FactoryInstantiationsService.java rename to client/src/main/java/io/split/client/FactoryInstantiationsCounter.java index 167896dae..80b6b07ed 100644 --- a/client/src/main/java/io/split/client/FactoryInstantiationsService.java +++ b/client/src/main/java/io/split/client/FactoryInstantiationsCounter.java @@ -1,29 +1,30 @@ package io.split.client; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ConcurrentHashMultiset; import com.google.common.collect.Multiset; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class FactoryInstantiationsService { +public class FactoryInstantiationsCounter { - private static final Logger _log = LoggerFactory.getLogger(FactoryInstantiationsService.class); - private static volatile FactoryInstantiationsService _factoryInstantiationsService; + private static final Logger _log = LoggerFactory.getLogger(FactoryInstantiationsCounter.class); + private static volatile FactoryInstantiationsCounter _factoryInstantiationsCounter; private static final Multiset USED_API_TOKENS = ConcurrentHashMultiset.create(); - private FactoryInstantiationsService() {} + private FactoryInstantiationsCounter() {} - public static FactoryInstantiationsService getFactoryInstantiationsServiceInstance() { - if(_factoryInstantiationsService == null) { - synchronized (FactoryInstantiationsService.class) { - if (_factoryInstantiationsService == null) { - _factoryInstantiationsService = new FactoryInstantiationsService(); + public static FactoryInstantiationsCounter getFactoryInstantiationsServiceInstance() { + if(_factoryInstantiationsCounter == null) { + synchronized (FactoryInstantiationsCounter.class) { + if (_factoryInstantiationsCounter == null) { + _factoryInstantiationsCounter = new FactoryInstantiationsCounter(); } } } - return _factoryInstantiationsService; + return _factoryInstantiationsCounter; } public void addToken(String apiToken) { @@ -52,7 +53,18 @@ public void removeToken(String apiToken) { * @param apiToken * @return */ - public boolean isTokenPresent(String apiToken){ + @VisibleForTesting + boolean isTokenPresent(String apiToken) { return USED_API_TOKENS.contains(apiToken); } + + /** + * Just for test + * @param apiToken + * @return + */ + @VisibleForTesting + int getCount(String apiToken) { + return USED_API_TOKENS.count(apiToken); + } } diff --git a/client/src/main/java/io/split/client/SplitFactoryImpl.java b/client/src/main/java/io/split/client/SplitFactoryImpl.java index 6b9ee3a14..31b274890 100644 --- a/client/src/main/java/io/split/client/SplitFactoryImpl.java +++ b/client/src/main/java/io/split/client/SplitFactoryImpl.java @@ -1,7 +1,5 @@ package io.split.client; -import com.google.common.collect.ConcurrentHashMultiset; -import com.google.common.collect.Multiset; import io.split.client.impressions.AsynchronousImpressionListener; import io.split.client.impressions.ImpressionListener; import io.split.client.impressions.ImpressionsManagerImpl; @@ -62,7 +60,6 @@ public class SplitFactoryImpl implements SplitFactory { private final static long SSE_CONNECT_TIMEOUT = 30000; private final static long SSE_SOCKET_TIMEOUT = 70000; - private static final Multiset USED_API_TOKENS = ConcurrentHashMultiset.create(); private static Random RANDOM = new Random(); private final SplitClient _client; @@ -70,11 +67,12 @@ public class SplitFactoryImpl implements SplitFactory { private final Runnable destroyer; private final String _apiToken; private boolean isTerminated = false; + private final FactoryInstantiationsCounter _factoryInstantiationsCounter; public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyntaxException { _apiToken = apiToken; - - FactoryInstantiationsService.getFactoryInstantiationsServiceInstance().addToken(apiToken); + _factoryInstantiationsCounter = FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance(); + _factoryInstantiationsCounter.addToken(apiToken); if (config.blockUntilReady() == -1) { //BlockUntilReady not been set @@ -202,7 +200,8 @@ public void destroy() { synchronized (SplitFactoryImpl.class) { if (!isTerminated) { destroyer.run(); - FactoryInstantiationsService.getFactoryInstantiationsServiceInstance().removeToken(_apiToken); + _factoryInstantiationsCounter.removeToken(_apiToken); + int i = FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().getCount(_apiToken); isTerminated = true; } } diff --git a/client/src/test/java/io/split/client/FactoryInstantiationsCounterTest.java b/client/src/test/java/io/split/client/FactoryInstantiationsCounterTest.java new file mode 100644 index 000000000..c69d0b592 --- /dev/null +++ b/client/src/test/java/io/split/client/FactoryInstantiationsCounterTest.java @@ -0,0 +1,50 @@ +package io.split.client; + +import junit.framework.TestCase; +import org.junit.Test; + +public class FactoryInstantiationsCounterTest extends TestCase { + + private static final String FIRST_TOKEN = "TOKENNUMBER1"; + private static final String SECOND_TOKEN = "TOKENNUMBER2"; + + @Test + public void testAddingNewToken() { + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(FIRST_TOKEN); + assertTrue(FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().isTokenPresent(FIRST_TOKEN)); + + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(FIRST_TOKEN); + } + + @Test + public void testAddingExistingToken() { + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(FIRST_TOKEN); + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(FIRST_TOKEN); + + assertTrue(FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().isTokenPresent(FIRST_TOKEN)); + assertEquals(2, FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().getCount(FIRST_TOKEN)); + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(FIRST_TOKEN); + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(FIRST_TOKEN); + } + + @Test + public void testRemovingToken() { + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(FIRST_TOKEN); + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(FIRST_TOKEN); + + assertFalse(FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().isTokenPresent(FIRST_TOKEN)); + assertEquals(0, FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().getCount(FIRST_TOKEN)); + } + + @Test + public void testAddingNonExistingToken() { + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(FIRST_TOKEN); + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(SECOND_TOKEN); + + assertTrue(FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().isTokenPresent(FIRST_TOKEN)); + assertEquals(1, FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().getCount(FIRST_TOKEN)); + assertEquals(1, FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().getCount(SECOND_TOKEN)); + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(FIRST_TOKEN); + FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(SECOND_TOKEN); + } +} diff --git a/client/src/test/java/io/split/client/FactoryInstantiationsServiceTest.java b/client/src/test/java/io/split/client/FactoryInstantiationsServiceTest.java deleted file mode 100644 index f4aad8478..000000000 --- a/client/src/test/java/io/split/client/FactoryInstantiationsServiceTest.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.split.client; - -import junit.framework.TestCase; - -public class FactoryInstantiationsServiceTest extends TestCase { - - -} \ No newline at end of file From df28d84c0825a16bba4437236e308cdf604bae4f Mon Sep 17 00:00:00 2001 From: Lucas Echeverz Date: Wed, 13 Jan 2021 10:55:54 -0300 Subject: [PATCH 4/8] Fixing PR comments --- .../java/io/split/client/ApiKeyCounter.java | 70 +++++++++++++++++++ .../client/FactoryInstantiationsCounter.java | 70 ------------------- .../io/split/client/SplitFactoryImpl.java | 9 ++- .../io/split/client/ApiKeyCounterTest.java | 50 +++++++++++++ .../FactoryInstantiationsCounterTest.java | 50 ------------- 5 files changed, 124 insertions(+), 125 deletions(-) create mode 100644 client/src/main/java/io/split/client/ApiKeyCounter.java delete mode 100644 client/src/main/java/io/split/client/FactoryInstantiationsCounter.java create mode 100644 client/src/test/java/io/split/client/ApiKeyCounterTest.java delete mode 100644 client/src/test/java/io/split/client/FactoryInstantiationsCounterTest.java diff --git a/client/src/main/java/io/split/client/ApiKeyCounter.java b/client/src/main/java/io/split/client/ApiKeyCounter.java new file mode 100644 index 000000000..ec8d23fa4 --- /dev/null +++ b/client/src/main/java/io/split/client/ApiKeyCounter.java @@ -0,0 +1,70 @@ +package io.split.client; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ConcurrentHashMultiset; +import com.google.common.collect.Multiset; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ApiKeyCounter { + + private static final Logger _log = LoggerFactory.getLogger(ApiKeyCounter.class); + private static volatile ApiKeyCounter _apiKeyCounter; + private static final Multiset USED_API_KEYS = ConcurrentHashMultiset.create(); + + + private ApiKeyCounter() {} + + public static ApiKeyCounter getApiKeyCounterInstance() { + if(_apiKeyCounter == null) { + synchronized (ApiKeyCounter.class) { + if (_apiKeyCounter == null) { + _apiKeyCounter = new ApiKeyCounter(); + } + } + } + + return _apiKeyCounter; + } + + public void add(String apiKey) { + String message; + if (USED_API_KEYS.contains(apiKey)) { + message = String.format("factory instantiation: You already have %s with this API Key. " + + "We recommend keeping only one instance of the factory at all times (Singleton pattern) and reusing " + + "it throughout your application.", + USED_API_KEYS.count(apiKey) == 1 ? "1 factory" : String.format("%s factories", USED_API_KEYS.count(apiKey))); + _log.warn(message); + } else if (!USED_API_KEYS.isEmpty()) { + message = "factory instantiation: You already have an instance of the Split factory. " + + "Make sure you definitely want this additional instance. We recommend keeping only one instance of " + + "the factory at all times (Singleton pattern) and reusing it throughout your application.“"; + _log.warn(message); + } + USED_API_KEYS.add(apiKey); + } + + public void remove(String apiKey) { + USED_API_KEYS.remove(apiKey); + } + + /** + * Just for test + * @param apiKey + * @return + */ + @VisibleForTesting + boolean isApiKeyPresent(String apiKey) { + return USED_API_KEYS.contains(apiKey); + } + + /** + * Just for test + * @param apiKey + * @return + */ + @VisibleForTesting + int getCount(String apiKey) { + return USED_API_KEYS.count(apiKey); + } +} diff --git a/client/src/main/java/io/split/client/FactoryInstantiationsCounter.java b/client/src/main/java/io/split/client/FactoryInstantiationsCounter.java deleted file mode 100644 index 80b6b07ed..000000000 --- a/client/src/main/java/io/split/client/FactoryInstantiationsCounter.java +++ /dev/null @@ -1,70 +0,0 @@ -package io.split.client; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ConcurrentHashMultiset; -import com.google.common.collect.Multiset; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class FactoryInstantiationsCounter { - - private static final Logger _log = LoggerFactory.getLogger(FactoryInstantiationsCounter.class); - private static volatile FactoryInstantiationsCounter _factoryInstantiationsCounter; - private static final Multiset USED_API_TOKENS = ConcurrentHashMultiset.create(); - - - private FactoryInstantiationsCounter() {} - - public static FactoryInstantiationsCounter getFactoryInstantiationsServiceInstance() { - if(_factoryInstantiationsCounter == null) { - synchronized (FactoryInstantiationsCounter.class) { - if (_factoryInstantiationsCounter == null) { - _factoryInstantiationsCounter = new FactoryInstantiationsCounter(); - } - } - } - - return _factoryInstantiationsCounter; - } - - public void addToken(String apiToken) { - String message; - if (USED_API_TOKENS.contains(apiToken)) { - message = String.format("factory instantiation: You already have %s with this API Key. " + - "We recommend keeping only one instance of the factory at all times (Singleton pattern) and reusing " + - "it throughout your application.", - USED_API_TOKENS.count(apiToken) == 1 ? "1 factory" : String.format("%s factories", USED_API_TOKENS.count(apiToken))); - _log.warn(message); - } else if (!USED_API_TOKENS.isEmpty()) { - message = "factory instantiation: You already have an instance of the Split factory. " + - "Make sure you definitely want this additional instance. We recommend keeping only one instance of " + - "the factory at all times (Singleton pattern) and reusing it throughout your application.“"; - _log.warn(message); - } - USED_API_TOKENS.add(apiToken); - } - - public void removeToken(String apiToken) { - USED_API_TOKENS.remove(apiToken); - } - - /** - * Just for test - * @param apiToken - * @return - */ - @VisibleForTesting - boolean isTokenPresent(String apiToken) { - return USED_API_TOKENS.contains(apiToken); - } - - /** - * Just for test - * @param apiToken - * @return - */ - @VisibleForTesting - int getCount(String apiToken) { - return USED_API_TOKENS.count(apiToken); - } -} diff --git a/client/src/main/java/io/split/client/SplitFactoryImpl.java b/client/src/main/java/io/split/client/SplitFactoryImpl.java index 31b274890..c521e6bae 100644 --- a/client/src/main/java/io/split/client/SplitFactoryImpl.java +++ b/client/src/main/java/io/split/client/SplitFactoryImpl.java @@ -67,12 +67,12 @@ public class SplitFactoryImpl implements SplitFactory { private final Runnable destroyer; private final String _apiToken; private boolean isTerminated = false; - private final FactoryInstantiationsCounter _factoryInstantiationsCounter; + private final ApiKeyCounter _apiKeyCounter; public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyntaxException { _apiToken = apiToken; - _factoryInstantiationsCounter = FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance(); - _factoryInstantiationsCounter.addToken(apiToken); + _apiKeyCounter = ApiKeyCounter.getApiKeyCounterInstance(); + _apiKeyCounter.add(apiToken); if (config.blockUntilReady() == -1) { //BlockUntilReady not been set @@ -200,8 +200,7 @@ public void destroy() { synchronized (SplitFactoryImpl.class) { if (!isTerminated) { destroyer.run(); - _factoryInstantiationsCounter.removeToken(_apiToken); - int i = FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().getCount(_apiToken); + _apiKeyCounter.remove(_apiToken); isTerminated = true; } } diff --git a/client/src/test/java/io/split/client/ApiKeyCounterTest.java b/client/src/test/java/io/split/client/ApiKeyCounterTest.java new file mode 100644 index 000000000..c017127ce --- /dev/null +++ b/client/src/test/java/io/split/client/ApiKeyCounterTest.java @@ -0,0 +1,50 @@ +package io.split.client; + +import junit.framework.TestCase; +import org.junit.Test; + +public class ApiKeyCounterTest extends TestCase { + + private static final String FIRST_KEY = "KEYNUMBER1"; + private static final String SECOND_KEY = "KEYNUMBER2"; + + @Test + public void testAddingNewToken() { + ApiKeyCounter.getApiKeyCounterInstance().add(FIRST_KEY); + assertTrue(ApiKeyCounter.getApiKeyCounterInstance().isApiKeyPresent(FIRST_KEY)); + + ApiKeyCounter.getApiKeyCounterInstance().remove(FIRST_KEY); + } + + @Test + public void testAddingExistingToken() { + ApiKeyCounter.getApiKeyCounterInstance().add(FIRST_KEY); + ApiKeyCounter.getApiKeyCounterInstance().add(FIRST_KEY); + + assertTrue(ApiKeyCounter.getApiKeyCounterInstance().isApiKeyPresent(FIRST_KEY)); + assertEquals(2, ApiKeyCounter.getApiKeyCounterInstance().getCount(FIRST_KEY)); + ApiKeyCounter.getApiKeyCounterInstance().remove(FIRST_KEY); + ApiKeyCounter.getApiKeyCounterInstance().remove(FIRST_KEY); + } + + @Test + public void testRemovingToken() { + ApiKeyCounter.getApiKeyCounterInstance().add(FIRST_KEY); + ApiKeyCounter.getApiKeyCounterInstance().remove(FIRST_KEY); + + assertFalse(ApiKeyCounter.getApiKeyCounterInstance().isApiKeyPresent(FIRST_KEY)); + assertEquals(0, ApiKeyCounter.getApiKeyCounterInstance().getCount(FIRST_KEY)); + } + + @Test + public void testAddingNonExistingToken() { + ApiKeyCounter.getApiKeyCounterInstance().add(FIRST_KEY); + ApiKeyCounter.getApiKeyCounterInstance().add(SECOND_KEY); + + assertTrue(ApiKeyCounter.getApiKeyCounterInstance().isApiKeyPresent(FIRST_KEY)); + assertEquals(1, ApiKeyCounter.getApiKeyCounterInstance().getCount(FIRST_KEY)); + assertEquals(1, ApiKeyCounter.getApiKeyCounterInstance().getCount(SECOND_KEY)); + ApiKeyCounter.getApiKeyCounterInstance().remove(FIRST_KEY); + ApiKeyCounter.getApiKeyCounterInstance().remove(SECOND_KEY); + } +} diff --git a/client/src/test/java/io/split/client/FactoryInstantiationsCounterTest.java b/client/src/test/java/io/split/client/FactoryInstantiationsCounterTest.java deleted file mode 100644 index c69d0b592..000000000 --- a/client/src/test/java/io/split/client/FactoryInstantiationsCounterTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.split.client; - -import junit.framework.TestCase; -import org.junit.Test; - -public class FactoryInstantiationsCounterTest extends TestCase { - - private static final String FIRST_TOKEN = "TOKENNUMBER1"; - private static final String SECOND_TOKEN = "TOKENNUMBER2"; - - @Test - public void testAddingNewToken() { - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(FIRST_TOKEN); - assertTrue(FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().isTokenPresent(FIRST_TOKEN)); - - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(FIRST_TOKEN); - } - - @Test - public void testAddingExistingToken() { - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(FIRST_TOKEN); - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(FIRST_TOKEN); - - assertTrue(FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().isTokenPresent(FIRST_TOKEN)); - assertEquals(2, FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().getCount(FIRST_TOKEN)); - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(FIRST_TOKEN); - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(FIRST_TOKEN); - } - - @Test - public void testRemovingToken() { - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(FIRST_TOKEN); - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(FIRST_TOKEN); - - assertFalse(FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().isTokenPresent(FIRST_TOKEN)); - assertEquals(0, FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().getCount(FIRST_TOKEN)); - } - - @Test - public void testAddingNonExistingToken() { - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(FIRST_TOKEN); - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().addToken(SECOND_TOKEN); - - assertTrue(FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().isTokenPresent(FIRST_TOKEN)); - assertEquals(1, FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().getCount(FIRST_TOKEN)); - assertEquals(1, FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().getCount(SECOND_TOKEN)); - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(FIRST_TOKEN); - FactoryInstantiationsCounter.getFactoryInstantiationsServiceInstance().removeToken(SECOND_TOKEN); - } -} From 97e604fe8e92c0dc0f18e93eff0b7ba98cd92eb1 Mon Sep 17 00:00:00 2001 From: Lucas Echeverz Date: Wed, 13 Jan 2021 11:55:29 -0300 Subject: [PATCH 5/8] Deleting 'volatile' --- client/src/main/java/io/split/client/ApiKeyCounter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/main/java/io/split/client/ApiKeyCounter.java b/client/src/main/java/io/split/client/ApiKeyCounter.java index ec8d23fa4..08516f3a7 100644 --- a/client/src/main/java/io/split/client/ApiKeyCounter.java +++ b/client/src/main/java/io/split/client/ApiKeyCounter.java @@ -9,7 +9,7 @@ public class ApiKeyCounter { private static final Logger _log = LoggerFactory.getLogger(ApiKeyCounter.class); - private static volatile ApiKeyCounter _apiKeyCounter; + private static ApiKeyCounter _apiKeyCounter; private static final Multiset USED_API_KEYS = ConcurrentHashMultiset.create(); From 86c473e1e7bb0e30d5598457364cd8ee8cb4ec7d Mon Sep 17 00:00:00 2001 From: Lucas Echeverz Date: Wed, 13 Jan 2021 14:26:10 -0300 Subject: [PATCH 6/8] Changing the way the getInstance is synchronized --- client/src/main/java/io/split/client/ApiKeyCounter.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/client/src/main/java/io/split/client/ApiKeyCounter.java b/client/src/main/java/io/split/client/ApiKeyCounter.java index 08516f3a7..9470a181b 100644 --- a/client/src/main/java/io/split/client/ApiKeyCounter.java +++ b/client/src/main/java/io/split/client/ApiKeyCounter.java @@ -15,13 +15,9 @@ public class ApiKeyCounter { private ApiKeyCounter() {} - public static ApiKeyCounter getApiKeyCounterInstance() { + public static synchronized ApiKeyCounter getApiKeyCounterInstance() { if(_apiKeyCounter == null) { - synchronized (ApiKeyCounter.class) { - if (_apiKeyCounter == null) { - _apiKeyCounter = new ApiKeyCounter(); - } - } + _apiKeyCounter = new ApiKeyCounter(); } return _apiKeyCounter; From e97c7cc1be2b7b4619befa01a25956b1f7a6e651 Mon Sep 17 00:00:00 2001 From: Lucas Echeverz Date: Wed, 13 Jan 2021 16:18:02 -0300 Subject: [PATCH 7/8] Changing the sinchronization. Last time --- .../main/java/io/split/client/ApiKeyCounter.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/client/src/main/java/io/split/client/ApiKeyCounter.java b/client/src/main/java/io/split/client/ApiKeyCounter.java index 9470a181b..27ba987fe 100644 --- a/client/src/main/java/io/split/client/ApiKeyCounter.java +++ b/client/src/main/java/io/split/client/ApiKeyCounter.java @@ -9,18 +9,19 @@ public class ApiKeyCounter { private static final Logger _log = LoggerFactory.getLogger(ApiKeyCounter.class); - private static ApiKeyCounter _apiKeyCounter; private static final Multiset USED_API_KEYS = ConcurrentHashMultiset.create(); private ApiKeyCounter() {} - public static synchronized ApiKeyCounter getApiKeyCounterInstance() { - if(_apiKeyCounter == null) { - _apiKeyCounter = new ApiKeyCounter(); - } + public static ApiKeyCounter getApiKeyCounterInstance() { + return ApyKeyCounterHolder.INSTANCE; + } - return _apiKeyCounter; + //Inner class to provide instance of class + private static class ApyKeyCounterHolder + { + private static final ApiKeyCounter INSTANCE = new ApiKeyCounter(); } public void add(String apiKey) { From 30d1a4c3095ffa09252455d780389e828273e781 Mon Sep 17 00:00:00 2001 From: Lucas Echeverz Date: Wed, 13 Jan 2021 16:25:20 -0300 Subject: [PATCH 8/8] Fix white space --- client/src/main/java/io/split/client/ApiKeyCounter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/main/java/io/split/client/ApiKeyCounter.java b/client/src/main/java/io/split/client/ApiKeyCounter.java index 27ba987fe..8c39394dd 100644 --- a/client/src/main/java/io/split/client/ApiKeyCounter.java +++ b/client/src/main/java/io/split/client/ApiKeyCounter.java @@ -11,7 +11,6 @@ public class ApiKeyCounter { private static final Logger _log = LoggerFactory.getLogger(ApiKeyCounter.class); private static final Multiset USED_API_KEYS = ConcurrentHashMultiset.create(); - private ApiKeyCounter() {} public static ApiKeyCounter getApiKeyCounterInstance() {