docs: public void downloadPiece(final Piece piece)
            throws IllegalStateException {
      List<PeerMessage.RequestMessage> toSend = new ArrayList<PeerMessage.RequestMessage>();
      synchronized (this.requestsLock) {
        if (myRequestedPieces.containsKey(piece)) {
          //already requested
          return;
        }
        int requestedBlocksCount = 0;
        int lastRequestedOffset = 0;
        while (lastRequestedOffset < piece.size()) {
          PeerMessage.RequestMessage request = PeerMessage.RequestMessage
                  .craft(piece.getIndex(), lastRequestedOffset,
                          Math.min((int) (piece.size() - lastRequestedOffset),
                                  PeerMessage.RequestMessage.DEFAULT_REQUEST_SIZE));
          toSend.add(request);
          requestedBlocksCount++;
          lastRequestedOffset = request.getLength() + lastRequestedOffset;
        }
        myRequestedPieces.put(piece, requestedBlocksCount);
        this.downloading = myRequestedPieces.size() > 0;
      }
      for (PeerMessage.RequestMessage requestMessage : toSend) {
        this.send(requestMessage);
      }
    }