diff --git a/build/resources/META-INF/smack.configuration b/build/resources/META-INF/smack.configuration new file mode 100644 index 000000000..f9d761d96 --- /dev/null +++ b/build/resources/META-INF/smack.configuration @@ -0,0 +1,14 @@ + + + + + + + org.jivesoftware.smackx.ServiceDiscoveryManager + org.jivesoftware.smackx.XHTMLManager + + + + 1.3.0 + + \ No newline at end of file diff --git a/source/org/jivesoftware/smack/SmackConfiguration.java b/source/org/jivesoftware/smack/SmackConfiguration.java new file mode 100644 index 000000000..4639d7528 --- /dev/null +++ b/source/org/jivesoftware/smack/SmackConfiguration.java @@ -0,0 +1,160 @@ +/** +* $RCSfile$ +* $Revision$ +* $Date$ +* +* Copyright (C) 2002-2003 Jive Software. All rights reserved. +* ==================================================================== +* The Jive Software License (based on Apache Software License, Version 1.1) +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* +* 3. The end-user documentation included with the redistribution, +* if any, must include the following acknowledgment: +* "This product includes software developed by +* Jive Software (http://www.jivesoftware.com)." +* Alternately, this acknowledgment may appear in the software itself, +* if and wherever such third-party acknowledgments normally appear. +* +* 4. The names "Smack" and "Jive Software" must not be used to +* endorse or promote products derived from this software without +* prior written permission. For written permission, please +* contact webmaster@jivesoftware.com. +* +* 5. Products derived from this software may not be called "Smack", +* nor may "Smack" appear in their name, without prior written +* permission of Jive Software. +* +* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR +* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +* SUCH DAMAGE. +* ==================================================================== +*/ + +package org.jivesoftware.smack; + +import java.io.*; +import java.net.*; +import java.util.*; + +import org.xmlpull.v1.*; + +/** + * Represents the configuration of Smack. The configuration is used for: + * + * + * @author Gaston Dombiak + */ +public final class SmackConfiguration { + + private static String versionNumber; + + private SmackConfiguration() { + } + + /** + * Loads the configuration from the smack.configuration file.

+ * + * 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 + * + */ + static void init() { + try { + // Get an array of class loaders to try loading the providers files from. + ClassLoader[] classLoaders = getClassLoaders(); + for (int i = 0; i < classLoaders.length; i++) { + Enumeration enum = classLoaders[i].getResources("META-INF/smack.configuration"); + while (enum.hasMoreElements()) { + URL url = (URL) enum.nextElement(); + InputStream systemStream = null; + try { + systemStream = url.openStream(); + XmlPullParserFactory factory = + XmlPullParserFactory.newInstance( + "org.xmlpull.mxp1.MXParserFactory", + null); + factory.setNamespaceAware(true); + XmlPullParser parser = factory.newPullParser(); + parser.setInput(systemStream, "UTF-8"); + int eventType = parser.getEventType(); + do { + if (eventType == XmlPullParser.START_TAG) { + if (parser.getName().equals("className")) { + String className = parser.nextText(); + // Attempt to load the class so that the class can get initialized + try { + Class provider = Class.forName(className); + } + catch (ClassNotFoundException cnfe) { + cnfe.printStackTrace(); + } + } + else if (parser.getName().equals("versionNumber")) { + versionNumber = parser.nextText(); + } + } + eventType = parser.next(); + } + while (eventType != XmlPullParser.END_DOCUMENT); + } + finally { + try { + systemStream.close(); + } + catch (Exception e) { + } + } + } + } + } + catch (Exception e) { + } + } + + /** + * Returns the current Smack release version. The version number value + * gets loaded from the smack.configuration file at system startup. + * + * @return the current Smack release version number + */ + public static String getVersionNumber() { + return versionNumber; + } + + /** + * Returns an array of class loaders to load resources from. + * + * @return an array of ClassLoader instances. + */ + private static ClassLoader[] getClassLoaders() { + ClassLoader[] classLoaders = new ClassLoader[3]; + classLoaders[0] = new SmackConfiguration().getClass().getClassLoader(); + classLoaders[1] = Thread.currentThread().getContextClassLoader(); + classLoaders[2] = ClassLoader.getSystemClassLoader(); + return classLoaders; + } +}