Skip to content

Commit 5c4920e

Browse files
committed
Merge branch 'master' of https://github.com/twilio/twilio-java into alpha
2 parents 1754428 + 41d1b61 commit 5c4920e

File tree

10 files changed

+181
-33
lines changed

10 files changed

+181
-33
lines changed

CHANGES.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
twilio-java changelog
22
=====================
33

4+
[2016-11-30] Version 7.3.0-alpha-1
5+
--------------------------
6+
- Add `recordingStatusCallback` and `recordingStatusCallbackMethod` to Conference TwiML
7+
- Fix TaskRouter Capabaility generation
8+
- Address potential NPE in `ApiException`
9+
410
[2016-11-16] Version 7.2.0-alpha-1
511
--------------------------
612
- Add PublicKey Credentials.

ISSUE_TEMPLATE.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
*Note: These issues are for bugs and feature requests for the helper libraries. If you need help or support, please email help@twilio.com and one of our experts will assist you!*
2+
3+
4+
**Version:**
5+
**API Subdomain (api/taskrouter/ip_messaging):**
6+
7+
### Code Snippet
8+
```java
9+
# paste code here
10+
```
11+
12+
### Exception / Log
13+
```
14+
<place exception / log here>
15+
```
16+
17+
### Steps to Reproduce
18+
1.
19+
2.
20+
3.
21+
22+
23+
### Feature Request
24+
_If this is a feature request, make sure you search Issues for an existing request before creating a new one!_

src/main/java/com/twilio/exception/ApiException.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ public ApiException(final String message, final Integer code, final String moreI
4444
this.status = status;
4545
}
4646

