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

com.avanza.astrix.serviceunit.ServiceProviderPlugins Maven / Gradle / Ivy

/*
 * Copyright 2014 Avanza Bank AB
 *
 * 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.avanza.astrix.serviceunit;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import com.avanza.astrix.beans.publish.ApiProviderClass;

class ServiceProviderPlugins {
	
	private final ConcurrentMap, ServiceProviderPlugin> pluginByAnnotationType = new ConcurrentHashMap<>();
	
	public ServiceProviderPlugins(List apiProviderPlugins) {
		for (ServiceProviderPlugin plugin : apiProviderPlugins) {
			ServiceProviderPlugin previous = this.pluginByAnnotationType.putIfAbsent(plugin.getProviderAnnotationType(), plugin);
			if (previous != null) {
				throw new IllegalArgumentException(String.format("Multiple ServiceProviderPlugin's found for providerAnnotationType=%s. p1=%s p2=%s", 
						plugin.getProviderAnnotationType().getName(), plugin.getClass().getName(), previous.getClass().getName()));
			}
		}
	}
	
	public List> getExportedServices(ApiProviderClass apiProvider) {
		ServiceProviderPlugin apiProviderPlugin = getProviderPlugin(apiProvider);
		List> result = new ArrayList<>();
		result.addAll(apiProviderPlugin.getExportedServices(apiProvider));
		return result;
	}
	
	private ServiceProviderPlugin getProviderPlugin(ApiProviderClass apiProvider) {
		for (ServiceProviderPlugin plugin : pluginByAnnotationType.values()) {
			if (apiProvider.isAnnotationPresent(plugin.getProviderAnnotationType())) {
				return plugin;
			}
		}
		throw new IllegalArgumentException("No plugin registered that can handle ApiProvider class: " + apiProvider + ".\n"
										 + "Some possible causes: \n"
										 + "1. You forgot annotate the ApiProvider class with an ApiProvider annotation, most commonly @AstrixApiProvider\n"
										 + "2. The given class is not an ApiProvider but rather a service interface. In that case you sould\n"
										 + "   update your applicationDescriptor's exportsRemoteServicesFor attribute (@AstrixApplication.exportsRemoteServicesFor) \n"
										 + "   to point to the ApiProvider rather than the service interface\n"
										 + "3. You don't have the Plugin that handles your ApiProvider on the classpath");
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy