final String domain,
ProtocolHashedVersion startVersion,
ProtocolHashedVersion endVersion,
long lengthLimit,
final WaveletFederationProvider.HistoryResponseListener listener) {
final IQ submitIq = new IQ(IQ.Type.get);
submitIq.setID(XmppUtil.generateUniqueId());
LOG.info("Getting history from remote server, wavelet " + waveletName
+ " version " + startVersion + " (inc) through " + endVersion
+ " (ex)");
submitIq.setFrom(jid);
Element pubsub =
submitIq.setChildElement("pubsub",
XmppNamespace.NAMESPACE_PUBSUB);
Element items = pubsub.addElement("items");
items.addAttribute("node", "wavelet");
Element historyDelta =
items.addElement("delta-history",
XmppNamespace.NAMESPACE_WAVE_SERVER);
historyDelta.addAttribute("start-version", Long.toString(startVersion
.getVersion()));
historyDelta.addAttribute("start-version-hash", Base64Util
.encode(startVersion.getHistoryHash()));
historyDelta.addAttribute("end-version", Long.toString(endVersion
.getVersion()));
historyDelta.addAttribute("end-version-hash", Base64Util.encode(endVersion
.getHistoryHash()));
if (lengthLimit > 0) {
historyDelta.addAttribute("response-length-limit", Long
.toString(lengthLimit));
}
try {
historyDelta.addAttribute("wavelet-name",
XmppUtil.waveletNameCodec.waveletNameToURI(waveletName));
} catch (EncodingException e) {
listener.onFailure(
FederationErrors.badRequest("Couldn't encode wavelet name " + waveletName));
return;
}
final PacketCallback callback = new PacketCallback() {
public void error(FederationError error) {
listener.onFailure(error);
}
@Override
public void run(Packet packet) {
processHistoryResponse(packet, listener);
}
};
disco.discoverRemoteJid(domain, new SuccessFailCallback<String, String>() {
@Override
public void onSuccess(String remoteJid) {
Preconditions.checkNotNull(remoteJid);
submitIq.setTo(remoteJid);
manager.send(submitIq, callback, XMPP_PROVIDER_TIMEOUT);
}
@Override
public void onFailure(String errorMessage) {