Skip to content

Commit

Permalink
Update CRater to parse additional attributes (#36)
Browse files Browse the repository at this point in the history
* Added parser for additional attributes. #34

* Detect ideas in singe score items #34
  • Loading branch information
hirokiterashima authored Sep 27, 2021
1 parent 610d941 commit b7b921d
Show file tree
Hide file tree
Showing 10 changed files with 167 additions and 33 deletions.
2 changes: 1 addition & 1 deletion .classpath
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**/org/wise/portal/domain/authentication/**/*.java|**/org/wise/portal/domain/newsitem/**/*.java|**/org/wise/portal/domain/run/**/*.java|**/org/wise/portal/domain/webservice/**/*.java|**/org/wise/portal/presentation/web/controllers/general/contactwise/*.java|**/org/wise/portal/presentation/web/controllers/teacher/management/BatchStudentChangePasswordControllerTest.java|**/org/wise/portal/presentation/web/controllers/teacher/management/ChangeStudentPeriodControllerTest.java|**/org/wise/portal/presentation/web/controllers/teacher/management/ChangeWorkgroupControllerTest.java|**/org/wise/portal/presentation/web/controllers/teacher/management/StudentListControllerTest.java|**/org/wise/portal/presentation/web/controllers/teacher/management/UpdateMyAccountInfoControllerTest.java|**/org/wise/portal/presentation/web/controllers/teacher/management/ViewMyStudentsControllerTest.java|**/org/wise/portal/presentation/web/controllers/teacher/project/**/*.java|**/org/wise/portal/presentation/web/controllers/teacher/run/ShareProjectRunControllerTest.java|**/org/wise/portal/presentation/web/controllers/teacher/RegisterTeacherControllerTest.java|**/org/wise/portal/presentation/web/controllers/IndexControllerTest.java|**/org/wise/portal/presentation/web/controllers/LoginControllerTest.java|**/org/wise/portal/presentation/web/controllers/RegisterStudentControllerTest.java|**/org/wise/portal/presentation/validators/teacher/*.java|**/org/wise/portal/dao/*.java|**/org/wise/portal/dao/authentication/impl/AllTests.java|**/org/wise/portal/dao/authentication/impl/HibernateAclEntryDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateAclSidDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateAclTargetObjectDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateAclTargetObjectIdentityDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateGrantedAuthorityDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateStudentUserDetailsDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateTeacherUserDetailsDaoTest.java|**/org/wise/portal/dao/group/**/*.java|**/org/wise/portal/dao/premadecomment/**/*.java" kind="src" output="target/test-classes" path="src/test/java">
<classpathentry excluding="**/org/wise/portal/domain/authentication/**/*.java|**/org/wise/portal/domain/newsitem/**/*.java|**/org/wise/portal/domain/run/**/*.java|**/org/wise/portal/domain/webservice/**/*.java|**/org/wise/portal/presentation/web/controllers/general/contactwise/*.java|**/org/wise/portal/presentation/web/controllers/teacher/management/BatchStudentChangePasswordControllerTest.java|**/org/wise/portal/presentation/web/controllers/teacher/management/StudentListControllerTest.java|**/org/wise/portal/presentation/web/controllers/teacher/management/UpdateMyAccountInfoControllerTest.java|**/org/wise/portal/presentation/web/controllers/teacher/project/**/*.java|**/org/wise/portal/presentation/web/controllers/teacher/run/ShareProjectRunControllerTest.java|**/org/wise/portal/presentation/web/controllers/teacher/RegisterTeacherControllerTest.java|**/org/wise/portal/presentation/web/controllers/IndexControllerTest.java|**/org/wise/portal/presentation/web/controllers/LoginControllerTest.java|**/org/wise/portal/presentation/web/controllers/RegisterStudentControllerTest.java|**/org/wise/portal/presentation/validators/teacher/*.java|**/org/wise/portal/dao/*.java|**/org/wise/portal/dao/authentication/impl/AllTests.java|**/org/wise/portal/dao/authentication/impl/HibernateAclEntryDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateAclSidDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateAclTargetObjectDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateAclTargetObjectIdentityDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateGrantedAuthorityDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateStudentUserDetailsDaoTest.java|**/org/wise/portal/dao/authentication/impl/HibernateTeacherUserDetailsDaoTest.java|**/org/wise/portal/dao/group/**/*.java|**/org/wise/portal/dao/premadecomment/**/*.java" kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.wise.vle.domain.webservice.crater;

import java.util.ArrayList;
import java.util.List;

import org.w3c.dom.Node;

import lombok.Getter;

@Getter
public class CRaterIdea {

String name;
boolean detected;
List<Integer> characterOffsets;

public CRaterIdea(Node ideaNode) {
this.name = getNodeValue(ideaNode, "name");
this.detected = getNodeValue(ideaNode, "detected").equals("1");
this.characterOffsets = new ArrayList<Integer>();
}

private String getNodeValue(Node node, String name) {
return node.getAttributes().getNamedItem(name).getNodeValue();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,16 +81,32 @@ public int getScore() {
public List<CRaterSubScore> getScores() {
List<CRaterSubScore> scores = new ArrayList<CRaterSubScore>();
NodeList scoreNodes = getScoreNodes();
for (int s = 0; s < scoreNodes.getLength(); s++) {
scores.add(new CRaterSubScore(scoreNodes.item(s)));
for (int i = 0; i < scoreNodes.getLength(); i++) {
scores.add(new CRaterSubScore(scoreNodes.item(i)));
}
return scores;
}

/**
* @return A List of CRaterIdea objects in the response
*/
public List<CRaterIdea> getIdeas() {
List<CRaterIdea> ideas = new ArrayList<CRaterIdea>();
NodeList ideaNodes = getIdeaNodes();
for (int i = 0; i < ideaNodes.getLength(); i++) {
ideas.add(new CRaterIdea(ideaNodes.item(i)));
}
return ideas;
}

private NodeList getScoreNodes() {
return getXMLDocument().getElementsByTagName("score");
}

private NodeList getIdeaNodes() {
return getXMLDocument().getElementsByTagName("idea");
}

private Node getResponseNode() {
NodeList responseList = getXMLDocument().getElementsByTagName("response");
return responseList.item(0);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,33 @@
package org.wise.vle.domain.webservice.crater;

import org.w3c.dom.NamedNodeMap;
import com.fasterxml.jackson.annotation.JsonInclude;

import org.w3c.dom.Node;

import lombok.Getter;

@Getter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CRaterSubScore {
String id;
int score;
float realNumberScore;
int score;
Integer scoreRangeMax;
Integer scoreRangeMin;

public CRaterSubScore(Node scoreNode) {
NamedNodeMap attributes = scoreNode.getAttributes();
this.id = attributes.getNamedItem("id").getNodeValue();
this.score = Integer.parseInt(attributes.getNamedItem("score").getNodeValue());
this.realNumberScore =
Float.parseFloat(attributes.getNamedItem("realNumberScore").getNodeValue());
this.id = getNodeValue(scoreNode, "id");
this.score = Integer.parseInt(getNodeValue(scoreNode, "score"));
this.realNumberScore = Float.parseFloat(getNodeValue(scoreNode, "realNumberScore"));
if (scoreNode.getAttributes().getNamedItem("score_range_min") != null) {
this.scoreRangeMin = Integer.parseInt(getNodeValue(scoreNode, "score_range_min"));
}
if (scoreNode.getAttributes().getNamedItem("score_range_max") != null) {
this.scoreRangeMax = Integer.parseInt(getNodeValue(scoreNode, "score_range_max"));
}
}

private String getNodeValue(Node node, String name) {
return node.getAttributes().getNamedItem(name).getNodeValue();
}
}
1 change: 1 addition & 0 deletions src/main/java/org/wise/vle/web/CRaterController.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ HashMap<String, Object> scoreItem(@RequestBody CRaterScoringRequest request) {
} else {
response.put("scores", cRaterResponse.getScores());
}
response.put("ideas", cRaterResponse.getIdeas());
response.put("cRaterResponse", cRaterResponse.getResponse());
return response;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.wise.vle.domain.webservice.crater;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.Test;

public class CRaterIdeaTest extends CRaterResponseSubItemTest {

@Test
public void constructor_ShouldDetectIdea() throws Exception {
CRaterIdea idea = new CRaterIdea(getNode(
"<idea name=\"idea1\" detected=\"1\" character_offsets=\"[]\" />"));
assertEquals("idea1", idea.getName());
assertTrue(idea.isDetected());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.wise.vle.domain.webservice.crater;

import java.io.ByteArrayInputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Node;

public class CRaterResponseSubItemTest {

protected Node getNode(String xmlString) throws Exception {
return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
new ByteArrayInputStream(xmlString.getBytes())).getDocumentElement();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,18 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;

import org.easymock.EasyMockRunner;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(EasyMockRunner.class)
public class CRaterScoringResponseTest {

String singleScoreXML = "<crater-results><tracking id=\"1013701\"/><client id=\"WISETEST\"/>" +
String singleScoreXml = "<crater-results><tracking id=\"1013701\"/><client id=\"WISETEST\"/>" +
"<items><item id=\"Photo_Sun\">" +
"<responses><response id=\"testID\" score=\"4\" concepts=\"1,2,3,4,5\"/></responses>" +
"</item></items></crater-results>";

CRaterScoringResponse singleScoreResponse = new CRaterScoringResponse(singleScoreXML);
CRaterScoringResponse singleScoreResponse = new CRaterScoringResponse(singleScoreXml);

String subScoresXML = "<crater-results><tracking id=\"1367459\" /><client id=\"WISETEST\" />" +
String subScoresXml = "<crater-results><tracking id=\"1367459\" /><client id=\"WISETEST\" />" +
"<items><item id=\"STRIDES_EX1\"><responses>" +
"<response id=\"1547591618656\" score=\"\" realNumberScore=\"\" confidenceMeasure=\"0.99\">" +
"<scores><score id=\"science\" score=\"1\" realNumberScore=\"0.2919\" />" +
Expand All @@ -27,7 +24,7 @@ public class CRaterScoringResponseTest {
"<advisorylist><advisorycode>0</advisorycode></advisorylist>" +
"</response></responses></item></items></crater-results>";

CRaterScoringResponse subScoresResponse = new CRaterScoringResponse(subScoresXML);
CRaterScoringResponse subScoresResponse = new CRaterScoringResponse(subScoresXml);

@Test
public void isSingleScore() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.wise.vle.domain.webservice.crater;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import org.junit.Test;

public class CRaterSubScoreTest extends CRaterResponseSubItemTest {

String subScoreXmlWithoutMinMax = "<score id=\"science\" score=\"1\" realNumberScore=\"0.2919\" />";
String subScoreXmlWithMinMax =
"<score id=\"science\" score=\"1\" realNumberScore=\"0.2919\" score_range_min=\"1\" score_range_max=\"5\" />";

@Test
public void constructor_NoRangeMinMax_FieldsShouldBeNull() throws Exception {
CRaterSubScore score = new CRaterSubScore(getNode(subScoreXmlWithoutMinMax));
assertEquals(1, score.getScore());
assertEquals(0.2919, score.getRealNumberScore(), 0.00001);
assertNull(score.getScoreRangeMin());
assertNull(score.getScoreRangeMax());
}

@Test
public void constructor_WithRangeMinMax_FieldsShouldBeSet() throws Exception {
CRaterSubScore score = new CRaterSubScore(getNode(subScoreXmlWithMinMax));
assertEquals(1, score.getScore());
assertEquals(0.2919, score.getRealNumberScore(), 0.00001);
assertEquals(1, score.getScoreRangeMin().intValue());
assertEquals(5, score.getScoreRangeMax().intValue());
}
}
54 changes: 38 additions & 16 deletions src/test/java/org/wise/vle/web/CRaterControllerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.powermock.api.easymock.PowerMock.replayAll;
Expand All @@ -20,6 +21,7 @@
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.wise.vle.domain.webservice.crater.CRaterHttpClient;
import org.wise.vle.domain.webservice.crater.CRaterIdea;
import org.wise.vle.domain.webservice.crater.CRaterScoringRequest;
import org.wise.vle.domain.webservice.crater.CRaterScoringResponse;
import org.wise.vle.domain.webservice.crater.CRaterSubScore;
Expand Down Expand Up @@ -66,45 +68,65 @@ public void verifyItemId_InvalidId_ReturnFalse() {
}

@Test
public void scoreItem_SingleScoreItem_ReturnScore() {
@SuppressWarnings("unchecked")
public void scoreItem_SingleScoreItem_ReturnScoreAndIdeas() {
CRaterScoringRequest request = new CRaterScoringRequest();
String cRaterXMLResponse = "<crater-results><tracking id=\"1767940\" />" +
String cRaterXmlResponse = "<crater-results><tracking id=\"1767940\" />" +
"<client id=\"WISETEST2\"/><items><item id=\"GREENROOF-II\" ><responses>" +
"<response id=\"12345\" score=\"1\" realNumberScore=\"1.1138\" confidenceMeasure=\"0.99\" >" +
"<advisorylist><advisorycode>0</advisorycode></advisorylist></response>" +
"<advisorylist><advisorycode>0</advisorycode></advisorylist><feedback><ideas>" +
"<idea name=\"idea1\" detected=\"1\" character_offsets=\"[]\" />" +
"</ideas></feedback></response>" +
"</responses></item></items></crater-results>";
CRaterScoringResponse cRaterResponse = new CRaterScoringResponse(cRaterXMLResponse);
CRaterScoringResponse cRaterResponse = new CRaterScoringResponse(cRaterXmlResponse);
expect(CRaterHttpClient.getScoringResponse(request)).andReturn(cRaterResponse);
replayAll();
HashMap<String, Object> scoreItemResponse = controller.scoreItem(request);
assertFalse(scoreItemResponse.containsKey("scores"));
assertTrue(scoreItemResponse.containsKey("score"));
assertEquals(1, scoreItemResponse.get("score"));
assertEquals(cRaterXMLResponse, scoreItemResponse.get("cRaterResponse"));
assertEquals(cRaterXmlResponse, scoreItemResponse.get("cRaterResponse"));
assertTrue(scoreItemResponse.containsKey("ideas"));
List<CRaterIdea> ideas = (List<CRaterIdea>) scoreItemResponse.get("ideas");
assertEquals(1, ideas.size());
assertTrue(ideas.get(0).isDetected());
}

@Test
@SuppressWarnings("unchecked")
public void scoreItem_MultipleScoresItem_ReturnScores() {
public void scoreItem_MultipleScoresItem_ReturnScoresAndIdeas() {
CRaterScoringRequest request = new CRaterScoringRequest();
String cRaterXMLResponse = "<crater-results><tracking id=\"1767886\" />" +
"<client id=\"WISETEST2\"/><items><item id=\"ColdBeverage1Sub\" ><responses>" +
String cRaterXmlResponse = "<crater-results>" +
"<items><item id=\"ColdBeverage1Sub\" ><responses>" +
"<response id=\"12345\" score=\"\" realNumberScore=\"\" confidenceMeasure=\"0.99\" >" +
"<scores><score id=\"experimentation\" score=\"1\" realNumberScore=\"1.0302\" />" +
"<score id=\"science\" score=\"1\" realNumberScore=\"1.0487\" />" +
"<score id=\"science\" score=\"1\" realNumberScore=\"1.0487\" score_range_min=\"0\" />" +
"<score id=\"ki\" score=\"2\" realNumberScore=\"1.5486\" /></scores>" +
"<advisorylist><advisorycode>0</advisorycode></advisorylist></response></responses>" +
"<feedback><ideas>" +
"<idea name=\"idea1\" detected=\"1\" character_offsets=\"[]\" />" +
"<idea name=\"idea2\" detected=\"0\" character_offsets=\"[]\" />" +
"</ideas></feedback>" +
"</response></responses>" +
"</item></items></crater-results>";
CRaterScoringResponse cRaterResponse = new CRaterScoringResponse(cRaterXMLResponse);
CRaterScoringResponse cRaterResponse = new CRaterScoringResponse(cRaterXmlResponse);
expect(CRaterHttpClient.getScoringResponse(request)).andReturn(cRaterResponse);
replayAll();
HashMap<String, Object> scoreItemResponse = controller.scoreItem(request);
assertFalse(scoreItemResponse.containsKey("score"));
assertTrue(scoreItemResponse.containsKey("scores"));
assertEquals(3, ((List<CRaterSubScore>) scoreItemResponse.get("scores")).size());
assertEquals(1, ((List<CRaterSubScore>) scoreItemResponse.get("scores")).get(0).getScore());
assertEquals(1, ((List<CRaterSubScore>) scoreItemResponse.get("scores")).get(1).getScore());
assertEquals(2, ((List<CRaterSubScore>) scoreItemResponse.get("scores")).get(2).getScore());
assertEquals(cRaterXMLResponse, scoreItemResponse.get("cRaterResponse"));
List<CRaterSubScore> subScores = (List<CRaterSubScore>) scoreItemResponse.get("scores");
assertEquals(3, subScores.size());
assertEquals(1, subScores.get(0).getScore());
assertEquals(1, subScores.get(1).getScore());
assertEquals(2, subScores.get(2).getScore());
assertNull(subScores.get(0).getScoreRangeMin());
assertNull(subScores.get(0).getScoreRangeMax());
assertEquals(0, subScores.get(1).getScoreRangeMin());
assertEquals(cRaterXmlResponse, scoreItemResponse.get("cRaterResponse"));
assertTrue(scoreItemResponse.containsKey("ideas"));
List<CRaterIdea> ideas = (List<CRaterIdea>) scoreItemResponse.get("ideas");
assertEquals(2, ideas.size());
assertTrue(ideas.get(0).isDetected());
assertFalse(ideas.get(1).isDetected());
}
}

0 comments on commit b7b921d

Please sign in to comment.