/*
* 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.dashboard.web;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.avanza.astrix.beans.registry.AstrixServiceRegistryEntry;
import com.avanza.astrix.beans.service.ServiceProperties;
import com.avanza.astrix.service.registry.client.ServiceRegistryAdministrator;
@RestController
@RequestMapping("/services")
public class ServiceRegistryController {
private ServiceRegistryAdministrator serviceRegistryAdmin;
@Autowired
public ServiceRegistryController(ServiceRegistryAdministrator serviceRegistryAdmin) {
this.serviceRegistryAdmin = Objects.requireNonNull(serviceRegistryAdmin);
}
@RequestMapping(value = "/", method = RequestMethod.GET)
public List<ServiceData> services() {
List<AstrixServiceRegistryEntry> services = serviceRegistryAdmin.listServices();
List<ServiceData> result = new ArrayList<>();
for (AstrixServiceRegistryEntry entry : services) {
ServiceData s = new ServiceData();
s.setProvidedApi(entry.getServiceBeanType());
s.setServiceMetadata(entry.getServiceMetadata());
Map<String, String> serviceProperties = new HashMap<>();
for (Map.Entry<String, String> prop : entry.getServiceProperties().entrySet()) {
if (prop.getKey().startsWith("_")) {
continue;
}
serviceProperties.put(prop.getKey(), prop.getValue());
}
serviceProperties.put(ServiceProperties.COMPONENT,
entry.getServiceProperties().get(ServiceProperties.COMPONENT));
s.setServiceProperties(serviceProperties);
result.add(s);
}
return result;
}
@RequestMapping(value = "/summary", method = RequestMethod.GET)
public List<ServiceDataSummary> servicesSummary() {
List<AstrixServiceRegistryEntry> services = serviceRegistryAdmin.listServices();
List<ServiceDataSummary> result = new ArrayList<>();
for (AstrixServiceRegistryEntry entry : services) {
ServiceProperties serviceProperties = new ServiceProperties(entry.getServiceProperties());
ServiceDataSummary s = new ServiceDataSummary();
if (serviceProperties.getQualifier() != null) {
s.setApiKey(serviceProperties.getProperty(ServiceProperties.API) + ":" + serviceProperties.getQualifier());
} else {
s.setApiKey(serviceProperties.getProperty(ServiceProperties.API) + ":-");
}
s.setSubsystem(serviceProperties.getProperty(ServiceProperties.SUBSYSTEM));
StringBuilder serviceUriBuilder = new StringBuilder();
serviceUriBuilder.append(serviceProperties.getComponent()).append(":");
boolean prependAmpersand = false;
for (Map.Entry<String, String> property : serviceProperties.getProperties().entrySet()) {
if (property.getKey().startsWith("_")) {
continue;
}
if (prependAmpersand) {
serviceUriBuilder.append("&");
} else {
prependAmpersand = true;
}
serviceUriBuilder.append(property.getKey()).append("=").append(property.getValue());
}
s.setServiceUri(serviceUriBuilder.toString());
result.add(s);
}
return result;
}
public static class ServiceData {
private String providedApi;
private Map<String, String> serviceProperties;
private Map<String, String> serviceMetadata;
public String getProvidedApi() {
return providedApi;
}
public void setServiceMetadata(Map<String, String> serviceMetadata) {
this.serviceMetadata = serviceMetadata;
}
public Map<String, String> getServiceMetadata() {
return serviceMetadata;
}
public void setProvidedApi(String providedApi) {
this.providedApi = providedApi;
}
public void setServiceProperties(Map<String, String> serviceProperties) {
this.serviceProperties = serviceProperties;
}
public Map<String, String> getServiceProperties() {
return serviceProperties;
}
}
public static class ServiceDataSummary {
private String apiKey;
private String subsystem;
private String serviceUri;
public String getApiKey() {
return apiKey;
}
public void setApiKey(String apiKey) {
this.apiKey = apiKey;
}
public String getSubsystem() {
return subsystem;
}
public void setSubsystem(String subsystem) {
this.subsystem = subsystem;
}
public String getServiceUri() {
return serviceUri;
}
public void setServiceUri(String serviceUri) {
this.serviceUri = serviceUri;
}
}
}