From 9e058472ffe05a7186550d24b94b0b7fd7b194ec Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Tue, 23 May 2023 10:19:52 -0300 Subject: [PATCH 1/8] [SDKS-7028] Add gzip decompression and logic to use it --- .../engine/sse/NotificationParserImp.java | 16 ++++++----- .../dtos/FeatureFlagChangeNotification.java | 27 ++++++++++++++++--- .../engine/sse/dtos/RawAuthResponse.java | 2 +- .../engine/sse/utils/DecompressionUtil.java | 23 +++++++++++++++- .../engine/sse/NotificationParserImpTest.java | 13 ++++++--- .../engine/sse/NotificationParserTest.java | 11 ++++++-- .../engine/sse/NotificationProcessorTest.java | 12 +++++++-- .../sse/utils/DecompressionUtilTest.java | 15 ++++++++++- 8 files changed, 99 insertions(+), 20 deletions(-) diff --git a/client/src/main/java/io/split/engine/sse/NotificationParserImp.java b/client/src/main/java/io/split/engine/sse/NotificationParserImp.java index 6197b9d4f..e5fee7502 100644 --- a/client/src/main/java/io/split/engine/sse/NotificationParserImp.java +++ b/client/src/main/java/io/split/engine/sse/NotificationParserImp.java @@ -1,7 +1,16 @@ package io.split.engine.sse; import io.split.client.utils.Json; -import io.split.engine.sse.dtos.*; + +import io.split.engine.sse.dtos.ControlNotification; +import io.split.engine.sse.dtos.ErrorNotification; +import io.split.engine.sse.dtos.FeatureFlagChangeNotification; +import io.split.engine.sse.dtos.GenericNotificationData; +import io.split.engine.sse.dtos.IncomingNotification; +import io.split.engine.sse.dtos.OccupancyNotification; +import io.split.engine.sse.dtos.RawMessageNotification; +import io.split.engine.sse.dtos.SegmentChangeNotification; +import io.split.engine.sse.dtos.SplitKillNotification; import io.split.engine.sse.exceptions.EventParsingException; public class NotificationParserImp implements NotificationParser { @@ -13,11 +22,9 @@ public IncomingNotification parseMessage(String payload) throws EventParsingExce RawMessageNotification rawMessageNotification = Json.fromJson(payload, RawMessageNotification.class); GenericNotificationData genericNotificationData = Json.fromJson(rawMessageNotification.getData(), GenericNotificationData.class); genericNotificationData.setChannel(rawMessageNotification.getChannel()); - if (rawMessageNotification.getChannel().contains(OCCUPANCY_PREFIX)) { return parseControlChannelMessage(genericNotificationData); } - return parseNotification(genericNotificationData); } catch (Exception ex) { throw new EventParsingException("Error parsing event.", ex, payload); @@ -28,11 +35,9 @@ public IncomingNotification parseMessage(String payload) throws EventParsingExce public ErrorNotification parseError(String payload) throws EventParsingException { try { ErrorNotification messageError = Json.fromJson(payload, ErrorNotification.class); - if (messageError.getMessage() == null || messageError.getStatusCode() == null) { throw new Exception("Wrong notification format."); } - return messageError; } catch (Exception ex) { throw new EventParsingException("Error parsing event.", ex, payload); @@ -59,7 +64,6 @@ private IncomingNotification parseControlChannelMessage(GenericNotificationData if (genericNotificationData.getControlType() != null) { return new ControlNotification(genericNotificationData); } - return new OccupancyNotification(genericNotificationData); } } \ No newline at end of file diff --git a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java index 496c066f4..f9b0e468b 100644 --- a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java +++ b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java @@ -1,23 +1,42 @@ package io.split.engine.sse.dtos; +import io.split.client.dtos.Split; +import io.split.client.utils.Json; import io.split.engine.sse.NotificationProcessor; import io.split.engine.sse.enums.CompressType; +import java.io.UnsupportedEncodingException; +import java.util.Base64; + +import static io.split.engine.sse.utils.DecompressionUtil.gZipDecompress; +import static io.split.engine.sse.utils.DecompressionUtil.zLibDecompress; + public class FeatureFlagChangeNotification extends IncomingNotification { private final long changeNumber; private long previousChangeNumber; - private String featureFlagDefinition; + private Split featureFlagDefinition; private CompressType compressType; - public FeatureFlagChangeNotification(GenericNotificationData genericNotificationData) { + public FeatureFlagChangeNotification(GenericNotificationData genericNotificationData) throws UnsupportedEncodingException { super(Type.SPLIT_UPDATE, genericNotificationData.getChannel()); changeNumber = genericNotificationData.getChangeNumber(); if(genericNotificationData.getPreviousChangeNumber() != null) { previousChangeNumber = genericNotificationData.getPreviousChangeNumber(); } - featureFlagDefinition = genericNotificationData.getFeatureFlagDefinition(); compressType = CompressType.from(genericNotificationData.getCompressType()); + if (compressType != null && genericNotificationData.getFeatureFlagDefinition() != null) { + byte[] decodedBytes = Base64.getDecoder().decode(genericNotificationData.getFeatureFlagDefinition()); + switch (compressType) { + case GZIP: + decodedBytes = gZipDecompress(decodedBytes); + break; + case ZLIB: + decodedBytes = zLibDecompress(decodedBytes); + break; + } + featureFlagDefinition = Json.fromJson(new String(decodedBytes, 0, decodedBytes.length, "UTF-8"),Split.class); + } } public long getChangeNumber() { @@ -27,7 +46,7 @@ public long getPreviousChangeNumber() { return previousChangeNumber; } - public String getFeatureFlagDefinition() { + public Split getFeatureFlagDefinition() { return featureFlagDefinition; } diff --git a/client/src/main/java/io/split/engine/sse/dtos/RawAuthResponse.java b/client/src/main/java/io/split/engine/sse/dtos/RawAuthResponse.java index 4e0026420..4082aac72 100644 --- a/client/src/main/java/io/split/engine/sse/dtos/RawAuthResponse.java +++ b/client/src/main/java/io/split/engine/sse/dtos/RawAuthResponse.java @@ -60,4 +60,4 @@ private String addPrefixControlChannels(String channels) { .replace("control_pri", "[?occupancy=metrics.publishers]control_pri") .replace("control_sec", "[?occupancy=metrics.publishers]control_sec"); } -} +} \ No newline at end of file diff --git a/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java b/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java index b73f776ae..3b80543fc 100644 --- a/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java +++ b/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java @@ -1,12 +1,15 @@ package io.split.engine.sse.utils; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.zip.DataFormatException; +import java.util.zip.GZIPInputStream; import java.util.zip.Inflater; public class DecompressionUtil { - public static byte[] zLibDecompress(byte[] toDecompress){ + public static byte[] zLibDecompress(byte[] toDecompress) { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(toDecompress.length); Inflater decompressor = new Inflater(); try { @@ -23,4 +26,22 @@ public static byte[] zLibDecompress(byte[] toDecompress){ } return byteArrayOutputStream.toByteArray(); } + + public static byte[] gZipDecompress(byte[] toDecompress) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(toDecompress)); + int res = 0; + byte buf[] = new byte[toDecompress.length]; + while (res >= 0) { + res = gzipInputStream.read(buf, 0, buf.length); + if (res > 0) { + out.write(buf, 0, res); + } + } + } catch(IOException e){ + throw new RuntimeException(e); + } + return out.toByteArray(); + } } \ No newline at end of file diff --git a/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java b/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java index c67a0c429..cd57e56ac 100644 --- a/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java +++ b/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java @@ -3,6 +3,7 @@ import io.split.engine.sse.dtos.FeatureFlagChangeNotification; import io.split.engine.sse.enums.CompressType; import io.split.engine.sse.exceptions.EventParsingException; + import org.junit.Assert; import org.junit.Test; @@ -14,26 +15,32 @@ public void validateZlibCompressType() throws EventParsingException { NotificationParserImp notificationParserImp = new NotificationParserImp(); FeatureFlagChangeNotification incomingNotification = (FeatureFlagChangeNotification) notificationParserImp.parseMessage(payload); + Assert.assertEquals(incomingNotification.getFeatureFlagDefinition().name, "mauro_java"); + Assert.assertEquals(incomingNotification.getFeatureFlagDefinition().changeNumber, 1684265694505L); Assert.assertEquals(CompressType.ZLIB, incomingNotification.getCompressType()); Assert.assertEquals(0, incomingNotification.getPreviousChangeNumber()); } @Test public void validateGzipCompressType() throws EventParsingException { - String payload = "{\"id\":\"vQQ61wzBRO:0:0\",\"clientId\":\"pri:MTUxNzg3MDg1OQ==\",\"timestamp\":1684265694676,\"encoding\":\"json\",\"channel\":\"NzM2MDI5Mzc0_MjkyNTIzNjczMw==_splits\",\"data\":\"{\\\"type\\\":\\\"SPLIT_UPDATE\\\",\\\"changeNumber\\\":1684265694505,\\\"pcn\\\":0,\\\"c\\\":1,\\\"d\\\":\\\"eJzMk99u2kwQxV8lOtdryQZj8N6hD5QPlThSTVNVEUKDPYZt1jZar1OlyO9emf8lVFWv2ss5zJyd82O8hTWUZSqZvW04opwhUVdsIKBSSKR+10vS1HWW7pIdz2NyBjRwHS8IXEopTLgbQqDYT+ZUm3LxlV4J4mg81LpMyKqygPRc94YeM6eQTtjphp4fegLVXvD6Qdjt9wPXF6gs2bqCxPC/2eRpDIEXpXXblpGuWCDljGptZ4bJ5lxYSJRZBoFkTcWKozpfsoH0goHfCXpB6PfcngDpVQnZEUjKIlOr2uwWqiC3zU5L1aF+3p7LFhUkPv8/mY2nk3gGgZxssmZzb8p6A9n25ktVtA9iGI3ODXunQ3HDp+AVWT6F+rZWlrWq7MN+YkSWWvuTDvkMSnNV7J6oTdl6qKTEvGnmjcCGjL2IYC/ovPYgUKnvvPtbmrmApiVryLM7p2jE++AfH6fTx09/HvuF32LWnNjStM0Xh3c8ukZcsZlEi3h8/zCObsBpJ0acqYLTmFdtqitK1V6NzrfpdPBbLmVx4uK26e27izpDu/r5yf/16AXun2Cr4u6w591xw7+LfDidLj6Mv8TXwP8xbofv/c7UmtHMmx8BAAD//0fclvU=\\\"}\"}"; + String payload = "{\"id\":\"vQQ61wzBRO:0:0\",\"clientId\":\"pri:MTUxNzg3MDg1OQ==\",\"timestamp\":1684265694676,\"encoding\":\"json\",\"channel\":\"NzM2MDI5Mzc0_MjkyNTIzNjczMw==_splits\",\"data\":\"{\\\"type\\\":\\\"SPLIT_UPDATE\\\",\\\"changeNumber\\\":1684265694505,\\\"pcn\\\":0,\\\"c\\\":1,\\\"d\\\":\\\"H4sIAAAAAAAA/8yT327aTBDFXyU612vJxoTgvUMfKB8qcaSapqoihAZ7DNusvWi9TpUiv3tl/pdQVb1qL+cwc3bOj/EGzlKeq3T6tuaYCoZEXbGFgMogkXXDIM0y31v4C/aCgMnrU9/3gl7Pp4yilMMIAuVusqDamvlXeiWIg/FAa5OSU6aEDHz/ip4wZ5Be1AmjoBsFAtVOCO56UXh31/O7ApUjV1eQGPw3HT+NIPCitG7bctIVC2ScU63d1DK5gksHCZPnEEhXVC45rosFW8ig1++GYej3g85tJEB6aSA7Aqkpc7Ws7XahCnLTbLVM7evnzalsUUHi8//j6WgyTqYQKMilK7b31tRryLa3WKiyfRCDeHhq2Dntiys+JS/J8THUt5VyrFXlHnYTQ3LU2h91yGdQVqhy+0RtTeuhUoNZ08wagTVZdxbBndF5vYVApb7z9m9pZgKaFqwhT+6coRHvg398nEweP/157Bd+S1hz6oxtm88O73B0jbhgM47nyej+YRRfgdNODDlXJWcJL9tUF5SqnRqfbtPr4LdcTHnk4rfp3buLOkG7+Pmp++vRM9w/wVblzX7Pm8OGfxf5YDKZfxh9SS6B/2Pc9t/7ja01o5k1PwIAAP//uTipVskEAAA=\\\"}\"}"; NotificationParserImp notificationParserImp = new NotificationParserImp(); FeatureFlagChangeNotification incomingNotification = (FeatureFlagChangeNotification) notificationParserImp.parseMessage(payload); + Assert.assertEquals(incomingNotification.getFeatureFlagDefinition().name, "mauro_java"); + Assert.assertEquals(incomingNotification.getFeatureFlagDefinition().changeNumber, 1684333081259L); Assert.assertEquals(CompressType.GZIP, incomingNotification.getCompressType()); Assert.assertEquals(0, incomingNotification.getPreviousChangeNumber()); } @Test public void validateNotCompressType() throws EventParsingException { - String payload = "{\"id\":\"vQQ61wzBRO:0:0\",\"clientId\":\"pri:MTUxNzg3MDg1OQ==\",\"timestamp\":1684265694676,\"encoding\":\"json\",\"channel\":\"NzM2MDI5Mzc0_MjkyNTIzNjczMw==_splits\",\"data\":\"{\\\"type\\\":\\\"SPLIT_UPDATE\\\",\\\"changeNumber\\\":1684265694505,\\\"pcn\\\":0,\\\"c\\\":0,\\\"d\\\":\\\"eJzMk99u2kwQxV8lOtdryQZj8N6hD5QPlThSTVNVEUKDPYZt1jZar1OlyO9emf8lVFWv2ss5zJyd82O8hTWUZSqZvW04opwhUVdsIKBSSKR+10vS1HWW7pIdz2NyBjRwHS8IXEopTLgbQqDYT+ZUm3LxlV4J4mg81LpMyKqygPRc94YeM6eQTtjphp4fegLVXvD6Qdjt9wPXF6gs2bqCxPC/2eRpDIEXpXXblpGuWCDljGptZ4bJ5lxYSJRZBoFkTcWKozpfsoH0goHfCXpB6PfcngDpVQnZEUjKIlOr2uwWqiC3zU5L1aF+3p7LFhUkPv8/mY2nk3gGgZxssmZzb8p6A9n25ktVtA9iGI3ODXunQ3HDp+AVWT6F+rZWlrWq7MN+YkSWWvuTDvkMSnNV7J6oTdl6qKTEvGnmjcCGjL2IYC/ovPYgUKnvvPtbmrmApiVryLM7p2jE++AfH6fTx09/HvuF32LWnNjStM0Xh3c8ukZcsZlEi3h8/zCObsBpJ0acqYLTmFdtqitK1V6NzrfpdPBbLmVx4uK26e27izpDu/r5yf/16AXun2Cr4u6w591xw7+LfDidLj6Mv8TXwP8xbofv/c7UmtHMmx8BAAD//0fclvU=\\\"}\"}"; - NotificationParserImp notificationParserImp = new NotificationParserImp(); + String payload = "{\"id\":\"vQQ61wzBRO:0:0\",\"clientId\":\"pri:MTUxNzg3MDg1OQ==\",\"timestamp\":1684265694676,\"encoding\":\"json\",\"channel\":\"NzM2MDI5Mzc0_MjkyNTIzNjczMw==_splits\",\"data\":\"{\\\"type\\\":\\\"SPLIT_UPDATE\\\",\\\"changeNumber\\\":1684329854385,\\\"pcn\\\":0,\\\"c\\\":0,\\\"d\\\":\\\"eyJ0cmFmZmljVHlwZU5hbWUiOiJ1c2VyIiwiaWQiOiJkNDMxY2RkMC1iMGJlLTExZWEtOGE4MC0xNjYwYWRhOWNlMzkiLCJuYW1lIjoibWF1cm9famF2YSIsInRyYWZmaWNBbGxvY2F0aW9uIjoxMDAsInRyYWZmaWNBbGxvY2F0aW9uU2VlZCI6LTkyMzkxNDkxLCJzZWVkIjotMTc2OTM3NzYwNCwic3RhdHVzIjoiQUNUSVZFIiwia2lsbGVkIjpmYWxzZSwiZGVmYXVsdFRyZWF0bWVudCI6Im9mZiIsImNoYW5nZU51bWJlciI6MTY4NDMyOTg1NDM4NSwiYWxnbyI6MiwiY29uZmlndXJhdGlvbnMiOnt9LCJjb25kaXRpb25zIjpbeyJjb25kaXRpb25UeXBlIjoiV0hJVEVMSVNUIiwibWF0Y2hlckdyb3VwIjp7ImNvbWJpbmVyIjoiQU5EIiwibWF0Y2hlcnMiOlt7Im1hdGNoZXJUeXBlIjoiV0hJVEVMSVNUIiwibmVnYXRlIjpmYWxzZSwid2hpdGVsaXN0TWF0Y2hlckRhdGEiOnsid2hpdGVsaXN0IjpbImFkbWluIiwibWF1cm8iLCJuaWNvIl19fV19LCJwYXJ0aXRpb25zIjpbeyJ0cmVhdG1lbnQiOiJvZmYiLCJzaXplIjoxMDB9XSwibGFiZWwiOiJ3aGl0ZWxpc3RlZCJ9LHsiY29uZGl0aW9uVHlwZSI6IlJPTExPVVQiLCJtYXRjaGVyR3JvdXAiOnsiY29tYmluZXIiOiJBTkQiLCJtYXRjaGVycyI6W3sia2V5U2VsZWN0b3IiOnsidHJhZmZpY1R5cGUiOiJ1c2VyIn0sIm1hdGNoZXJUeXBlIjoiSU5fU0VHTUVOVCIsIm5lZ2F0ZSI6ZmFsc2UsInVzZXJEZWZpbmVkU2VnbWVudE1hdGNoZXJEYXRhIjp7InNlZ21lbnROYW1lIjoibWF1ci0yIn19XX0sInBhcnRpdGlvbnMiOlt7InRyZWF0bWVudCI6Im9uIiwic2l6ZSI6MH0seyJ0cmVhdG1lbnQiOiJvZmYiLCJzaXplIjoxMDB9LHsidHJlYXRtZW50IjoiVjQiLCJzaXplIjowfSx7InRyZWF0bWVudCI6InY1Iiwic2l6ZSI6MH1dLCJsYWJlbCI6ImluIHNlZ21lbnQgbWF1ci0yIn0seyJjb25kaXRpb25UeXBlIjoiUk9MTE9VVCIsIm1hdGNoZXJHcm91cCI6eyJjb21iaW5lciI6IkFORCIsIm1hdGNoZXJzIjpbeyJrZXlTZWxlY3RvciI6eyJ0cmFmZmljVHlwZSI6InVzZXIifSwibWF0Y2hlclR5cGUiOiJBTExfS0VZUyIsIm5lZ2F0ZSI6ZmFsc2V9XX0sInBhcnRpdGlvbnMiOlt7InRyZWF0bWVudCI6Im9uIiwic2l6ZSI6MH0seyJ0cmVhdG1lbnQiOiJvZmYiLCJzaXplIjoxMDB9LHsidHJlYXRtZW50IjoiVjQiLCJzaXplIjowfSx7InRyZWF0bWVudCI6InY1Iiwic2l6ZSI6MH1dLCJsYWJlbCI6ImRlZmF1bHQgcnVsZSJ9XX0=\\\"}\"}"; + NotificationParserImp notificationParserImp = new NotificationParserImp(); FeatureFlagChangeNotification incomingNotification = (FeatureFlagChangeNotification) notificationParserImp.parseMessage(payload); + Assert.assertEquals(incomingNotification.getFeatureFlagDefinition().name, "mauro_java"); + Assert.assertEquals(incomingNotification.getFeatureFlagDefinition().changeNumber, 1684329854385L); Assert.assertEquals(CompressType.NOT_COMPRESSED, incomingNotification.getCompressType()); Assert.assertEquals(0, incomingNotification.getPreviousChangeNumber()); } diff --git a/client/src/test/java/io/split/engine/sse/NotificationParserTest.java b/client/src/test/java/io/split/engine/sse/NotificationParserTest.java index 43bfbb7eb..26f9e1997 100644 --- a/client/src/test/java/io/split/engine/sse/NotificationParserTest.java +++ b/client/src/test/java/io/split/engine/sse/NotificationParserTest.java @@ -1,11 +1,18 @@ package io.split.engine.sse; -import io.split.engine.sse.dtos.*; +import io.split.engine.sse.dtos.ControlNotification; +import io.split.engine.sse.dtos.ControlType; +import io.split.engine.sse.dtos.ErrorNotification; +import io.split.engine.sse.dtos.FeatureFlagChangeNotification; +import io.split.engine.sse.dtos.IncomingNotification; +import io.split.engine.sse.dtos.OccupancyNotification; +import io.split.engine.sse.dtos.SegmentChangeNotification; +import io.split.engine.sse.dtos.SplitKillNotification; import io.split.engine.sse.exceptions.EventParsingException; import org.junit.Before; import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; public class NotificationParserTest { private NotificationParser notificationParser; diff --git a/client/src/test/java/io/split/engine/sse/NotificationProcessorTest.java b/client/src/test/java/io/split/engine/sse/NotificationProcessorTest.java index 3e34cc757..99aef62c5 100644 --- a/client/src/test/java/io/split/engine/sse/NotificationProcessorTest.java +++ b/client/src/test/java/io/split/engine/sse/NotificationProcessorTest.java @@ -1,6 +1,12 @@ package io.split.engine.sse; -import io.split.engine.sse.dtos.*; +import io.split.engine.sse.dtos.ControlNotification; +import io.split.engine.sse.dtos.FeatureFlagChangeNotification; +import io.split.engine.sse.dtos.GenericNotificationData; +import io.split.engine.sse.dtos.OccupancyNotification; +import io.split.engine.sse.dtos.SegmentChangeNotification; +import io.split.engine.sse.dtos.SegmentQueueDto; +import io.split.engine.sse.dtos.SplitKillNotification; import io.split.engine.sse.workers.SegmentsWorkerImp; import io.split.engine.sse.workers.SplitsWorker; import io.split.engine.sse.workers.Worker; @@ -8,6 +14,8 @@ import org.junit.Test; import org.mockito.Mockito; +import java.io.UnsupportedEncodingException; + public class NotificationProcessorTest { private SplitsWorker _splitsWorker; private Worker _segmentWorker; @@ -24,7 +32,7 @@ public void setUp() { } @Test - public void processSplitUpdateAddToQueueInWorker() { + public void processSplitUpdateAddToQueueInWorker() throws UnsupportedEncodingException { long changeNumber = 1585867723838L; String channel = "splits"; GenericNotificationData genericNotificationData = new GenericNotificationData(changeNumber, null, null, null, null, null, null, channel, null, null, null); diff --git a/client/src/test/java/io/split/engine/sse/utils/DecompressionUtilTest.java b/client/src/test/java/io/split/engine/sse/utils/DecompressionUtilTest.java index 24313453d..5e210ac95 100644 --- a/client/src/test/java/io/split/engine/sse/utils/DecompressionUtilTest.java +++ b/client/src/test/java/io/split/engine/sse/utils/DecompressionUtilTest.java @@ -6,6 +6,9 @@ import java.io.UnsupportedEncodingException; import java.util.Base64; +import static io.split.engine.sse.utils.DecompressionUtil.gZipDecompress; +import static io.split.engine.sse.utils.DecompressionUtil.zLibDecompress; + public class DecompressionUtilTest { @@ -14,8 +17,18 @@ public void testZLibDecompress() throws UnsupportedEncodingException { String toDecode = "eJzMk99u2kwQxV8lOtdryQZj8N6hD5QPlThSTVNVEUKDPYZt1jZar1OlyO9emf8lVFWv2ss5zJyd82O8hTWUZSqZvW04opwhUVdsIKBSSKR+10vS1HWW7pIdz2NyBjRwHS8IXEopTLgbQqDYT+ZUm3LxlV4J4mg81LpMyKqygPRc94YeM6eQTtjphp4fegLVXvD6Qdjt9wPXF6gs2bqCxPC/2eRpDIEXpXXblpGuWCDljGptZ4bJ5lxYSJRZBoFkTcWKozpfsoH0goHfCXpB6PfcngDpVQnZEUjKIlOr2uwWqiC3zU5L1aF+3p7LFhUkPv8/mY2nk3gGgZxssmZzb8p6A9n25ktVtA9iGI3ODXunQ3HDp+AVWT6F+rZWlrWq7MN+YkSWWvuTDvkMSnNV7J6oTdl6qKTEvGnmjcCGjL2IYC/ovPYgUKnvvPtbmrmApiVryLM7p2jE++AfH6fTx09/HvuF32LWnNjStM0Xh3c8ukZcsZlEi3h8/zCObsBpJ0acqYLTmFdtqitK1V6NzrfpdPBbLmVx4uK26e27izpDu/r5yf/16AXun2Cr4u6w591xw7+LfDidLj6Mv8TXwP8xbofv/c7UmtHMmx8BAAD//0fclvU="; byte[] decodedBytes = Base64.getDecoder().decode(toDecode); - byte[] decompressFeatureFlag = DecompressionUtil.zLibDecompress(decodedBytes); + byte[] decompressFeatureFlag = zLibDecompress(decodedBytes); String featureFlag = new String(decompressFeatureFlag, 0, decompressFeatureFlag.length, "UTF-8"); Assert.assertEquals("{\"trafficTypeName\":\"user\",\"id\":\"d431cdd0-b0be-11ea-8a80-1660ada9ce39\",\"name\":\"mauro_java\",\"trafficAllocation\":100,\"trafficAllocationSeed\":-92391491,\"seed\":-1769377604,\"status\":\"ACTIVE\",\"killed\":false,\"defaultTreatment\":\"off\",\"changeNumber\":1684265694505,\"algo\":2,\"configurations\":{},\"conditions\":[{\"conditionType\":\"WHITELIST\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"matcherType\":\"WHITELIST\",\"negate\":false,\"whitelistMatcherData\":{\"whitelist\":[\"admin\",\"mauro\",\"nico\"]}}]},\"partitions\":[{\"treatment\":\"v5\",\"size\":100}],\"label\":\"whitelisted\"},{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\"},\"matcherType\":\"IN_SEGMENT\",\"negate\":false,\"userDefinedSegmentMatcherData\":{\"segmentName\":\"maur-2\"}}]},\"partitions\":[{\"treatment\":\"on\",\"size\":0},{\"treatment\":\"off\",\"size\":100},{\"treatment\":\"V4\",\"size\":0},{\"treatment\":\"v5\",\"size\":0}],\"label\":\"in segment maur-2\"},{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\"},\"matcherType\":\"ALL_KEYS\",\"negate\":false}]},\"partitions\":[{\"treatment\":\"on\",\"size\":0},{\"treatment\":\"off\",\"size\":100},{\"treatment\":\"V4\",\"size\":0},{\"treatment\":\"v5\",\"size\":0}],\"label\":\"default rule\"}]}", featureFlag); } + + @Test + public void testGZipDecompress() throws UnsupportedEncodingException { + String toDecode = "H4sIAAAAAAAA/8yT327aTBDFXyU612vJxoTgvUMfKB8qcaSapqoihAZ7DNusvWi9TpUiv3tl/pdQVb1qL+cwc3bOj/EGzlKeq3T6tuaYCoZEXbGFgMogkXXDIM0y31v4C/aCgMnrU9/3gl7Pp4yilMMIAuVusqDamvlXeiWIg/FAa5OSU6aEDHz/ip4wZ5Be1AmjoBsFAtVOCO56UXh31/O7ApUjV1eQGPw3HT+NIPCitG7bctIVC2ScU63d1DK5gksHCZPnEEhXVC45rosFW8ig1++GYej3g85tJEB6aSA7Aqkpc7Ws7XahCnLTbLVM7evnzalsUUHi8//j6WgyTqYQKMilK7b31tRryLa3WKiyfRCDeHhq2Dntiys+JS/J8THUt5VyrFXlHnYTQ3LU2h91yGdQVqhy+0RtTeuhUoNZ08wagTVZdxbBndF5vYVApb7z9m9pZgKaFqwhT+6coRHvg398nEweP/157Bd+S1hz6oxtm88O73B0jbhgM47nyej+YRRfgdNODDlXJWcJL9tUF5SqnRqfbtPr4LdcTHnk4rfp3buLOkG7+Pmp++vRM9w/wVblzX7Pm8OGfxf5YDKZfxh9SS6B/2Pc9t/7ja01o5k1PwIAAP//uTipVskEAAA="; + + byte[] decodedBytes = Base64.getDecoder().decode(toDecode); + byte[] decompressFeatureFlag = gZipDecompress(decodedBytes); + String featureFlag = new String(decompressFeatureFlag, 0, decompressFeatureFlag.length, "UTF-8"); + Assert.assertEquals("{\"trafficTypeName\":\"user\",\"id\":\"d431cdd0-b0be-11ea-8a80-1660ada9ce39\",\"name\":\"mauro_java\",\"trafficAllocation\":100,\"trafficAllocationSeed\":-92391491,\"seed\":-1769377604,\"status\":\"ACTIVE\",\"killed\":false,\"defaultTreatment\":\"off\",\"changeNumber\":1684333081259,\"algo\":2,\"configurations\":{},\"conditions\":[{\"conditionType\":\"WHITELIST\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"matcherType\":\"WHITELIST\",\"negate\":false,\"whitelistMatcherData\":{\"whitelist\":[\"admin\",\"mauro\",\"nico\"]}}]},\"partitions\":[{\"treatment\":\"v5\",\"size\":100}],\"label\":\"whitelisted\"},{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\"},\"matcherType\":\"IN_SEGMENT\",\"negate\":false,\"userDefinedSegmentMatcherData\":{\"segmentName\":\"maur-2\"}}]},\"partitions\":[{\"treatment\":\"on\",\"size\":0},{\"treatment\":\"off\",\"size\":100},{\"treatment\":\"V4\",\"size\":0},{\"treatment\":\"v5\",\"size\":0}],\"label\":\"in segment maur-2\"},{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\"},\"matcherType\":\"ALL_KEYS\",\"negate\":false}]},\"partitions\":[{\"treatment\":\"on\",\"size\":0},{\"treatment\":\"off\",\"size\":100},{\"treatment\":\"V4\",\"size\":0},{\"treatment\":\"v5\",\"size\":0}],\"label\":\"default rule\"}]}", featureFlag); + } } \ No newline at end of file From d99aaa73b297ad8b085e6236bcf2e2183cb6385b Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Tue, 23 May 2023 10:27:56 -0300 Subject: [PATCH 2/8] [SDKS-7028] Some checks --- .../io/split/engine/sse/dtos/FeatureFlagChangeNotification.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java index f9b0e468b..3d85b434e 100644 --- a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java +++ b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java @@ -35,7 +35,7 @@ public FeatureFlagChangeNotification(GenericNotificationData genericNotification decodedBytes = zLibDecompress(decodedBytes); break; } - featureFlagDefinition = Json.fromJson(new String(decodedBytes, 0, decodedBytes.length, "UTF-8"),Split.class); + featureFlagDefinition = Json.fromJson(new String(decodedBytes, 0, decodedBytes.length, "UTF-8"), Split.class); } } From 7f0fdadbe2509dbfa29dc54b84cee91465709a5c Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Tue, 23 May 2023 12:46:41 -0300 Subject: [PATCH 3/8] [SDKS-7028] Update FeatureFlagChangeNotification to log the exceptions --- .../dtos/FeatureFlagChangeNotification.java | 33 ++++++++++++------- .../engine/sse/NotificationParserImpTest.java | 2 ++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java index 3d85b434e..e6296450e 100644 --- a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java +++ b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java @@ -2,8 +2,11 @@ import io.split.client.dtos.Split; import io.split.client.utils.Json; +import io.split.engine.segments.SegmentSynchronizationTaskImp; import io.split.engine.sse.NotificationProcessor; import io.split.engine.sse.enums.CompressType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.UnsupportedEncodingException; import java.util.Base64; @@ -12,13 +15,13 @@ import static io.split.engine.sse.utils.DecompressionUtil.zLibDecompress; public class FeatureFlagChangeNotification extends IncomingNotification { + private static final Logger _log = LoggerFactory.getLogger(SegmentSynchronizationTaskImp.class); private final long changeNumber; private long previousChangeNumber; private Split featureFlagDefinition; private CompressType compressType; - - public FeatureFlagChangeNotification(GenericNotificationData genericNotificationData) throws UnsupportedEncodingException { + public FeatureFlagChangeNotification(GenericNotificationData genericNotificationData) { super(Type.SPLIT_UPDATE, genericNotificationData.getChannel()); changeNumber = genericNotificationData.getChangeNumber(); if(genericNotificationData.getPreviousChangeNumber() != null) { @@ -26,16 +29,24 @@ public FeatureFlagChangeNotification(GenericNotificationData genericNotification } compressType = CompressType.from(genericNotificationData.getCompressType()); if (compressType != null && genericNotificationData.getFeatureFlagDefinition() != null) { - byte[] decodedBytes = Base64.getDecoder().decode(genericNotificationData.getFeatureFlagDefinition()); - switch (compressType) { - case GZIP: - decodedBytes = gZipDecompress(decodedBytes); - break; - case ZLIB: - decodedBytes = zLibDecompress(decodedBytes); - break; + try { + byte[] decodedBytes = Base64.getDecoder().decode(genericNotificationData.getFeatureFlagDefinition()); + switch (compressType) { + case GZIP: + decodedBytes = gZipDecompress(decodedBytes); + break; + case ZLIB: + decodedBytes = zLibDecompress(decodedBytes); + break; + } + featureFlagDefinition = Json.fromJson(new String(decodedBytes, 0, decodedBytes.length, "UTF-8"), Split.class); + } catch (UnsupportedEncodingException e) { + _log.warn("Could not encode feature flag definition", e); + } catch (IllegalArgumentException e) { + _log.warn("Could not decode feature flag definition", e); + } catch (RuntimeException e) { + _log.warn("Could not decompress feature flag definition", e); } - featureFlagDefinition = Json.fromJson(new String(decodedBytes, 0, decodedBytes.length, "UTF-8"), Split.class); } } diff --git a/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java b/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java index cd57e56ac..60bf06fce 100644 --- a/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java +++ b/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java @@ -6,6 +6,8 @@ import org.junit.Assert; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class NotificationParserImpTest { From 07baebcd83163300033df6c35a884c04a87f1095 Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Tue, 23 May 2023 14:19:12 -0300 Subject: [PATCH 4/8] [SDKS-7028] Remove imports --- .../java/io/split/engine/sse/NotificationParserImpTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java b/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java index 60bf06fce..cd57e56ac 100644 --- a/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java +++ b/client/src/test/java/io/split/engine/sse/NotificationParserImpTest.java @@ -6,8 +6,6 @@ import org.junit.Assert; import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class NotificationParserImpTest { From 9fa3926139ed4cd20740fddc2916be63dd11d3fb Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Tue, 23 May 2023 15:17:17 -0300 Subject: [PATCH 5/8] [SDKS-7028] Pr suggestions --- .../sse/dtos/FeatureFlagChangeNotification.java | 16 ++++++++++------ .../engine/sse/utils/DecompressionUtil.java | 8 ++++---- .../engine/sse/utils/DecompressionUtilTest.java | 6 ++++-- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java index e6296450e..835b1d00f 100644 --- a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java +++ b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java @@ -8,8 +8,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Base64; +import java.util.zip.DataFormatException; import static io.split.engine.sse.utils.DecompressionUtil.gZipDecompress; import static io.split.engine.sse.utils.DecompressionUtil.zLibDecompress; @@ -40,12 +42,14 @@ public FeatureFlagChangeNotification(GenericNotificationData genericNotification break; } featureFlagDefinition = Json.fromJson(new String(decodedBytes, 0, decodedBytes.length, "UTF-8"), Split.class); - } catch (UnsupportedEncodingException e) { - _log.warn("Could not encode feature flag definition", e); - } catch (IllegalArgumentException e) { - _log.warn("Could not decode feature flag definition", e); - } catch (RuntimeException e) { - _log.warn("Could not decompress feature flag definition", e); + } catch (UnsupportedEncodingException u) { + _log.warn("Could not encode feature flag definition", u); + } catch (IllegalArgumentException i) { + _log.warn("Could not decode feature flag definition", i); + } catch (DataFormatException d) { + _log.warn("Could not decompress feature flag definition with zlib algorithm", d); + } catch (IOException i) { + _log.warn("Could not decompress feature flag definition with gzip algorithm", i); } } } diff --git a/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java b/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java index 3b80543fc..9748d6727 100644 --- a/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java +++ b/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java @@ -9,7 +9,7 @@ public class DecompressionUtil { - public static byte[] zLibDecompress(byte[] toDecompress) { + public static byte[] zLibDecompress(byte[] toDecompress) throws DataFormatException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(toDecompress.length); Inflater decompressor = new Inflater(); try { @@ -20,14 +20,14 @@ public static byte[] zLibDecompress(byte[] toDecompress) { byteArrayOutputStream.write(buf, 0, count); } } catch (DataFormatException e) { - throw new RuntimeException(e); + throw e; } finally { decompressor.end(); } return byteArrayOutputStream.toByteArray(); } - public static byte[] gZipDecompress(byte[] toDecompress) { + public static byte[] gZipDecompress(byte[] toDecompress) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(toDecompress)); @@ -40,7 +40,7 @@ public static byte[] gZipDecompress(byte[] toDecompress) { } } } catch(IOException e){ - throw new RuntimeException(e); + throw e; } return out.toByteArray(); } diff --git a/client/src/test/java/io/split/engine/sse/utils/DecompressionUtilTest.java b/client/src/test/java/io/split/engine/sse/utils/DecompressionUtilTest.java index 5e210ac95..bc62b431f 100644 --- a/client/src/test/java/io/split/engine/sse/utils/DecompressionUtilTest.java +++ b/client/src/test/java/io/split/engine/sse/utils/DecompressionUtilTest.java @@ -3,8 +3,10 @@ import org.junit.Assert; import org.junit.Test; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Base64; +import java.util.zip.DataFormatException; import static io.split.engine.sse.utils.DecompressionUtil.gZipDecompress; import static io.split.engine.sse.utils.DecompressionUtil.zLibDecompress; @@ -13,7 +15,7 @@ public class DecompressionUtilTest { @Test - public void testZLibDecompress() throws UnsupportedEncodingException { + public void testZLibDecompress() throws UnsupportedEncodingException, DataFormatException { String toDecode = "eJzMk99u2kwQxV8lOtdryQZj8N6hD5QPlThSTVNVEUKDPYZt1jZar1OlyO9emf8lVFWv2ss5zJyd82O8hTWUZSqZvW04opwhUVdsIKBSSKR+10vS1HWW7pIdz2NyBjRwHS8IXEopTLgbQqDYT+ZUm3LxlV4J4mg81LpMyKqygPRc94YeM6eQTtjphp4fegLVXvD6Qdjt9wPXF6gs2bqCxPC/2eRpDIEXpXXblpGuWCDljGptZ4bJ5lxYSJRZBoFkTcWKozpfsoH0goHfCXpB6PfcngDpVQnZEUjKIlOr2uwWqiC3zU5L1aF+3p7LFhUkPv8/mY2nk3gGgZxssmZzb8p6A9n25ktVtA9iGI3ODXunQ3HDp+AVWT6F+rZWlrWq7MN+YkSWWvuTDvkMSnNV7J6oTdl6qKTEvGnmjcCGjL2IYC/ovPYgUKnvvPtbmrmApiVryLM7p2jE++AfH6fTx09/HvuF32LWnNjStM0Xh3c8ukZcsZlEi3h8/zCObsBpJ0acqYLTmFdtqitK1V6NzrfpdPBbLmVx4uK26e27izpDu/r5yf/16AXun2Cr4u6w591xw7+LfDidLj6Mv8TXwP8xbofv/c7UmtHMmx8BAAD//0fclvU="; byte[] decodedBytes = Base64.getDecoder().decode(toDecode); @@ -23,7 +25,7 @@ public void testZLibDecompress() throws UnsupportedEncodingException { } @Test - public void testGZipDecompress() throws UnsupportedEncodingException { + public void testGZipDecompress() throws IOException { String toDecode = "H4sIAAAAAAAA/8yT327aTBDFXyU612vJxoTgvUMfKB8qcaSapqoihAZ7DNusvWi9TpUiv3tl/pdQVb1qL+cwc3bOj/EGzlKeq3T6tuaYCoZEXbGFgMogkXXDIM0y31v4C/aCgMnrU9/3gl7Pp4yilMMIAuVusqDamvlXeiWIg/FAa5OSU6aEDHz/ip4wZ5Be1AmjoBsFAtVOCO56UXh31/O7ApUjV1eQGPw3HT+NIPCitG7bctIVC2ScU63d1DK5gksHCZPnEEhXVC45rosFW8ig1++GYej3g85tJEB6aSA7Aqkpc7Ws7XahCnLTbLVM7evnzalsUUHi8//j6WgyTqYQKMilK7b31tRryLa3WKiyfRCDeHhq2Dntiys+JS/J8THUt5VyrFXlHnYTQ3LU2h91yGdQVqhy+0RtTeuhUoNZ08wagTVZdxbBndF5vYVApb7z9m9pZgKaFqwhT+6coRHvg398nEweP/157Bd+S1hz6oxtm88O73B0jbhgM47nyej+YRRfgdNODDlXJWcJL9tUF5SqnRqfbtPr4LdcTHnk4rfp3buLOkG7+Pmp++vRM9w/wVblzX7Pm8OGfxf5YDKZfxh9SS6B/2Pc9t/7ja01o5k1PwIAAP//uTipVskEAAA="; byte[] decodedBytes = Base64.getDecoder().decode(toDecode); From 9698840620cc0af567ddc8f57c27e8a94a6b2f9c Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Tue, 23 May 2023 17:02:52 -0300 Subject: [PATCH 6/8] [SDKS-7028] Update FFChangeNotification and DecompressionUtil --- .../dtos/FeatureFlagChangeNotification.java | 39 +++++++++---------- .../engine/sse/utils/DecompressionUtil.java | 7 +--- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java index 835b1d00f..39fba3870 100644 --- a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java +++ b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java @@ -30,27 +30,26 @@ public FeatureFlagChangeNotification(GenericNotificationData genericNotification previousChangeNumber = genericNotificationData.getPreviousChangeNumber(); } compressType = CompressType.from(genericNotificationData.getCompressType()); - if (compressType != null && genericNotificationData.getFeatureFlagDefinition() != null) { - try { - byte[] decodedBytes = Base64.getDecoder().decode(genericNotificationData.getFeatureFlagDefinition()); - switch (compressType) { - case GZIP: - decodedBytes = gZipDecompress(decodedBytes); - break; - case ZLIB: - decodedBytes = zLibDecompress(decodedBytes); - break; - } - featureFlagDefinition = Json.fromJson(new String(decodedBytes, 0, decodedBytes.length, "UTF-8"), Split.class); - } catch (UnsupportedEncodingException u) { - _log.warn("Could not encode feature flag definition", u); - } catch (IllegalArgumentException i) { - _log.warn("Could not decode feature flag definition", i); - } catch (DataFormatException d) { - _log.warn("Could not decompress feature flag definition with zlib algorithm", d); - } catch (IOException i) { - _log.warn("Could not decompress feature flag definition with gzip algorithm", i); + if (compressType == null || genericNotificationData.getFeatureFlagDefinition() == null) { + return; + } + try { + byte[] decodedBytes = Base64.getDecoder().decode(genericNotificationData.getFeatureFlagDefinition()); + switch (compressType) { + case GZIP: + decodedBytes = gZipDecompress(decodedBytes); + break; + case ZLIB: + decodedBytes = zLibDecompress(decodedBytes); + break; } + featureFlagDefinition = Json.fromJson(new String(decodedBytes, 0, decodedBytes.length, "UTF-8"), Split.class); + } catch (UnsupportedEncodingException | IllegalArgumentException e) { + _log.warn("Could not encode feature flag definition", e); + } catch (DataFormatException d) { + _log.warn("Could not decompress feature flag definition with zlib algorithm", d); + } catch (IOException i) { + _log.warn("Could not decompress feature flag definition with gzip algorithm", i); } } diff --git a/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java b/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java index 9748d6727..522425e45 100644 --- a/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java +++ b/client/src/main/java/io/split/engine/sse/utils/DecompressionUtil.java @@ -19,8 +19,6 @@ public static byte[] zLibDecompress(byte[] toDecompress) throws DataFormatExcept int count = decompressor.inflate(buf); byteArrayOutputStream.write(buf, 0, count); } - } catch (DataFormatException e) { - throw e; } finally { decompressor.end(); } @@ -29,8 +27,7 @@ public static byte[] zLibDecompress(byte[] toDecompress) throws DataFormatExcept public static byte[] gZipDecompress(byte[] toDecompress) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); - try { - GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(toDecompress)); + try (GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(toDecompress))){ int res = 0; byte buf[] = new byte[toDecompress.length]; while (res >= 0) { @@ -39,8 +36,6 @@ public static byte[] gZipDecompress(byte[] toDecompress) throws IOException { out.write(buf, 0, res); } } - } catch(IOException e){ - throw e; } return out.toByteArray(); } From 9a773dba35ebf0b4f70e76c6896dfe88bd44a6d2 Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Tue, 23 May 2023 17:11:45 -0300 Subject: [PATCH 7/8] [SDKS-7028] Update log message --- .../io/split/engine/sse/dtos/FeatureFlagChangeNotification.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java index 39fba3870..5f2060b85 100644 --- a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java +++ b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java @@ -45,7 +45,7 @@ public FeatureFlagChangeNotification(GenericNotificationData genericNotification } featureFlagDefinition = Json.fromJson(new String(decodedBytes, 0, decodedBytes.length, "UTF-8"), Split.class); } catch (UnsupportedEncodingException | IllegalArgumentException e) { - _log.warn("Could not encode feature flag definition", e); + _log.warn("Could not decode feature flag definition", e); } catch (DataFormatException d) { _log.warn("Could not decompress feature flag definition with zlib algorithm", d); } catch (IOException i) { From e85f4e5318f5eae0c4f6f76ad55ea6fa3c29e9da Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Tue, 23 May 2023 17:35:46 -0300 Subject: [PATCH 8/8] Update log message --- .../io/split/engine/sse/dtos/FeatureFlagChangeNotification.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java index 5f2060b85..108fbc016 100644 --- a/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java +++ b/client/src/main/java/io/split/engine/sse/dtos/FeatureFlagChangeNotification.java @@ -45,7 +45,7 @@ public FeatureFlagChangeNotification(GenericNotificationData genericNotification } featureFlagDefinition = Json.fromJson(new String(decodedBytes, 0, decodedBytes.length, "UTF-8"), Split.class); } catch (UnsupportedEncodingException | IllegalArgumentException e) { - _log.warn("Could not decode feature flag definition", e); + _log.warn("Could not decode base64 data in flag definition", e); } catch (DataFormatException d) { _log.warn("Could not decompress feature flag definition with zlib algorithm", d); } catch (IOException i) {