Skip to content
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -31,4 +23,8 @@ public String generateBodyData() throws JSONException {
body.put("responses", responses);
return body.toString();
}

public String getCRaterUrlVariableBase() {
return "cRater_scoring_url";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand All @@ -85,16 +80,18 @@ 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));
HttpResponse response = client.execute(post);
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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
}
4 changes: 2 additions & 2 deletions src/main/java/org/wise/vle/web/CRaterController.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
5 changes: 5 additions & 0 deletions src/main/resources/application-dockerdev-sample.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
5 changes: 5 additions & 0 deletions src/main/resources/application_sample.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
}
}
4 changes: 2 additions & 2 deletions src/test/java/org/wise/vle/web/CRaterControllerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
5 changes: 5 additions & 0 deletions src/test/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down