All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bertramlabs.plugins.karman.KarmanProviders.groovy Maven / Gradle / Ivy

package com.bertramlabs.plugins.karman

import com.bertramlabs.plugins.karman.network.NetworkProviderInterface
import groovy.util.logging.Commons

@Commons
class KarmanProviders {
	static final String FACTORIES_RESOURCE_LOCATION = "META-INF/karman/providers.properties"
	static final String NETWORK_FACTORIES_RESOURCE_LOCATION = "META-INF/karman/networkProviders.properties"
    private static Map> providers = null
	private static Map> networkProviders = null
    /**
     * Load the storage provider classes and adds them to the provider factory
     *
     * @param classLoader The classloader
     *
     * @return A list of provider classes
     */
    static synchronized Map> loadProviders(ClassLoader classLoader = Thread.currentThread().contextClassLoader) {

        if(providers == null) {
            def resources = classLoader.getResources(FACTORIES_RESOURCE_LOCATION)
            providers = [:]

            resources.each { URL res ->
	        	Properties providerProperties = new Properties()
            	providerProperties.load(res.openStream())

            	providerProperties.keySet().each { providerName ->
            		try {
	            		String className = providerProperties.getProperty(providerName)
	            		def cls = classLoader.loadClass(className)
	            		if(StorageProviderInterface.isAssignableFrom(cls)) {
	            			if(!providers[providerName]) {
	            				providers[providerName] = cls
	            			}
	        			} else {
	            			log.warn("Karman Storage Provider $className not registered because it does not implement the StorageProviderInterface")		
	        			}
	        		} catch(Throwable e) {
	        			log.error("Error Loading Karman Storage Provider $className: $e.message",e)
	        		} 
            	}
	        }
	    }
    	return providers
    }


	/**
	 * Load the network provider classes and adds them to the provider factory
	 *
	 * @param classLoader The classloader
	 *
	 * @return A list of network provider classes
	 */
	static synchronized Map> loadNetworkProviders(ClassLoader classLoader = Thread.currentThread().contextClassLoader) {

		if(networkProviders == null) {
			def resources = classLoader.getResources(NETWORK_FACTORIES_RESOURCE_LOCATION)
			networkProviders = [:]

			resources.each { URL res ->
				Properties providerProperties = new Properties()
				providerProperties.load(res.openStream())

				providerProperties.keySet().each { providerName ->
					String className = providerProperties.getProperty(providerName)
					try {
						def cls = classLoader.loadClass(className)
						if(NetworkProviderInterface.isAssignableFrom(cls)) {
							if(!networkProviders[providerName]) {
								networkProviders[providerName] = cls
							}
						} else {
							log.warn("Karman Network Provider $className not registered because it does not implement the NetworkProviderInterface")
						}
					} catch(Throwable e) {
						log.error("Error Loading Karman Network Provider $className: $e.message",e)
					}
				}
			}
		}
		return networkProviders
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy