/*
* 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.util.Collection;
import java.util.HashSet;
import java.util.Set;
import com.avanza.astrix.beans.publish.ApiProviderClass;
import com.avanza.astrix.provider.core.AstrixApplication;
/**
*
* @author Elias Lindholm (elilin)
*
*/
public class AstrixApplicationDescriptor {
private final Class<?> descriptorHolder;
private final String defaultServiceComponent;
private final Collection<ApiProviderClass> exportsRemoteServicesFor;
private AstrixApplicationDescriptor(Class<?> descriptorHolder, String defaultServiceComponent, Collection<ApiProviderClass> exportsRemoteServicesFor) {
this.descriptorHolder = descriptorHolder;
this.defaultServiceComponent = defaultServiceComponent;
this.exportsRemoteServicesFor = exportsRemoteServicesFor;
}
public static AstrixApplicationDescriptor create(Class<?> applicationDescriptorHolder) {
String defaultServiceComponent;
if (!applicationDescriptorHolder.isAnnotationPresent(AstrixApplication.class)) {
throw new IllegalArgumentException("Illegal applicationDescriptor. An application" +
" descriptor must be annotated with @AstrixApplication. descriptorClass=" + applicationDescriptorHolder.getName());
}
AstrixApplication astrixApplication = applicationDescriptorHolder.getAnnotation(AstrixApplication.class);
defaultServiceComponent = getDefaultServiceComponent(astrixApplication, applicationDescriptorHolder);
Class<?>[] exportedRemoteServiceEndpointClasses = getExportedRemoteServiceEndpoints(astrixApplication, applicationDescriptorHolder);
Set<ApiProviderClass> exportsRemoteServicesForApis = new HashSet<>();
for (Class<?> apiProviderClass : exportedRemoteServiceEndpointClasses) {
exportsRemoteServicesForApis.add(ApiProviderClass.create(apiProviderClass));
}
return new AstrixApplicationDescriptor(applicationDescriptorHolder, defaultServiceComponent, exportsRemoteServicesForApis);
}
@SuppressWarnings("deprecation")
private static String getDefaultServiceComponent(
AstrixApplication astrixApplication, Class<?> applicationDescriptorHolder) {
if (astrixApplication.defaultServiceComponent().isEmpty() &&
astrixApplication.component().isEmpty()) {
throw new IllegalArgumentException("Illegal applicationDescriptor. An application" +
" descriptor must not define both a 'component' property and a 'defaultComponentName'"
+ " property. applicationDescriptorClass=" + applicationDescriptorHolder.getName());
}
if (!astrixApplication.defaultServiceComponent().isEmpty()) {
return astrixApplication.defaultServiceComponent();
}
if (!astrixApplication.component().isEmpty()) {
return astrixApplication.component();
}
throw new IllegalArgumentException("Illegal applicationDescriptor. An application" +
" descriptor must define the 'defaultComponentName' property");
}
@SuppressWarnings("deprecation")
private static Class<?>[] getExportedRemoteServiceEndpoints(AstrixApplication astrixApplication, Class<?> applicationDescriptorHolder) {
if (astrixApplication.apiDescriptors().length > 0 &&
astrixApplication.exportsRemoteServicesFor().length > 0) {
throw new IllegalArgumentException("Illegal applicationDescriptor. An application" +
" descriptor must not define both a 'apiDescriptors' property and a 'exportsRemoteServicesFor'"
+ " property. applicationDescriptorClass=" + applicationDescriptorHolder.getName());
}
if (astrixApplication.exportsRemoteServicesFor().length > 0) {
return astrixApplication.exportsRemoteServicesFor();
}
if (astrixApplication.apiDescriptors().length > 0) {
return astrixApplication.apiDescriptors();
}
throw new IllegalArgumentException("Illegal applicationDescriptor. An application" +
" descriptor must define the 'exportsRemoteServicesFor' property");
}
@Override
public String toString() {
return descriptorHolder.getName().toString();
}
/**
* Default ServiceComponent used for services exported to service registry.
* @return
*/
public String getDefaultServiceComponent() {
return defaultServiceComponent;
}
/**
* Defines what api's that this application should export remote service endpoints
* for. <p>
* @return
*/
public Collection<ApiProviderClass> exportsRemoteServicesFor() {
return this.exportsRemoteServicesFor;
}
}