/*
* Jicofo, the Jitsi Conference Focus.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jitsi.jicofo.osgi;
import org.jitsi.impl.neomedia.*;
import org.jitsi.impl.neomedia.device.*;
import org.jitsi.impl.neomedia.transform.csrc.*;
import org.jitsi.impl.neomedia.transform.srtp.*;
import org.jitsi.impl.osgi.framework.*;
import org.jitsi.service.configuration.*;
import org.osgi.framework.*;
import java.util.*;
/**
* Represents the entry point of the OSGi environment of the Jitsi Meet
* conference focus application.
*
* @author Pawel Domas
*/
public class OSGi
{
/**
* Indicates whether 'mock' protocol providers should be used instead of
* original Jitsi protocol providers. For the purpose of unit testing.
*/
private static boolean useMockProtocols = false;
/**
* The <tt>OSGiLauncher</tt> instance which
* represents the launched OSGi instance.
*/
private static OSGiLauncher launcher;
/**
* <tt>BundleActivator</tt> bundle activator launched on startup/shutdown of
* the OSGi system.
*/
private static BundleActivator activator;
/**
* The locations of the OSGi bundles (or rather of the class files of their
* <tt>BundleActivator</tt> implementations) comprising Jitsi Meet Focus.
* An element of the <tt>BUNDLES</tt> array is an array of <tt>String</tt>s
* and represents an OSGi start level.
*/
private static String[][] getBUNDLES()
{
String[] protocols =
{
"org/jitsi/impl/protocol/xmpp/XmppProtocolActivator"
};
String[] mockProtocols =
{
"mock/MockActivator"
};
String[][] bundles = {
{
"net/java/sip/communicator/impl/libjitsi/LibJitsiActivator"
},
{
"net/java/sip/communicator/util/UtilActivator",
//"net/java/sip/communicator/impl/fileaccess/FileAccessActivator"
},
{
"net/java/sip/communicator/impl/configuration/ConfigurationActivator"
},
{
//"net/java/sip/communicator/impl/resources/ResourceManagementActivator"
},
{
//"net/java/sip/communicator/impl/dns/DnsUtilActivator"
},
{
"net/java/sip/communicator/impl/credentialsstorage/CredentialsStorageActivator"
},
{
"net/java/sip/communicator/impl/netaddr/NetaddrActivator"
},
{
//"net/java/sip/communicator/impl/packetlogging/PacketLoggingActivator"
},
{
//"net/java/sip/communicator/service/gui/internal/GuiServiceActivator"
},
{
"net/java/sip/communicator/service/protocol/media/ProtocolMediaActivator"
},
{
//"net/java/sip/communicator/service/notification/NotificationServiceActivator",
//"net/java/sip/communicator/impl/globaldisplaydetails/GlobalDisplayDetailsActivator"
},
useMockProtocols
? new String[]
{
"mock/media/MockMediaActivator"
}
: new String[]
{
//"net/java/sip/communicator/impl/neomedia/NeomediaActivator"
},
{
//"net/java/sip/communicator/impl/certificate/CertificateVerificationActivator"
},
{
//"net/java/sip/communicator/impl/version/VersionActivator"
},
{
"net/java/sip/communicator/service/protocol/ProtocolProviderActivator"
},
{
"net/java/sip/communicator/plugin/reconnectplugin/ReconnectPluginActivator"
},
// Shall we use mock protocol providers ?
useMockProtocols ? mockProtocols : protocols,
{
"org/jitsi/jicofo/FocusBundleActivator"
},
{
"org/jitsi/videobridge/log/LoggingBundleActivator"
},
useMockProtocols
? new String[] { "mock/MockMainMethodActivator" }
: new String[] { }
};
return bundles;
}
static
{
/*
* Before we start OSGi and, more specifically, the very Jitsi
* Videobridge application, set the default values of the System
* properties which affect the (optional) behavior of the application.
*/
setSystemPropertyDefaults();
}
/**
* Sets default values on <tt>System</tt> properties which affect the
* (optional) behavior of the Jitsi Videobridge application and the
* libraries that it utilizes. Because <tt>ConfigurationServiceImpl</tt>
* will override <tt>System</tt> property values, the set default
* <tt>System</tt> property values will not prevent the user from overriding
* them.
*/
private static void setSystemPropertyDefaults()
{
/*
* XXX A default System property value specified bellow will eventually
* be set only if the System property in question does not have a value
* set yet.
*/
Map<String,String> defaults = new HashMap<String,String>();
String true_ = Boolean.toString(true);
String false_ = Boolean.toString(false);
/*
* The design at the time of this writing considers the configuration
* file read-only (in a read-only directory) and provides only manual
* editing for it.
*/
defaults.put(
ConfigurationService.PNAME_CONFIGURATION_FILE_IS_READ_ONLY,
true_);
defaults.put(
DeviceConfiguration.PROP_AUDIO_SYSTEM,
AudioSystem.LOCATOR_PROTOCOL_AUDIOSILENCE);
defaults.put(
MediaServiceImpl.DISABLE_VIDEO_SUPPORT_PNAME,
true_);
// It makes no sense for Jitsi Videobridge to pace its RTP output.
defaults.put(
DeviceConfiguration.PROP_VIDEO_RTP_PACING_THRESHOLD,
Integer.toString(Integer.MAX_VALUE));
/*
* XXX Explicitly support JitMeet by default because is is the primary
* use case of Jitsi Videobridge right now.
*/
defaults.put(
SsrcTransformEngine
.DROP_MUTED_AUDIO_SOURCE_IN_REVERSE_TRANSFORM,
true_);
defaults.put(SRTPCryptoContext.CHECK_REPLAY_PNAME, false_);
for (Map.Entry<String,String> e : defaults.entrySet())
{
String key = e.getKey();
if (System.getProperty(key) == null)
System.setProperty(key, e.getValue());
}
}
/**
* Indicates whether mock protocol providers should be used instead of
* original Jitsi protocol providers.
*/
public static boolean isUseMockProtocols()
{
return useMockProtocols;
}
/**
* Make OSGi use mock protocol providers instead of original Jitsi protocols
* implementation.
* @param useMockProtocols <tt>true</tt> if Jitsi protocol providers should
* be replaced with mock version.
*/
public static void setUseMockProtocols(boolean useMockProtocols)
{
OSGi.useMockProtocols = useMockProtocols;
}
/**
* Starts the OSGi infrastructure.
*
* @param activator the <tt>BundleActivator</tt> that will be launched after
* OSGi starts.
*/
public static synchronized void start(BundleActivator activator)
{
if (OSGi.activator != null)
throw new IllegalStateException("activator");
OSGi.activator = activator;
if (launcher == null)
{
launcher = new OSGiLauncher(getBUNDLES());
}
launcher.start(activator);
}
/**
* Stops the Jitsi Meet Focus bundles and the OSGi implementation.
*
* The <tt>BundleActivator</tt> that has been passed to
* {@link #start(BundleActivator)} will be launched after shutdown.
*/
public static synchronized void stop()
{
if (launcher != null && activator != null)
{
launcher.stop(activator);
activator = null;
}
}
}