Java tutorial
/*********************************************************************************************************************** * Copyright (c) 2008 empolis GmbH and brox IT Solutions GmbH. All rights reserved. This program and the accompanying * materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: August Georg Schmidt (brox IT Solutions GmbH) - initial API and implementation **********************************************************************************************************************/ package org.eclipse.smila.search.plugin; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.Platform; import org.eclipse.smila.search.EIFActivator; /** * @author GSchmidt * * To change this generated comment go to Window>Preferences>Java>Code Generation>Code and Comments */ public class PluginFactory { /** * Extension point name for Plugin Access. */ public static final String EXTENSION_POINT_NAME_PLUGIN = "org.eclipse.smila.search.plugin"; /** * s_object. */ private static Object s_object = new Object(); /** * s_plugin. */ private static Plugin s_plugin; /** * Constructor. */ private PluginFactory() { } /** * @throws PluginException - */ public static void initialize() throws PluginException { synchronized (s_object) { final String pluginName = null; try { EIFActivator.registerSchemas(); // pluginName = ConfigManager // .getString(ConfigManager.AFSDK_PLUGIN); s_plugin = getInstance(); } catch (final Throwable e) { throw new PluginException("unable to instanciate retrieval plugin [" + pluginName + "]", e); } } } public static Plugin getPlugin() { synchronized (s_object) { final Log log = LogFactory.getLog(PluginFactory.class); if (s_plugin == null) { try { initialize(); } catch (final PluginException exception) { if (log.isErrorEnabled()) { log.error(exception); } } } return s_plugin; } } public static Plugin getInstance() { // TODO: implement correctly final Log log = LogFactory.getLog(PluginFactory.class); Plugin[] types; try { types = getTypes(); if (types.length != 1) { if (log.isWarnEnabled()) { log.warn("invalid plugin count [" + types.length + "]"); } return null; } return types[0]; } catch (final PluginException e) { if (log.isErrorEnabled()) { log.error(e); } return null; } } /** * Get all available IRM types. * * @return IRM types. * @throws PluginException - */ public static Plugin[] getTypes() throws PluginException { final Log log = LogFactory.getLog(PluginFactory.class); final List<Plugin> found = new ArrayList<Plugin>(); // TODO: Check why the next line is needed. // found.add(UNKNOWN); final IExtension[] extensions = Platform.getExtensionRegistry() .getExtensionPoint(EXTENSION_POINT_NAME_PLUGIN).getExtensions(); for (int i = 0; i < extensions.length; i++) { final IExtension extension = extensions[i]; final IConfigurationElement[] configElements = extension.getConfigurationElements(); for (int j = 0; j < configElements.length; j++) { final IConfigurationElement configurationElement = configElements[j]; final String typeName = parseType(configurationElement, found.size()); Plugin clazz = null; try { final Object obj = configurationElement.createExecutableExtension("Clazz"); clazz = (Plugin) obj; } catch (final Exception exception) { if (log.isErrorEnabled()) { if (configurationElement != null) { log.error("Failed to instantiate plugin"); } else { log.error("Unknown!"); } } throw new PluginException("unable to load plugin", exception); } if (clazz != null) { found.add(clazz); } } } return found.toArray(new Plugin[0]); } /** * Parse configuration and return according IRMType. * * @param configurationElement * Configuration element. * @param ordinal * Ordinal. * @return Type name. */ public static String parseType(IConfigurationElement configurationElement, int ordinal) { final Log log = LogFactory.getLog(PluginFactory.class); if (!configurationElement.getName().equals("Plugin")) { return null; } try { String name = configurationElement.getAttribute("Clazz"); if (name == null) { name = "[missing attribute name]"; } return name; } catch (final Exception e) { if (log.isErrorEnabled()) { String name = configurationElement.getAttribute("Clazz"); if (name == null) { name = "[missing attribute name]"; } final String msg = "Failed to load plugin named " + name + " in " + configurationElement.getDeclaringExtension().getNamespaceIdentifier(); log.error(msg, e); } return null; } } }