/*
* Jicofo, the Jitsi Conference Focus.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jitsi.jicofo.xmpp;
import org.dom4j.*;
import org.dom4j.io.*;
import org.jivesoftware.smack.provider.*;
import org.xmlpull.v1.*;
import org.xmpp.packet.*;
import java.io.*;
/**
* FIXME: copied from JVB and used also in Jigasi
*
* Provides functionality which aids the manipulation of
* <tt>org.jivesoftware.smack.packet.IQ</tt> and <tt>org.xmpp.packet.IQ</tt>
* instances.
*
* @author Lyubomir Marinov
*/
public final class IQUtils
{
/**
* The <tt>XmlPullParserFactory</tt> instance which is to create
* <tt>XmlPullParser</tt> instances for the purposes of
* {@link #convert(org.xmpp.packet.IQ)}. Introduced as a shared instance in
* order to avoid unnecessary allocations.
*/
private static XmlPullParserFactory xmlPullParserFactory;
/**
* Converts a specific <tt>org.jivesoftware.smack.packet.IQ</tt> instance
* into a new <tt>org.xmpp.packet.iQ</tt> instance which represents the same
* stanza.
*
* @param smackIQ the <tt>org.jivesoftware.smack.packet.IQ</tt> instance to
* convert to a new <tt>org.xmpp.packet.IQ</tt> instance
* @return a new <tt>org.xmpp.packet.IQ</tt> instance which represents the
* same stanza as the specified <tt>smackIQ</tt>
* @throws Exception if anything goes wrong during the conversion
*/
public static org.xmpp.packet.IQ convert(
org.jivesoftware.smack.packet.IQ smackIQ)
throws Exception
{
String xml = smackIQ.toXML();
Element element = null;
if ((xml != null) && (xml.length() != 0))
{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new StringReader(xml));
element = document.getRootElement();
}
org.xmpp.packet.IQ iq = new org.xmpp.packet.IQ(element);
String from = smackIQ.getFrom();
if ((from != null) && (from.length() != 0))
iq.setFrom(new JID(from));
iq.setID(smackIQ.getPacketID());
String to = smackIQ.getTo();
if ((to != null) && (to.length() != 0))
iq.setTo(new JID(to));
iq.setType(convert(smackIQ.getType()));
return iq;
}
/**
* Converts a specific <tt>org.xmpp.packet.iQ</tt> instance into a new
* <tt>org.jivesoftware.smack.packet.IQ</tt> instance which represents the
* same stanza.
*
* @param iq the <tt>org.xmpp.packet.IQ</tt> instance to convert to a new
* <tt>org.jivesoftware.smack.packet.IQ</tt> instance
* @return a new <tt>org.jivesoftware.smack.packet.IQ</tt> instance which
* represents the same stanza as the specified <tt>iq</tt>
* @throws Exception if anything goes wrong during the conversion
*/
public static org.jivesoftware.smack.packet.IQ convert(
org.xmpp.packet.IQ iq)
throws Exception
{
Element element = iq.getChildElement();
IQProvider iqProvider
= (IQProvider)
ProviderManager.getInstance().getIQProvider(
element.getName(),
element.getNamespaceURI());
org.jivesoftware.smack.packet.IQ smackIQ = null;
if (iqProvider != null)
{
XmlPullParserFactory xmlPullParserFactory;
synchronized (IQUtils.class)
{
if (IQUtils.xmlPullParserFactory == null)
{
IQUtils.xmlPullParserFactory
= XmlPullParserFactory.newInstance();
IQUtils.xmlPullParserFactory.setNamespaceAware(true);
}
xmlPullParserFactory = IQUtils.xmlPullParserFactory;
}
XmlPullParser parser = xmlPullParserFactory.newPullParser();
parser.setInput(new StringReader(iq.toXML()));
int eventType = parser.next();
if (XmlPullParser.START_TAG == eventType)
{
String name = parser.getName();
if ("iq".equals(name))
{
eventType = parser.next();
if (XmlPullParser.START_TAG == eventType)
{
smackIQ = iqProvider.parseIQ(parser);
if (smackIQ != null)
{
eventType = parser.getEventType();
if (XmlPullParser.END_TAG != eventType)
{
throw new IllegalStateException(
Integer.toString(eventType)
+ " != XmlPullParser.END_TAG");
}
}
}
else
{
throw new IllegalStateException(
Integer.toString(eventType)
+ " != XmlPullParser.START_TAG");
}
}
else
throw new IllegalStateException(name + " != iq");
}
else
{
throw new IllegalStateException(
Integer.toString(eventType)
+ " != XmlPullParser.START_TAG");
}
}
if (smackIQ != null)
{
org.xmpp.packet.JID fromJID = iq.getFrom();
if (fromJID != null)
smackIQ.setFrom(fromJID.toString());
smackIQ.setPacketID(iq.getID());
org.xmpp.packet.JID toJID = iq.getTo();
if (toJID != null)
smackIQ.setTo(toJID.toString());
smackIQ.setType(convert(iq.getType()));
}
return smackIQ;
}
/*public IQ parse(String packetStr)
{
}*/
/**
* Methods used for IQProvider testing.
* @param iqStr
* @param iqProvider
* @return
* @throws Exception
*/
public static org.jivesoftware.smack.packet.IQ parse(
String iqStr,
IQProvider iqProvider)
throws Exception
{
org.jivesoftware.smack.packet.IQ smackIQ = null;
if (iqProvider != null)
{
XmlPullParserFactory xmlPullParserFactory;
synchronized (IQUtils.class)
{
if (IQUtils.xmlPullParserFactory == null)
{
IQUtils.xmlPullParserFactory
= XmlPullParserFactory.newInstance();
IQUtils.xmlPullParserFactory.setNamespaceAware(true);
}
xmlPullParserFactory = IQUtils.xmlPullParserFactory;
}
XmlPullParser parser = xmlPullParserFactory.newPullParser();
parser.setInput(new StringReader(iqStr));
int eventType = parser.next();
if (XmlPullParser.START_TAG == eventType)
{
String name = parser.getName();
if ("iq".equals(name))
{
String packetId = parser.getAttributeValue("", "id");
String from = parser.getAttributeValue("", "from");
String to = parser.getAttributeValue("", "to");
String type = parser.getAttributeValue("", "type");
eventType = parser.next();
if (XmlPullParser.START_TAG == eventType)
{
smackIQ = iqProvider.parseIQ(parser);
if (smackIQ != null)
{
eventType = parser.getEventType();
if (XmlPullParser.END_TAG != eventType)
{
throw new IllegalStateException(
Integer.toString(eventType)
+ " != XmlPullParser.END_TAG");
}
smackIQ.setType(
org.jivesoftware.smack.packet.IQ.Type
.fromString(type));
smackIQ.setPacketID(packetId);
smackIQ.setFrom(from);
smackIQ.setTo(to);
}
}
else
{
throw new IllegalStateException(
Integer.toString(eventType)
+ " != XmlPullParser.START_TAG");
}
}
else
throw new IllegalStateException(name + " != iq");
}
else
{
throw new IllegalStateException(
Integer.toString(eventType)
+ " != XmlPullParser.START_TAG");
}
}
return smackIQ;
}
/**
* Converts an <tt>org.jivesoftware.smack.packet.IQ.Type</tt> value into an
* <tt>org.xmpp.packet.IQ.Type</tt> value which represents the same IQ type.
*
* @param smackType the <tt>org.jivesoftware.smack.packet.IQ.Type</tt> value
* to convert into an <tt>org.xmpp.packet.IQ.Type</tt> value
* @return an <tt>org.xmpp.packet.IQ.Type</tt> value which represents the
* same IQ type as the specified <tt>smackType</tt>
*/
public static org.xmpp.packet.IQ.Type convert(
org.jivesoftware.smack.packet.IQ.Type smackType)
{
return org.xmpp.packet.IQ.Type.valueOf(smackType.toString());
}
/**
* Converts an <tt>org.xmpp.packet.IQ.Type</tt> value into an
* <tt>org.jivesoftware.smack.packet.IQ.Type</tt> value which represents the
* same IQ type.
*
* @param type the <tt>org.xmpp.packet.IQ.Type</tt> value to convert into an
* <tt>org.jivesoftware.smack.packet.IQ.Type</tt> value
* @return an <tt>org.jivesoftware.smack.packet.IQ.Type</tt> value which
* represents the same IQ type as the specified <tt>type</tt>
*/
public static org.jivesoftware.smack.packet.IQ.Type convert(
org.xmpp.packet.IQ.Type type)
{
return org.jivesoftware.smack.packet.IQ.Type.fromString(type.name());
}
/** Prevents the initialization of new <tt>IQUtils</tt> instances. */
private IQUtils()
{
}
}