/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* 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 net.java.sip.communicator.service.protocol.jabber;
import net.java.sip.communicator.util.*;
import org.jivesoftware.smack.provider.*;
/**
*
* This class abstracts interactions within Smack XMPP library (mostly with
* its <tt>ProviderManager</tt> class).
* This exists because <tt>JingleIQProvider</tt> and <tt>ColibriIQProvider</tt>
* are in need to be used with Smack v4, where <tt>ProviderManager</tt>
* has a different interface.
*
* @author Maksym Kulish
*/
abstract public class AbstractSmackInteroperabilityLayer {
/**
* The <tt>Logger</tt> used by the
* <tt>AbstractSmackInteroperabilityLayer</tt> class for
* reporting on improper implementations instantiation
*/
private static final Logger logger = Logger.getLogger(
AbstractSmackInteroperabilityLayer.class);
/**
* The implementation class to be used within its Jitsi application
*/
private static Class<AbstractSmackInteroperabilityLayer>
implementationClass;
/**
* The instance of Smack interoperability layer implementation class
*/
private static AbstractSmackInteroperabilityLayer
interopLayerInstance;
/**
* Get the instance of Smack interoperability layer implementation class
*
* @return Smack interoperation layer implementation class
*/
public static AbstractSmackInteroperabilityLayer getInstance()
{
if (interopLayerInstance == null)
{
try
{
interopLayerInstance =
implementationClass.newInstance();
}
catch (IllegalAccessException e)
{
// Never thrown within proper implementation
logger.fatal("Your AbstractSmackInteroperabilityLayer " +
"implementation " +
"cannot be accessed properly. " +
"Please fix the implementation");
}
catch (InstantiationException e)
{
// Never thrown within proper implementation
logger.fatal("Your AbstractSmackInteroperabilityLayer " +
"implementation " +
"cannot be instantiated properly. " +
"Please fix the implementation");
}
}
return interopLayerInstance;
}
/**
* Set the Smack interoperation layer
* implementation class to be used within this Jitsi application
* @param implementationClass Smack interoperation layer
* implementation class
*/
public static void setImplementationClass(
Class implementationClass)
{
AbstractSmackInteroperabilityLayer.implementationClass
= implementationClass;
}
/**
* Add <tt>PacketExtensionProvider</tt> to the list of known
* providers
*
* @param elementName The element name where the matching is happening
* @param namespace The XML namespace used in that element
* @param provider <tt>PacketExtensionProvider</tt> implementation to be
* used
*/
abstract public void addExtensionProvider(
String elementName, String namespace, Object provider);
/**
* Add <tt>IQProvider</tt> to the list of known
* providers
*
* @param elementName The element name where the matching is happening
* @param namespace The XML namespace used in that element
* @param provider <tt>IQProvider</tt> implementation to be
* used
*/
abstract public void addIQProvider(
String elementName, String namespace, Object provider);
/**
* Get the <tt>PacketExtensionProvider</tt> for given element name and XML
* namespace
*
* @param elementName The element name where the matching is happening
* @param namespace The XML namespace used in that element
* @return <tt>PacketExtensionProvider</tt> implementation to be
* used
*/
abstract public PacketExtensionProvider getExtensionProvider(
String elementName, String namespace);
}