2 * Copyright © 2016-2018 European Support Limited
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
17 package org.openecomp.sdc.be.servlets;
\r
19 import java.util.List;
\r
20 import java.util.Map;
\r
21 import javax.inject.Inject;
\r
22 import javax.inject.Singleton;
\r
23 import javax.servlet.http.HttpServletRequest;
\r
24 import javax.ws.rs.Consumes;
\r
25 import javax.ws.rs.DELETE;
\r
26 import javax.ws.rs.GET;
\r
27 import javax.ws.rs.HeaderParam;
\r
28 import javax.ws.rs.POST;
\r
29 import javax.ws.rs.PUT;
\r
30 import javax.ws.rs.Path;
\r
31 import javax.ws.rs.PathParam;
\r
32 import javax.ws.rs.Produces;
\r
33 import javax.ws.rs.core.Context;
\r
34 import javax.ws.rs.core.MediaType;
\r
35 import javax.ws.rs.core.Response;
\r
36 import org.openecomp.sdc.be.components.impl.PropertyBusinessLogic;
\r
37 import org.openecomp.sdc.be.config.BeEcompErrorManager;
\r
38 import org.openecomp.sdc.be.dao.api.ActionStatus;
\r
39 import org.openecomp.sdc.be.datamodel.utils.PropertyValueConstraintValidationUtil;
\r
40 import org.openecomp.sdc.be.impl.ComponentsUtils;
\r
41 import org.openecomp.sdc.be.model.PropertyDefinition;
\r
42 import org.openecomp.sdc.be.model.User;
\r
43 import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
\r
44 import org.openecomp.sdc.be.resources.data.EntryData;
\r
45 import org.openecomp.sdc.be.user.UserBusinessLogic;
\r
46 import org.openecomp.sdc.common.api.Constants;
\r
47 import org.openecomp.sdc.exception.ResponseFormat;
\r
48 import org.slf4j.Logger;
\r
49 import org.slf4j.LoggerFactory;
\r
50 import com.jcabi.aspects.Loggable;
\r
51 import fj.data.Either;
\r
52 import io.swagger.v3.oas.annotations.OpenAPIDefinition;
\r
53 import io.swagger.v3.oas.annotations.Operation;
\r
54 import io.swagger.v3.oas.annotations.Parameter;
\r
55 import io.swagger.v3.oas.annotations.info.Info;
\r
56 import io.swagger.v3.oas.annotations.media.ArraySchema;
\r
57 import io.swagger.v3.oas.annotations.media.Content;
\r
58 import io.swagger.v3.oas.annotations.media.Schema;
\r
59 import io.swagger.v3.oas.annotations.responses.ApiResponse;
\r
60 import io.swagger.v3.oas.annotations.responses.ApiResponses;
\r
62 @Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
\r
63 @Path("/v1/catalog")
\r
64 @OpenAPIDefinition(info = @Info(title = "Component Property Servlet", description = "Component Property Servlet"))
\r
66 public class ComponentPropertyServlet extends BeGenericServlet {
\r
68 private final PropertyBusinessLogic propertyBusinessLogic;
\r
69 private final ApplicationDataTypeCache applicationDataTypeCache;
\r
72 public ComponentPropertyServlet(UserBusinessLogic userBusinessLogic,
\r
73 ComponentsUtils componentsUtils,
\r
74 ApplicationDataTypeCache applicationDataTypeCache,
\r
75 PropertyBusinessLogic propertyBusinessLogic) {
\r
76 super(userBusinessLogic, componentsUtils);
\r
77 this.applicationDataTypeCache = applicationDataTypeCache;
\r
78 this.propertyBusinessLogic = propertyBusinessLogic;
\r
81 private static final Logger log = LoggerFactory.getLogger(ComponentPropertyServlet.class);
\r
82 private static final String CREATE_PROPERTY = "Create Property";
\r
83 private static final String DEBUG_MESSAGE = "Start handle request of {} modifier id is {}";
\r
86 @Path("services/{serviceId}/properties")
\r
87 @Consumes(MediaType.APPLICATION_JSON)
\r
88 @Produces(MediaType.APPLICATION_JSON)
\r
89 @Operation(description = "Create Service Property", method = "POST", summary = "Returns created service property",
\r
90 responses = @ApiResponse(
\r
91 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
92 @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Service property created"),
\r
93 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
94 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
\r
95 @ApiResponse(responseCode = "409", description = "Service property already exist")})
\r
96 public Response createPropertyInService(
\r
97 @Parameter(description = "service id to update with new property",
\r
98 required = true) @PathParam("serviceId") final String serviceId,
\r
99 @Parameter(description = "Service property to be created", required = true) String data,
\r
100 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
102 return createProperty(serviceId, data, request, userId);
\r
106 @Path("resources/{resourceId}/properties")
\r
107 @Consumes(MediaType.APPLICATION_JSON)
\r
108 @Produces(MediaType.APPLICATION_JSON)
\r
109 @Operation(description = "Create Resource Property", method = "POST", summary = "Returns created service property",
\r
110 responses = @ApiResponse(
\r
111 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
112 @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Resource property created"),
\r
113 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
114 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
\r
115 @ApiResponse(responseCode = "409", description = "Resource property already exist")})
\r
116 public Response createPropertyInResource(
\r
117 @Parameter(description = "Resource id to update with new property",
\r
118 required = true) @PathParam("resourceId") final String resourceId,
\r
119 @Parameter(description = "Resource property to be created", required = true) String data,
\r
120 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
122 return createProperty(resourceId, data, request, userId);
\r
127 @Path("services/{serviceId}/properties/{propertyId}")
\r
128 @Consumes(MediaType.APPLICATION_JSON)
\r
129 @Produces(MediaType.APPLICATION_JSON)
\r
130 @Operation(description = "Get Service Property", method = "GET", summary = "Returns property of service",
\r
131 responses = @ApiResponse(
\r
132 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
133 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "property"),
\r
134 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
135 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
\r
136 @ApiResponse(responseCode = "404", description = "Service property not found")})
\r
137 public Response getPropertyInService(
\r
138 @Parameter(description = "service id of property", required = true) @PathParam("serviceId") final String serviceId,
\r
139 @Parameter(description = "property id to get", required = true) @PathParam("propertyId") final String propertyId,
\r
140 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
142 return getProperty(serviceId, propertyId, request, userId);
\r
146 @Path("resources/{resourceId}/properties/{propertyId}")
\r
147 @Consumes(MediaType.APPLICATION_JSON)
\r
148 @Produces(MediaType.APPLICATION_JSON)
\r
149 @Operation(description = "Get Resource Property", method = "GET", summary = "Returns property of resource",
\r
150 responses = @ApiResponse(
\r
151 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
152 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "property"),
\r
153 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
154 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
\r
155 @ApiResponse(responseCode = "404", description = "Resource property not found")})
\r
156 public Response getPropertyInResource(
\r
157 @Parameter(description = "resource id of property",
\r
158 required = true) @PathParam("resourceId") final String resourceId,
\r
159 @Parameter(description = "property id to get", required = true) @PathParam("propertyId") final String propertyId,
\r
160 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
162 return getProperty(resourceId, propertyId, request, userId);
\r
166 @Path("services/{serviceId}/properties")
\r
167 @Consumes(MediaType.APPLICATION_JSON)
\r
168 @Produces(MediaType.APPLICATION_JSON)
\r
169 @Operation(description = "Get Service Property", method = "GET", summary = "Returns property list of service",
\r
170 responses = @ApiResponse(
\r
171 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
172 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "property"),
\r
173 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
174 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
\r
175 @ApiResponse(responseCode = "404", description = "Service property not found")})
\r
176 public Response getPropertyListInService(
\r
177 @Parameter(description = "service id of property",
\r
178 required = true) @PathParam("serviceId") final String serviceId,
\r
179 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
181 return getPropertyList(serviceId, request, userId);
\r
185 @Path("resources/{resourceId}/properties")
\r
186 @Consumes(MediaType.APPLICATION_JSON)
\r
187 @Produces(MediaType.APPLICATION_JSON)
\r
188 @Operation(description = "Get Resource Property", method = "GET", summary = "Returns property list of resource",
\r
189 responses = @ApiResponse(
\r
190 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
191 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "property"),
\r
192 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
193 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
\r
194 @ApiResponse(responseCode = "404", description = "Resource property not found")})
\r
195 public Response getPropertyListInResource(
\r
196 @Parameter(description = "resource id of property",
\r
197 required = true) @PathParam("resourceId") final String resourceId,
\r
198 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
200 return getPropertyList(resourceId, request, userId);
\r
204 @Path("services/{serviceId}/properties/{propertyId}")
\r
205 @Consumes(MediaType.APPLICATION_JSON)
\r
206 @Produces(MediaType.APPLICATION_JSON)
\r
207 @Operation(description = "Delete Service Property", method = "DELETE", summary = "Returns deleted property",
\r
208 responses = @ApiResponse(
\r
209 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
210 @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "deleted property"),
\r
211 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
212 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
\r
213 @ApiResponse(responseCode = "404", description = "Service property not found")})
\r
214 public Response deletePropertyInService(
\r
215 @Parameter(description = "service id of property",
\r
216 required = true) @PathParam("serviceId") final String serviceId,
\r
217 @Parameter(description = "Property id to delete",
\r
218 required = true) @PathParam("propertyId") final String propertyId,
\r
219 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
221 return deleteProperty(serviceId, propertyId, request, userId);
\r
225 @Path("resources/{resourceId}/properties/{propertyId}")
\r
226 @Consumes(MediaType.APPLICATION_JSON)
\r
227 @Produces(MediaType.APPLICATION_JSON)
\r
228 @Operation(description = "Delete Resource Property", method = "DELETE", summary = "Returns deleted property",
\r
229 responses = @ApiResponse(
\r
230 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
231 @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "deleted property"),
\r
232 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
233 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
\r
234 @ApiResponse(responseCode = "404", description = "Resource property not found")})
\r
235 public Response deletePropertyInResource(
\r
236 @Parameter(description = "resource id of property",
\r
237 required = true) @PathParam("resourceId") final String resourceId,
\r
238 @Parameter(description = "Property id to delete",
\r
239 required = true) @PathParam("propertyId") final String propertyId,
\r
240 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
242 return deleteProperty(resourceId, propertyId, request, userId);
\r
246 @Path("services/{serviceId}/properties")
\r
247 @Consumes(MediaType.APPLICATION_JSON)
\r
248 @Produces(MediaType.APPLICATION_JSON)
\r
249 @Operation(description = "Update Service Property", method = "PUT", summary = "Returns updated property",
\r
250 responses = @ApiResponse(
\r
251 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
252 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Service property updated"),
\r
253 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
254 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
\r
255 public Response updatePropertyInService(
\r
256 @Parameter(description = "service id to update with new property",
\r
257 required = true) @PathParam("serviceId") final String serviceId,
\r
258 @Parameter(description = "Service property to update", required = true) String data,
\r
259 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
261 return updateProperty(serviceId, data, request, userId);
\r
265 @Path("resources/{resourceId}/properties")
\r
266 @Consumes(MediaType.APPLICATION_JSON)
\r
267 @Produces(MediaType.APPLICATION_JSON)
\r
268 @Operation(description = "Update Resource Property", method = "PUT", summary = "Returns updated property",
\r
269 responses = @ApiResponse(
\r
270 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
271 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Resource property updated"),
\r
272 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
273 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
\r
274 public Response updatePropertyInResource(
\r
275 @Parameter(description = "resource id to update with new property",
\r
276 required = true) @PathParam("resourceId") final String resourceId,
\r
277 @Parameter(description = "Resource property to update", required = true) String data,
\r
278 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
280 return updateProperty(resourceId, data, request, userId);
\r
283 private Response createProperty(String componentId, String data, HttpServletRequest request,String userId) {
\r
284 String url = request.getMethod() + " " + request.getRequestURI();
\r
285 log.debug("Start handle request of {} modifier id is {} data is {}", url, userId, data);
\r
288 Either<Map<String, PropertyDefinition>, ActionStatus> propertyDefinition =
\r
289 getPropertyModel(componentId, data);
\r
290 if (propertyDefinition.isRight()) {
\r
291 ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(propertyDefinition.right().value());
\r
292 return buildErrorResponse(responseFormat);
\r
295 Map<String, PropertyDefinition> properties = propertyDefinition.left().value();
\r
296 if (properties == null || properties.size() != 1) {
\r
297 log.info("Property content is invalid - {}", data);
\r
298 ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
\r
299 return buildErrorResponse(responseFormat);
\r
302 Map.Entry<String, PropertyDefinition> entry = properties.entrySet().iterator().next();
\r
303 PropertyDefinition newPropertyDefinition = entry.getValue();
\r
304 newPropertyDefinition.setParentUniqueId(componentId);
\r
305 String propertyName = newPropertyDefinition.getName();
\r
307 Either<EntryData<String, PropertyDefinition>, ResponseFormat> addPropertyEither =
\r
308 propertyBusinessLogic.addPropertyToComponent(componentId, propertyName, newPropertyDefinition, userId);
\r
310 if(addPropertyEither.isRight()) {
\r
311 return buildErrorResponse(addPropertyEither.right().value());
\r
314 return buildOkResponse(newPropertyDefinition);
\r
316 } catch (Exception e) {
\r
317 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(CREATE_PROPERTY);
\r
318 log.debug("create property failed with exception", e);
\r
319 ResponseFormat responseFormat =
\r
320 getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR);
\r
321 return buildErrorResponse(responseFormat);
\r
326 private Response updateProperty(String componentId, String data, HttpServletRequest request, String userId) {
\r
327 String url = request.getMethod() + " " + request.getRequestURI();
\r
328 log.debug("Start handle request of {}", url);
\r
331 User modifier = new User();
\r
332 modifier.setUserId(userId);
\r
333 log.debug("modifier id is {}", userId);
\r
336 // convert json to PropertyDefinition
\r
338 Either<Map<String, PropertyDefinition>, ActionStatus> propertiesListEither =
\r
339 getPropertiesListForUpdate(data);
\r
340 if (propertiesListEither.isRight()) {
\r
341 ResponseFormat responseFormat =
\r
342 getComponentsUtils().getResponseFormat(propertiesListEither.right().value());
\r
343 return buildErrorResponse(responseFormat);
\r
345 Map<String, PropertyDefinition> properties = propertiesListEither.left().value();
\r
346 if (properties == null) {
\r
347 log.info("Property content is invalid - {}", data);
\r
348 ResponseFormat responseFormat =
\r
349 getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
\r
350 return buildErrorResponse(responseFormat);
\r
353 //Validate value and Constraint of property
\r
354 Either<Boolean, ResponseFormat> constraintValidatorResponse =
\r
355 PropertyValueConstraintValidationUtil.getInstance().
\r
356 validatePropertyConstraints(properties.values(), applicationDataTypeCache);
\r
357 if (constraintValidatorResponse.isRight()) {
\r
358 log.error("Failed validation value and constraint of property: {}",
\r
359 constraintValidatorResponse.right().value());
\r
360 return buildErrorResponse(constraintValidatorResponse.right().value());
\r
365 for(PropertyDefinition propertyDefinition : properties.values()) {
\r
366 Either<EntryData<String, PropertyDefinition>, ResponseFormat> status =
\r
367 propertyBusinessLogic.updateComponentProperty(
\r
368 componentId, propertyDefinition.getUniqueId(), propertyDefinition, userId);
\r
369 if (status.isRight()) {
\r
370 log.info("Failed to update Property. Reason - ", status.right().value());
\r
371 return buildErrorResponse(status.right().value());
\r
373 EntryData<String, PropertyDefinition> property = status.left().value();
\r
374 PropertyDefinition updatedPropertyDefinition = property.getValue();
\r
376 log.debug("Property id {} updated successfully ", updatedPropertyDefinition.getUniqueId());
\r
379 ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.OK);
\r
380 return buildOkResponse(responseFormat, properties);
\r
382 } catch (Exception e) {
\r
383 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Update Property");
\r
384 log.debug("update property failed with exception", e);
\r
385 ResponseFormat responseFormat =
\r
386 getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR);
\r
387 return buildErrorResponse(responseFormat);
\r
392 private Response getProperty(String componentId, String propertyId, HttpServletRequest request, String userId) {
\r
393 String url = request.getMethod() + " " + request.getRequestURI();
\r
394 log.debug(DEBUG_MESSAGE, url, userId);
\r
397 Either<Map.Entry<String, PropertyDefinition>, ResponseFormat> retrievedPropertyEither =
\r
398 propertyBusinessLogic.getComponentProperty(componentId, propertyId, userId);
\r
400 if(retrievedPropertyEither.isRight()) {
\r
401 return buildErrorResponse(retrievedPropertyEither.right().value());
\r
404 return buildOkResponse(retrievedPropertyEither.left().value());
\r
406 } catch (Exception e) {
\r
407 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(CREATE_PROPERTY);
\r
408 log.debug("get property failed with exception", e);
\r
409 ResponseFormat responseFormat =
\r
410 getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR);
\r
411 return buildErrorResponse(responseFormat);
\r
414 private Response getPropertyList(String componentId, HttpServletRequest request, String userId) {
\r
416 String url = request.getMethod() + " " + request.getRequestURI();
\r
417 log.debug(DEBUG_MESSAGE, url, userId);
\r
420 Either<List<PropertyDefinition>, ResponseFormat> propertiesListEither =
\r
421 propertyBusinessLogic.getPropertiesList(componentId, userId);
\r
423 if(propertiesListEither.isRight()) {
\r
424 return buildErrorResponse(propertiesListEither.right().value());
\r
427 return buildOkResponse(propertiesListEither.left().value());
\r
429 } catch (Exception e) {
\r
430 BeEcompErrorManager.getInstance().logBeRestApiGeneralError(CREATE_PROPERTY);
\r
431 log.debug("get property failed with exception", e);
\r
432 ResponseFormat responseFormat =
\r
433 getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR);
\r
434 return buildErrorResponse(responseFormat);
\r
437 private Response deleteProperty(String componentId, String propertyId, HttpServletRequest request, String userId) {
\r
438 String url = request.getMethod() + " " + request.getRequestURI();
\r
439 log.debug(DEBUG_MESSAGE, url, userId);
\r
443 // delete the property
\r
444 Either<Map.Entry<String, PropertyDefinition>, ResponseFormat> status =
\r
445 propertyBusinessLogic.deletePropertyFromComponent(componentId, propertyId, userId);
\r
446 if (status.isRight()) {
\r
447 log.debug("Failed to delete Property. Reason - ", status.right().value());
\r
448 return buildErrorResponse(status.right().value());
\r
450 Map.Entry<String, PropertyDefinition> property = status.left().value();
\r
451 String name = property.getKey();
\r
452 PropertyDefinition propertyDefinition = property.getValue();
\r
454 log.debug("Property {} deleted successfully with id {}", name, propertyDefinition.getUniqueId());
\r
455 ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT);
\r
456 return buildOkResponse(responseFormat, propertyToJson(property));
\r
458 } catch (Exception e) {
\r
459 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete Property");
\r
460 log.debug("delete property failed with exception", e);
\r
461 ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR);
\r
462 return buildErrorResponse(responseFormat);
\r