net.sf.nmedit.nomad.core.jpf.JPFServiceInstallerTool.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.nmedit.nomad.core.jpf.JPFServiceInstallerTool.java

Source

/* Copyright (C) 2006 Christian Schneider
 * 
 * This file is part of Nomad.
 * 
 * Nomad is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * Nomad is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Nomad; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
package net.sf.nmedit.nomad.core.jpf;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import net.sf.nmedit.nomad.core.service.Service;
import net.sf.nmedit.nomad.core.service.ServiceException;
import net.sf.nmedit.nomad.core.service.ServiceRegistry;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.java.plugin.Plugin;
import org.java.plugin.PluginManager;
import org.java.plugin.registry.Extension;
import org.java.plugin.registry.ExtensionPoint;

public class JPFServiceInstallerTool {

    private static transient Log _logger;

    private static Log getLogger() {
        if (_logger == null)
            _logger = LogFactory.getLog(JPFServiceInstallerTool.class);

        return _logger;
    }

    public static final String SERVICE_IMPLEMENTATION_CLASS_KEY = "class";
    public static final String SERVICE_CLASS_KEY = "service";
    public static final String SERVICE_DESCRIPTION_KEY = "description";

    public static void activateAllServices(Plugin mainPlugin) {
        Log log = getLogger();

        if (log.isInfoEnabled()) {
            log.info("Activating services...");
        }

        Map<String, Class<Service>> serviceClassCache = new HashMap<String, Class<Service>>();

        ExtensionPoint serviceExtensionPoint = mainPlugin.getDescriptor().getExtensionPoint("Service");

        Collection<Extension> connectedExtensions = serviceExtensionPoint.getConnectedExtensions();

        PluginManager manager = mainPlugin.getManager();

        if (log.isInfoEnabled()) {
            log.info("Connected extensions: " + connectedExtensions.size());
        }

        for (Extension extension : connectedExtensions) {
            ClassLoader pluginClassLoader = manager.getPluginClassLoader(extension.getDeclaringPluginDescriptor());

            activateService(log, serviceClassCache, extension, pluginClassLoader);
        }

    }

    private static void activateService(Log log, Map<String, Class<Service>> serviceClassCache, Extension extension,
            ClassLoader pluginClassLoader) {
        String serviceClassName = extension.getParameter(SERVICE_CLASS_KEY).valueAsString();

        String implementationClassName = extension.getParameter(SERVICE_IMPLEMENTATION_CLASS_KEY).valueAsString();

        if (log.isInfoEnabled()) {
            String description = extension.getParameter(SERVICE_DESCRIPTION_KEY).valueAsString();

            log.info("Service implementation / Service: " + implementationClassName + " (description=" + description
                    + ") / " + serviceClassName);
        }

        Class<Service> serviceClass;
        try {
            serviceClass = lookupServiceClass(serviceClassCache, serviceClassName, pluginClassLoader);
        } catch (ClassNotFoundException e) {
            if (log.isWarnEnabled()) {
                log.warn("Error loading service class: " + serviceClassName, e);
            }

            return;
        }

        Class<Service> serviceImplementationClass;
        try {
            serviceImplementationClass = lookupServiceImplementationClass(serviceClass, implementationClassName,
                    pluginClassLoader);
        } catch (ClassNotFoundException e) {
            if (log.isWarnEnabled()) {
                log.warn("Error loading service implementation class: " + implementationClassName, e);
            }
            return;
        }

        Service serviceInstance;
        try {
            serviceInstance = serviceImplementationClass.newInstance();
        } catch (InstantiationException e) {
            if (log.isWarnEnabled()) {
                log.warn("Error instantiating service: " + serviceImplementationClass, e);
            }

            return;
        } catch (IllegalAccessException e) {
            if (log.isWarnEnabled()) {
                log.warn("Error instantiating service: " + serviceImplementationClass, e);
            }

            return;
        }

        try {
            ServiceRegistry.addService(serviceClass, serviceInstance);
        } catch (ServiceException e) {
            if (log.isWarnEnabled()) {
                log.warn("Error installing service: " + serviceInstance, e);
            }

            return;
        }
    }

    @SuppressWarnings("unchecked")
    private static Class<Service> lookupServiceImplementationClass(Class<? extends Service> serviceClass,
            String serviceImplementationName, ClassLoader loader) throws ClassNotFoundException {
        Class<?> _class = loader.loadClass(serviceImplementationName);

        if (!serviceClass.isAssignableFrom(_class))
            throw new ClassCastException("Service class is not subclass of " + serviceClass + ": " + _class);

        Class<Service> serviceImplementationClass = (Class<Service>) _class;

        return serviceImplementationClass;
    }

    @SuppressWarnings("unchecked")
    private static Class<Service> lookupServiceClass(Map<String, Class<Service>> serviceClassCache,
            String serviceClassName, ClassLoader loader) throws ClassNotFoundException {
        Class<Service> serviceClass = serviceClassCache.get(serviceClassName);

        if (serviceClass != null)
            return serviceClass;

        Class<?> _class = Class.forName(serviceClassName);

        if (!Service.class.isAssignableFrom(_class))
            throw new ClassCastException("Service class is not subclass of " + Service.class + ": " + _class);

        serviceClass = (Class<Service>) _class;

        serviceClassCache.put(serviceClassName, serviceClass);

        return serviceClass;
    }

}