Skip to content

Commit 61388e1

Browse files
committed
Merge pull request #1 from instructure/outcomes-passback
Outcomes passback
2 parents 4763b59 + b70e654 commit 61388e1

File tree

4 files changed

+89
-34
lines changed

4 files changed

+89
-34
lines changed

pom.xml

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<name>IMS BasicLTI Utilities</name>
66
<groupId>org.imsglobal</groupId>
77
<artifactId>basiclti-util</artifactId>
8-
<version>1.0.0</version>
8+
<version>1.1.0</version>
99
<organization>
1010
<name>IMS Global Learning Consortium</name>
1111
<url>www.imsglobal.org/</url>
@@ -49,9 +49,19 @@
4949
<version>20100527</version>
5050
</dependency>
5151
<dependency>
52-
<groupId>commons-httpclient</groupId>
53-
<artifactId>commons-httpclient</artifactId>
54-
<version>2.0.2</version>
52+
<groupId>org.apache.httpcomponents</groupId>
53+
<artifactId>httpclient</artifactId>
54+
<version>4.0.1</version>
55+
</dependency>
56+
<dependency>
57+
<groupId>oauth.signpost</groupId>
58+
<artifactId>signpost-core</artifactId>
59+
<version>1.2.1.2</version>
60+
</dependency>
61+
<dependency>
62+
<groupId>oauth.signpost</groupId>
63+
<artifactId>signpost-commonshttp4</artifactId>
64+
<version>1.2.1.2</version>
5565
</dependency>
5666
<dependency>
5767
<groupId>junit</groupId>

src/main/java/org/imsglobal/json/IMSJSONRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import net.oauth.SimpleOAuthValidator;
2222
import net.oauth.server.OAuthServlet;
2323
import net.oauth.signature.OAuthSignatureMethod;
24-
import org.apache.commons.httpclient.util.Base64;
24+
import org.apache.commons.codec.binary.Base64;
2525

2626
import org.json.simple.JSONValue;
2727

@@ -137,7 +137,7 @@ public void loadFromRequest(HttpServletRequest request)
137137
postBody = new String(bytes, "UTF-8");
138138
MessageDigest md = MessageDigest.getInstance("SHA1");
139139
md.update(bytes);
140-
byte[] output = Base64.encode(md.digest());
140+
byte[] output = Base64.encodeBase64(md.digest());
141141
String hash = new String(output);
142142
System.out.println("HASH="+hash+" bytes="+bytes.length);
143143
if ( ! hash.equals(oauth_body_hash) ) {

src/main/java/org/imsglobal/lti2/LTI2Servlet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@
3232
import javax.servlet.http.HttpServletRequest;
3333
import javax.servlet.http.HttpServletResponse;
3434

35-
import org.apache.commons.httpclient.HttpStatus;
3635
import org.apache.commons.logging.Log;
3736
import org.apache.commons.logging.LogFactory;
37+
import org.apache.http.HttpStatus;
3838
import org.codehaus.jackson.map.ObjectMapper;
3939
import org.codehaus.jackson.map.ObjectWriter;
4040
import org.imsglobal.basiclti.BasicLTIConstants;

src/main/java/org/imsglobal/pox/IMSPOXRequest.java

Lines changed: 72 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.imsglobal.pox;
22

33
import java.io.ByteArrayInputStream;
4+
import java.io.IOException;
45
import java.io.Reader;
56
import java.net.URLDecoder;
67
import java.security.MessageDigest;
@@ -27,9 +28,16 @@
2728
import net.oauth.SimpleOAuthValidator;
2829
import net.oauth.server.OAuthServlet;
2930
import net.oauth.signature.OAuthSignatureMethod;
31+
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
32+
import oauth.signpost.exception.OAuthException;
3033

34+
import org.apache.commons.codec.binary.Base64;
3135
import org.apache.commons.lang3.StringEscapeUtils;
32-
import org.apache.commons.httpclient.util.Base64;
36+
import org.apache.http.HttpResponse;
37+
import org.apache.http.client.HttpResponseException;
38+
import org.apache.http.client.methods.HttpPost;
39+
import org.apache.http.entity.StringEntity;
40+
import org.apache.http.impl.client.DefaultHttpClient;
3341
import org.imsglobal.basiclti.XMLMap;
3442
import org.w3c.dom.Document;
3543
import org.w3c.dom.Element;
@@ -224,7 +232,7 @@ public void loadFromRequest(HttpServletRequest request)
224232
try {
225233
MessageDigest md = MessageDigest.getInstance("SHA1");
226234
md.update(postBody.getBytes());
227-
byte[] output = Base64.encode(md.digest());
235+
byte[] output = Base64.encodeBase64(md.digest());
228236
String hash = new String(output);
229237
// System.out.println("HASH="+hash);
230238
if ( ! hash.equals(oauth_body_hash) ) {
@@ -481,35 +489,72 @@ public String getResponse(String description, String major, String severity,
481489
bodyString, newLine);
482490

483491
}
492+
493+
static final String replaceResultMessage =
494+
"<?xml version = \"1.0\" encoding = \"UTF-8\"?>"+
495+
"<imsx_POXEnvelopeRequest xmlns=\"http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0\">"+
496+
" <imsx_POXHeader>"+
497+
" <imsx_POXRequestHeaderInfo>"+
498+
" <imsx_version>V1.0</imsx_version>"+
499+
" </imsx_POXRequestHeaderInfo>"+
500+
" </imsx_POXHeader>"+
501+
" <imsx_POXBody>"+
502+
" <replaceResultRequest>"+
503+
" <resultRecord>"+
504+
" <sourcedGUID>"+
505+
" <sourcedId>%s</sourcedId>"+
506+
" </sourcedGUID>"+
507+
" <result>"+
508+
" <resultScore>"+
509+
" <textString>%s</textString>"+
510+
" </resultScore>"+
511+
" %s"+
512+
" </result>"+
513+
" </resultRecord>"+
514+
" </replaceResultRequest>"+
515+
" </imsx_POXBody>"+
516+
"</imsx_POXEnvelopeRequest>";
517+
518+
static final String resultDataText = "<resultData><text>%s</text></resultData>";
519+
520+
static final String resultDataUrl = "<resultData><text>%s</text></resultData>";
521+
522+
public static void sendReplaceResult(String url, String key, String secret, String sourcedid, String score) throws IOException, OAuthException {
523+
sendReplaceResult(url, key, secret, sourcedid, score, null);
524+
}
525+
526+
public static void sendReplaceResult(String url, String key, String secret, String sourcedid, String score, String resultData) throws IOException, OAuthException {
527+
sendReplaceResult(url, key, secret, sourcedid, score, resultData, false);
528+
}
529+
530+
public static void sendReplaceResult(String url, String key, String secret, String sourcedid, String score, String resultData, Boolean isUrl) throws IOException, OAuthException {
531+
String dataXml = "";
532+
if (resultData != null) {
533+
if (isUrl) {
534+
dataXml = String.format(resultDataUrl, StringEscapeUtils.escapeXml(resultData));
535+
} else {
536+
dataXml = String.format(resultDataText, StringEscapeUtils.escapeXml(resultData));
537+
}
538+
}
539+
String xml = String.format(replaceResultMessage, StringEscapeUtils.escapeXml(sourcedid),
540+
StringEscapeUtils.escapeXml(score), dataXml);
541+
542+
CommonsHttpOAuthConsumer signer = new CommonsHttpOAuthConsumer(key, secret);
543+
HttpPost request = new HttpPost(url);
544+
request.setHeader("Content-Type", "application/xml");
545+
request.setEntity(new StringEntity(xml, "UTF-8"));
546+
signer.sign(request);
547+
DefaultHttpClient client = new DefaultHttpClient();
548+
HttpResponse response = client.execute(request);
549+
if (response.getStatusLine().getStatusCode() >= 400) {
550+
throw new HttpResponseException(response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase());
551+
}
552+
}
484553

485554
/** Unit Tests */
486-
static final String inputTestData = "<?xml version = \"1.0\" encoding = \"UTF-8\"?>\n" +
487-
"<imsx_POXEnvelopeRequest xmlns = \"http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0\">\n" +
488-
"<imsx_POXHeader>\n" +
489-
"<imsx_POXRequestHeaderInfo>\n" +
490-
"<imsx_version>V1.0</imsx_version>\n" +
491-
"<imsx_messageIdentifier>999999123</imsx_messageIdentifier>\n" +
492-
"</imsx_POXRequestHeaderInfo>\n" +
493-
"</imsx_POXHeader>\n" +
494-
"<imsx_POXBody>\n" +
495-
"<replaceResultRequest>\n" +
496-
"<resultRecord>\n" +
497-
"<sourcedGUID>\n" +
498-
"<sourcedId>3124567</sourcedId>\n" +
499-
"</sourcedGUID>\n" +
500-
"<result>\n" +
501-
"<resultScore>\n" +
502-
"<language>en-us</language>\n" +
503-
"<textString>A</textString>\n" +
504-
"</resultScore>\n" +
505-
"</result>\n" +
506-
"</resultRecord>\n" +
507-
"</replaceResultRequest>\n" +
508-
"</imsx_POXBody>\n" +
509-
"</imsx_POXEnvelopeRequest>";
510-
511555
public static void runTest() {
512556
System.out.println("Runnig test.");
557+
String inputTestData = String.format(replaceResultMessage, "3124567", "A", "");
513558
IMSPOXRequest pox = new IMSPOXRequest(inputTestData);
514559
System.out.println("Version = "+pox.getHeaderVersion());
515560
System.out.println("Operation = "+pox.getOperation());

0 commit comments

Comments
 (0)