Add DOT to property's name permitted chars
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / servlets / BeGenericServlet.java
index c321df1..da7b11f 100644 (file)
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-
 package org.openecomp.sdc.be.servlets;
 
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.reflect.TypeToken;
 import fj.data.Either;
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Supplier;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
-import org.openecomp.sdc.be.components.impl.*;
-import org.openecomp.sdc.be.components.lifecycle.LifecycleBusinessLogic;
-import org.openecomp.sdc.be.components.scheduledtasks.ComponentsCleanBusinessLogic;
-import org.openecomp.sdc.be.components.upgrade.UpgradeBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic;
+import org.openecomp.sdc.be.components.impl.BaseBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ElementBusinessLogic;
+import org.openecomp.sdc.be.components.impl.GenericArtifactBrowserBusinessLogic;
+import org.openecomp.sdc.be.components.impl.InputsBusinessLogic;
+import org.openecomp.sdc.be.components.impl.OutputsBusinessLogic;
+import org.openecomp.sdc.be.components.impl.PolicyBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ResourceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.config.BeEcompErrorManager;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
-import org.openecomp.sdc.be.ecomp.converters.AssetMetadataConverter;
+import org.openecomp.sdc.be.datatypes.enums.DeclarationTypeEnum;
+import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
 import org.openecomp.sdc.be.impl.ComponentsUtils;
 import org.openecomp.sdc.be.impl.WebAppContextWrapper;
+import org.openecomp.sdc.be.model.ComponentInstInputsMap;
+import org.openecomp.sdc.be.model.InputDefinition;
 import org.openecomp.sdc.be.model.PropertyConstraint;
 import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.User;
@@ -50,35 +77,29 @@ import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
 import org.openecomp.sdc.be.user.UserBusinessLogic;
 import org.openecomp.sdc.common.api.Constants;
-import org.openecomp.sdc.common.datastructure.Wrapper;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 import org.openecomp.sdc.common.servlets.BasicServlet;
 import org.openecomp.sdc.exception.ResponseFormat;
 import org.springframework.web.context.WebApplicationContext;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import java.lang.reflect.Type;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.function.Supplier;
