From ca58c65a26034bd2b7c4b7e8c2bc70ab593d2ec7 Mon Sep 17 00:00:00 2001 From: ramabit Date: Tue, 5 Apr 2016 14:51:34 -0300 Subject: [PATCH] Implement Last Message Correction (XEP-0308) Fixes SMACK-714 --- .../MessageCorrectExtension.java | 105 ++++++++++++++++++ .../smackx/message_correct/package-info.java | 21 ++++ .../provider/MessageCorrectProvider.java | 42 +++++++ .../provider/package-info.java | 17 +++ .../MessageCorrectExtensionTest.java | 51 +++++++++ 5 files changed, 236 insertions(+) create mode 100644 smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/MessageCorrectExtension.java create mode 100644 smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/package-info.java create mode 100644 smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/provider/MessageCorrectProvider.java create mode 100644 smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/provider/package-info.java create mode 100644 smack-extensions/src/test/java/org/jivesoftware/smackx/message_correct/MessageCorrectExtensionTest.java diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/MessageCorrectExtension.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/MessageCorrectExtension.java new file mode 100644 index 000000000..30910d801 --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/MessageCorrectExtension.java @@ -0,0 +1,105 @@ +/** + * + * 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.message_correct; + +import org.jivesoftware.smack.packet.ExtensionElement; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.util.XmlStringBuilder; + +/** + * An Extension that implements XEP-0308: Last Message Correction + * + * This extension is expected to be added to message stanzas. Please refer to + * the XEP for more implementation guidelines. + * + * @author Fernando Ramirez, f.e.ramirez94@gmail.com + * @see XEP-0308: Last& + * nbsp;Message Correction + */ +public class MessageCorrectExtension implements ExtensionElement { + + /** + * The XML element name of a 'message correct' extension. + */ + public static final String ELEMENT = "replace"; + + /** + * The namespace that qualifies the XML element of a 'message correct' + * extension. + */ + public static final String NAMESPACE = "urn:xmpp:message-correct:0"; + + /** + * The id tag of a 'message correct' extension. + */ + public static final String ID_TAG = "id"; + + /** + * The id of the message to correct. + */ + private String idInitialMessage; + + public MessageCorrectExtension(String idInitialMessage) { + this.setIdInitialMessage(idInitialMessage); + } + + public String getIdInitialMessage() { + return idInitialMessage; + } + + public void setIdInitialMessage(String idInitialMessage) { + this.idInitialMessage = idInitialMessage; + } + + /* + * (non-Javadoc) + * + * @see org.jivesoftware.smack.packet.PacketExtension#getElementName() + */ + @Override + public String getElementName() { + return ELEMENT; + } + + /* + * (non-Javadoc) + * + * @see org.jivesoftware.smack.packet.PacketExtension#toXML() + */ + @Override + public XmlStringBuilder toXML() { + XmlStringBuilder xml = new XmlStringBuilder(this); + xml.attribute(ID_TAG, getIdInitialMessage()); + xml.closeEmptyElement(); + return xml; + } + + /* + * (non-Javadoc) + * + * @see org.jivesoftware.smack.packet.PacketExtension#getNamespace() + */ + @Override + public String getNamespace() { + return NAMESPACE; + } + + public static MessageCorrectExtension from(Message message) { + return message.getExtension(ELEMENT, NAMESPACE); + } + +} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/package-info.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/package-info.java new file mode 100644 index 000000000..2070625f9 --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/package-info.java @@ -0,0 +1,21 @@ +/** + * + * 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. + */ + +/** + * Classes and Interfaces that implement Last Message Correction as defined in XEP-0308. + */ +package org.jivesoftware.smackx.message_correct; diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/provider/MessageCorrectProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/provider/MessageCorrectProvider.java new file mode 100644 index 000000000..271305670 --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/provider/MessageCorrectProvider.java @@ -0,0 +1,42 @@ +/** + * + * 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.message_correct.provider; + +import java.io.IOException; + +import org.jivesoftware.smack.SmackException; +import org.jivesoftware.smack.provider.ExtensionElementProvider; +import org.jivesoftware.smackx.message_correct.MessageCorrectExtension; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +/** + * A ExtensionElementProvider for the MessageCorrectExtension. As + * MessageCorrection elements have only the ID of the message to replace. + * + * @author Fernando Ramirez, f.e.ramirez94@gmail.com + */ +public class MessageCorrectProvider extends ExtensionElementProvider { + + @Override + public MessageCorrectExtension parse(XmlPullParser parser, int initialDepth) + throws XmlPullParserException, IOException, SmackException { + String idMessageToReplace = parser.getAttributeValue("", MessageCorrectExtension.ID_TAG); + return new MessageCorrectExtension(idMessageToReplace); + } + +} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/provider/package-info.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/provider/package-info.java new file mode 100644 index 000000000..225a76d12 --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/message_correct/provider/package-info.java @@ -0,0 +1,17 @@ +/** + * + * 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.message_correct.provider; diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/message_correct/MessageCorrectExtensionTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/message_correct/MessageCorrectExtensionTest.java new file mode 100644 index 000000000..97216a285 --- /dev/null +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/message_correct/MessageCorrectExtensionTest.java @@ -0,0 +1,51 @@ +/** + * + * 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.message_correct; + +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.util.PacketParserUtils; +import org.junit.Assert; +import org.junit.Test; + +public class MessageCorrectExtensionTest { + + private Message initialMessage; + + private final String idInitialMessage = "bad1"; + + private final String initialMessageXml = "" + + "But soft, what light through yonder window breaks?" + ""; + + private final CharSequence messageCorrectionXml = ""; + + private final CharSequence expectedXml = "" + + "But soft, what light through yonder window breaks?" + + "" + ""; + + @Test + public void checkStanzas() throws Exception { + initialMessage = (Message) PacketParserUtils.parseStanza(initialMessageXml); + MessageCorrectExtension messageCorrectExtension = new MessageCorrectExtension(idInitialMessage); + + Assert.assertEquals(messageCorrectExtension.toXML().toString(), messageCorrectionXml); + + initialMessage.addExtension(messageCorrectExtension); + + Assert.assertEquals(initialMessage.toXML(), expectedXml); + } + +}