/* * Copyright (C) 2004-2008 Jive Software. 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. */ package org.jivesoftware.xmpp.workgroup; import org.jivesoftware.util.ClassUtils; import org.jivesoftware.util.JiveGlobals; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * <p>Allows customers to customize the request filters being used by the workgroup.</p> * * <p>In order to provide custome request filters to be used by Live Assistant, create * a RequestFilterFactory that derives from this class and implements the getFilter() method. * Add the custom implementation classes to the classpath (most commonly by jarring them and * adding them to the Openfire <tt>home/lib</tt> directory). Finally, set the * RequestFilterFactory.className property in the system property:</p> * * <tt>RequestFilterFactory.className = package.name.className</tt> * * @author Derek DeMoro */ abstract public class RequestFilterFactory { private static final Logger Log = LoggerFactory.getLogger(RequestFilterFactory.class); /** <p>The factory to be used.</p> */ private static RequestFilterFactory factory; /** * <p>Obtain a request filter factory.</p> * * @return The request filter factory to be used */ public static RequestFilterFactory getRequestFilterFactory(){ loadProviders(); return factory; } /** * Returns a request filter. * * @return the filter to use */ abstract public RequestFilter getFilter(); /** * The default class to instantiate is an empty implementation. */ private static String [] classNames = { "org.jivesoftware.xmpp.workgroup.spi.BasicRequestFilterFactory" }; /** * The property names to use to decide what classes to load */ private static String [] propNames = { "RequestFilterFactory.className" }; /** * <p>Sets up the providers based on the defaults and jive properties.</p> * * @param providers the provider classes to use. * @throws IllegalAccessException if the class could not be loaded. * @throws InstantiationException if the class coul not be instantiated. */ private static void setProviders(Class[]providers) throws IllegalAccessException, InstantiationException { factory = (RequestFilterFactory) providers[0].newInstance(); } /** * <p>Loads the provider names from the jive properties config file.</p> */ private static void loadProviders(){ if (factory == null){ // Use className as a convenient object to get a lock on. synchronized(classNames) { if (factory == null){ try { Class []providers = new Class[classNames.length]; for (int i = 0; i < classNames.length; i++){ // Convert XML based provider setup to Database based JiveGlobals.migrateProperty(propNames[i]); String className = classNames[i]; //See if the classname has been set as a Jive property. String classNameProp = JiveGlobals.getProperty(propNames[i]); if (classNameProp != null) { className = classNameProp; } try { providers[i] = ClassUtils.forName(className); } catch (Exception e){ Log.error( "Exception loading class: " + className, e); } } setProviders(providers); } catch (Exception e) { Log.error( "Exception loading class: " + classNames, e); } } } } } }