serviceregistry.java

来自「world wind java sdk 源码」· Java 代码 · 共 335 行

JAVA
335
字号
/* Copyright (C) 2001, 2008 United States Government as represented by
the Administrator of the National Aeronautics and Space Administration.
All Rights Reserved.
*/
package gov.nasa.worldwind.util;

import java.util.*;

/**
 * @author dcollins
 * @version $Id: ServiceRegistry.java 7008 2008-10-11 00:58:57Z dcollins $
 */
public class ServiceRegistry
{
    private String name = "";
    private Map<Class<?>, ProviderRegistry<?>> serviceMap = new HashMap<Class<?>, ProviderRegistry<?>>();

    public ServiceRegistry()
    {
    }

    public String getName()
    {
        return this.name;
    }

    public void setName(String name)
    {
        this.name = (name != null ? name : "");
    }

    public Iterable<Class<?>> getServices()
    {
        return this.serviceMap.keySet();
    }

    public <T> boolean hasService(Class<T> service)
    {
        ProviderRegistry<T> reg = this.getProviderRegistry(service);
        return reg != null;
    }

    public <T> void addService(Class<T> service)
    {
        if (service == null)
        {
            String message = Logging.getMessage("nullValue.ServiceIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        ProviderRegistry<T> reg = new ProviderRegistry<T>(service);
        this.serviceMap.put(service, reg);

        String message = Logging.getMessage("ServiceRegistry.RegisterServiceCategory", this.getName(), service);
        Logging.logger().finer(message);
    }

    public <T> Iterable<Class<? extends T>> getServiceProviders(Class<T> service)
    {
        if (service == null)
        {
            String message = Logging.getMessage("nullValue.ServiceIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        String message = this.validateService(service);
        if (message != null)
        {
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        ProviderRegistry<T> reg = this.getProviderRegistry(service);
        return reg.getProviders();    
    }

    public <T> Iterable<? extends T> createServiceProviders(Class<T> service)
    {
        if (service == null)
        {
            String message = Logging.getMessage("nullValue.ServiceIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        String message = this.validateService(service);
        if (message != null)
        {
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        ProviderRegistry<T> reg = this.getProviderRegistry(service);
        return this.instantiateProviders(reg.getProviders());
    }

    public <T> boolean hasServiceProvider(Class<? extends T> provider, Class<T> service)
    {
        if (service == null)
        {
            String message = Logging.getMessage("nullValue.ServiceIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        String message = this.validateService(service);
        if (message != null)
        {
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        ProviderRegistry<T> reg = this.getProviderRegistry(service);
        return reg.hasProvider(provider);
    }

    public <T> void registerServiceProvider(Class<? extends T> provider, Class<T> service)
    {
        if (provider == null)
        {
            String message = Logging.getMessage("nullValue.ServiceProviderIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }
        if (service == null)
        {
            String message = Logging.getMessage("nullValue.ServiceIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        String message = this.validateProvider(provider, service);
        if (message != null)
        {
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        message = this.validateService(service);
        if (message != null)
        {
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        ProviderRegistry<T> reg = this.getProviderRegistry(service);
        reg.registerProvider(provider);

        message = Logging.getMessage("ServiceRegistry.RegisterServiceProvider",
            this.getName(), provider, reg.getService());
        Logging.logger().finer(message);
    }

    public <T> void deregisterServiceProvider(Class<? extends T> provider, Class<T> service)
    {
        if (provider == null)
        {
            String message = Logging.getMessage("nullValue.ServiceProviderIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }
        if (service == null)
        {
            String message = Logging.getMessage("nullValue.ServiceIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        String message = this.validateProvider(provider, service);
        if (message != null)
        {
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        message = this.validateService(service);
        if (message != null)
        {
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        ProviderRegistry<T> reg = this.getProviderRegistry(service);
        reg.deregisterProvider(provider);

        message = Logging.getMessage("ServiceRegistry.DeregisterServiceProvider",
            this.getName(), provider, reg.getService());
        Logging.logger().finer(message);
    }

    public <T> void deregisterAll(Class<T> service)
    {
        if (service == null)
        {
            String message = Logging.getMessage("nullValue.ServiceIsNull");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        String message = this.validateService(service);
        if (message != null)
        {
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        ProviderRegistry<T> reg = this.getProviderRegistry(service); 
        reg.deregisterAll();

        message = Logging.getMessage("ServiceRegistry.DeregisterAllServiceProviders",
            this.getName(), reg.getService());
        Logging.logger().finer(message);
    }

    public void deregisterAll()
    {
        for (ProviderRegistry reg : this.serviceMap.values())
        {
            reg.deregisterAll();

            String message = Logging.getMessage("ServiceRegistry.DeregisterAllServiceProviders",
                this.getName(), reg.getService());
            Logging.logger().finer(message);
        }
    }

    @SuppressWarnings({"unchecked"})
    protected <T> ProviderRegistry<T> getProviderRegistry(Class<T> service)
    {
        return (ProviderRegistry<T>) this.serviceMap.get(service);
    }

    protected <T> Iterable<? extends T> instantiateProviders(Iterable<Class<? extends T>> providers)
    {
        List<T> instances = new ArrayList<T>();

        for (Class<? extends T> cls : providers)
        {
            try
            {
                T newInstance = cls.newInstance();
                instances.add(newInstance);
            }
            catch (IllegalAccessException e)
            {
                String message = Logging.getMessage("ServiceRegistry.NoDefaultConstructor");
                Logging.logger().severe(message);
            }
            catch (InstantiationException e)
            {
                String message = Logging.getMessage("ServiceRegistry.NonInstantiableServiceProvider");
                Logging.logger().severe(message);
            }
        }

        return instances;
    }

    protected <T> String validateService(Class<T> service)
    {
        StringBuilder sb = new StringBuilder();

        ProviderRegistry<T> reg = this.getProviderRegistry(service);
        if (reg == null)
            sb.append(sb.length() > 0 ? ", " : "")
                    .append(Logging.getMessage("ServiceRegistry.UnknownService", service));

        if (sb.length() == 0)
            return null;

        return sb.toString();
    }

    protected <T> String validateProvider(Class<? extends T> provider, Class<T> service)
    {
        StringBuilder sb = new StringBuilder();

        if (!service.isAssignableFrom(provider))
            sb.append(sb.length() > 0 ? ", " : "")
                    .append(Logging.getMessage("ServiceRegistry.InvalidServiceProviderType", provider));

        if (sb.length() == 0)
            return null;

        return sb.toString();
    }

    protected static class ProviderRegistry<T>
    {
        private Class<T> service;
        private List<Class<? extends T>> providerList;

        public ProviderRegistry(Class<T> service)
        {
            this.service = service;
            this.providerList = new ArrayList<Class<? extends T>>();
        }

        public Class<T> getService()
        {
            return this.service;
        }

        public Iterable<Class<? extends T>> getProviders()
        {
            return Collections.unmodifiableList(this.providerList);
        }

        public boolean hasProvider(Class<? extends T> provider)
        {
            Object o = this.providerList.contains(provider);
            return o != null;
        }

        public void registerProvider(Class<? extends T> provider)
        {
            if (!this.providerList.contains(provider))
                this.providerList.add(provider);
        }

        public void deregisterProvider(Class<? extends T> provider)
        {
            if (!this.providerList.contains(provider))
                this.providerList.remove(provider);
        }

        public void deregisterAll()
        {
            this.providerList.clear();
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?