/**
   * Update catalog service
   *
   * @param param Catalog Service update parameters
   * @param id the URN the catalog service
   * @prereq none
   * @brief Update Catalog Service
   * @return No data returned in response body
   */
  @PUT
  @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
  @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
  @Path("/{id}")
  @CheckPermission(
      roles = {Role.TENANT_ADMIN},
      acls = {ACL.OWN})
  public CatalogServiceRestRep updateCatalogService(
      @PathParam("id") URI id, CatalogServiceUpdateParam param) {
    CatalogService catalogService = getCatalogServiceById(id, true);
    List<CatalogServiceField> catalogServiceFields =
        catalogServiceManager.getCatalogServiceFields(id);

    StorageOSUser user = getUserFromContext();
    CatalogCategory parentCatalogCategory =
        catalogCategoryManager.getCatalogCategoryById(param.getCatalogCategory());
    verifyAuthorizedInTenantOrg(uri(parentCatalogCategory.getTenant()), user);

    validateParam(param, catalogService);

    updateObject(catalogService, param, parentCatalogCategory);
    List<CatalogServiceField> updatedCatalogServiceFields =
        updateObjectList(catalogService, catalogServiceFields, param.getCatalogServiceFields());

    catalogServiceManager.updateCatalogService(catalogService, updatedCatalogServiceFields);
    auditOpSuccess(OperationTypeEnum.UPDATE_CATALOG_SERVICE, catalogService.auditParameters());

    // Refresh Objects
    catalogService = catalogServiceManager.getCatalogServiceById(catalogService.getId());
    catalogServiceFields = catalogServiceManager.getCatalogServiceFields(catalogService.getId());
    ServiceDescriptor serviceDescriptor = getServiceDescriptor(catalogService);

    return map(catalogService, serviceDescriptor, catalogServiceFields);
  }
  @PUT
  @Path("/{id}/acl")
  @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
  @CheckPermission(
      roles = {Role.SECURITY_ADMIN, Role.TENANT_ADMIN},
      acls = {ACL.OWN},
      block_proxies = true)
  public ACLAssignments updateRoleAssignments(
      @PathParam("id") URI id, ACLAssignmentChanges changes) {
    CatalogService catalogService = catalogServiceManager.getCatalogServiceById(id);
    CatalogCategory parentCatalogCategory =
        catalogCategoryManager.getCatalogCategoryById(
            catalogService.getCatalogCategoryId().getURI());
    URI tenantId = uri(parentCatalogCategory.getTenant());

    _permissionsHelper.updateACLs(catalogService, changes, new CatalogACLInputFilter(tenantId));

    catalogServiceManager.updateCatalogService(catalogService, null);
    ;

    auditOpSuccess(
        OperationTypeEnum.MODIFY_CATALOG_SERVICE_ACL,
        catalogService.getId().toString(),
        catalogService.getLabel(),
        changes);

    catalogConfigUtils.notifyCatalogAclChange();

    return getRoleAssignmentsResponse(id);
  }
  /**
   * Creates a new catalog service
   *
   * @param createParam the parameter to create a new catalog service
   * @prereq none
   * @brief Create Catalog Service
   * @return none
   */
  @POST
  @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
  @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
  @CheckPermission(
      roles = {Role.TENANT_ADMIN},
      acls = {ACL.OWN})
  @Path("")
  public CatalogServiceRestRep createCatalogService(CatalogServiceCreateParam createParam) {

    StorageOSUser user = getUserFromContext();
    CatalogCategory parentCatalogCategory =
        catalogCategoryManager.getCatalogCategoryById(createParam.getCatalogCategory());
    verifyAuthorizedInTenantOrg(uri(parentCatalogCategory.getTenant()), user);

    validateParam(createParam, null);

    CatalogService catalogService = createNewObject(createParam, parentCatalogCategory);
    List<CatalogServiceField> catalogServiceFields =
        createNewObjectList(catalogService, createParam.getCatalogServiceFields());
    catalogServiceManager.createCatalogService(catalogService, catalogServiceFields);

    auditOpSuccess(OperationTypeEnum.CREATE_CATALOG_SERVICE, catalogService.auditParameters());

    // Refresh Objects
    catalogService = catalogServiceManager.getCatalogServiceById(catalogService.getId());
    catalogServiceFields = catalogServiceManager.getCatalogServiceFields(catalogService.getId());
    ServiceDescriptor serviceDescriptor = getServiceDescriptor(catalogService);

    return map(catalogService, serviceDescriptor, catalogServiceFields);
  }
 @Override
 protected URI getTenantOwner(URI id) {
   CatalogService catalogService = queryResource(id);
   CatalogCategory parentCatalogCategory =
       catalogCategoryManager.getCatalogCategoryById(
           catalogService.getCatalogCategoryId().getURI());
   return uri(parentCatalogCategory.getTenant());
 }
  public void deleteCatalogService(CatalogService catalogService) {
    CatalogCategory parentCatalogCategory =
        catalogCategoryManager.getCatalogCategoryById(
            catalogService.getCatalogCategoryId().getURI());
    URI tenantId = uri(parentCatalogCategory.getTenant());

    if (isServiceUsedForOrders(tenantId, catalogService)) {
      URI deletedCategoryURI = URI.create(CatalogCategory.DELETED_CATEGORY);
      String deletedCategoryLabel = CatalogCategory.DELETED_CATEGORY;
      catalogService.setCatalogCategoryId(new NamedURI(deletedCategoryURI, deletedCategoryLabel));
      client.save(catalogService);
    } else {
      List<CatalogServiceField> serviceFields = getCatalogServiceFields(catalogService.getId());
      log.debug(String.format("Deleting Service Fields: %s", catalogService.getTitle()));
      client.delete(serviceFields);

      log.info(String.format("Deleting Service: %s", catalogService.getTitle()));
      client.delete(catalogService);
    }
  }