-
 public class BeGenericServlet extends BasicServlet {
 
+    private static final Logger log = Logger.getLogger(BeGenericServlet.class);
+    private static final String PROPERTY_NAME_REGEX = "[a-zA-Z0-9._:-@]+";
     @Context
     protected HttpServletRequest servletRequest;
+    protected ComponentsUtils componentsUtils;
 
-    private static final Logger log = Logger.getLogger(BeGenericServlet.class);
+    public BeGenericServlet(ComponentsUtils componentsUtils) {
+        this.componentsUtils = componentsUtils;
+    }
+
+    private static Response buildOkResponseStatic(Object entity) {
+        return Response.status(Response.Status.OK).entity(entity).build();
+    }
 
     /******************** New error response mechanism
      * @param requestErrorWrapper **************/
-
     protected Response buildErrorResponse(ResponseFormat requestErrorWrapper) {
         return Response.status(requestErrorWrapper.getStatus()).entity(gson.toJson(requestErrorWrapper.getRequestError())).build();
     }
@@ -91,10 +112,13 @@ public class BeGenericServlet extends BasicServlet {
         return buildOkResponseStatic(entity);
     }
 
-    private static Response buildOkResponseStatic(Object entity) {
-        return Response.status(Response.Status.OK)
-            .entity(entity)
-            .build();
+    public HttpServletRequest getServletRequest() {
+        return servletRequest;
+    }
+
+    @VisibleForTesting
+    public void setRequestServlet(HttpServletRequest request) {
+        this.servletRequest = request;
     }
 
     protected Response buildOkResponse(ResponseFormat errorResponseWrapper, Object entity) {
@@ -105,16 +129,18 @@ public class BeGenericServlet extends BasicServlet {
         int status = errorResponseWrapper.getStatus();
         ResponseBuilder responseBuilder = Response.status(status);
         if (entity != null) {
-            if (log.isTraceEnabled())
+            if (log.isTraceEnabled()) {
                 log.trace("returned entity is {}", entity.toString());
+            }
             responseBuilder = responseBuilder.entity(entity);
         }
         if (additionalHeaders != null) {
             for (Entry<String, String> additionalHeader : additionalHeaders.entrySet()) {
                 String headerName = additionalHeader.getKey();
                 String headerValue = additionalHeader.getValue();
-                if (log.isTraceEnabled())
+                if (log.isTraceEnabled()) {
                     log.trace("Adding header {} with value {} to the response", headerName, headerValue);
+                }
                 responseBuilder.header(headerName, headerValue);
             }
         }
@@ -123,96 +149,58 @@ public class BeGenericServlet extends BasicServlet {
 
     /*******************************************************************************************************/
     protected Either<User, ResponseFormat> getUser(final HttpServletRequest request, String userId) {
-        Either<User, ActionStatus> eitherCreator = getUserAdminManager(request.getSession().getServletContext()).getUser(userId, false);
-        if (eitherCreator.isRight()) {
+        User user;
+        try {
+            user = getUserAdminManager(request.getSession().getServletContext()).getUser(userId, false);
+            return Either.left(user);
+        } catch (ComponentException ce) {
             log.info("createResource method - user is not listed. userId= {}", userId);
-            ResponseFormat errorResponse = getComponentsUtils().getResponseFormat(ActionStatus.MISSING_INFORMATION);
-            User user = new User("", "", userId, "", null, null);
-
+            ResponseFormat errorResponse = getComponentsUtils().getResponseFormat(ce);
+            user = new User("", "", userId, "", null, null);
             getComponentsUtils().auditResource(errorResponse, user, "", AuditingActionEnum.CHECKOUT_RESOURCE);
             return Either.right(errorResponse);
         }
-        return Either.left(eitherCreator.left().value());
-
     }
 
     UserBusinessLogic getUserAdminManager(ServletContext context) {
         return getClassFromWebAppContext(context, () -> UserBusinessLogic.class);
     }
 
-    protected ResourceBusinessLogic getResourceBL(ServletContext context) {
-        return getClassFromWebAppContext(context, () -> ResourceBusinessLogic.class);
-    }
-
-    protected InterfaceOperationBusinessLogic getInterfaceOperationBL(ServletContext context) {
-        return getClassFromWebAppContext(context, () -> InterfaceOperationBusinessLogic.class);
+    protected GenericArtifactBrowserBusinessLogic getGenericArtifactBrowserBL(ServletContext context) {
+        return getClassFromWebAppContext(context, () -> GenericArtifactBrowserBusinessLogic.class);
     }
 
-    ComponentsCleanBusinessLogic getComponentCleanerBL(ServletContext context) {
-        return getClassFromWebAppContext(context, () -> ComponentsCleanBusinessLogic.class);
+    protected ResourceBusinessLogic getResourceBL(ServletContext context) {
+        return getClassFromWebAppContext(context, () -> ResourceBusinessLogic.class);
     }
 
     protected ServiceBusinessLogic getServiceBL(ServletContext context) {
         return getClassFromWebAppContext(context, () -> ServiceBusinessLogic.class);
     }
 
-    ProductBusinessLogic getProductBL(ServletContext context) {
-        return getClassFromWebAppContext(context, () -> ProductBusinessLogic.class);
-    }
-
     protected ArtifactsBusinessLogic getArtifactBL(ServletContext context) {
         return getClassFromWebAppContext(context, () -> ArtifactsBusinessLogic.class);
     }
-    protected UpgradeBusinessLogic getUpgradeBL(ServletContext context) {
-        return getClassFromWebAppContext(context, () -> UpgradeBusinessLogic.class);
-    }
 
     protected ElementBusinessLogic getElementBL(ServletContext context) {
         return getClassFromWebAppContext(context, () -> ElementBusinessLogic.class);
     }
 
-    MonitoringBusinessLogic getMonitoringBL(ServletContext context) {
-        return getClassFromWebAppContext(context, () -> MonitoringBusinessLogic.class);
-    }
-
-    protected AssetMetadataConverter getAssetUtils(ServletContext context) {
-        return getClassFromWebAppContext(context, () -> AssetMetadataConverter.class);
-    }
-
-    protected LifecycleBusinessLogic getLifecycleBL(ServletContext context) {
-        return getClassFromWebAppContext(context, () -> LifecycleBusinessLogic.class);
-    }
-
-    <T> T getClassFromWebAppContext(ServletContext context, Supplier<Class<T>> businessLogicClassGen) {
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
-        WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
-        return webApplicationContext.getBean(businessLogicClassGen.get());
-    }
-
-    GroupBusinessLogic getGroupBL(ServletContext context) {
-
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
-        WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
-        return webApplicationContext.getBean(GroupBusinessLogic.class);
+    <T> T getClassFromWebAppContext(final ServletContext context, final Supplier<Class<T>> businessLogicClassGen) {
+        return getWebAppContext(context).getBean(businessLogicClassGen.get());
     }
 
-    protected ComponentInstanceBusinessLogic getComponentInstanceBL(ServletContext context) {
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
-        WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
-        return webApplicationContext.getBean(ComponentInstanceBusinessLogic.class);
+    protected ComponentInstanceBusinessLogic getComponentInstanceBL(final ServletContext context) {
+        return getClassFromWebAppContext(context, () -> ComponentInstanceBusinessLogic.class);
     }
 
     protected ComponentsUtils getComponentsUtils() {
-        ServletContext context = this.servletRequest.getSession().getServletContext();
-
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
-        WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
-        return webApplicationContext.getBean(ComponentsUtils.class);
+        final ServletContext context = this.servletRequest.getSession().getServletContext();
+        return getClassFromWebAppContext(context, () -> ComponentsUtils.class);
     }
 
     /**
-     * Used to support Unit Test.<br>
-     * Header Params are not supported in Unit Tests
+     * Used to support Unit Test.<br> Header Params are not supported in Unit Tests
      *
      * @return
      */
@@ -230,82 +218,52 @@ public class BeGenericServlet extends BasicServlet {
         return new StringBuilder().append("attachment; filename=\"").append(artifactFileName).append("\"").toString();
     }
 
-
-
-    protected ComponentBusinessLogic getComponentBL(ComponentTypeEnum componentTypeEnum, ServletContext context) {
-        ComponentBusinessLogic businessLogic;
-        switch (componentTypeEnum) {
-            case RESOURCE:
-                businessLogic = getResourceBL(context);
-                break;
-            case SERVICE:
-                businessLogic = getServiceBL(context);
-                break;
-            case PRODUCT:
-                businessLogic = getProductBL(context);
-                break;
-            case RESOURCE_INSTANCE:
-                businessLogic = getResourceBL(context);
-                break;
-            default:
-                BeEcompErrorManager.getInstance().logBeSystemError("getComponentBL");
-                throw new IllegalArgumentException("Illegal component type:" + componentTypeEnum.getValue());
-        }
-        return businessLogic;
-    }
-
-    <T> void convertJsonToObjectOfClass(String json, Wrapper<T> policyWrapper, Class<T> clazz, Wrapper<Response> errorWrapper) {
+    <T> T convertJsonToObjectOfClass(String json, Class<T> clazz) {
         T object = null;
-        ObjectMapper mapper = new ObjectMapper()
-            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
+        ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
             .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
         try {
             log.trace("Starting to convert json to object. Json=\n{}", json);
-
             SimpleModule module = new SimpleModule("customDeserializationModule");
             module.addDeserializer(PropertyConstraint.class, new PropertyConstraintJacksonDeserializer());
             mapper.registerModule(module);
-
+            mapper.setSerializationInclusion(Include.NON_NULL);
             object = mapper.readValue(json, clazz);
             if (object != null) {
-                policyWrapper.setInnerElement(object);
+                return object;
             } else {
                 BeEcompErrorManager.getInstance().logBeInvalidJsonInput("convertJsonToObject");
                 log.debug("The object of class {} is null after converting from json. ", clazz);
-                errorWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT)));
+                throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
             }
-        } catch (Exception e) {
+        } catch (IOException e) {
             BeEcompErrorManager.getInstance().logBeInvalidJsonInput("convertJsonToObject");
-            log.debug("The exception {} occured upon json to object convertation. Json=\n{}", e, json);
-            errorWrapper.setInnerElement(buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT)));
+            log.debug("The exception {} occurred upon json to object convertation. Json=\n{}", e, json);
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
         }
     }
 
-    protected Either<Map<String, PropertyDefinition>, ActionStatus> getPropertyModel(String componentId,
-                                                                                     String data) {
+    protected Either<Map<String, PropertyDefinition>, ActionStatus> getPropertyModel(String componentId, String data) {
         JSONParser parser = new JSONParser();
         JSONObject root;
         try {
-            Map<String, PropertyDefinition> properties = new HashMap<String, PropertyDefinition>();
+            Map<String, PropertyDefinition> properties = new HashMap<>();
             root = (JSONObject) parser.parse(data);
-
             Set entrySet = root.entrySet();
             Iterator iterator = entrySet.iterator();
             while (iterator.hasNext()) {
                 Entry next = (Entry) iterator.next();
                 String propertyName = (String) next.getKey();
+                if (!isPropertyNameValid(propertyName)) {
+                    return Either.right(ActionStatus.INVALID_PROPERTY_NAME);
+                }
                 JSONObject value = (JSONObject) next.getValue();
-                String jsonString = value.toJSONString();
-                Either<PropertyDefinition, ActionStatus> convertJsonToObject = convertJsonToObject(jsonString, PropertyDefinition.class);
-                if (convertJsonToObject.isRight()) {
-                    return Either.right(convertJsonToObject.right().value());
+                Either<PropertyDefinition, ActionStatus> propertyDefinitionEither = getPropertyDefinitionFromJson(componentId, propertyName, value);
+                if (propertyDefinitionEither.isRight()) {
+                    return Either.right(propertyDefinitionEither.right().value());
                 }
-                PropertyDefinition propertyDefinition = convertJsonToObject.left().value();
-                String uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, (String) propertyName);
-                propertyDefinition.setUniqueId(uniqueId);
-                properties.put(propertyName, propertyDefinition);
+                properties.put(propertyName, propertyDefinitionEither.left().value());
             }
-
             return Either.left(properties);
         } catch (ParseException e) {
             log.info("Property conetnt is invalid - {}", data);
@@ -313,69 +271,83 @@ public class BeGenericServlet extends BasicServlet {
         }
     }
 
-    protected Either<Map<String, PropertyDefinition>, ActionStatus> getPropertiesListForUpdate(String data) {
+    protected boolean isPropertyNameValid(String propertyName) {
+        return Objects.nonNull(propertyName) && propertyName.matches(PROPERTY_NAME_REGEX);
+    }
+
+    private Either<PropertyDefinition, ActionStatus> getPropertyDefinitionFromJson(String componentId, String propertyName, JSONObject value) {
+        String jsonString = value.toJSONString();
+        Either<PropertyDefinition, ActionStatus> convertJsonToObject = convertJsonToObject(jsonString, PropertyDefinition.class);
+        if (convertJsonToObject.isRight()) {
+            return Either.right(convertJsonToObject.right().value());
+        }
+        PropertyDefinition propertyDefinition = convertJsonToObject.left().value();
+        String uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, propertyName);
+        propertyDefinition.setUniqueId(uniqueId);
+        return Either.left(propertyDefinition);
+    }
+
+    private Either<InputDefinition, ActionStatus> getInputDefinitionFromJson(String componentId, String inputName, JSONObject value) {
+        String jsonString = value.toJSONString();
+        Either<InputDefinition, ActionStatus> convertJsonToObject = convertJsonToObject(jsonString, InputDefinition.class);
+        if (convertJsonToObject.isRight()) {
+            return Either.right(convertJsonToObject.right().value());
+        }
+        InputDefinition inputDefinition = convertJsonToObject.left().value();
+        String uniqueId = UniqueIdBuilder.buildPropertyUniqueId(componentId, inputName);
+        inputDefinition.setUniqueId(uniqueId);
+        return Either.left(inputDefinition);
+    }
 
+    protected Either<Map<String, PropertyDefinition>, ActionStatus> getPropertiesListForUpdate(String data) {
         Map<String, PropertyDefinition> properties = new HashMap<>();
         JSONParser parser = new JSONParser();
         JSONArray jsonArray;
-
         try {
             jsonArray = (JSONArray) parser.parse(data);
             for (Object jsonElement : jsonArray) {
                 String propertyAsString = jsonElement.toString();
                 Either<PropertyDefinition, ActionStatus> convertJsonToObject = convertJsonToObject(propertyAsString, PropertyDefinition.class);
-
                 if (convertJsonToObject.isRight()) {
                     return Either.right(convertJsonToObject.right().value());
                 }
-
                 PropertyDefinition propertyDefinition = convertJsonToObject.left().value();
                 properties.put(propertyDefinition.getName(), propertyDefinition);
             }
-
             return Either.left(properties);
         } catch (Exception e) {
             log.info("Property content is invalid - {}", data);
             return Either.right(ActionStatus.INVALID_CONTENT);
         }
-
     }
 
-
     protected String propertyToJson(Map.Entry<String, PropertyDefinition> property) {
         JSONObject root = new JSONObject();
-        String propertyName = property.getKey();
         PropertyDefinition propertyDefinition = property.getValue();
-        JSONObject propertyDefinitionO = getPropertyDefinitionJSONObject(propertyDefinition);
-        root.put(propertyName, propertyDefinitionO);
+        root.put(property.getKey(), getPropertyDefinitionJSONObject(propertyDefinition));
         propertyDefinition.getType();
         return root.toString();
     }
 
     private JSONObject getPropertyDefinitionJSONObject(PropertyDefinition propertyDefinition) {
-
         Either<String, ActionStatus> either = convertObjectToJson(propertyDefinition);
         if (either.isRight()) {
             return new JSONObject();
         }
-        String value = either.left().value();
         try {
-            JSONObject root = (JSONObject) new JSONParser().parse(value);
-            return root;
+            return (JSONObject) new JSONParser().parse(either.left().value());
         } catch (ParseException e) {
             log.info("failed to convert input to json");
             log.error("failed to convert to json", e);
             return new JSONObject();
         }
-
     }
 
-    protected  <T> Either<T, ActionStatus> convertJsonToObject(String data, Class<T> clazz) {
+    protected <T> Either<T, ActionStatus> convertJsonToObject(String data, Class<T> clazz) {
         T t = null;
         Type constraintType = new TypeToken<PropertyConstraint>() {
         }.getType();
-        Gson
-            gson = new GsonBuilder().registerTypeAdapter(constraintType, new PropertyOperation.PropertyConstraintDeserialiser()).create();
+        Gson gson = new GsonBuilder().registerTypeAdapter(constraintType, new PropertyOperation.PropertyConstraintDeserialiser()).create();
         try {
             log.trace("convert json to object. json=\n {}", data);
             t = gson.fromJson(data, clazz);
@@ -410,13 +382,105 @@ public class BeGenericServlet extends BasicServlet {
             log.debug("failed to convert fto json", e);
             return Either.right(ActionStatus.INVALID_CONTENT);
         }
+    }
+
+    private OutputsBusinessLogic getOutputBL(final ServletContext context) {
+        return getClassFromWebAppContext(context, () -> OutputsBusinessLogic.class);
+    }
+
+    private InputsBusinessLogic getInputBL(final ServletContext context) {
+        return getClassFromWebAppContext(context, () -> InputsBusinessLogic.class);
+    }
+
+    private PolicyBusinessLogic getPolicyBL(final ServletContext context) {
+        return getClassFromWebAppContext(context, () -> PolicyBusinessLogic.class);
+    }
+
+    private WebApplicationContext getWebAppContext(final ServletContext context) {
+        return ((WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR)).getWebAppContext(context);
+    }
+
+    protected <T> Either<T, ResponseFormat> parseToComponentInstanceMap(final String componentJson, final User user,
+                                                                        final ComponentTypeEnum componentType, final Class<T> clazz) {
+        return getComponentsUtils()
+            .convertJsonToObjectUsingObjectMapper(componentJson, user, clazz, AuditingActionEnum.CREATE_RESOURCE, componentType);
+    }
+
+    protected Response declareProperties(String userId, String componentId, String componentType, String componentInstInputsMapObj,
+                                         DeclarationTypeEnum typeEnum, HttpServletRequest request) {
+        ServletContext context = request.getSession().getServletContext();
+        String url = request.getMethod() + " " + request.getRequestURI();
+        log.debug("(get) Start handle request of {}", url);
+        try {
+            BaseBusinessLogic businessLogic = getBlForDeclaration(typeEnum, context);
+            // get modifier id
+            User modifier = new User();
+            modifier.setUserId(userId);
+            log.debug("modifier id is {}", userId);
+            ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.findByParamName(componentType);
+            Either<ComponentInstInputsMap, ResponseFormat> componentInstInputsMapRes = parseToComponentInstanceMap(componentInstInputsMapObj,
+                modifier, componentTypeEnum, ComponentInstInputsMap.class);
+            if (componentInstInputsMapRes.isRight()) {
+                log.debug("failed to parse componentInstInputsMap");
+                return buildErrorResponse(componentInstInputsMapRes.right().value());
+            }
+            Either<List<ToscaDataDefinition>, ResponseFormat> propertiesAfterDeclaration = businessLogic
+                .declareProperties(userId, componentId, componentTypeEnum, componentInstInputsMapRes.left().value());
+            if (propertiesAfterDeclaration.isRight()) {
+                log.debug("failed to create inputs  for service: {}", componentId);
+                return buildErrorResponse(propertiesAfterDeclaration.right().value());
+            }
+            Object properties = RepresentationUtils.toRepresentation(propertiesAfterDeclaration.left().value());
+            return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), properties);
+        } catch (Exception e) {
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Create inputs for service with id: " + componentId);
+            log.debug("Properties declaration failed with exception", e);
+            return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+        }
+    }
+
+    public BaseBusinessLogic getBlForDeclaration(final DeclarationTypeEnum typeEnum, final ServletContext context) {
+        switch (typeEnum) {
+            case OUTPUT:
+                return getOutputBL(context);
+            case POLICY:
+                return getPolicyBL(context);
+            case INPUT:
+                return getInputBL(context);
+            default:
+                throw new IllegalArgumentException("Invalid DeclarationTypeEnum");
+        }
+    }
 
+    protected Either<Map<String, InputDefinition>, ActionStatus> getInputModel(String componentId, String data) {
+        JSONParser parser = new JSONParser();
+        JSONObject root;
+        try {
+            Map<String, InputDefinition> inputs = new HashMap<>();
+            root = (JSONObject) parser.parse(data);
+            Set entrySet = root.entrySet();
+            Iterator iterator = entrySet.iterator();
+            while (iterator.hasNext()) {
+                Entry next = (Entry) iterator.next();
+                String inputName = (String) next.getKey();
+                if (!isInputNameValid(inputName)) {
+                    return Either.right(ActionStatus.INVALID_INPUT_NAME);
+                }
+                JSONObject value = (JSONObject) next.getValue();
+                Either<InputDefinition, ActionStatus> inputDefinitionEither = getInputDefinitionFromJson(componentId, inputName, value);
+                if (inputDefinitionEither.isRight()) {
+                    return Either.right(inputDefinitionEither.right().value());
+                }
+                inputs.put(inputName, inputDefinitionEither.left().value());
+            }
+            return Either.left(inputs);
+        } catch (ParseException e) {
+            log.warn("Input content is invalid - {}", data, e);
+            return Either.right(ActionStatus.INVALID_CONTENT);
+        }
     }
 
-    protected PropertyBusinessLogic getPropertyBL(ServletContext context) {
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
-        WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
-        PropertyBusinessLogic propertytBl = webApplicationContext.getBean(PropertyBusinessLogic.class);
-        return propertytBl;
+    protected boolean isInputNameValid(String inputName) {
+        return Objects.nonNull(inputName) && inputName.matches(PROPERTY_NAME_REGEX);
     }
 }