org.jitsi.jicofo.xmpp.IQUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.jitsi.jicofo.xmpp.IQUtils.java

Source

/*
 * 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() {
    }
}