Skip to content

Commit e76f1cd

Browse files
Juan Pablo Diaz-VazJuan Pablo Diaz-Vaz
authored andcommitted
SUMOK-28 Added verification of JSON in transformer for Cloudwatch
1 parent c9d98e6 commit e76f1cd

5 files changed

Lines changed: 98 additions & 7 deletions

File tree

build.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<get src= "http://central.maven.org/maven2/org/apache/lucene/lucene-core/4.8.1/lucene-core-4.8.1.jar" dest="${external.dir}/lib" usetimestamp="true" verbose="true"/>
3434
<get src= "http://central.maven.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10.jar" dest="${external.dir}/lib" usetimestamp="true" verbose="true"/>
3535
<get src= "http://central.maven.org/maven2/com/ning/async-http-client/1.9.30/async-http-client-1.9.30.jar" dest="${external.dir}/lib" usetimestamp="true" verbose="true"/>
36+
<get src= "http://central.maven.org/maven2/com/google/code/gson/gson/2.3.1/gson-2.3.1.jar" dest="${external.dir}/lib" usetimestamp="true" verbose="true"/>
3637

3738
<get src= "https://hamcrest.googlecode.com/files/hamcrest-core-1.3.jar" dest="${external.dir}/lib" usetimestamp="true" verbose="true"/>
3839

src/main/java/com/sumologic/client/CloudWatchMessageModelSumologicTransformer.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import java.nio.charset.CharsetDecoder;
1818
import java.util.zip.GZIPInputStream;
1919

20+
import com.google.gson.Gson;
21+
2022
/**
2123
* A custom transfomer for {@link SimpleKinesisMessageModel} records in JSON format. The output is in a format
2224
* usable for insertions to Sumologic.
@@ -44,8 +46,14 @@ public SimpleKinesisMessageModel toClass(Record record) throws IOException {
4446
String stringifiedRecord = decompressGzip(decodedRecord);
4547

4648
if (stringifiedRecord == null) {
47-
LOG.error("Unable to decompress the record: "+new String(record.getData().array()));
48-
LOG.error("Not attempting to transform into a Message Model");
49+
LOG.error("Unable to decompress the record: "+new String(record.getData().array())
50+
+"\nNot attempting to transform into a Message Model");
51+
return null;
52+
}
53+
54+
if (!verifyJSON(stringifiedRecord)) {
55+
LOG.error("The record is not a valid JSON: "+stringifiedRecord
56+
+"\nNot attempting to transform into a Message Model");
4957
return null;
5058
}
5159

@@ -83,4 +91,14 @@ public static String byteBufferToString(ByteBuffer buffer){
8391
return data;
8492
}
8593

94+
private static final Gson gson = new Gson();
95+
public static boolean verifyJSON(String json) {
96+
try {
97+
gson.fromJson(json, Object.class);
98+
return true;
99+
} catch(com.google.gson.JsonSyntaxException ex) {
100+
return false;
101+
}
102+
}
103+
86104
}

src/main/java/com/sumologic/client/SumologicSender.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public boolean sendToSumologic(String data) throws IOException{
4848
BoundRequestBuilder builder = null;
4949
builder = this.clientPreparePost(url);
5050

51-
byte[] compressedData = compressGzip(data);
51+
byte[] compressedData = SumologicSender.compressGzip(data);
5252

5353
builder.setHeader("Content-Encoding", "gzip");
5454
builder.setBody(compressedData);
@@ -82,7 +82,7 @@ public boolean sendToSumologic(String data) throws IOException{
8282
}
8383
}
8484

85-
public byte[] compressGzip(String data) {
85+
public static byte[] compressGzip(String data) {
8686
if (data == null || data.length() == 0) {
8787
return null;
8888
}

src/test/java/com/sumologic/client/CloudWatchMessageModelSumologicTransformerTest.java

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class CloudWatchMessageModelSumologicTransformerTest {
2121
public static Charset charset = Charset.forName("UTF-8");
2222
public static CharsetEncoder encoder = charset.newEncoder();
2323

24+
@Ignore
2425
@Test
2526
public void theTransformerShouldFailGracefullyWhenUnableToTransform () {
2627
CloudWatchMessageModelSumologicTransformer transfomer = new CloudWatchMessageModelSumologicTransformer();
@@ -45,4 +46,77 @@ public void theTransformerShouldFailGracefullyWhenUnableToTransform () {
4546

4647
Assert.assertNull(messageModel);
4748
}
49+
50+
@Test
51+
public void theTransformerShouldSucceedWhenTransformingAProperJSON() {
52+
CloudWatchMessageModelSumologicTransformer transfomer = new CloudWatchMessageModelSumologicTransformer();
53+
54+
String jsonData = "["
55+
+"{"
56+
+ "\"id\": \"55b25585730b5e5bcd53c580\","
57+
+ "\"index\": 0,"
58+
+ "\"guid\": \"f3bf1c45-306d-4799-801f-c6d16acca931\","
59+
+ "\"isActive\": false,"
60+
+ "\"picture\": \"http://placehold.it/32x32\""
61+
+ "}"
62+
+"]";
63+
64+
byte[] compressData = SumologicSender.compressGzip(jsonData);
65+
66+
ByteBuffer bufferedData = null;
67+
try {
68+
bufferedData = ByteBuffer.wrap(compressData);
69+
} catch (Exception e) {
70+
Assert.fail("Getting error: "+e.getMessage());
71+
}
72+
73+
Record mockedRecord = new Record();
74+
mockedRecord.setData(bufferedData);
75+
76+
SimpleKinesisMessageModel messageModel = null;
77+
try {
78+
messageModel = transfomer.toClass(mockedRecord);
79+
} catch (IOException e) {
80+
Assert.fail("Getting error while transforming: "+e.getMessage());
81+
}
82+
83+
Assert.assertNotNull(messageModel);
84+
Assert.assertTrue(messageModel.getData().equals(jsonData));
85+
}
86+
87+
@Test
88+
public void theTransformerShouldSucceedWhenTransformingAJSONWithTrailingCommas() {
89+
CloudWatchMessageModelSumologicTransformer transfomer = new CloudWatchMessageModelSumologicTransformer();
90+
91+
String jsonData = "["
92+
+"{"
93+
+ "\"id\": \"55b25585730b5e5bcd53c580\","
94+
+ "\"index\": 0,"
95+
+ "\"guid\": \"f3bf1c45-306d-4799-801f-c6d16acca931\","
96+
+ "\"isActive\": false,"
97+
+ "\"picture\": \"http://placehold.it/32x32\","
98+
+ "}"
99+
+"]";
100+
101+
byte[] compressData = SumologicSender.compressGzip(jsonData);
102+
103+
ByteBuffer bufferedData = null;
104+
try {
105+
bufferedData = ByteBuffer.wrap(compressData);
106+
} catch (Exception e) {
107+
Assert.fail("Getting error: "+e.getMessage());
108+
}
109+
110+
Record mockedRecord = new Record();
111+
mockedRecord.setData(bufferedData);
112+
113+
SimpleKinesisMessageModel messageModel = null;
114+
try {
115+
messageModel = transfomer.toClass(mockedRecord);
116+
} catch (IOException e) {
117+
Assert.fail("Getting error while transforming: "+e.getMessage());
118+
}
119+
120+
Assert.assertNull(messageModel);
121+
}
48122
}

src/test/java/com/sumologic/client/SumologicSenderTest.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,7 @@ public void decompressGzipTest() {
7474

7575
String data = "a string of characters";
7676

77-
SumologicSender sender = new SumologicSender(url);
78-
79-
byte[] compressData = sender.compressGzip(data);
77+
byte[] compressData = SumologicSender.compressGzip(data);
8078
String result = CloudWatchMessageModelSumologicTransformer.decompressGzip(compressData);
8179

8280
Assert.assertTrue(data.equals(result));

0 commit comments

Comments
 (0)