Fix PubSub namespaces

Those were broken since 9e797c1b17 as they
always used the basic PubSub namespace, i.e. without a fragment. Which
resulted in e.g. delete requests look like

<iq to="pubsub.ec-xmpp" id="2GAeW-75" type="set">
  <pubsub xmlns="http://jabber.org/protocol/pubsub">
    <delete node="2e92d38c-9e90-47f6-8e26-330d25ebe96b"/>
  </pubsub>
</iq>

when the namespace should be in fact

http://jabber.org/protocol/pubsub#owner
This commit is contained in:
Florian Schmaus 2014-12-17 13:31:22 +01:00
parent d0341c1d94
commit add4ff5b5a
5 changed files with 70 additions and 69 deletions

View File

@ -16,6 +16,7 @@
*/ */
package org.jivesoftware.smack; package org.jivesoftware.smack;
import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
@ -37,13 +38,8 @@ public class ThreadedDummyConnection extends DummyConnection {
private volatile boolean timeout = false; private volatile boolean timeout = false;
@Override @Override
public void sendPacket(Packet packet) { public void sendPacket(Packet packet) throws NotConnectedException {
try { super.sendPacket(packet);
super.sendPacket(packet);
}
catch (NotConnectedException e) {
e.printStackTrace();
}
if (packet instanceof IQ && !timeout) { if (packet instanceof IQ && !timeout) {
timeout = false; timeout = false;
@ -106,4 +102,10 @@ public class ThreadedDummyConnection extends DummyConnection {
} }
} }
public static ThreadedDummyConnection newInstance() throws SmackException, IOException, XMPPException {
ThreadedDummyConnection threadedDummyConnection = new ThreadedDummyConnection();
threadedDummyConnection.connect();
return threadedDummyConnection;
}
} }

View File

