package org.apereo.cas.mgmt.services.web;
import com.google.common.base.Throwables;
import org.apereo.cas.mgmt.services.web.beans.RegisteredServiceEditBean;
import org.apereo.cas.mgmt.services.web.factory.RegisteredServiceFactory;
import org.apereo.cas.services.RegisteredService;
import org.apereo.cas.services.ServicesManager;
import org.apereo.cas.util.JsonUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/**
* Handle adding/editing of RegisteredServices.
*
* @author Scott Battaglia
* @since 3.1
*/
@Controller("registeredServiceSimpleFormController")
public class RegisteredServiceSimpleFormController extends AbstractManagementController {
private static final Logger LOGGER = LoggerFactory.getLogger(RegisteredServiceSimpleFormController.class);
/**
* Instance of the RegisteredServiceFactory.
*/
private final RegisteredServiceFactory registeredServiceFactory;
/**
* Instantiates a new registered service simple form controller.
*
* @param servicesManager the services manager
* @param registeredServiceFactory the registered service factory
*/
public RegisteredServiceSimpleFormController(final ServicesManager servicesManager, final RegisteredServiceFactory registeredServiceFactory) {
super(servicesManager);
this.registeredServiceFactory = registeredServiceFactory;
}
/**
* Adds the service to the Service Registry.
*
* @param request the request
* @param response the response
* @param result the result
* @param service the edit bean
*/
@PostMapping(value = "saveService.html")
public void saveService(final HttpServletRequest request, final HttpServletResponse response,
@RequestBody final RegisteredServiceEditBean.ServiceData service,
final BindingResult result) {
try {
final RegisteredService svcToUse = this.registeredServiceFactory.createRegisteredService(service);
final RegisteredService newSvc = this.servicesManager.save(svcToUse);
LOGGER.info("Saved changes to service [{}]", svcToUse.getId());
final Map<String, Object> model = new HashMap<>();
model.put("id", newSvc.getId());
model.put("status", HttpServletResponse.SC_OK);
JsonUtils.render(model, response);
} catch (final Exception e) {
throw Throwables.propagate(e);
}
}
/**
* Gets service by id.
*
* @param id the id
* @param request the request
* @param response the response
*/
@GetMapping(value = "getService")
public void getServiceById(@RequestParam(value = "id", required = false) final Long id,
final HttpServletRequest request, final HttpServletResponse response) {
try {
final RegisteredServiceEditBean bean = new RegisteredServiceEditBean();
if (id == -1) {
bean.setServiceData(null);
} else {
final RegisteredService service = this.servicesManager.findServiceBy(id);
if (service == null) {
LOGGER.warn("Invalid service id specified [{}]. Cannot find service in the registry", id);
throw new IllegalArgumentException("Service id " + id + " cannot be found");
}
bean.setServiceData(this.registeredServiceFactory.createServiceData(service));
}
bean.setFormData(this.registeredServiceFactory.createFormData());
bean.setStatus(HttpServletResponse.SC_OK);
JsonUtils.render(bean, response);
} catch (final Exception e) {
throw Throwables.propagate(e);
}
}
}