1717
1818import javax .servlet .MultipartConfigElement ;
1919import javax .servlet .http .Part ;
20-
21- import com .rusticisoftware .tincan .http .HTTPPart ;
2220import org .apache .commons .codec .binary .Base64 ;
2321import com .fasterxml .jackson .core .JsonProcessingException ;
2422import com .fasterxml .jackson .databind .JsonNode ;
2523import com .fasterxml .jackson .databind .node .ArrayNode ;
24+ import com .fasterxml .jackson .databind .ObjectMapper ;
2625import com .rusticisoftware .tincan .documents .ActivityProfileDocument ;
2726import com .rusticisoftware .tincan .documents .AgentProfileDocument ;
2827import com .rusticisoftware .tincan .documents .Document ;
3433import com .rusticisoftware .tincan .json .Mapper ;
3534import com .rusticisoftware .tincan .json .StringOfJSON ;
3635import com .rusticisoftware .tincan .v10x .StatementsQuery ;
36+ import com .rusticisoftware .tincan .http .HTTPPart ;
37+ import com .rusticisoftware .tincan .internal .MultipartParser ;
3738import org .eclipse .jetty .client .api .ContentResponse ;
3839import org .eclipse .jetty .client .api .Request ;
3940import org .eclipse .jetty .client .api .Response ;
@@ -219,22 +220,21 @@ private HTTPResponse makeSyncRequest(HTTPRequest req) {
219220 }
220221 }
221222
222-
223223 OutputStreamContentProvider content = new OutputStreamContentProvider ();
224224 InputStreamResponseListener listener = new InputStreamResponseListener ();
225225
226- try (OutputStream output = content .getOutputStream ()){
227- if (req .getPartList () == null || req .getPartList ().size () <= 0 ) {
226+ try (OutputStream output = content .getOutputStream ()) {
227+ if (req .getPartList () == null || req .getPartList ().size () <= 0 ) {
228228 if (req .getContentType () != null ) {
229229 webReq .header ("Content-Type" , req .getContentType ());
230230 }
231- else {
231+ else if ( req . getContentType () != "GET" ) {
232232 webReq .header ("Content-Type" , "application/octet-stream" );
233233 }
234234
235235 webReq .content (content ).send (listener );
236236
237- if (req .getContent () != null ) {
237+ if (req .getContent () != null ) {
238238 output .write (req .getContent ());
239239 }
240240
@@ -247,7 +247,6 @@ private HTTPResponse makeSyncRequest(HTTPRequest req) {
247247 webReq .header ("Content-Type" , "multipart/mixed; boundary=" + multiout .getBoundary ());
248248 webReq .content (content ).send (listener );
249249
250-
251250 if (req .getContentType () != null ) {
252251 multiout .startPart (req .getContentType ());
253252 } else {
@@ -263,8 +262,6 @@ private HTTPResponse makeSyncRequest(HTTPRequest req) {
263262 "Content-Transfer-Encoding: binary" ,
264263 "X-Experience-API-Hash: " + part .getSha2 ()});
265264 multiout .write (part .getContent ());
266-
267-
268265 }
269266 multiout .close ();
270267 }
@@ -274,7 +271,7 @@ private HTTPResponse makeSyncRequest(HTTPRequest req) {
274271
275272 response .setStatus (httpResponse .getStatus ());
276273 response .setStatusMsg (httpResponse .getReason ());
277- for (HttpField header : httpResponse .getHeaders ()) {
274+ for (HttpField header : httpResponse .getHeaders ()) {
278275 response .setHeader (header .getName (), header .getValue ());
279276 }
280277
@@ -284,23 +281,52 @@ private HTTPResponse makeSyncRequest(HTTPRequest req) {
284281 try (InputStream responseContent = listener .getInputStream ())
285282 {
286283
287- if (response .getContentType () != null && response .getContentType ().contains ("multipart/mixed" )){
284+ if (response .getContentType () != null && response .getContentType ().contains ("multipart/mixed" )) {
288285
289- MultiPartInputStreamParser multiin = new MultiPartInputStreamParser (responseContent , response . getContentType (). replace ( "multipart/mixed" , "multipart/form-data" ), new MultipartConfigElement ( "/tmp" ), new File ( "/tmp" ) );
286+ MultipartParser responseHandler = new MultipartParser (responseContent );
290287
291- Collection <Part > parts = multiin .getParts ();
288+ // We need to get the first part that contains the statements and parse them
289+ responseHandler .nextPart ();
292290
293- for (Part part : parts ) {
294- if (part .getContentType ().equals ("application/json" )){
291+ ArrayList <Statement > statements = new ArrayList <Statement >();
292+
293+ if (responseHandler .getHeaders ().get ("Content-Type" ).contains ("application/json" )) {
294+ JsonNode statementsNode = (new StringOfJSON (new String (responseHandler .getContent ())).toJSONNode ());
295+ if (! (statementsNode .findPath ("statements" ).isMissingNode ())) {
296+ statementsNode = statementsNode .findPath ("statements" );
297+ for (JsonNode obj : statementsNode ) {
298+ statements .add (new Statement (obj ));
299+ }
300+ }
301+ else {
302+ statements .add (new Statement (statementsNode ));
295303 }
304+ }
296305
306+ while (! responseHandler .noMoreParts ) {
307+ responseHandler .nextPart ();
308+ String hashToMatch = responseHandler .getHeaders ().get ("X-Experience-API-Hash" );
309+ for (Statement stmt : statements ) {
310+ if (stmt .getAttachments () != null ) {
311+ for (Attachment a : stmt .getAttachments ()) {
312+ if (a .getSha2 ().equals (hashToMatch )) {
313+ a .setContent (responseHandler .getContent ());
314+ break ;
315+ }
316+ }
317+ }
318+ }
297319 }
320+ StatementsResult responseStatements = new StatementsResult ();
321+ responseStatements .setStatements (statements );
322+ response .setContentBytes (responseStatements .toJSONNode (TCAPIVersion .V101 ).toString ().getBytes ());
323+ }
324+ else {
325+ String responseContentString = IO .toString (responseContent );
326+ response .setContentBytes (responseContentString .getBytes ());
298327 }
299- String responseContentString = IO .toString (responseContent );
300- response .setContentBytes (responseContentString .getBytes ());
301328 }
302329
303-
304330 } catch (Exception ex ) {
305331 response .setStatus (400 );
306332 response .setStatusMsg ("Exception in RemoteLRS.makeSyncRequest(): " + ex );
@@ -309,12 +335,11 @@ private HTTPResponse makeSyncRequest(HTTPRequest req) {
309335 return response ;
310336 }
311337
312- private StatementLRSResponse getStatement (String id , String paramName ) {
338+ private StatementLRSResponse getStatement (HashMap < String , String > params ) {
313339 HTTPRequest request = new HTTPRequest ();
314340 request .setMethod (HttpMethod .GET .asString ());
315341 request .setResource ("statements" );
316- request .setQueryParams (new HashMap <String , String >());
317- request .getQueryParams ().put (paramName , id );
342+ request .setQueryParams (params );
318343
319344 HTTPResponse response = makeSyncRequest (request );
320345 int status = response .getStatus ();
@@ -612,14 +637,20 @@ public StatementsResultLRSResponse saveStatements(List<Statement> statements) {
612637 }
613638
614639 @ Override
615- public StatementLRSResponse retrieveStatement (String id ) {
616- return getStatement (id , "statementId" );
640+ public StatementLRSResponse retrieveStatement (String id , boolean attachments ) {
641+ HashMap <String , String > params = new HashMap <String , String >();
642+ params .put ("statementId" , id );
643+ params .put ("attachments" , String .valueOf (attachments ));
644+ return getStatement (params );
617645 }
618646
619647 @ Override
620- public StatementLRSResponse retrieveVoidedStatement (String id ) {
648+ public StatementLRSResponse retrieveVoidedStatement (String id , boolean attachments ) {
621649 String paramName = (this .getVersion () == TCAPIVersion .V095 ) ? "statementId" : "voidedStatementId" ;
622- return getStatement (id , paramName );
650+ HashMap <String , String > params = new HashMap <String , String >();
651+ params .put (paramName , id );
652+ params .put ("attachments" , String .valueOf (attachments ));
653+ return getStatement (params );
623654 }
624655
625656 @ Override
0 commit comments