synchronized (this) {
boolean done = false;
int i = 0;
for (; i < acknowledgement.getAcknowledgementRange().size(); i++) {
AcknowledgementRange r = acknowledgement.getAcknowledgementRange().get(i);
if (r.getLower().compareTo(messageNumber) <= 0
&& r.getUpper().compareTo(messageNumber) >= 0) {
done = true;
break;
}
long diff = r.getLower() - messageNumber;
if (diff == 1) {
r.setLower(messageNumber);
done = true;
} else if (diff > 0) {
break;
} else if (messageNumber - r.getUpper().longValue() == 1) {
r.setUpper(messageNumber);
done = true;
break;
}
}
if (!done) {
// need new acknowledgement range
AcknowledgementRange range = new AcknowledgementRange();
range.setLower(messageNumber);
range.setUpper(messageNumber);
acknowledgement.getAcknowledgementRange().add(i, range);
if (acknowledgement.getAcknowledgementRange().size() > 1) {
// acknowledge out-of-order at first opportunity
scheduleImmediateAcknowledgement();