2003-12-19 19:17:36 +01:00
|
|
|
/**
|
2004-11-03 00:53:30 +01:00
|
|
|
* $RCSfile$
|
|
|
|
* $Revision$
|
|
|
|
* $Date$
|
|
|
|
*
|
2007-02-12 01:59:05 +01:00
|
|
|
* Copyright 2003-2007 Jive Software.
|
2004-11-03 00:53:30 +01:00
|
|
|
*
|
|
|
|
* All rights reserved. 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.
|
|
|
|
*/
|
2003-12-19 19:17:36 +01:00
|
|
|
|
|
|
|
package org.jivesoftware.smack;
|
|
|
|
|
2006-03-09 03:34:27 +01:00
|
|
|
import java.io.InputStream;
|
|
|
|
import java.net.URL;
|
2013-01-04 12:43:35 +01:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Collection;
|
|
|
|
import java.util.Enumeration;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Vector;
|
|
|
|
|
|
|
|
import org.xmlpull.mxp1.MXParser;
|
|
|
|
import org.xmlpull.v1.XmlPullParser;
|
2003-12-19 19:17:36 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents the configuration of Smack. The configuration is used for:
|
|
|
|
* <ul>
|
|
|
|
* <li> Initializing classes by loading them at start-up.
|
|
|
|
* <li> Getting the current Smack version.
|
2004-04-18 20:11:26 +02:00
|
|
|
* <li> Getting and setting global library behavior, such as the period of time
|
|
|
|
* to wait for replies to packets from the server. Note: setting these values
|
|
|
|
* via the API will override settings in the configuration file.
|
2003-12-19 19:17:36 +01:00
|
|
|
* </ul>
|
2004-04-18 20:11:26 +02:00
|
|
|
*
|
|
|
|
* Configuration settings are stored in META-INF/smack-config.xml (typically inside the
|
|
|
|
* smack.jar file).
|
2003-12-19 19:17:36 +01:00
|
|
|
*
|
|
|
|
* @author Gaston Dombiak
|
|
|
|
*/
|
|
|
|
public final class SmackConfiguration {
|
|
|
|
|
2012-01-27 22:30:09 +01:00
|
|
|
private static final String SMACK_VERSION = "3.2.2";
|
2004-03-15 19:59:41 +01:00
|
|
|
|
|
|
|
private static int packetReplyTimeout = 5000;
|
|
|
|
private static int keepAliveInterval = 30000;
|
2007-11-14 17:27:47 +01:00
|
|
|
private static Vector<String> defaultMechs = new Vector<String>();
|
2003-12-19 19:17:36 +01:00
|
|
|
|
2010-08-15 13:57:11 +02:00
|
|
|
private static boolean localSocks5ProxyEnabled = true;
|
2012-01-27 22:30:09 +01:00
|
|
|
private static int localSocks5ProxyPort = 7777;
|
2011-06-18 20:18:03 +02:00
|
|
|
private static int packetCollectorSize = 5000;
|
2010-08-15 13:57:11 +02:00
|
|
|
|
2013-02-27 23:49:04 +01:00
|
|
|
/**
|
|
|
|
* defaultPingInterval (in seconds)
|
|
|
|
*/
|
|
|
|
private static int defaultPingInterval = 1800; // 30 min (30*60)
|
2013-01-04 12:43:35 +01:00
|
|
|
|
2003-12-19 19:17:36 +01:00
|
|
|
private SmackConfiguration() {
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2004-04-18 20:11:26 +02:00
|
|
|
* Loads the configuration from the smack-config.xml file.<p>
|
2003-12-19 19:17:36 +01:00
|
|
|
*
|
|
|
|
* So far this means that:
|
|
|
|
* 1) a set of classes will be loaded in order to execute their static init block
|
|
|
|
* 2) retrieve and set the current Smack release
|
|
|
|
*/
|
2004-04-18 20:11:26 +02:00
|
|
|
static {
|
2003-12-19 19:17:36 +01:00
|
|
|
try {
|
|
|
|
// Get an array of class loaders to try loading the providers files from.
|
|
|
|
ClassLoader[] classLoaders = getClassLoaders();
|
2006-07-18 07:14:33 +02:00
|
|
|
for (ClassLoader classLoader : classLoaders) {
|
2012-10-26 12:47:55 +02:00
|
|
|
Enumeration<URL> configEnum = classLoader.getResources("META-INF/smack-config.xml");
|
2004-10-29 17:09:04 +02:00
|
|
|
while (configEnum.hasMoreElements()) {
|
2012-10-26 12:47:55 +02:00
|
|
|
URL url = configEnum.nextElement();
|
2003-12-19 19:17:36 +01:00
|
|
|
InputStream systemStream = null;
|
|
|
|
try {
|
|
|
|
systemStream = url.openStream();
|
2005-03-23 03:36:19 +01:00
|
|
|
XmlPullParser parser = new MXParser();
|
|
|
|
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
|
2003-12-19 19:17:36 +01:00
|
|
|
parser.setInput(systemStream, "UTF-8");
|
|
|
|
int eventType = parser.getEventType();
|
|
|
|
do {
|
|
|
|
if (eventType == XmlPullParser.START_TAG) {
|
|
|
|
if (parser.getName().equals("className")) {
|
|
|
|
// Attempt to load the class so that the class can get initialized
|
2003-12-20 13:20:30 +01:00
|
|
|
parseClassToLoad(parser);
|
2003-12-19 19:17:36 +01:00
|
|
|
}
|
2004-01-02 00:19:37 +01:00
|
|
|
else if (parser.getName().equals("packetReplyTimeout")) {
|
2011-06-18 20:18:03 +02:00
|
|
|
packetReplyTimeout = parseIntProperty(parser, packetReplyTimeout);
|
2004-03-15 19:59:41 +01:00
|
|
|
}
|
|
|
|
else if (parser.getName().equals("keepAliveInterval")) {
|
|
|
|
keepAliveInterval = parseIntProperty(parser, keepAliveInterval);
|
2003-12-20 13:20:30 +01:00
|
|
|
}
|
2007-11-14 17:27:47 +01:00
|
|
|
else if (parser.getName().equals("mechName")) {
|
|
|
|
defaultMechs.add(parser.nextText());
|
2011-06-18 20:18:03 +02:00
|
|
|
}
|
|
|
|
else if (parser.getName().equals("localSocks5ProxyEnabled")) {
|
|
|
|
localSocks5ProxyEnabled = Boolean.parseBoolean(parser.nextText());
|
|
|
|
}
|
|
|
|
else if (parser.getName().equals("localSocks5ProxyPort")) {
|
|
|
|
localSocks5ProxyPort = parseIntProperty(parser, localSocks5ProxyPort);
|
|
|
|
}
|
|
|
|
else if (parser.getName().equals("packetCollectorSize")) {
|
|
|
|
packetCollectorSize = parseIntProperty(parser, packetCollectorSize);
|
2007-11-14 17:27:47 +01:00
|
|
|
}
|
2013-02-27 23:49:04 +01:00
|
|
|
else if (parser.getName().equals("defaultPingInterval")) {
|
2013-01-04 12:43:35 +01:00
|
|
|
defaultPingInterval = parseIntProperty(parser, defaultPingInterval);
|
|
|
|
}
|
2003-12-19 19:17:36 +01:00
|
|
|
}
|
|
|
|
eventType = parser.next();
|
|
|
|
}
|
|
|
|
while (eventType != XmlPullParser.END_DOCUMENT);
|
|
|
|
}
|
2004-04-18 16:27:20 +02:00
|
|
|
catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2003-12-19 19:17:36 +01:00
|
|
|
finally {
|
|
|
|
try {
|
|
|
|
systemStream.close();
|
|
|
|
}
|
|
|
|
catch (Exception e) {
|
2006-07-18 08:47:38 +02:00
|
|
|
// Ignore.
|
2003-12-19 19:17:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (Exception e) {
|
2004-11-27 03:04:43 +01:00
|
|
|
e.printStackTrace();
|
2003-12-19 19:17:36 +01:00
|
|
|
}
|
|
|
|
}
|
2003-12-20 13:20:30 +01:00
|
|
|
|
2003-12-19 19:17:36 +01:00
|
|
|
/**
|
2004-08-09 23:13:36 +02:00
|
|
|
* Returns the Smack version information, eg "1.3.0".
|
2003-12-19 19:17:36 +01:00
|
|
|
*
|
2004-03-15 19:59:41 +01:00
|
|
|
* @return the Smack version information.
|
2003-12-19 19:17:36 +01:00
|
|
|
*/
|
2004-03-15 19:59:41 +01:00
|
|
|
public static String getVersion() {
|
|
|
|
return SMACK_VERSION;
|
2003-12-19 19:17:36 +01:00
|
|
|
}
|
|
|
|
|
2004-01-02 00:19:37 +01:00
|
|
|
/**
|
|
|
|
* Returns the number of milliseconds to wait for a response from
|
2004-03-15 19:59:41 +01:00
|
|
|
* the server. The default value is 5000 ms.
|
2004-01-02 00:19:37 +01:00
|
|
|
*
|
|
|
|
* @return the milliseconds to wait for a response from the server
|
|
|
|
*/
|
|
|
|
public static int getPacketReplyTimeout() {
|
2004-09-24 04:12:47 +02:00
|
|
|
// The timeout value must be greater than 0 otherwise we will answer the default value
|
|
|
|
if (packetReplyTimeout <= 0) {
|
2006-08-03 00:31:23 +02:00
|
|
|
packetReplyTimeout = 5000;
|
2004-09-24 04:12:47 +02:00
|
|
|
}
|
2004-01-02 00:19:37 +01:00
|
|
|
return packetReplyTimeout;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the number of milliseconds to wait for a response from
|
|
|
|
* the server.
|
|
|
|
*
|
|
|
|
* @param timeout the milliseconds to wait for a response from the server
|
|
|
|
*/
|
|
|
|
public static void setPacketReplyTimeout(int timeout) {
|
2004-09-24 04:12:47 +02:00
|
|
|
if (timeout <= 0) {
|
|
|
|
throw new IllegalArgumentException();
|
|
|
|
}
|
2004-01-02 00:19:37 +01:00
|
|
|
packetReplyTimeout = timeout;
|
|
|
|
}
|
|
|
|
|
2004-03-15 19:59:41 +01:00
|
|
|
/**
|
|
|
|
* Returns the number of milleseconds delay between sending keep-alive
|
|
|
|
* requests to the server. The default value is 30000 ms. A value of -1
|
|
|
|
* mean no keep-alive requests will be sent to the server.
|
|
|
|
*
|
|
|
|
* @return the milliseconds to wait between keep-alive requests, or -1 if
|
|
|
|
* no keep-alive should be sent.
|
|
|
|
*/
|
|
|
|
public static int getKeepAliveInterval() {
|
|
|
|
return keepAliveInterval;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the number of milleseconds delay between sending keep-alive
|
|
|
|
* requests to the server. The default value is 30000 ms. A value of -1
|
|
|
|
* mean no keep-alive requests will be sent to the server.
|
|
|
|
*
|
|
|
|
* @param interval the milliseconds to wait between keep-alive requests,
|
|
|
|
* or -1 if no keep-alive should be sent.
|
|
|
|
*/
|
|
|
|
public static void setKeepAliveInterval(int interval) {
|
|
|
|
keepAliveInterval = interval;
|
|
|
|
}
|
|
|
|
|
2011-06-18 20:18:03 +02:00
|
|
|
/**
|
|
|
|
* Gets the default max size of a packet collector before it will delete
|
|
|
|
* the older packets.
|
|
|
|
*
|
|
|
|
* @return The number of packets to queue before deleting older packets.
|
|
|
|
*/
|
|
|
|
public static int getPacketCollectorSize() {
|
|
|
|
return packetCollectorSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the default max size of a packet collector before it will delete
|
|
|
|
* the older packets.
|
|
|
|
*
|
|
|
|
* @param The number of packets to queue before deleting older packets.
|
|
|
|
*/
|
|
|
|
public static void setPacketCollectorSize(int collectorSize) {
|
|
|
|
packetCollectorSize = collectorSize;
|
|
|
|
}
|
|
|
|
|
2007-11-14 17:27:47 +01:00
|
|
|
/**
|
|
|
|
* Add a SASL mechanism to the list to be used.
|
|
|
|
*
|
|
|
|
* @param mech the SASL mechanism to be added
|
|
|
|
*/
|
|
|
|
public static void addSaslMech(String mech) {
|
|
|
|
if(! defaultMechs.contains(mech) ) {
|
|
|
|
defaultMechs.add(mech);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add a Collection of SASL mechanisms to the list to be used.
|
|
|
|
*
|
|
|
|
* @param mechs the Collection of SASL mechanisms to be added
|
|
|
|
*/
|
|
|
|
public static void addSaslMechs(Collection<String> mechs) {
|
|
|
|
for(String mech : mechs) {
|
|
|
|
addSaslMech(mech);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove a SASL mechanism from the list to be used.
|
|
|
|
*
|
|
|
|
* @param mech the SASL mechanism to be removed
|
|
|
|
*/
|
|
|
|
public static void removeSaslMech(String mech) {
|
|
|
|
if( defaultMechs.contains(mech) ) {
|
|
|
|
defaultMechs.remove(mech);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove a Collection of SASL mechanisms to the list to be used.
|
|
|
|
*
|
|
|
|
* @param mechs the Collection of SASL mechanisms to be removed
|
|
|
|
*/
|
|
|
|
public static void removeSaslMechs(Collection<String> mechs) {
|
|
|
|
for(String mech : mechs) {
|
|
|
|
removeSaslMech(mech);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the list of SASL mechanisms to be used. If a SASL mechanism is
|
|
|
|
* listed here it does not guarantee it will be used. The server may not
|
|
|
|
* support it, or it may not be implemented.
|
|
|
|
*
|
|
|
|
* @return the list of SASL mechanisms to be used.
|
|
|
|
*/
|
|
|
|
public static List<String> getSaslMechs() {
|
|
|
|
return defaultMechs;
|
|
|
|
}
|
|
|
|
|
2010-08-15 13:57:11 +02:00
|
|
|
/**
|
|
|
|
* Returns true if the local Socks5 proxy should be started. Default is true.
|
|
|
|
*
|
|
|
|
* @return if the local Socks5 proxy should be started
|
|
|
|
*/
|
|
|
|
public static boolean isLocalSocks5ProxyEnabled() {
|
|
|
|
return localSocks5ProxyEnabled;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets if the local Socks5 proxy should be started. Default is true.
|
|
|
|
*
|
|
|
|
* @param localSocks5ProxyEnabled if the local Socks5 proxy should be started
|
|
|
|
*/
|
|
|
|
public static void setLocalSocks5ProxyEnabled(boolean localSocks5ProxyEnabled) {
|
|
|
|
SmackConfiguration.localSocks5ProxyEnabled = localSocks5ProxyEnabled;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return the port of the local Socks5 proxy. Default is 7777.
|
|
|
|
*
|
|
|
|
* @return the port of the local Socks5 proxy
|
|
|
|
*/
|
|
|
|
public static int getLocalSocks5ProxyPort() {
|
|
|
|
return localSocks5ProxyPort;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the port of the local Socks5 proxy. Default is 7777. If you set the port to a negative
|
|
|
|
* value Smack tries the absolute value and all following until it finds an open port.
|
|
|
|
*
|
|
|
|
* @param localSocks5ProxyPort the port of the local Socks5 proxy to set
|
|
|
|
*/
|
|
|
|
public static void setLocalSocks5ProxyPort(int localSocks5ProxyPort) {
|
|
|
|
SmackConfiguration.localSocks5ProxyPort = localSocks5ProxyPort;
|
|
|
|
}
|
|
|
|
|
2013-02-27 23:49:04 +01:00
|
|
|
/**
|
|
|
|
* Returns the default ping interval (seconds)
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
*/
|
2013-01-04 12:43:35 +01:00
|
|
|
public static int getDefaultPingInterval() {
|
|
|
|
return defaultPingInterval;
|
|
|
|
}
|
|
|
|
|
2013-02-27 23:49:04 +01:00
|
|
|
/**
|
|
|
|
* Sets the default ping interval (seconds). Set it to '-1' to disable the periodic ping
|
|
|
|
*
|
|
|
|
* @param defaultPingInterval
|
|
|
|
*/
|
2013-01-04 12:43:35 +01:00
|
|
|
public static void setDefaultPingInterval(int defaultPingInterval) {
|
|
|
|
SmackConfiguration.defaultPingInterval = defaultPingInterval;
|
|
|
|
}
|
|
|
|
|
2004-03-15 19:59:41 +01:00
|
|
|
private static void parseClassToLoad(XmlPullParser parser) throws Exception {
|
|
|
|
String className = parser.nextText();
|
|
|
|
// Attempt to load the class so that the class can get initialized
|
|
|
|
try {
|
|
|
|
Class.forName(className);
|
|
|
|
}
|
|
|
|
catch (ClassNotFoundException cnfe) {
|
2004-04-18 20:11:26 +02:00
|
|
|
System.err.println("Error! A startup class specified in smack-config.xml could " +
|
2004-03-15 19:59:41 +01:00
|
|
|
"not be loaded: " + className);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static int parseIntProperty(XmlPullParser parser, int defaultValue)
|
|
|
|
throws Exception
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
return Integer.parseInt(parser.nextText());
|
|
|
|
}
|
|
|
|
catch (NumberFormatException nfe) {
|
|
|
|
nfe.printStackTrace();
|
|
|
|
return defaultValue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-12-19 19:17:36 +01:00
|
|
|
/**
|
|
|
|
* Returns an array of class loaders to load resources from.
|
|
|
|
*
|
|
|
|
* @return an array of ClassLoader instances.
|
|
|
|
*/
|
|
|
|
private static ClassLoader[] getClassLoaders() {
|
2004-11-27 03:04:43 +01:00
|
|
|
ClassLoader[] classLoaders = new ClassLoader[2];
|
2006-07-18 07:14:33 +02:00
|
|
|
classLoaders[0] = SmackConfiguration.class.getClassLoader();
|
2003-12-19 19:17:36 +01:00
|
|
|
classLoaders[1] = Thread.currentThread().getContextClassLoader();
|
2006-08-03 00:31:23 +02:00
|
|
|
// Clean up possible null values. Note that #getClassLoader may return a null value.
|
|
|
|
List<ClassLoader> loaders = new ArrayList<ClassLoader>();
|
|
|
|
for (ClassLoader classLoader : classLoaders) {
|
|
|
|
if (classLoader != null) {
|
|
|
|
loaders.add(classLoader);
|
|
|
|
}
|
|
|
|
}
|
2006-08-03 19:03:19 +02:00
|
|
|
return loaders.toArray(new ClassLoader[loaders.size()]);
|
2003-12-19 19:17:36 +01:00
|
|
|
}
|
|
|
|
}
|