diff --git a/src/main/java/org/wise/vle/domain/webservice/crater/AbstractCRaterRequest.java b/src/main/java/org/wise/vle/domain/webservice/crater/AbstractCRaterRequest.java new file mode 100644 index 000000000..14ce5cf48 --- /dev/null +++ b/src/main/java/org/wise/vle/domain/webservice/crater/AbstractCRaterRequest.java @@ -0,0 +1,29 @@ +package org.wise.vle.domain.webservice.crater; + +import org.json.JSONException; +import org.json.JSONObject; + +import lombok.Getter; +import lombok.Setter; + +@Setter +public abstract class AbstractCRaterRequest implements CRaterRequest { + String itemId; + String cRaterClientId; + + @Getter + String cRaterUrl; + + public String generateBodyData() throws JSONException { + JSONObject body = new JSONObject(); + body.put("client_id", cRaterClientId); + body.put("item_id", itemId); + return body.toString(); + } + + public boolean forBerkeleyEndpoint() { + return itemId.length() > 9 && itemId.substring(0, 9).equals("berkeley_"); + } + + public abstract String getCRaterUrlVariableBase(); +} diff --git a/src/main/java/org/wise/vle/domain/webservice/crater/CRaterRequest.java b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterRequest.java index f5e52010c..7e16cb48b 100644 --- a/src/main/java/org/wise/vle/domain/webservice/crater/CRaterRequest.java +++ b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterRequest.java @@ -6,5 +6,13 @@ public interface CRaterRequest { String getCRaterUrl(); + String getCRaterUrlVariableBase(); + + void setCRaterUrl(String cRaterUrl); + + void setCRaterClientId(String cRaterClientId); + String generateBodyData() throws JSONException; + + boolean forBerkeleyEndpoint(); } diff --git a/src/main/java/org/wise/vle/domain/webservice/crater/CRaterScoringRequest.java b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterScoringRequest.java index d2253eabc..0f37f24db 100644 --- a/src/main/java/org/wise/vle/domain/webservice/crater/CRaterScoringRequest.java +++ b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterScoringRequest.java @@ -5,24 +5,16 @@ import org.json.JSONObject; import org.wise.portal.presentation.util.http.Base64; -import lombok.Getter; import lombok.Setter; @Setter -public class CRaterScoringRequest implements CRaterRequest { - String itemId; +public class CRaterScoringRequest extends AbstractCRaterRequest { String responseId; String responseText; - String cRaterClientId; - - @Getter - String cRaterUrl; public String generateBodyData() throws JSONException { - JSONObject body = new JSONObject(); - body.put("client_id", cRaterClientId); + JSONObject body = new JSONObject(super.generateBodyData()); body.put("service", "ScoringService"); - body.put("item_id", itemId); JSONArray responses = new JSONArray(); JSONObject response = new JSONObject(); response.put("response_id", responseId); @@ -31,4 +23,8 @@ public String generateBodyData() throws JSONException { body.put("responses", responses); return body.toString(); } + + public String getCRaterUrlVariableBase() { + return "cRater_scoring_url"; + } } diff --git a/src/main/java/org/wise/vle/domain/webservice/crater/CRaterService.java b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterService.java index 76dc7b80a..4d976422a 100644 --- a/src/main/java/org/wise/vle/domain/webservice/crater/CRaterService.java +++ b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterService.java @@ -52,26 +52,21 @@ public class CRaterService { private Environment appProperties; /** - * Sends student work to the CRater server and receives the score as the response - * - * @param CRaterScoringRequest scoring request from client - * @return CRaterScoringResponse scoring response from CRater + * Sends either student work (scoring request) or an item id (verification request) to + * the CRater server + * @param request the scoring or verification request from the client + * @return scoring or verify response from CRater + * @throws JSONException */ - public String getScoringResponse(CRaterScoringRequest request) throws JSONException { - request.setCRaterClientId(appProperties.getProperty("cRater_client_id")); - request.setCRaterUrl(appProperties.getProperty("cRater_scoring_url")); - return post(request); - } + public String getCRaterResponse(CRaterRequest request) throws JSONException { + String prefix = request.forBerkeleyEndpoint() ? "berkeley_" : ""; + + String clientIdVariable = prefix + "cRater_client_id"; + String cRaterUrlVariable = prefix + request.getCRaterUrlVariableBase(); + + request.setCRaterClientId(appProperties.getProperty(clientIdVariable)); + request.setCRaterUrl(appProperties.getProperty(cRaterUrlVariable)); - /** - * Sends item id verification request to the CRater server - * - * @param CRaterVerificationRequest request with item id to verify - * @return CRaterVerificationResponse verify response from CRater - */ - public String getVerificationResponse(CRaterVerificationRequest request) throws JSONException { - request.setCRaterClientId(appProperties.getProperty("cRater_client_id")); - request.setCRaterUrl(appProperties.getProperty("cRater_verification_url")); return post(request); } @@ -85,8 +80,10 @@ private String post(CRaterRequest request) throws JSONException { HttpClient client = HttpClientBuilder.create().build(); HttpPost post = new HttpPost(request.getCRaterUrl()); try { - String authHeader = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary( - ("extsyscrtr02dev:" + appProperties.getProperty("cRater_password")).getBytes()); + String password = appProperties.getProperty( + request.forBerkeleyEndpoint() ? "berkeley_cRater_password" : "cRater_password"); + String authHeader = "Basic " + javax.xml.bind.DatatypeConverter + .printBase64Binary(("extsyscrtr02dev:" + password).getBytes()); post.setHeader(HttpHeaders.AUTHORIZATION, authHeader); post.setHeader(HttpHeaders.CONTENT_TYPE, "application/json;charset=utf-8"); post.setEntity(new StringEntity(request.generateBodyData(), ContentType.APPLICATION_JSON)); @@ -94,7 +91,7 @@ private String post(CRaterRequest request) throws JSONException { if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { System.err.println("Method failed: " + response.getStatusLine()); } - return IOUtils.toString(response.getEntity().getContent()); + return IOUtils.toString(response.getEntity().getContent(), "UTF-8"); } catch (IOException e) { System.err.println("Fatal transport error: " + e.getMessage()); e.printStackTrace(); diff --git a/src/main/java/org/wise/vle/domain/webservice/crater/CRaterVerificationRequest.java b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterVerificationRequest.java index 0ff17ebf0..f1e59a1f6 100644 --- a/src/main/java/org/wise/vle/domain/webservice/crater/CRaterVerificationRequest.java +++ b/src/main/java/org/wise/vle/domain/webservice/crater/CRaterVerificationRequest.java @@ -3,22 +3,14 @@ import org.json.JSONException; import org.json.JSONObject; -import lombok.Getter; -import lombok.Setter; - -@Setter -public class CRaterVerificationRequest implements CRaterRequest { - String itemId; - String cRaterClientId; - - @Getter - String cRaterUrl; - +public class CRaterVerificationRequest extends AbstractCRaterRequest { public String generateBodyData() throws JSONException { - JSONObject body = new JSONObject(); - body.put("client_id", cRaterClientId); - body.put("service", "VerificationService"); - body.put("item_id", itemId); - return body.toString(); + JSONObject body = new JSONObject(super.generateBodyData()); + body.put("service", "VerificationService"); + return body.toString(); + } + + public String getCRaterUrlVariableBase() { + return "cRater_verification_url"; } } diff --git a/src/main/java/org/wise/vle/web/CRaterController.java b/src/main/java/org/wise/vle/web/CRaterController.java index 30ef348e4..58573b402 100644 --- a/src/main/java/org/wise/vle/web/CRaterController.java +++ b/src/main/java/org/wise/vle/web/CRaterController.java @@ -43,11 +43,11 @@ public class CRaterController { @GetMapping("/verify") String verifyItemId(CRaterVerificationRequest request) throws JSONException { - return cRaterService.getVerificationResponse(request); + return cRaterService.getCRaterResponse(request); } @PostMapping("/score") String scoreItem(@RequestBody CRaterScoringRequest request) throws JSONException { - return cRaterService.getScoringResponse(request); + return cRaterService.getCRaterResponse(request); } } diff --git a/src/main/resources/application-dockerdev-sample.properties b/src/main/resources/application-dockerdev-sample.properties index a12a0e02e..237f839c1 100644 --- a/src/main/resources/application-dockerdev-sample.properties +++ b/src/main/resources/application-dockerdev-sample.properties @@ -66,6 +66,11 @@ cRater_scoring_url= cRater_client_id= cRater_password= +berkeley_cRater_verification_url= +berkeley_cRater_scoring_url= +berkeley_cRater_client_id= +berkeley_cRater_password= + ######### database properties ######### # Modify below as needed. diff --git a/src/main/resources/application_sample.properties b/src/main/resources/application_sample.properties index ae6733b98..c8b5bb17e 100644 --- a/src/main/resources/application_sample.properties +++ b/src/main/resources/application_sample.properties @@ -66,6 +66,11 @@ cRater_scoring_url= cRater_client_id= cRater_password= +berkeley_cRater_verification_url= +berkeley_cRater_scoring_url= +berkeley_cRater_client_id= +berkeley_cRater_password= + ######### database properties ######### # Modify below as needed. diff --git a/src/test/java/org/wise/vle/domain/webservice/crater/CRaterServiceTest.java b/src/test/java/org/wise/vle/domain/webservice/crater/CRaterServiceTest.java index 57fd768f4..67abab653 100644 --- a/src/test/java/org/wise/vle/domain/webservice/crater/CRaterServiceTest.java +++ b/src/test/java/org/wise/vle/domain/webservice/crater/CRaterServiceTest.java @@ -6,7 +6,6 @@ import org.easymock.Mock; import org.easymock.TestSubject; import org.json.JSONException; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.core.env.Environment; @@ -25,32 +24,65 @@ public class CRaterServiceTest { private String password = "abc123"; private String scoringUrl = "https://test.org/score"; private String verifyUrl = "https://test.org/verify"; + private String berkeleyScoringUrl = "https://test.org/score/berkeley"; + private String berkeleyVerifyUrl = "https://test.org/verify/berkeley"; - @BeforeEach - public void before() { + public void beforeETS() { expect(appProperties.getProperty("cRater_client_id")).andReturn(clientId); expect(appProperties.getProperty("cRater_password")).andReturn(password); } + public void beforeBerkeley() { + expect(appProperties.getProperty("berkeley_cRater_client_id")).andReturn(clientId); + expect(appProperties.getProperty("berkeley_cRater_password")).andReturn(password); + } + @Test public void getScoringResponse_ShouldGetCRaterProperties() throws JSONException { + beforeETS(); CRaterScoringRequest request = new CRaterScoringRequest(); request.setItemId(itemId); request.setResponseId("1234567890"); request.setResponseText("hello"); expect(appProperties.getProperty("cRater_scoring_url")).andReturn(scoringUrl); replay(appProperties); - cRaterService.getScoringResponse(request); + cRaterService.getCRaterResponse(request); verify(appProperties); } @Test public void getVerificationResponse_ShouldGetCRaterProperties() throws JSONException { + beforeETS(); CRaterVerificationRequest request = new CRaterVerificationRequest(); request.setItemId(itemId); expect(appProperties.getProperty("cRater_verification_url")).andReturn(verifyUrl); replay(appProperties); - cRaterService.getVerificationResponse(request); + cRaterService.getCRaterResponse(request); + verify(appProperties); + } + + @Test + public void getBerkeleyScoringResponse_ShouldGetCRaterProperties() throws JSONException { + beforeBerkeley(); + CRaterScoringRequest request = new CRaterScoringRequest(); + request.setItemId("berkeley_" + itemId); + request.setResponseId("1234567890"); + request.setResponseText("hello"); + expect(appProperties.getProperty("berkeley_cRater_scoring_url")).andReturn(berkeleyScoringUrl); + replay(appProperties); + cRaterService.getCRaterResponse(request); + verify(appProperties); + } + + @Test + public void getBerkeleyVerificationResponse_ShouldGetCRaterProperties() throws JSONException { + beforeBerkeley(); + CRaterVerificationRequest request = new CRaterVerificationRequest(); + request.setItemId("berkeley_" + itemId); + expect(appProperties.getProperty("berkeley_cRater_verification_url")) + .andReturn(berkeleyVerifyUrl); + replay(appProperties); + cRaterService.getCRaterResponse(request); verify(appProperties); } } diff --git a/src/test/java/org/wise/vle/web/CRaterControllerTest.java b/src/test/java/org/wise/vle/web/CRaterControllerTest.java index 866f4070b..837c018b7 100644 --- a/src/test/java/org/wise/vle/web/CRaterControllerTest.java +++ b/src/test/java/org/wise/vle/web/CRaterControllerTest.java @@ -31,7 +31,7 @@ public void verifyItemId_ShouldReturnString() { CRaterVerificationRequest request = new CRaterVerificationRequest(); request.setItemId(itemId); try { - expect(cRaterService.getVerificationResponse(request)) + expect(cRaterService.getCRaterResponse(request)) .andReturn(createVerificationResponseString(itemId, true, trackingId, clientId)); replay(cRaterService); String response = controller.verifyItemId(request); @@ -59,7 +59,7 @@ public void scoreItemId_ShouldReturnString() { CRaterScoringRequest request = new CRaterScoringRequest(); request.setItemId(itemId); try { - expect(cRaterService.getScoringResponse(request)) + expect(cRaterService.getCRaterResponse(request)) .andReturn(createScoringResponseString(itemId, trackingId, clientId)); replay(cRaterService); String response = controller.scoreItem(request); diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index a987d8da6..3200bad51 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -64,6 +64,11 @@ cRater_scoring_url= cRater_client_id= cRater_password= +berkeley_cRater_verification_url= +berkeley_cRater_scoring_url= +berkeley_cRater_client_id= +berkeley_cRater_password= + ######### database properties ######### # Modify below as needed.