Skip to content

Commit e7b5de1

Browse files
feat(CRater): Allow requests to be sent to Berkeley endpoint (#288)
Co-authored-by: Hiroki Terashima <honchikun@gmail.com>
1 parent c726787 commit e7b5de1

11 files changed

Lines changed: 125 additions & 56 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.wise.vle.domain.webservice.crater;
2+
3+
import org.json.JSONException;
4+
import org.json.JSONObject;
5+
6+
import lombok.Getter;
7+
import lombok.Setter;
8+
9+
@Setter
10+
public abstract class AbstractCRaterRequest implements CRaterRequest {
11+
String itemId;
12+
String cRaterClientId;
13+
14+
@Getter
15+
String cRaterUrl;
16+
17+
public String generateBodyData() throws JSONException {
18+
JSONObject body = new JSONObject();
19+
body.put("client_id", cRaterClientId);
20+
body.put("item_id", itemId);
21+
return body.toString();
22+
}
23+
24+
public boolean forBerkeleyEndpoint() {
25+
return itemId.length() > 9 && itemId.substring(0, 9).equals("berkeley_");
26+
}
27+
28+
public abstract String getCRaterUrlVariableBase();
29+
}

src/main/java/org/wise/vle/domain/webservice/crater/CRaterRequest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,13 @@ public interface CRaterRequest {
66

77
String getCRaterUrl();
88

9+
String getCRaterUrlVariableBase();
10+
11+
void setCRaterUrl(String cRaterUrl);
12+
13+
void setCRaterClientId(String cRaterClientId);
14+
915
String generateBodyData() throws JSONException;
16+
17+
boolean forBerkeleyEndpoint();
1018
}

src/main/java/org/wise/vle/domain/webservice/crater/CRaterScoringRequest.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,16 @@
55
import org.json.JSONObject;
66
import org.wise.portal.presentation.util.http.Base64;
77

8-
import lombok.Getter;
98
import lombok.Setter;
109

1110
@Setter
12-
public class CRaterScoringRequest implements CRaterRequest {
13-
String itemId;
11+
public class CRaterScoringRequest extends AbstractCRaterRequest {
1412
String responseId;
1513
String responseText;
16-
String cRaterClientId;
17-
18-
@Getter
19-
String cRaterUrl;
2014

2115
public String generateBodyData() throws JSONException {
22-
JSONObject body = new JSONObject();
23-
body.put("client_id", cRaterClientId);
16+
JSONObject body = new JSONObject(super.generateBodyData());
2417
body.put("service", "ScoringService");
25-
body.put("item_id", itemId);
2618
JSONArray responses = new JSONArray();
2719
JSONObject response = new JSONObject();
2820
response.put("response_id", responseId);
@@ -31,4 +23,8 @@ public String generateBodyData() throws JSONException {
3123
body.put("responses", responses);
3224
return body.toString();
3325
}
26+
27+
public String getCRaterUrlVariableBase() {
28+
return "cRater_scoring_url";
29+
}
3430
}

src/main/java/org/wise/vle/domain/webservice/crater/CRaterService.java

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -52,26 +52,21 @@ public class CRaterService {
5252
private Environment appProperties;
5353

5454
/**
55-
* Sends student work to the CRater server and receives the score as the response
56-
*
57-
* @param CRaterScoringRequest scoring request from client
58-
* @return CRaterScoringResponse scoring response from CRater
55+
* Sends either student work (scoring request) or an item id (verification request) to
56+
* the CRater server
57+
* @param request the scoring or verification request from the client
58+
* @return scoring or verify response from CRater
59+
* @throws JSONException
5960
*/
60-
public String getScoringResponse(CRaterScoringRequest request) throws JSONException {
61-
request.setCRaterClientId(appProperties.getProperty("cRater_client_id"));
62-
request.setCRaterUrl(appProperties.getProperty("cRater_scoring_url"));
63-
return post(request);
64-
}
61+
public String getCRaterResponse(CRaterRequest request) throws JSONException {
62+
String prefix = request.forBerkeleyEndpoint() ? "berkeley_" : "";
63+
64+
String clientIdVariable = prefix + "cRater_client_id";
65+
String cRaterUrlVariable = prefix + request.getCRaterUrlVariableBase();
66+
67+
request.setCRaterClientId(appProperties.getProperty(clientIdVariable));
68+
request.setCRaterUrl(appProperties.getProperty(cRaterUrlVariable));
6569

66-
/**
67-
* Sends item id verification request to the CRater server
68-
*
69-
* @param CRaterVerificationRequest request with item id to verify
70-
* @return CRaterVerificationResponse verify response from CRater
71-
*/
72-
public String getVerificationResponse(CRaterVerificationRequest request) throws JSONException {
73-
request.setCRaterClientId(appProperties.getProperty("cRater_client_id"));
74-
request.setCRaterUrl(appProperties.getProperty("cRater_verification_url"));
7570
return post(request);
7671
}
7772

@@ -85,16 +80,18 @@ private String post(CRaterRequest request) throws JSONException {
8580
HttpClient client = HttpClientBuilder.create().build();
8681
HttpPost post = new HttpPost(request.getCRaterUrl());
8782
try {
88-
String authHeader = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(
89-
("extsyscrtr02dev:" + appProperties.getProperty("cRater_password")).getBytes());
83+
String password = appProperties.getProperty(
84+
request.forBerkeleyEndpoint() ? "berkeley_cRater_password" : "cRater_password");
85+
String authHeader = "Basic " + javax.xml.bind.DatatypeConverter
86+
.printBase64Binary(("extsyscrtr02dev:" + password).getBytes());
9087
post.setHeader(HttpHeaders.AUTHORIZATION, authHeader);
9188
post.setHeader(HttpHeaders.CONTENT_TYPE, "application/json;charset=utf-8");
9289
post.setEntity(new StringEntity(request.generateBodyData(), ContentType.APPLICATION_JSON));
9390
HttpResponse response = client.execute(post);
9491
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
9592
System.err.println("Method failed: " + response.getStatusLine());
9693
}
97-
return IOUtils.toString(response.getEntity().getContent());
94+
return IOUtils.toString(response.getEntity().getContent(), "UTF-8");
9895
} catch (IOException e) {
9996
System.err.println("Fatal transport error: " + e.getMessage());
10097
e.printStackTrace();

src/main/java/org/wise/vle/domain/webservice/crater/CRaterVerificationRequest.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,14 @@
33
import org.json.JSONException;
44
import org.json.JSONObject;
55

6-
import lombok.Getter;
7-
import lombok.Setter;
8-
9-
@Setter
10-
public class CRaterVerificationRequest implements CRaterRequest {
11-
String itemId;
12-
String cRaterClientId;
13-
14-
@Getter
15-
String cRaterUrl;
16-
6+
public class CRaterVerificationRequest extends AbstractCRaterRequest {
177
public String generateBodyData() throws JSONException {
18-
JSONObject body = new JSONObject();
19-
body.put("client_id", cRaterClientId);
20-
body.put("service", "VerificationService");
21-
body.put("item_id", itemId);
22-
return body.toString();
8+
JSONObject body = new JSONObject(super.generateBodyData());
9+
body.put("service", "VerificationService");
10+
return body.toString();
11+
}
12+
13+
public String getCRaterUrlVariableBase() {
14+
return "cRater_verification_url";
2315
}
2416
}

src/main/java/org/wise/vle/web/CRaterController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ public class CRaterController {
4343

4444
@GetMapping("/verify")
4545
String verifyItemId(CRaterVerificationRequest request) throws JSONException {
46-
return cRaterService.getVerificationResponse(request);
46+
return cRaterService.getCRaterResponse(request);
4747
}
4848

4949
@PostMapping("/score")
5050
String scoreItem(@RequestBody CRaterScoringRequest request) throws JSONException {
51-
return cRaterService.getScoringResponse(request);
51+
return cRaterService.getCRaterResponse(request);
5252
}
5353
}

src/main/resources/application-dockerdev-sample.properties

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ cRater_scoring_url=
6666
cRater_client_id=
6767
cRater_password=
6868

69+
berkeley_cRater_verification_url=
70+
berkeley_cRater_scoring_url=
71+
berkeley_cRater_client_id=
72+
berkeley_cRater_password=
73+
6974
######### database properties #########
7075

7176
# Modify below as needed.

src/main/resources/application_sample.properties

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ cRater_scoring_url=
6666
cRater_client_id=
6767
cRater_password=
6868

69+
berkeley_cRater_verification_url=
70+
berkeley_cRater_scoring_url=
71+
berkeley_cRater_client_id=
72+
berkeley_cRater_password=
73+
6974
######### database properties #########
7075

7176
# Modify below as needed.

src/test/java/org/wise/vle/domain/webservice/crater/CRaterServiceTest.java

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import org.easymock.Mock;
77
import org.easymock.TestSubject;
88
import org.json.JSONException;
9-
import org.junit.jupiter.api.BeforeEach;
109
import org.junit.jupiter.api.Test;
1110
import org.junit.jupiter.api.extension.ExtendWith;
1211
import org.springframework.core.env.Environment;
@@ -25,32 +24,65 @@ public class CRaterServiceTest {
2524
private String password = "abc123";
2625
private String scoringUrl = "https://test.org/score";
2726
private String verifyUrl = "https://test.org/verify";
27+
private String berkeleyScoringUrl = "https://test.org/score/berkeley";
28+
private String berkeleyVerifyUrl = "https://test.org/verify/berkeley";
2829

29-
@BeforeEach
30-
public void before() {
30+
public void beforeETS() {
3131
expect(appProperties.getProperty("cRater_client_id")).andReturn(clientId);
3232
expect(appProperties.getProperty("cRater_password")).andReturn(password);
3333
}
3434

35+
public void beforeBerkeley() {
36+
expect(appProperties.getProperty("berkeley_cRater_client_id")).andReturn(clientId);
37+
expect(appProperties.getProperty("berkeley_cRater_password")).andReturn(password);
38+
}
39+
3540
@Test
3641
public void getScoringResponse_ShouldGetCRaterProperties() throws JSONException {
42+
beforeETS();
3743
CRaterScoringRequest request = new CRaterScoringRequest();
3844
request.setItemId(itemId);
3945
request.setResponseId("1234567890");
4046
request.setResponseText("hello");
4147
expect(appProperties.getProperty("cRater_scoring_url")).andReturn(scoringUrl);
4248
replay(appProperties);
43-
cRaterService.getScoringResponse(request);
49+
cRaterService.getCRaterResponse(request);
4450
verify(appProperties);
4551
}
4652

4753
@Test
4854
public void getVerificationResponse_ShouldGetCRaterProperties() throws JSONException {
55+
beforeETS();
4956
CRaterVerificationRequest request = new CRaterVerificationRequest();
5057
request.setItemId(itemId);
5158
expect(appProperties.getProperty("cRater_verification_url")).andReturn(verifyUrl);
5259
replay(appProperties);
53-
cRaterService.getVerificationResponse(request);
60+
cRaterService.getCRaterResponse(request);
61+
verify(appProperties);
62+
}
63+
64+
@Test
65+
public void getBerkeleyScoringResponse_ShouldGetCRaterProperties() throws JSONException {
66+
beforeBerkeley();
67+
CRaterScoringRequest request = new CRaterScoringRequest();
68+
request.setItemId("berkeley_" + itemId);
69+
request.setResponseId("1234567890");
70+
request.setResponseText("hello");
71+
expect(appProperties.getProperty("berkeley_cRater_scoring_url")).andReturn(berkeleyScoringUrl);
72+
replay(appProperties);
73+
cRaterService.getCRaterResponse(request);
74+
verify(appProperties);
75+
}
76+
77+
@Test
78+
public void getBerkeleyVerificationResponse_ShouldGetCRaterProperties() throws JSONException {
79+
beforeBerkeley();
80+
CRaterVerificationRequest request = new CRaterVerificationRequest();
81+
request.setItemId("berkeley_" + itemId);
82+
expect(appProperties.getProperty("berkeley_cRater_verification_url"))
83+
.andReturn(berkeleyVerifyUrl);
84+
replay(appProperties);
85+
cRaterService.getCRaterResponse(request);
5486
verify(appProperties);
5587
}
5688
}

src/test/java/org/wise/vle/web/CRaterControllerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void verifyItemId_ShouldReturnString() {
3131
CRaterVerificationRequest request = new CRaterVerificationRequest();
3232
request.setItemId(itemId);
3333
try {
34-
expect(cRaterService.getVerificationResponse(request))
34+
expect(cRaterService.getCRaterResponse(request))
3535
.andReturn(createVerificationResponseString(itemId, true, trackingId, clientId));
3636
replay(cRaterService);
3737
String response = controller.verifyItemId(request);
@@ -59,7 +59,7 @@ public void scoreItemId_ShouldReturnString() {
5959
CRaterScoringRequest request = new CRaterScoringRequest();
6060
request.setItemId(itemId);
6161
try {
62-
expect(cRaterService.getScoringResponse(request))
62+
expect(cRaterService.getCRaterResponse(request))
6363
.andReturn(createScoringResponseString(itemId, trackingId, clientId));
6464
replay(cRaterService);
6565
String response = controller.scoreItem(request);

0 commit comments

Comments
 (0)