Rework blocking command code.

Mostly remove the helper utils. The server is required to present the
client with a consisent state of the block list and corresponding
modifications, so we should not end up with duplicate entires if we
don't check for them.

SMACK-731
This commit is contained in:
Florian Schmaus 2016-08-31 08:20:13 +02:00
parent 9554c7be26
commit 98bacb144d
5 changed files with 24 additions and 40 deletions

View File

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2016 Fernando Ramirez * Copyright 2016 Fernando Ramirez, Florian Schmaus
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -44,6 +44,7 @@ import org.jxmpp.jid.Jid;
* Blocking command manager class. * Blocking command manager class.
* *
* @author Fernando Ramirez * @author Fernando Ramirez
* @author Florian Schmaus
* @see <a href="http://xmpp.org/extensions/xep-0191.html">XEP-0191: Blocking * @see <a href="http://xmpp.org/extensions/xep-0191.html">XEP-0191: Blocking
* Command</a> * Command</a>
*/ */
@ -96,7 +97,7 @@ public final class BlockingCommandManager extends Manager {
} }
List<Jid> blockedJids = blockContactIQ.getJids(); List<Jid> blockedJids = blockContactIQ.getJids();
addToBlockList(blockedJids); blockListCached.addAll(blockedJids);
return IQ.createResultIQ(blockContactIQ); return IQ.createResultIQ(blockContactIQ);
} }
@ -117,7 +118,7 @@ public final class BlockingCommandManager extends Manager {
if (unblockedJids == null) { // remove all if (unblockedJids == null) { // remove all
blockListCached.clear(); blockListCached.clear();
} else { // remove only some } else { // remove only some
removeFromBlockList(unblockedJids); blockListCached.removeAll(unblockedJids);
} }
return IQ.createResultIQ(unblockContactIQ); return IQ.createResultIQ(unblockContactIQ);
@ -136,33 +137,6 @@ public final class BlockingCommandManager extends Manager {
}); });
} }
private void addToBlockList(List<Jid> blockedJids) {
for (Jid jid : blockedJids) {
if (searchJid(jid) == -1) {
blockListCached.add(jid);
}
}
}
private void removeFromBlockList(List<Jid> unblockedJids) {
for (Jid jid : unblockedJids) {
int position = searchJid(jid);
if (position != -1) {
blockListCached.remove(position);
}
}
}
private int searchJid(Jid jid) {
int i = -1;
for (int j = 0; j < blockListCached.size(); j++) {
if (blockListCached.get(j).equals(jid)) {
i = j;
}
}
return i;
}
/** /**
* Returns true if Blocking Command is supported by the server. * Returns true if Blocking Command is supported by the server.
* *
@ -197,8 +171,7 @@ public final class BlockingCommandManager extends Manager {
BlockListIQ blockListIQResult = connection().createPacketCollectorAndSend(blockListIQ).nextResultOrThrow(); BlockListIQ blockListIQResult = connection().createPacketCollectorAndSend(blockListIQ).nextResultOrThrow();
blockListCached = blockListIQResult.getJids(); blockListCached = blockListIQResult.getJids();
List<Jid> emptyList = Collections.emptyList(); return Collections.unmodifiableList(blockListCached);
return (blockListCached == null) ? emptyList : Collections.unmodifiableList(blockListCached);
} }
/** /**
@ -241,7 +214,7 @@ public final class BlockingCommandManager extends Manager {
*/ */
public void unblockAll() public void unblockAll()
throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
UnblockContactsIQ unblockContactIQ = new UnblockContactsIQ(null); UnblockContactsIQ unblockContactIQ = new UnblockContactsIQ();
connection().createPacketCollectorAndSend(unblockContactIQ).nextResultOrThrow(); connection().createPacketCollectorAndSend(unblockContactIQ).nextResultOrThrow();
} }

View File

@ -16,6 +16,7 @@
*/ */
package org.jivesoftware.smackx.blocking.element; package org.jivesoftware.smackx.blocking.element;
import java.util.Collections;
import java.util.List; import java.util.List;
import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.IQ;
@ -50,6 +51,9 @@ public class BlockListIQ extends IQ {
*/ */
public BlockListIQ(List<Jid> jids) { public BlockListIQ(List<Jid> jids) {
super(ELEMENT, NAMESPACE); super(ELEMENT, NAMESPACE);
if (jids == null) {
jids = Collections.emptyList();
}
this.jids = jids; this.jids = jids;
} }
@ -71,10 +75,8 @@ public class BlockListIQ extends IQ {
@Override @Override
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
if (jids.isEmpty()) {
if (jids == null) {
xml.setEmptyElement(); xml.setEmptyElement();
} else { } else {
xml.rightAngleBracket(); xml.rightAngleBracket();

View File

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2016 Fernando Ramirez * Copyright 2016 Fernando Ramirez, Florian Schmaus
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -26,6 +26,7 @@ import org.jxmpp.jid.Jid;
* Unblock contact IQ class. * Unblock contact IQ class.
* *
* @author Fernando Ramirez * @author Fernando Ramirez
* @author Florian Schmaus
* @see <a href="http://xmpp.org/extensions/xep-0191.html">XEP-0191: Blocking * @see <a href="http://xmpp.org/extensions/xep-0191.html">XEP-0191: Blocking
* Command</a> * Command</a>
*/ */
@ -54,6 +55,13 @@ public class UnblockContactsIQ extends IQ {
this.jids = jids; this.jids = jids;
} }
/**
* Constructs a new unblock IQ which will unblock <b>all</b> JIDs.
*/
public UnblockContactsIQ() {
this(null);
}
/** /**
* Get the JIDs. * Get the JIDs.
* *

View File

@ -21,9 +21,9 @@ import java.util.List;
import org.jivesoftware.smack.packet.IQ.Type; import org.jivesoftware.smack.packet.IQ.Type;
import org.jivesoftware.smack.provider.IQProvider; import org.jivesoftware.smack.provider.IQProvider;
import org.jivesoftware.smack.util.ParserUtils;
import org.jivesoftware.smackx.blocking.element.BlockListIQ; import org.jivesoftware.smackx.blocking.element.BlockListIQ;
import org.jxmpp.jid.Jid; import org.jxmpp.jid.Jid;
import org.jxmpp.jid.impl.JidCreate;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
/** /**
@ -49,7 +49,8 @@ public class BlockListIQProvider extends IQProvider<BlockListIQ> {
if (jids == null) { if (jids == null) {
jids = new ArrayList<>(); jids = new ArrayList<>();
} }
jids.add(JidCreate.from(parser.getAttributeValue("", "jid"))); Jid jid = ParserUtils.getJidAttribute(parser);
jids.add(jid);
} }
break; break;

View File

@ -53,7 +53,7 @@ public class GetBlockingListTest {
IQ iq2 = (IQ) PacketParserUtils.parseStanza(emptyBlockListIQExample); IQ iq2 = (IQ) PacketParserUtils.parseStanza(emptyBlockListIQExample);
BlockListIQ emptyBlockListIQ = (BlockListIQ) iq2; BlockListIQ emptyBlockListIQ = (BlockListIQ) iq2;
Assert.assertNull(emptyBlockListIQ.getJids()); Assert.assertEquals(0, emptyBlockListIQ.getJids().size());
} }
} }