/* * 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 com.avanza.astrix.beans.core.AstrixBeanKey; import com.avanza.astrix.beans.publish.ApiProviderClass; import com.avanza.astrix.beans.publish.BeanDefinitionMethod; import com.avanza.astrix.beans.service.ServiceDefinition; import com.avanza.astrix.beans.service.ServiceDefinitionSource; import com.avanza.astrix.provider.core.AstrixApiProvider; import com.avanza.astrix.versioning.core.AstrixObjectSerializerConfig; import com.avanza.astrix.versioning.core.ObjectSerializerDefinition; import com.avanza.astrix.versioning.core.Versioned; /** * * @author Elias Lindholm * */ public class GenericServiceProviderPlugin implements ServiceProviderPlugin { @Override public List<ExportedServiceBeanDefinition<?>> getExportedServices(ApiProviderClass apiProvider) { List<ExportedServiceBeanDefinition<?>> result = new ArrayList<>(); for (BeanDefinitionMethod<?> beanDefinition : apiProvider.getBeanDefinitionMethods()) { if (!beanDefinition.isService()) { continue; } result.add(createExportedServiceBeanDefinition(beanDefinition, apiProvider)); } return result; } private <T> ExportedServiceBeanDefinition<T> createExportedServiceBeanDefinition(BeanDefinitionMethod<T> beanDefinitionMethod, ApiProviderClass apiProvider) { boolean usesServiceRegistry = beanDefinitionMethod.usesServiceRegistry(); ServiceDefinition<T> serviceDefinition = createServiceDefinition(apiProvider, beanDefinitionMethod, beanDefinitionMethod.getBeanKey()); return new ExportedServiceBeanDefinition<T>(beanDefinitionMethod.getBeanKey(), serviceDefinition, usesServiceRegistry, beanDefinitionMethod.getServiceComponentName()); } private <T> ServiceDefinition<T> createServiceDefinition(ApiProviderClass apiProvider, BeanDefinitionMethod<T> serviceDefinitionMethod, AstrixBeanKey<T> beanKey) { Class<?> declaringApi = apiProvider.getProviderClass(); if (!(declaringApi.isAnnotationPresent(Versioned.class) || serviceDefinitionMethod.isVersioned())) { return ServiceDefinition.create(ServiceDefinitionSource.create(apiProvider.getName()), beanKey, serviceDefinitionMethod.getServiceConfigClass(), ObjectSerializerDefinition.nonVersioned(), serviceDefinitionMethod.isDynamicQualified()); } if (!apiProvider.isAnnotationPresent(AstrixObjectSerializerConfig.class)) { throw new IllegalArgumentException("Illegal api-provider. Api is versioned but provider does not declare a @AstrixObjectSerializerConfig." + " providedService=" + serviceDefinitionMethod.getBeanType().getName() + ", provider=" + apiProvider.getProviderClassName()); } AstrixObjectSerializerConfig serializerConfig = apiProvider.getAnnotation(AstrixObjectSerializerConfig.class); return ServiceDefinition.create(ServiceDefinitionSource.create(apiProvider.getName()), beanKey, serviceDefinitionMethod.getServiceConfigClass(), ObjectSerializerDefinition.versionedService(serializerConfig.version(), serializerConfig.objectSerializerConfigurer()), serviceDefinitionMethod.isDynamicQualified()); } @Override public Class<? extends Annotation> getProviderAnnotationType() { return AstrixApiProvider.class; } }