Skip to content

Commit 4cb3031

Browse files
Migrated batching to OkHttp
1 parent 76a447d commit 4cb3031

File tree

4 files changed

+169
-115
lines changed

4 files changed

+169
-115
lines changed

src/main/java/com/microsoft/graph/content/MSBatchRequestContent.java

Lines changed: 16 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,20 @@
77

88
import org.json.simple.JSONArray;
99
import org.json.simple.JSONObject;
10-
import org.json.simple.parser.JSONParser;
1110
import org.json.simple.parser.ParseException;
1211

12+
import com.microsoft.graph.httpcore.RequestSerializer;
13+
1314
import okhttp3.Headers;
14-
import okhttp3.Request;
1515
import okhttp3.RequestBody;
16-
import okio.Buffer;
1716

1817
public class MSBatchRequestContent {
1918
private Map<String, MSBatchRequestStep> batchRequestStepsHashMap;
20-
private final int maxNumberOfRequests = 20;
19+
public static final int MAX_NUMBER_OF_REQUESTS = 20;
2120

2221
public MSBatchRequestContent(List<MSBatchRequestStep> batchRequestStepsArray) {
23-
if(batchRequestStepsArray.size() > maxNumberOfRequests)
24-
throw new IllegalArgumentException("Number of batch request steps cannot exceed 20.");
22+
if(batchRequestStepsArray.size() > MAX_NUMBER_OF_REQUESTS)
23+
throw new IllegalArgumentException("Number of batch request steps cannot exceed " + MAX_NUMBER_OF_REQUESTS);
2524

2625
this.batchRequestStepsHashMap = new HashMap<>();
2726
for(MSBatchRequestStep requestStep: batchRequestStepsArray)
@@ -57,20 +56,24 @@ public String getBatchRequestContent() {
5756
JSONObject batchRequestContentMap = new JSONObject();
5857
JSONArray batchContentArray = new JSONArray();
5958
for(Map.Entry<String, MSBatchRequestStep> requestStep : batchRequestStepsHashMap.entrySet()) {
60-
batchContentArray.add(getBatchRequestMapFromRequestStep(requestStep.getValue()));
59+
batchContentArray.add(getBatchRequestObjectFromRequestStep(requestStep.getValue()));
6160
}
6261
batchRequestContentMap.put("requests", batchContentArray);
63-
return batchRequestContentMap.toJSONString();
62+
63+
String content = batchRequestContentMap.toString();
64+
return content;
6465
}
6566

6667
@SuppressWarnings("unchecked")
67-
private JSONObject getBatchRequestMapFromRequestStep(final MSBatchRequestStep batchRequestStep){
68+
private JSONObject getBatchRequestObjectFromRequestStep(final MSBatchRequestStep batchRequestStep){
6869
JSONObject contentmap = new JSONObject();
6970
contentmap.put("id", batchRequestStep.getRequestId());
7071

7172
String url = batchRequestStep.getRequest().url().toString();
72-
url = url.replaceAll("https://graph.microsoft.com/v1.0", "");
73-
url = url.replace("https://graph.microsoft.com/beta", "");
73+
url = url.replaceAll("https://graph.microsoft.com/v1.0/", "");
74+
url = url.replaceAll("http://graph.microsoft.com/v1.0/", "");
75+
url = url.replaceAll("https://graph.microsoft.com/beta/", "");
76+
url = url.replaceAll("http://graph.microsoft.com/beta/", "");
7477
contentmap.put("url", url);
7578

7679
contentmap.put("method", batchRequestStep.getRequest().method().toString());
@@ -79,7 +82,7 @@ private JSONObject getBatchRequestMapFromRequestStep(final MSBatchRequestStep ba
7982
if(headers != null && headers.size() != 0) {
8083
JSONObject headerMap = new JSONObject();
8184
for(Map.Entry<String, List<String>> entry : headers.toMultimap().entrySet()) {
82-
headerMap.put(entry.getKey(), getHeaderValuesAsString(entry.getValue()));
85+
headerMap.put(entry.getKey(), RequestSerializer.getHeaderValuesAsString(entry.getValue()));
8386
}
8487
contentmap.put("headers", headerMap);
8588
}
@@ -94,34 +97,12 @@ private JSONObject getBatchRequestMapFromRequestStep(final MSBatchRequestStep ba
9497
RequestBody body = batchRequestStep.getRequest().body();
9598
if(body != null) {
9699
try {
97-
contentmap.put("body", requestBodyToJSONObject(batchRequestStep.getRequest()));
100+
contentmap.put("body", RequestSerializer.requestBodyToJSONObject(batchRequestStep.getRequest()));
98101
}catch(IOException | ParseException e) {
99102
e.printStackTrace();
100103
}
101104
}
102-
103105
return contentmap;
104106
}
105107

106-
private String getHeaderValuesAsString(final List<String> list) {
107-
StringBuilder builder = new StringBuilder("");
108-
if(list.size() != 0) {
109-
builder.append(list.get(0));
110-
for(int i=1;i<list.size();i++) {
111-
builder.append("; ");
112-
builder.append(list.get(i));
113-
}
114-
}
115-
return builder.toString();
116-
}
117-
118-
private JSONObject requestBodyToJSONObject(final Request request) throws IOException, ParseException{
119-
Request copy = request.newBuilder().build();
120-
Buffer buffer = new Buffer();
121-
copy.body().writeTo(buffer);
122-
String body = buffer.readUtf8();
123-
JSONObject json = (JSONObject)new JSONParser().parse(body);
124-
return json;
125-
}
126-
127108
}
Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,43 @@
11
package com.microsoft.graph.content;
22

3+
import java.io.IOException;
4+
import java.util.Map;
5+
36
import org.json.simple.JSONArray;
47
import org.json.simple.JSONObject;
5-
import org.json.simple.parser.JSONParser;
6-
import org.json.simple.parser.ParseException;
8+
9+
import com.microsoft.graph.httpcore.RequestSerializer;
710

811
import okhttp3.MediaType;
12+
import okhttp3.Request;
913
import okhttp3.Response;
1014
import okhttp3.ResponseBody;
1115

1216
public class MSBatchResponseContent {
1317

1418
private JSONObject batchResponseObj;
19+
private Response batchResponse;
20+
private Map<String, Request> batchRequestsHashMap;
21+
private JSONArray batchResponseArray;
1522

16-
public MSBatchResponseContent(String batchResponseData) {
17-
JSONParser parser = new JSONParser();
18-
try {
19-
if(batchResponseData != null)
20-
batchResponseObj = (JSONObject) parser.parse(batchResponseData);
21-
}
22-
catch(ParseException e) {
23-
e.printStackTrace();
23+
public MSBatchResponseContent(Response batchResponse) {
24+
if(batchResponse == null)
25+
throw new IllegalArgumentException("Batch Response cannot be null");
26+
27+
this.batchRequestsHashMap = RequestSerializer.createBatchRequestsHashMap(batchResponse);
28+
this.batchResponse = batchResponse;
29+
if(batchResponse.body() != null) {
30+
try {
31+
String batchResponseData = batchResponse.body().string();
32+
if(batchResponseData != null) {
33+
batchResponseObj = RequestSerializer.stringToJSONObject(batchResponseData);
34+
if(batchResponseObj != null) {
35+
batchResponseArray = (JSONArray)batchResponseObj.get("responses");
36+
}
37+
}
38+
} catch (IOException e) {
39+
e.printStackTrace();
40+
}
2441
}
2542
}
2643

@@ -32,28 +49,39 @@ public Response getResponseById(String requestId) {
3249
if(responses == null)
3350
return null;
3451

35-
for(Object response: responses) {
52+
for(Object response : responses) {
3653
JSONObject jsonresponse = (JSONObject)response;
3754
String id = (String)jsonresponse.get("id");
3855
if(id.compareTo(requestId) == 0) {
3956
Response.Builder builder = new Response.Builder();
4057

58+
// Put corresponding request into the constructed response
59+
builder.request(batchRequestsHashMap.get(requestId));
60+
// copy protocol and message same as of batch response
61+
builder.protocol(batchResponse.protocol());
62+
builder.message(batchResponse.message());
63+
64+
// Put status code of the corresponding request in JSONArray
4165
if(jsonresponse.get("status") != null) {
42-
String status = (String)jsonresponse.get("status");
43-
builder.code(Integer.parseInt(status));
66+
Long status = (Long)jsonresponse.get("status");
67+
builder.code(status.intValue());
4468
}
4569

70+
// Put body from response array for corresponding id into constructing response
4671
if(jsonresponse.get("body") != null) {
47-
String bodyAsString = (String)jsonresponse.get("body");
72+
JSONObject jsonObject = (JSONObject)jsonresponse.get("body");
73+
String bodyAsString = jsonObject.toJSONString();
4874
ResponseBody responseBody = ResponseBody.create(MediaType.parse("application/json; charset=utf-8"), bodyAsString);
4975
builder.body(responseBody);
5076
}
77+
78+
// Put headers from response array for corresponding id into constructing response
5179
if(jsonresponse.get("headers") != null){
5280
JSONObject jsonheaders = (JSONObject)jsonresponse.get("headers");
5381
for(Object key: jsonheaders.keySet()) {
5482
String strkey = (String)key;
5583
String strvalue = (String)jsonheaders.get(strkey);
56-
for(String value : strvalue.split("; ")) {
84+
for(String value : strvalue.split(";")) {
5785
builder.header(strkey, value);
5886
}
5987
}
@@ -64,9 +92,19 @@ public Response getResponseById(String requestId) {
6492
return null;
6593
}
6694

95+
/*
96+
* @return responses as a string
97+
*/
6798
public String getResponses() {
68-
if(batchResponseObj != null)
69-
return ((JSONArray)batchResponseObj.get("responses")).toJSONString();
70-
return null;
99+
return batchResponseArray != null ? batchResponseArray.toJSONString() : null;
100+
}
101+
102+
/*
103+
* @return nextLink of batch response
104+
*/
105+
public String nextLink() {
106+
if(batchResponseObj == null) return null;
107+
Object nextLinkObject = batchResponseObj.get("nextLink");
108+
return nextLinkObject != null ? ((JSONObject)nextLinkObject).toString() : null;
71109
}
72110
}

src/test/java/com/microsoft/graph/content/MSBatchRequestContentTest.java

Lines changed: 53 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -11,77 +11,78 @@
1111

1212
public class MSBatchRequestContentTest {
1313

14-
String testurl = "http://graph.microsoft.com";
15-
14+
String testurl = "http://graph.microsoft.com/me";
15+
1616
@Test
1717
public void testMSBatchRequestContentCreation() {
1818
List<MSBatchRequestStep> requestStepArray = new ArrayList<>();
19-
for(int i=0;i<5;i++) {
20-
Request request = new Request.Builder().url(testurl).build();
21-
List<String> arrayOfDependsOnIds = new ArrayList<>();
22-
MSBatchRequestStep requestStep = new MSBatchRequestStep("" + i, request, arrayOfDependsOnIds);
23-
requestStepArray.add(requestStep);
24-
}
25-
MSBatchRequestContent requestContent = new MSBatchRequestContent(requestStepArray);
26-
assertTrue(requestContent.getBatchRequestContent() != null);
19+
for(int i=0;i<5;i++) {
20+
Request request = new Request.Builder().url(testurl).build();
21+
List<String> arrayOfDependsOnIds = new ArrayList<>();
22+
MSBatchRequestStep requestStep = new MSBatchRequestStep("" + i, request, arrayOfDependsOnIds);
23+
requestStepArray.add(requestStep);
24+
}
25+
MSBatchRequestContent requestContent = new MSBatchRequestContent(requestStepArray);
26+
assertTrue(requestContent.getBatchRequestContent() != null);
2727
}
28-
28+
2929
@Test
3030
public void testGetBatchRequestContent() {
3131
Request request = new Request.Builder().url(testurl).build();
32-
List<String> arrayOfDependsOnIds = new ArrayList<>();
33-
MSBatchRequestStep requestStep = new MSBatchRequestStep("1", request, arrayOfDependsOnIds);
34-
MSBatchRequestContent requestContent = new MSBatchRequestContent();
35-
requestContent.addBatchRequestStep(requestStep);
36-
String content = requestContent.getBatchRequestContent();
37-
String expectedContent = "{\"requests\":[{\"method\":\"GET\",\"dependsOn\":\"[]\",\"id\":\"1\",\"url\":\"http:\\/\\/graph.microsoft.com\"}]}";
38-
assertTrue(content.compareTo(expectedContent) == 0);
32+
List<String> arrayOfDependsOnIds = new ArrayList<>();
33+
MSBatchRequestStep requestStep = new MSBatchRequestStep("1", request, arrayOfDependsOnIds);
34+
MSBatchRequestContent requestContent = new MSBatchRequestContent();
35+
requestContent.addBatchRequestStep(requestStep);
36+
String content = requestContent.getBatchRequestContent();
37+
String expectedContent = "{\"requests\":[{\"method\":\"GET\",\"dependsOn\":[],\"id\":\"1\",\"url\":\"http:\\/\\/graph.microsoft.com\\/me\"}]}";
38+
assertTrue(content.compareTo(expectedContent) == 0);
3939
}
40-
40+
4141
@Test
4242
public void testGetBatchRequestContentWithHeader() {
4343
Request request = new Request.Builder().url(testurl).header("testkey", "testvalue").build();
44-
List<String> arrayOfDependsOnIds = new ArrayList<>();
45-
MSBatchRequestStep requestStep = new MSBatchRequestStep("1", request, arrayOfDependsOnIds);
46-
MSBatchRequestContent requestContent = new MSBatchRequestContent();
47-
requestContent.addBatchRequestStep(requestStep);
48-
String content = requestContent.getBatchRequestContent();
49-
String expectedContent = "{\"requests\":[{\"headers\":\"{\\\"testkey\\\":\\\"testvalue\\\"}\",\"method\":\"GET\",\"dependsOn\":\"[]\",\"id\":\"1\",\"url\":\"http:\\/\\/graph.microsoft.com\"}]}";
50-
assertTrue(content.compareTo(expectedContent) == 0);
44+
List<String> arrayOfDependsOnIds = new ArrayList<>();
45+
MSBatchRequestStep requestStep = new MSBatchRequestStep("1", request, arrayOfDependsOnIds);
46+
MSBatchRequestContent requestContent = new MSBatchRequestContent();
47+
requestContent.addBatchRequestStep(requestStep);
48+
String content = requestContent.getBatchRequestContent();
49+
System.out.println(content);
50+
String expectedContent = "{\"requests\":[{\"headers\":{\"testkey\":\"testvalue\"},\"method\":\"GET\",\"dependsOn\":[],\"id\":\"1\",\"url\":\"http:\\/\\/graph.microsoft.com\\/me\"}]}";
51+
assertTrue(content.compareTo(expectedContent) == 0);
5152
}
52-
53+
5354
@Test
5455
public void testRemoveBatchRequesStepWithId() {
5556
Request request = new Request.Builder().url(testurl).build();
56-
List<String> arrayOfDependsOnIds = new ArrayList<>();
57-
MSBatchRequestStep requestStep = new MSBatchRequestStep("1", request, arrayOfDependsOnIds);
58-
MSBatchRequestContent requestContent = new MSBatchRequestContent();
59-
requestContent.addBatchRequestStep(requestStep);
60-
requestContent.removeBatchRequestStepWithId("1");
61-
String content = requestContent.getBatchRequestContent();
62-
String expectedContent = "{\"requests\":[]}";
63-
assertTrue(content.compareTo(expectedContent) == 0);
57+
List<String> arrayOfDependsOnIds = new ArrayList<>();
58+
MSBatchRequestStep requestStep = new MSBatchRequestStep("1", request, arrayOfDependsOnIds);
59+
MSBatchRequestContent requestContent = new MSBatchRequestContent();
60+
requestContent.addBatchRequestStep(requestStep);
61+
requestContent.removeBatchRequestStepWithId("1");
62+
String content = requestContent.getBatchRequestContent();
63+
String expectedContent = "{\"requests\":[]}";
64+
assertTrue(content.compareTo(expectedContent) == 0);
6465
}
65-
66+
6667
@Test
6768
public void testRemoveBatchRequesStepWithIdByAddingMultipleBatchSteps() {
6869
Request request = new Request.Builder().url(testurl).build();
69-
List<String> arrayOfDependsOnIds = new ArrayList<>();
70-
MSBatchRequestStep requestStep = new MSBatchRequestStep("1", request, arrayOfDependsOnIds);
71-
72-
Request request1 = new Request.Builder().url(testurl).build();
73-
List<String> arrayOfDependsOnIds1 = new ArrayList<>();
74-
arrayOfDependsOnIds1.add("1");
75-
MSBatchRequestStep requestStep1 = new MSBatchRequestStep("2", request1, arrayOfDependsOnIds1);
76-
77-
MSBatchRequestContent requestContent = new MSBatchRequestContent();
78-
requestContent.addBatchRequestStep(requestStep);
79-
requestContent.addBatchRequestStep(requestStep1);
80-
81-
requestContent.removeBatchRequestStepWithId("1");
82-
String content = requestContent.getBatchRequestContent();
83-
String expectedContent = "{\"requests\":[{\"method\":\"GET\",\"dependsOn\":\"[]\",\"id\":\"2\",\"url\":\"http:\\/\\/graph.microsoft.com\"}]}";
84-
assertTrue(content.compareTo(expectedContent) == 0);
70+
List<String> arrayOfDependsOnIds = new ArrayList<>();
71+
MSBatchRequestStep requestStep = new MSBatchRequestStep("1", request, arrayOfDependsOnIds);
72+
73+
Request request1 = new Request.Builder().url(testurl).build();
74+
List<String> arrayOfDependsOnIds1 = new ArrayList<>();
75+
arrayOfDependsOnIds1.add("1");
76+
MSBatchRequestStep requestStep1 = new MSBatchRequestStep("2", request1, arrayOfDependsOnIds1);
77+
78+
MSBatchRequestContent requestContent = new MSBatchRequestContent();
79+
requestContent.addBatchRequestStep(requestStep);
80+
requestContent.addBatchRequestStep(requestStep1);
81+
82+
requestContent.removeBatchRequestStepWithId("1");
83+
String content = requestContent.getBatchRequestContent();
84+
String expectedContent = "{\"requests\":[{\"method\":\"GET\",\"dependsOn\":[],\"id\":\"2\",\"url\":\"http:\\/\\/graph.microsoft.com\\/me\"}]}";
85+
assertTrue(content.compareTo(expectedContent) == 0);
8586
}
8687

8788
}

0 commit comments

Comments
 (0)