package alien4cloud.rest.form;
import java.beans.IntrospectionException;
import java.util.Map;
import javax.annotation.Resource;
import javax.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import alien4cloud.model.common.MetaPropConfiguration;
import org.alien4cloud.tosca.model.types.NodeType;
import alien4cloud.orchestrators.services.OrchestratorConfigurationService;
import alien4cloud.plugin.PluginManager;
import alien4cloud.repository.services.RepositoryService;
import alien4cloud.rest.model.RestResponse;
import alien4cloud.rest.model.RestResponseBuilder;
import alien4cloud.ui.form.PojoFormDescriptorGenerator;
import alien4cloud.ui.form.ToscaPropertyFormDescriptorGenerator;
import springfox.documentation.annotations.ApiIgnore;
@ApiIgnore
@Component
@RestController
@RequestMapping({ "/rest/formdescriptor", "/rest/v1/formdescriptor", "/rest/latest/formdescriptor" })
public class FormDescriptorController {
@Resource
private PojoFormDescriptorGenerator pojoFormDescriptorGenerator;
@Resource
private ToscaPropertyFormDescriptorGenerator toscaPropertyFormDescriptorGenerator;
@Resource
private PluginManager pluginManager;
@Resource
private OrchestratorConfigurationService orchestratorConfigurationService;
@Resource
private RepositoryService repositoryService;
@ApiIgnore
@RequestMapping(value = "/nodetype", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasAnyAuthority('ADMIN', 'COMPONENTS_MANAGER', 'COMPONENTS_BROWSER')")
public RestResponse<Map<String, Object>> getNodeTypeFormDescriptor() throws IntrospectionException {
return RestResponseBuilder.<Map<String, Object>> builder().data(pojoFormDescriptorGenerator.generateDescriptor(NodeType.class)).build();
}
@ApiIgnore
@RequestMapping(value = "/complex-tosca-type", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
@PreAuthorize("hasAnyAuthority('ADMIN', 'COMPONENTS_MANAGER', 'COMPONENTS_BROWSER')")
public RestResponse<Map<String, Object>> getComplexToscaTypeFormDescriptor(@RequestBody @Valid ComplexToscaTypeFormDescriptorRequest request) {
return RestResponseBuilder.<Map<String, Object>> builder()
.data(toscaPropertyFormDescriptorGenerator.generateDescriptor(request.getPropertyDefinition(), request.getDependencies())).build();
}
@RequestMapping(value = "/tagconfiguration", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasAuthority('ADMIN')")
public RestResponse<Map<String, Object>> getTagConfigurationFormDescriptor() throws IntrospectionException {
return RestResponseBuilder.<Map<String, Object>> builder().data(pojoFormDescriptorGenerator.generateDescriptor(MetaPropConfiguration.class)).build();
}
@RequestMapping(value = "/pluginConfig/{pluginId:.+}", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasAuthority('ADMIN')")
public RestResponse<Map<String, Object>> getPluginConfigurationFormDescriptor(@PathVariable String pluginId) throws IntrospectionException {
if (pluginManager.isPluginConfigurable(pluginId)) {
Class<?> configType = pluginManager.getConfigurationType(pluginId);
return RestResponseBuilder.<Map<String, Object>> builder().data(pojoFormDescriptorGenerator.generateDescriptor(configType)).build();
}
return RestResponseBuilder.<Map<String, Object>> builder().build();
}
@RequestMapping(value = "/orchestratorConfig/{orchestratorId:.+}", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasAuthority('ADMIN')")
public RestResponse<Map<String, Object>> getOrchestratorConfigurationFormDescriptor(@PathVariable String orchestratorId) throws IntrospectionException {
Class<?> configurationClass = orchestratorConfigurationService.getConfigurationType(orchestratorId);
if (configurationClass != null) {
return RestResponseBuilder.<Map<String, Object>> builder().data(pojoFormDescriptorGenerator.generateDescriptor(configurationClass)).build();
}
return RestResponseBuilder.<Map<String, Object>> builder().build();
}
@RequestMapping(value = "/repositoryConfig/{pluginId:.+}", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasAnyAuthority('ADMIN', 'COMPONENTS_MANAGER')")
public RestResponse<Map<String, Object>> getRepositoryConfigurationFormDescriptor(@PathVariable String pluginId) throws IntrospectionException {
Class<?> configurationClass = repositoryService.getRepositoryConfigurationType(pluginId);
if (configurationClass != null) {
return RestResponseBuilder.<Map<String, Object>> builder().data(pojoFormDescriptorGenerator.generateDescriptor(configurationClass)).build();
}
return RestResponseBuilder.<Map<String, Object>> builder().build();
}
}