47-
public int getCode() {
47+
public Integer getCode() {
4848
return code;
4949
}
5050

5151
public String getMoreInfo() {
5252
return moreInfo;
5353
}
5454

55-
public int getStatusCode() {
55+
public Integer getStatusCode() {
5656
return status;
5757
}
5858
}

src/main/java/com/twilio/jwt/taskrouter/FilterRequirement.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.twilio.jwt.taskrouter;
22

3+
import com.fasterxml.jackson.annotation.JsonFormat;
4+
5+
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
36
public enum FilterRequirement {
47
REQUIRED(true),
58
OPTIONAL(false);

src/main/java/com/twilio/jwt/taskrouter/Policy.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,9 @@ public class Policy {
2727
private final HttpMethod method;
2828

2929
@JsonProperty("query_filter")
30-
@JsonSerialize(using = FilterRequirementSerializer.class)
3130
private final Map<String, FilterRequirement> queryFilter;
3231

3332
@JsonProperty("post_filter")
34-
@JsonSerialize(using = FilterRequirementSerializer.class)
3533
private final Map<String, FilterRequirement> postFilter;
3634

3735
@JsonProperty("allow")
@@ -149,19 +147,4 @@ public Policy build() {
149147
return new Policy(this);
150148
}
151149
}
152-
153-
private static class FilterRequirementSerializer extends JsonSerializer<Map<String, FilterRequirement>> {
154-
@Override
155-
public void serialize(
156-
Map<String, FilterRequirement> stringFilterRequirementMap,
157-
JsonGenerator jsonGenerator,
158-
SerializerProvider serializerProvider
159-
) throws IOException, JsonProcessingException {
160-
for (Map.Entry<String, FilterRequirement> entry : stringFilterRequirementMap.entrySet()) {
161-
jsonGenerator.writeObjectFieldStart(entry.getKey());
162-
jsonGenerator.writeBooleanField("required", entry.getValue().value());
163-
jsonGenerator.writeEndObject();
164-
}
165-
}
166-
}
167150
}

src/main/java/com/twilio/jwt/taskrouter/TaskRouterCapability.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public Map<String, Object> getClaims() {
4949
payload.put("account_sid", this.accountSid);
5050
payload.put("friendly_name", this.friendlyName);
5151
payload.put("workspace_sid", this.workspaceSid);
52-
payload.put("channel_id", this.channelId);
52+
payload.put("channel", this.channelId);
5353

5454
if (channelId.startsWith("WK")) {
5555
payload.put("worker_sid", this.channelId);

src/main/java/com/twilio/twiml/Conference.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,12 @@ public String apply(ConferenceEvent event) {
119119
@XmlAttribute
120120
private final String statusCallback;
121121

122+
@XmlAttribute
123+
private final String recordingStatusCallback;
124+
125+
@XmlAttribute
126+
private final Method recordingStatusCallbackMethod;
127+
122128
@XmlValue
123129
private final String name;
124130

@@ -144,6 +150,8 @@ private Conference(Builder b) {
144150
this.statusCallbackEvents = b.statusCallbackEvents;
145151
this.statusCallbackMethod = b.statusCallbackMethod;
146152
this.statusCallback = b.statusCallback;
153+
this.recordingStatusCallback = b.recordingStatusCallback;
154+
this.recordingStatusCallbackMethod = b.recordingStatusCallbackMethod;
147155

148156
if (this.statusCallbackEvents != null) {
149157
this.statusCallbackEvent = Joiner.on(" ").join(Lists.transform(this.statusCallbackEvents, ConferenceEvent.TO_STRING));
@@ -204,6 +212,14 @@ public List<ConferenceEvent> getStatusCallbackEvents() {
204212
return statusCallbackEvents;
205213
}
206214

215+
public String getRecordingStatusCallback() {
216+
return recordingStatusCallback;
217+
}
218+
219+
public Method getRecordingStatusCallbackMethod() {
220+
return recordingStatusCallbackMethod;
221+
}
222+
207223
public String getName() {
208224
return name;
209225
}
@@ -222,6 +238,8 @@ public static class Builder {
222238
private List<ConferenceEvent> statusCallbackEvents;
223239
private Method statusCallbackMethod;
224240
private String statusCallback;
241+
private String recordingStatusCallback;
242+
private Method recordingStatusCallbackMethod;
225243
private String name;
226244

227245
public Builder(String name) {
@@ -293,6 +311,16 @@ public Builder eventCallbackUrl(String eventCallbackUrl) {
293311
return this;
294312
}
295313

314+
public Builder recordingStatusCallback(String recordingStatusCallback) {
315+
this.recordingStatusCallback = recordingStatusCallback;
316+
return this;
317+
}
318+
319+
public Builder recordingStatusCallbackMethod(Method recordingStatusCallbackMethod) {
320+
this.recordingStatusCallbackMethod = recordingStatusCallbackMethod;
321+
return this;
322+
}
323+
296324
public Conference build() {
297325
return new Conference(this);
298326
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.twilio.exception;
2+
3+
import org.junit.Test;
4+
5+
import static org.junit.Assert.assertEquals;
6+
import static org.junit.Assert.assertSame;
7+
8+
@SuppressWarnings("ThrowableInstanceNeverThrown")
9+
public class ApiExceptionTest {
10+
11+
private final String anyMessage = "message for test";
12+
private final Throwable anyCause = new RuntimeException("some root cause");
13+
private final String anyMoreInfo = "more info";
14+
private final int anyErrorCode = 123;
15+
private final int anyHttpStatus = 200;
16+
17+
18+
@Test
19+
public void singleArgConstructorShouldPreserveMessage() {
20+
ApiException error = new ApiException(anyMessage);
21+
assertEquals(anyMessage, error.getMessage());
22+
}
23+
24+
@Test
25+
public void twoArgConstructorShouldPreserveMessageAndCause() {
26+
ApiException error = new ApiException(anyMessage, anyCause);
27+
assertEquals("Message", anyMessage, error.getMessage());
28+
assertSame("Cause", anyCause, error.getCause());
29+
}
30+
31+
@Test
32+
public void fullConstructorShouldPreserveAllValues() {
33+
ApiException error = new ApiException(anyMessage, anyErrorCode, anyMoreInfo, anyHttpStatus, anyCause);
34+
assertEquals("Message", anyMessage, error.getMessage());
35+
assertSame("Cause", anyCause, error.getCause());
36+
assertEquals("More info", anyMoreInfo, error.getMoreInfo());
37+
assertEquals("Error code", anyErrorCode, error.getCode().intValue());
38+
assertEquals("Status code", anyHttpStatus, error.getStatusCode().intValue());
39+
}
40+
41+
@Test
42+
public void getCodeShouldNotThrowExceptionWhenCodeIsNull() {
43+
ApiException error = new ApiException(anyMessage);
44+
assertEquals(null, error.getCode());
45+
}
46+
47+
@Test
48+
public void getStatusCodeShouldNotThrowExceptionWhenCodeIsNull() {
49+
ApiException error = new ApiException(anyMessage);
50+
assertEquals(null, error.getStatusCode());
51+
}
52+
53+
}

src/test/java/com/twilio/jwt/taskrouter/PolicyTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@ public void testToJson() throws IOException {
2727
.build();
2828

2929
Assert.assertEquals(
30-
"{\"url\":\"http://localhost\",\"method\":\"GET\",\"query_filter\",\"foo\":{\"required\":true},\"post_filter\",\"allow\":true}",
31-
p.toJson()
32-
);
30+
"{\"url\":\"http://localhost\",\"method\":\"GET\",\"query_filter\":{\"foo\":{\"required\":true}},\"post_filter\":{},\"allow\":true}",
31+
p.toJson());
3332
}
3433

3534
}
Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package com.twilio.jwt.taskrouter;
22

3+
import java.util.Date;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
import org.junit.Assert;
9+
import org.junit.Test;
10+
311
import com.google.common.collect.Lists;
12+
import com.twilio.http.HttpMethod;
413
import com.twilio.jwt.Jwt;
14+
515
import io.jsonwebtoken.Claims;
616
import io.jsonwebtoken.Jwts;
7-
import org.junit.Assert;
8-
import org.junit.Test;
9-
10-
import java.util.Date;
11-
import java.util.List;
1217

1318
/**
1419
* Test class for {@link TaskRouterCapability}.
@@ -17,16 +22,16 @@ public class TaskRouterCapabilityTest {
1722

1823
private static final String ACCOUNT_SID = "AC123";
1924
private static final String AUTH_TOKEN = "secret";
20-
private static final String WORKSPACE_SID = "WK123";
21-
private static final String CHANNEL_ID = "CH123";
25+
private static final String WORKSPACE_SID = "WS123";
26+
private static final String WORKER_SID = "WK123";
2227

2328
@Test
2429
public void testToken() {
2530
List<Policy> policies = Lists.newArrayList(
2631
new Policy.Builder().url(UrlUtils.workspaces()).build()
2732
);
28-
Jwt jwt =
29-
new TaskRouterCapability.Builder(ACCOUNT_SID, AUTH_TOKEN, WORKSPACE_SID, CHANNEL_ID)
33+
final Jwt jwt =
34+
new TaskRouterCapability.Builder(ACCOUNT_SID, AUTH_TOKEN, WORKSPACE_SID, WORKER_SID)
3035
.policies(policies)
3136
.build();
3237
Claims claims =
@@ -36,9 +41,56 @@ public void testToken() {
3641
.getBody();
3742

3843
Assert.assertEquals(WORKSPACE_SID, claims.get("workspace_sid"));
39-
Assert.assertEquals(CHANNEL_ID, claims.get("channel_id"));
44+
Assert.assertEquals(WORKER_SID, claims.get("channel"));
4045
Assert.assertEquals(ACCOUNT_SID, claims.get("account_sid"));
4146
Assert.assertEquals(ACCOUNT_SID, claims.getIssuer());
4247
Assert.assertTrue(claims.getExpiration().getTime() > new Date().getTime());
4348
}
49+
50+
@Test
51+
public void testWorkerToken() {
52+
final List<Policy> policies = PolicyUtils.defaultWorkerPolicies(WORKSPACE_SID, WORKER_SID);
53+
54+
final Map<String, FilterRequirement> activityUpdateFilter = new HashMap<>();
55+
activityUpdateFilter.put("ActivitySid", FilterRequirement.REQUIRED);
56+
57+
final Policy allowActivityUpdates = new Policy.Builder()
58+
.url(UrlUtils.worker(WORKSPACE_SID, WORKER_SID))
59+
.method(HttpMethod.POST)
60+
.postFilter(activityUpdateFilter).build();
61+
62+
final Policy allowTasksUpdate = new Policy.Builder()
63+
.url(UrlUtils.allTasks(WORKER_SID))
64+
.method(HttpMethod.POST)
65+
.build();
66+
67+
final Policy allowReservationUpdate = new Policy.Builder()
68+
.url(UrlUtils.allReservations(WORKSPACE_SID, WORKER_SID))
69+
.method(HttpMethod.POST)
70+
.build();
71+
72+
policies.add(allowActivityUpdates);
73+
policies.add(allowTasksUpdate);
74+
policies.add(allowReservationUpdate);
75+
76+
final Jwt jwt =
77+
new TaskRouterCapability.Builder(ACCOUNT_SID, AUTH_TOKEN, WORKSPACE_SID, WORKER_SID)
78+
.policies(policies)
79+
.build();
80+
final Claims claims =
81+
Jwts.parser()
82+
.setSigningKey(AUTH_TOKEN.getBytes())
83+
.parseClaimsJws(jwt.toJwt())
84+
.getBody();
85+
86+
Assert.assertEquals(WORKSPACE_SID, claims.get("workspace_sid"));
87+
Assert.assertEquals(WORKER_SID, claims.get("channel"));
88+
Assert.assertEquals(ACCOUNT_SID, claims.get("account_sid"));
89+
Assert.assertEquals(ACCOUNT_SID, claims.getIssuer());
90+
Assert.assertTrue(claims.getExpiration().getTime() > new Date().getTime());
91+
92+
final List<Policy> claimedPolicies = (List<Policy>) claims.get("policies");
93+
final int connectionPolicies = 2;
94+
Assert.assertEquals(policies.size() + connectionPolicies, claimedPolicies.size());
95+
}
4496
}

0 commit comments

Comments
 (0)