/*
* � Copyright IBM Corp. 2013
*
* 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 com.ibm.domino.commons.model;
import static com.ibm.domino.commons.model.IGatekeeperProvider.FEATURE_REST_API_DEBUG_IN_ERROR_RESPONSE;
import java.util.HashMap;
import java.util.Map;
import lotus.domino.NotesException;
import lotus.domino.Session;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import com.ibm.domino.commons.internal.Logger;
/**
* Factory for Out of Office provider.
*
* <p>In the future, this factory may eventually produce other provider interfaces.
*/
public class ProviderFactory {
private static IOooStatusProvider s_oooProvider = null;
private static IDelegateProvider s_delegateProvider = null;
private static IFreeRoomsProvider s_freeRoomsProvider = null;
private static ISiteProvider s_siteProvider = null;
private static IImaSettingsProvider s_imaSettingsProvider = null;
private static ILookupProvider s_lookupProvider = null;
private static ITrustProvider s_trustProvider = null;
private static IStatisticsProvider s_statsProvider = null;
private static IRecentContactsProvider s_recentContactsProvider = null;
private static IGatekeeperProvider s_gatekeeperProvider = null;
private static ICustomerProvider s_customerProvider = null;
private static IMutedThreadsProvider s_mutedThreadsProvider = null;
private static IProviderLoader s_loader = null;
private static boolean s_loaderNotFound = false;
/**
* Loads a provider instance from a domino.commons fragment.
*
* @param clazz
* @return
*/
private static Object loadFromFragment(Class<?> clazz) {
Object provider = null;
if ( s_loader == null && !s_loaderNotFound ) {
// Initialize the loader
try {
Class<?> loaderClazz = Class.forName("com.ibm.domino.commons.model.ProviderLoader"); // $NON-NLS-1$
s_loader = (IProviderLoader)loaderClazz.newInstance();
}
catch (Throwable e) {
s_loaderNotFound = true;
}
}
if ( s_loader == null ) {
// For backward compatibility with a 9.0.1 version of
// domino.commons.ext, try some hard-coded class names.
try {
Class<?> oldClazz = null;
if ( clazz.equals(IOooStatusProvider.class) ) {
oldClazz = Class.forName("com.ibm.domino.commons.model.OooStatusProvider"); // $NON-NLS-1$
}
else if ( clazz.equals(IImaSettingsProvider.class) ) {
oldClazz = Class.forName("com.ibm.domino.commons.model.ImaSettingsProvider"); // $NON-NLS-1$
}
if ( oldClazz != null ) {
provider = oldClazz.newInstance();
}
}
catch (Throwable e) {
// Do nothing
}
}
else {
// Load the provider from the fragment
provider = s_loader.load(clazz);
}
if ( provider != null && !clazz.isInstance(provider) ) {
// Wrong type
provider = null;
}
return provider;
}
private static Map<Class<?>, IProviderExtension> s_extensions = null;
private final static String PROVIDER_EXTENSION_ID = "com.ibm.domino.commons.provider"; // $NON-NLS-1$
private final static String PROVIDER_DEFINITION = "providerDefinition"; // $NON-NLS-1$
private final static String CLASS_NAME_ATTR = "className"; // $NON-NLS-1$
/**
* Loads all the provider extensions available. All extensions use the same extension id
* and they must implement the @see {@link IProviderExtension} interface.
*
* @return
*/
private static Map<Class<?>, IProviderExtension> loadExtensions() {
final HashMap<Class<?>, IProviderExtension> result = new HashMap<Class<?>, IProviderExtension>();
// Get a list of all registered provider extensions
IExtension extensions[] = null;
final IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
if (extensionRegistry != null) {
final IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(PROVIDER_EXTENSION_ID);
if (extensionPoint != null) {
extensions = extensionPoint.getExtensions();
}
}
if (extensions != null) {
// Walk through each extension in the list
for (final IExtension extension : extensions) {
final IConfigurationElement configElements[] = extension.getConfigurationElements();
if (configElements == null) {
continue;
}
for (final IConfigurationElement configElement : configElements) {
// We only handle providerDefinition elements for now
if (!(PROVIDER_DEFINITION.equalsIgnoreCase(configElement.getName()))) {
continue;
}
// The cast is safe because the extension point definition requires that the
// class implements this interface.
try {
final IProviderExtension ext = (IProviderExtension) configElement.createExecutableExtension(CLASS_NAME_ATTR);
for (final Class<?> intf : ext.provides()) {
final IProviderExtension oldext = result.put(intf, ext);
if (oldext != null) {
Logger.get().info(String.format("Extension %s replaced by %s for interface %s", // $NLI-ProviderFactory.Extensionsreplacedbysforinterface-1$
oldext.toString(),
ext.toString(),
intf.toString()));
}
}
} catch (final CoreException e) {
Logger.get().error(e, "Unable to create IProviderExtension"); // $NLE-ProviderFactory.UnabletocreateIProviderExtension-1$
}
}
}
}
return result;
}
/**
* Gets a provider instance from an extension point
*/
private static IProviderExtension getExtension(final Class<? extends IProviderExtension> clazz) {
if (s_extensions == null)
s_extensions = loadExtensions();
return s_extensions.get(clazz);
}
public static IOooStatusProvider getOooStatusProvider() {
if ( s_oooProvider == null ) {
s_oooProvider = (IOooStatusProvider)loadFromFragment(IOooStatusProvider.class);
}
return s_oooProvider;
}
public static IImaSettingsProvider getImaSettingsProvider() {
if ( s_imaSettingsProvider == null ) {
s_imaSettingsProvider = (IImaSettingsProvider)loadFromFragment(IImaSettingsProvider.class);
}
return s_imaSettingsProvider;
}
public static IDelegateProvider getDelegateProvider(Session session) {
if ( s_delegateProvider == null ) {
s_delegateProvider = (IDelegateProvider)loadFromFragment(IDelegateProvider.class);
if ( s_delegateProvider == null ) {
boolean useOldProvider = false;
try {
String var = session.getEnvironmentString("MailServiceDelegateWithACL", true); // $NON-NLS-1$
if ( "1".equals(var) ) {
useOldProvider = true;
}
}
catch (NotesException e) {
// Ignore
}
if ( useOldProvider ) {
s_delegateProvider = new DelegateProvider();
}
else {
s_delegateProvider = new Delegate901Provider();
}
}
}
return s_delegateProvider;
}
public static IFreeRoomsProvider getFreeRoomsProvider(Session session) {
if ( s_freeRoomsProvider == null ) {
s_freeRoomsProvider = (IFreeRoomsProvider)loadFromFragment(IFreeRoomsProvider.class);
if ( s_freeRoomsProvider == null ) {
boolean useOldProvider = false;
try {
String var = session.getEnvironmentString("FbUseOldRoomsAPI", true); // $NON-NLS-1$
if ( "1".equals(var) ) {
useOldProvider = true;
}
}
catch (NotesException e) {
// Ignore
}
if ( useOldProvider ) {
s_freeRoomsProvider = new FreeRoomsProvider();
}
else {
s_freeRoomsProvider = new FreeRooms901Provider();
}
}
}
return s_freeRoomsProvider;
}
public static ISiteProvider getSiteProvider() {
if ( s_siteProvider == null ) {
s_siteProvider = (ISiteProvider)loadFromFragment(ISiteProvider.class);
if ( s_siteProvider == null ) {
s_siteProvider = new SiteProvider();
}
}
return s_siteProvider;
}
public static ILookupProvider getLookupProvider() {
if ( s_lookupProvider == null ) {
s_lookupProvider = (ILookupProvider)loadFromFragment(ILookupProvider.class);
if ( s_lookupProvider == null ) {
s_lookupProvider = new LookupProvider();
}
}
return s_lookupProvider;
}
public static ITrustProvider getTrustProvider() {
if ( s_trustProvider == null ) {
s_trustProvider = (ITrustProvider)loadFromFragment(ITrustProvider.class);
}
return s_trustProvider;
}
public static IStatisticsProvider getStatisticsProvider() {
if ( s_statsProvider == null ) {
s_statsProvider = (IStatisticsProvider)loadFromFragment(IStatisticsProvider.class);
}
return s_statsProvider;
}
public static IRecentContactsProvider getRecentContactsProvider() {
if ( s_recentContactsProvider == null ) {
s_recentContactsProvider = (IRecentContactsProvider)loadFromFragment(IRecentContactsProvider.class);
if ( s_recentContactsProvider == null ) {
s_recentContactsProvider = new RecentContactsProvider();
}
}
return s_recentContactsProvider;
}
public static IGatekeeperProvider getGatekeeperProvider() {
if ( s_gatekeeperProvider == null ) {
s_gatekeeperProvider = (IGatekeeperProvider)loadFromFragment(IGatekeeperProvider.class);
if ( s_gatekeeperProvider == null ) {
// Return the default implemenation.
s_gatekeeperProvider = new IGatekeeperProvider() {
public boolean isFeatureEnabled(int feature, String CustomerID, String userID) {
if ( feature == FEATURE_REST_API_DEBUG_IN_ERROR_RESPONSE ) {
return false;
}
else {
// Everything else is enabled
return true;
}
}
};
}
}
return s_gatekeeperProvider;
}
public static ICustomerProvider getCustomerProvider() {
if ( s_customerProvider == null ) {
s_customerProvider = (ICustomerProvider)loadFromFragment(ICustomerProvider.class);
}
return s_customerProvider;
}
public static IMutedThreadsProvider getMutedThreadsProvider() {
if ( s_mutedThreadsProvider == null ) {
s_mutedThreadsProvider = (IMutedThreadsProvider)loadFromFragment(IMutedThreadsProvider.class);
}
return s_mutedThreadsProvider;
}
public static IThreadListProvider getThreadListProvider() {
final IProviderExtension result = getExtension(IThreadListProvider.class);
if (result != null)
return (IThreadListProvider) result;
return null;
}
}