@ -32,23 +32,18 @@ public class PubSub extends IQ
public static final String ELEMENT = "pubsub"; public static final String ELEMENT = "pubsub";
public static final String NAMESPACE = "http://jabber.org/protocol/pubsub"; public static final String NAMESPACE = "http://jabber.org/protocol/pubsub";
private PubSubNamespace ns = PubSubNamespace.BASIC;
public PubSub() { public PubSub() {
super(ELEMENT, NAMESPACE); super(ELEMENT, NAMESPACE);
} }
public PubSub(String to, Type type) { public PubSub(PubSubNamespace ns) {
this(); super(ELEMENT, ns.getXmlns());
setTo(to);
setType(type);
} }
public PubSub(String to, Type type, PubSubNamespace ns) { public PubSub(String to, Type type, PubSubNamespace ns) {
this(to, type); super(ELEMENT, (ns == null ? PubSubNamespace.BASIC : ns).getXmlns());
if (ns != null) { setTo(to);
setPubSubNamespace(ns); setType(type);
}
} }
/** /**
@ -60,49 +55,12 @@ public class PubSub extends IQ
return ELEMENT; return ELEMENT;
} }
/**
* Returns the XML namespace of the extension sub-packet root element.
* According the specification the namespace is
* http://jabber.org/protocol/pubsub with a specific fragment depending
* on the request. The namespace is defined at <a href="http://xmpp.org/registrar/namespaces.html">XMPP Registrar</a> at
*
* The default value has no fragment.
*
* @return the XML namespace of the packet extension.
*/
public String getNamespace()
{
return ns.getXmlns();
}
/**
* Set the namespace for the packet if it something other than the default
* case of {@link PubSubNamespace#BASIC}. The {@link #getNamespace()} method will return
* the result of calling {@link PubSubNamespace#getXmlns()} on the specified enum.
*
* @param ns - The new value for the namespace.
*/
public void setPubSubNamespace(PubSubNamespace ns)
{
this.ns = ns;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <PE extends PacketExtension> PE getExtension(PubSubElementType elem) public <PE extends PacketExtension> PE getExtension(PubSubElementType elem)
{ {
return (PE) getExtension(elem.getElementName(), elem.getNamespace().getXmlns()); return (PE) getExtension(elem.getElementName(), elem.getNamespace().getXmlns());
} }
/**
* Returns the current value of the namespace. The {@link #getNamespace()} method will return
* the result of calling {@link PubSubNamespace#getXmlns()} this value.
*
* @return The current value of the namespace.
*/
public PubSubNamespace getPubSubNamespace()
{
return ns;
}
/** /**
* Returns the XML representation of a pubsub element according the specification. * Returns the XML representation of a pubsub element according the specification.
* *

View File

@ -38,25 +38,22 @@ public class PubSubProvider extends IQProvider<PubSub>
@Override @Override
public PubSub parse(XmlPullParser parser, int initialDepth) public PubSub parse(XmlPullParser parser, int initialDepth)
throws XmlPullParserException, IOException, SmackException { throws XmlPullParserException, IOException, SmackException {
PubSub pubsub = new PubSub();
String namespace = parser.getNamespace(); String namespace = parser.getNamespace();
pubsub.setPubSubNamespace(PubSubNamespace.valueOfFromXmlns(namespace)); PubSubNamespace pubSubNamespace = PubSubNamespace.valueOfFromXmlns(namespace);
boolean done = false; PubSub pubsub = new PubSub(pubSubNamespace);
while (!done) outerloop: while (true)
{ {
int eventType = parser.next(); int eventType = parser.next();
switch (eventType) {
if (eventType == XmlPullParser.START_TAG) case XmlPullParser.START_TAG:
{
PacketParserUtils.addPacketExtension(pubsub, parser); PacketParserUtils.addPacketExtension(pubsub, parser);
} break;
else if (eventType == XmlPullParser.END_TAG) case XmlPullParser.END_TAG:
{ if (parser.getDepth() == initialDepth) {
if (parser.getName().equals("pubsub")) break outerloop;
{
done = true;
} }
break;
} }
} }
return pubsub; return pubsub;

View File

@ -18,6 +18,8 @@ package org.jivesoftware.smackx.pubsub;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import java.io.IOException;
import org.jivesoftware.smack.SmackConfiguration; import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.ThreadedDummyConnection; import org.jivesoftware.smack.ThreadedDummyConnection;
@ -47,9 +49,9 @@ public class ConfigureFormTest
} }
@Test @Test
public void getConfigFormWithInsufficientPriviliges() throws XMPPException, SmackException public void getConfigFormWithInsufficientPriviliges() throws XMPPException, SmackException, IOException
{ {
ThreadedDummyConnection con = new ThreadedDummyConnection(); ThreadedDummyConnection con = ThreadedDummyConnection.newInstance();
PubSubManager mgr = new PubSubManager(con); PubSubManager mgr = new PubSubManager(con);
DiscoverInfo info = new DiscoverInfo(); DiscoverInfo info = new DiscoverInfo();
Identity ident = new Identity("pubsub", null, "leaf"); Identity ident = new Identity("pubsub", null, "leaf");

View File

@ -0,0 +1,42 @@
/**
*
* Copyright 2014 Florian Schmaus
*
* 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.pubsub;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.ThreadedDummyConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smackx.pubsub.packet.PubSub;
import org.junit.Test;
public class PubSubManagerTest {
@Test
public void deleteNodeTest() throws InterruptedException, SmackException, IOException, XMPPException {
ThreadedDummyConnection con = ThreadedDummyConnection.newInstance();
PubSubManager mgr = new PubSubManager(con);
mgr.deleteNode("foo@bar.org");
PubSub pubSubDeleteRequest = con.getSentPacket();
assertEquals("http://jabber.org/protocol/pubsub#owner", pubSubDeleteRequest.getChildElementNamespace());
assertEquals("pubsub", pubSubDeleteRequest.getChildElementName());
}
}