diff --git a/documentation/extensions/blockingcommand.md b/documentation/extensions/blockingcommand.md index 3e7e369ce..dd562577f 100644 --- a/documentation/extensions/blockingcommand.md +++ b/documentation/extensions/blockingcommand.md @@ -8,6 +8,7 @@ Allows to manage communications blocking. * Block contact * Unblock contact * Unblock all + * Check if a message has a blocked error **XEP related:** [XEP-0191](http://xmpp.org/extensions/xep-0191.html) @@ -61,3 +62,13 @@ Unblock all ``` blockingCommandManager.unblockAll(); ``` + + +Check if a message has a blocked error +-------------------------------------- + +``` +BlockedErrorExtension.isInside(message)); +``` +*message* is a `Message` + diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/blocking/BlockingCommandManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/blocking/BlockingCommandManager.java index 55044394d..d45458435 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/blocking/BlockingCommandManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/blocking/BlockingCommandManager.java @@ -163,14 +163,12 @@ public final class BlockingCommandManager extends Manager { public List getBlockList() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { - if (blockListCached != null) { - return Collections.unmodifiableList(blockListCached); + if (blockListCached == null) { + BlockListIQ blockListIQ = new BlockListIQ(); + BlockListIQ blockListIQResult = connection().createPacketCollectorAndSend(blockListIQ).nextResultOrThrow(); + blockListCached = blockListIQResult.getBlockedJidsCopy(); } - BlockListIQ blockListIQ = new BlockListIQ(); - BlockListIQ blockListIQResult = connection().createPacketCollectorAndSend(blockListIQ).nextResultOrThrow(); - blockListCached = blockListIQResult.getBlockedJidsCopy(); - return Collections.unmodifiableList(blockListCached); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/blocking/element/BlockedErrorExtension.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/blocking/element/BlockedErrorExtension.java new file mode 100644 index 000000000..da9e8eba8 --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/blocking/element/BlockedErrorExtension.java @@ -0,0 +1,75 @@ +/** + * + * Copyright 2016-2017 Fernando Ramirez + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.blocking.element; + +import org.jivesoftware.smack.packet.ExtensionElement; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.packet.XMPPError; +import org.jivesoftware.smack.util.XmlStringBuilder; +import org.jivesoftware.smackx.blocking.BlockingCommandManager; + +/** + * Blocked error extension class. + * + * @author Fernando Ramirez + * @see XEP-0191: Blocking + * Command + */ +public class BlockedErrorExtension implements ExtensionElement { + + public static final String ELEMENT = "blocked"; + public static final String NAMESPACE = BlockingCommandManager.NAMESPACE + ":errors"; + + @Override + public String getElementName() { + return ELEMENT; + } + + @Override + public String getNamespace() { + return NAMESPACE; + } + + @Override + public CharSequence toXML() { + XmlStringBuilder xml = new XmlStringBuilder(this); + xml.closeEmptyElement(); + return xml; + } + + public static BlockedErrorExtension from(Message message) { + XMPPError error = message.getError(); + if (error == null) { + return null; + } + return error.getExtension(ELEMENT, NAMESPACE); + } + + /** + * Check if a message contains a BlockedErrorExtension, which means that a + * message was blocked because the JID blocked the sender, and that was + * reflected back as an error message. + * + * @param message + * @return true if the message contains a BlockedErrorExtension, false if + * not + */ + public static boolean isInside(Message message) { + return from(message) != null; + } + +} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/blocking/provider/BlockedErrorExtensionProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/blocking/provider/BlockedErrorExtensionProvider.java new file mode 100644 index 000000000..5e7e39249 --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/blocking/provider/BlockedErrorExtensionProvider.java @@ -0,0 +1,37 @@ +/** + * + * Copyright 2016 Fernando Ramirez + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.blocking.provider; + +import org.jivesoftware.smack.provider.ExtensionElementProvider; +import org.jivesoftware.smackx.blocking.element.BlockedErrorExtension; +import org.xmlpull.v1.XmlPullParser; + +/** + * Blocked error extension class. + * + * @author Fernando Ramirez + * @see XEP-0191: Blocking + * Command + */ +public class BlockedErrorExtensionProvider extends ExtensionElementProvider { + + @Override + public BlockedErrorExtension parse(XmlPullParser parser, int initialDepth) throws Exception { + return new BlockedErrorExtension(); + } + +} diff --git a/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers b/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers index 2cef339a9..a8267f785 100644 --- a/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers +++ b/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers @@ -531,6 +531,10 @@ urn:xmpp:blocking org.jivesoftware.smackx.blocking.provider.UnblockContactsIQProvider + + blocked + urn:xmpp:blocking:errors + org.jivesoftware.smackx.blocking.provider.BlockedErrorExtensionProvider + - diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/blocking/BlockedErrorExtensionTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/blocking/BlockedErrorExtensionTest.java new file mode 100644 index 000000000..ca5d0166f --- /dev/null +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/blocking/BlockedErrorExtensionTest.java @@ -0,0 +1,54 @@ +/** + * + * Copyright 2016 Fernando Ramirez + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.blocking; + +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.util.PacketParserUtils; +import org.jivesoftware.smackx.blocking.element.BlockedErrorExtension; +import org.junit.Assert; +import org.junit.Test; + +public class BlockedErrorExtensionTest { + + String messageWithoutError = "" + ""; + + String messageWithError = "" + "" + + "" + "" + ""; + + String messageWithBlockedError = "" + "" + + "" + + "" + "" + ""; + + @Test + public void checkErrorHasBlockedExtension() throws Exception { + Message message1 = (Message) PacketParserUtils.parseStanza(messageWithoutError); + Assert.assertFalse(BlockedErrorExtension.isInside(message1)); + + Message message2 = (Message) PacketParserUtils.parseStanza(messageWithError); + Assert.assertFalse(BlockedErrorExtension.isInside(message2)); + + Message message3 = (Message) PacketParserUtils.parseStanza(messageWithBlockedError); + Assert.assertTrue(BlockedErrorExtension.isInside(message3)); + } + +}