/* * 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.beans.service; import com.avanza.astrix.beans.core.AstrixBeanKey; import com.avanza.astrix.versioning.core.ObjectSerializerDefinition; /** * Holds static information about a given service, i.e information defined * in the ApiProvider as part of the service definition. * * This is different from the dynamic information stored in * the service registry which is represented by {@link ServiceProperties}. * * @author Elias Lindholm (elilin) * */ public final class ServiceDefinition<T> { private final Class<?> serviceConfigClass; private final ObjectSerializerDefinition objectSerializerDefinition; private final AstrixBeanKey<T> beanKey; private final boolean dynamicQualified; private final ServiceDefinitionSource serviceDefinitionSource; public ServiceDefinition(ServiceDefinitionSource serviceDefinitionSource, AstrixBeanKey<T> beanKey, ObjectSerializerDefinition serializerDefinition, boolean dynamicQualified) { this.serviceDefinitionSource = serviceDefinitionSource; this.beanKey = beanKey; this.objectSerializerDefinition = serializerDefinition; this.dynamicQualified = dynamicQualified; this.serviceConfigClass = null; } private ServiceDefinition(ServiceDefinitionSource serviceDefinitionSource, AstrixBeanKey<T> beanKey, Class<?> serviceConfigClass, ObjectSerializerDefinition objectSerializerDefinition, boolean dynamicQualified) { this.serviceDefinitionSource = serviceDefinitionSource; this.beanKey = beanKey; this.serviceConfigClass = serviceConfigClass; this.objectSerializerDefinition = objectSerializerDefinition; this.dynamicQualified = dynamicQualified; } public static <T> ServiceDefinition<T> create(ServiceDefinitionSource serviceDefinitionSource, AstrixBeanKey<T> beanKey, Class<?> serviceConfigClass, ObjectSerializerDefinition serializerDefinition, boolean dynamicQualified) { return new ServiceDefinition<>(serviceDefinitionSource, beanKey, serviceConfigClass, serializerDefinition, dynamicQualified); } public <E> ServiceDefinition<E> asyncDefinition(Class<E> asyncInterface) { return new ServiceDefinition<>(serviceDefinitionSource, AstrixBeanKey.create(asyncInterface, beanKey.getQualifier()), serviceConfigClass, objectSerializerDefinition, this.dynamicQualified); } public boolean isDynamicQualified() { return dynamicQualified; } public Class<T> getServiceType() { return this.beanKey.getBeanType(); } public ServiceDefinitionSource getServiceDefinitionSource() { return serviceDefinitionSource; } public boolean isVersioned() { return objectSerializerDefinition.isVersioned(); } @SuppressWarnings("unchecked") public <E> Class<E> getServiceConfigClass(Class<E> type) { if (this.serviceConfigClass == null) { throw new IllegalStateException(String.format("Expected service configuration class of type=%s to be defined for service", type.getName())); } if (!type.isAssignableFrom(this.serviceConfigClass)) { throw new IllegalStateException(String.format("Expected service configuration class of type=%s, but actualType=%s", type.getName(), serviceConfigClass.getName())); } return (Class<E>) serviceConfigClass; } public int version() { return objectSerializerDefinition.version(); } public ObjectSerializerDefinition getObjectSerializerDefinition() { return this.objectSerializerDefinition; } public AstrixBeanKey<T> getBeanKey() { return this.beanKey; } }