private HTTPExchange processResponseAcknowledgementReport(
            final AbstractBody resp)
            throws BOSHException {
        assertLocked();
        
        String reportStr = resp.getAttribute(Attributes.REPORT);
        if (reportStr == null) {
            // No report on this message
            return null;
        }
        
        Long report = Long.parseLong(reportStr);
        Long time = Long.parseLong(resp.getAttribute(Attributes.TIME));
        if (LOG.isLoggable(Level.FINE)) {
            LOG.fine("Received report of missing request (RID="
                    + report + ", time=" + time + "ms)");
        }

        // Find the missing request
        Iterator<ComposableBody> iter = pendingRequestAcks.iterator();
        AbstractBody req = null;
        while (iter.hasNext() && req == null) {
            AbstractBody pending = iter.next();
            Long pendingRID = Long.parseLong(
                    pending.getAttribute(Attributes.RID));
            if (report.equals(pendingRID)) {
                req = pending;
            }
        }

        if (req == null) {
            throw(new BOSHException("Report of missing message with RID '"
                    + reportStr
                    + "' but local copy of that request was not found"));
        }

        // Resend the missing request
        HTTPExchange exch = new HTTPExchange(req);
        exchanges.add(exch);
        notEmpty.signal();
        return exch;
    }
private HTTPExchange processResponseAcknowledgementReport ( final AbstractBody resp ) throws BOSHException { assertLocked ( ) ; String reportStr = resp . getAttribute ( Attributes . REPORT ) ; if ( reportStr == null ) { return null ; } Long report = Long . parseLong ( reportStr ) ; Long time = Long . parseLong ( resp . getAttribute ( Attributes . TIME ) ) ; if ( LOG . isLoggable ( Level . FINE ) ) { LOG . fine ( "Received report of missing request (RID=" + report + ", time=" + time + "ms)" ) ; } Iterator < ComposableBody > iter = pendingRequestAcks . iterator ( ) ; AbstractBody req = null ; while ( iter . hasNext ( ) && req == null ) { AbstractBody pending = iter . next ( ) ; Long pendingRID = Long . parseLong ( pending . getAttribute ( Attributes . RID ) ) ; if ( report . equals ( pendingRID ) ) { req = pending ; } } if ( req == null ) { throw ( new BOSHException ( "Report of missing message with RID '" + reportStr + "' but local copy of that request was not found" ) ) ; } HTTPExchange exch = new HTTPExchange ( req ) ; exchanges . add ( exch ) ; notEmpty . signal ( ) ; return exch ; }
Process the response in order to check for and respond to any potential
ack reports.

This method assumes the lock is currently held.

@param resp response
@return exchange to transmit if a resend is to be performed, or
{@code null} if no resend is necessary
@throws BOSHException when a a retry is needed but cannot be performed