Sync Integ to Master
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / CommonImportManager.java
index 31c6656..055e479 100644 (file)
 
 package org.openecomp.sdc.be.components.impl;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.function.BiFunction;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-
-import javax.annotation.Resource;
-
+import fj.data.Either;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.openecomp.sdc.be.components.impl.ImportUtils.ResultStatusEnum;
 import org.openecomp.sdc.be.config.BeEcompErrorManager;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.impl.ComponentsUtils;
-import org.openecomp.sdc.be.model.CapabilityTypeDefinition;
-import org.openecomp.sdc.be.model.DataTypeDefinition;
-import org.openecomp.sdc.be.model.GroupTypeDefinition;
-import org.openecomp.sdc.be.model.PolicyTypeDefinition;
-import org.openecomp.sdc.be.model.PropertyDefinition;
+import org.openecomp.sdc.be.model.*;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
 import org.openecomp.sdc.exception.ResponseFormat;
@@ -49,260 +35,279 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 import org.yaml.snakeyaml.Yaml;
 
-import fj.data.Either;
-import jersey.repackaged.com.google.common.base.Function;
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @Component("commonImportManager")
 public class CommonImportManager {
 
-       private static Logger log = LoggerFactory.getLogger(CommonImportManager.class.getName());
-
-       @Resource
-       private ComponentsUtils componentsUtils;
-       @Resource
-       private PropertyOperation propertyOperation;
-
-       protected void setProperties(Map<String, Object> toscaJson, Consumer<List<PropertyDefinition>> consumer) {
-               consumer.accept(getProperties(toscaJson));
-       }
-
-       private List<PropertyDefinition> getProperties(Map<String, Object> toscaJson) {
-               List<PropertyDefinition> values = null;
-               Either<Map<String, PropertyDefinition>, ResultStatusEnum> properties = ImportUtils.getProperties(toscaJson);
-
-               if (properties.isLeft()) {
-                       values = new ArrayList<>();
-                       Map<String, PropertyDefinition> propertiesMap = properties.left().value();
-                       if (propertiesMap != null && propertiesMap.isEmpty() == false) {
-
-                               for (Entry<String, PropertyDefinition> entry : propertiesMap.entrySet()) {
-                                       String propName = entry.getKey();
-                                       PropertyDefinition propertyDefinition = entry.getValue();
-                                       PropertyDefinition newPropertyDefinition = new PropertyDefinition(propertyDefinition);
-                                       newPropertyDefinition.setName(propName);
-                                       values.add(newPropertyDefinition);
-                               }
-                       }
-               }
-
-               return values;
-       }
-
-       protected void setPropertiesMap(Map<String, Object> toscaJson, Consumer<Map<String, PropertyDefinition>> consumer) {
-               final List<PropertyDefinition> properties = getProperties(toscaJson);
-               if (properties != null) {
-                       Map<String, PropertyDefinition> collect = properties.stream().collect(Collectors.toMap(e -> e.getName(), e -> e));
-                       consumer.accept(collect);
-               }
-
-       }
-
-       interface ICreateElementType<T1, T2, ElementType> {
-               ElementType createElement(T1 firstArg, T2 secondArg);
-       }
-
-       protected <ElementDefinition> Either<List<ElementDefinition>, ActionStatus> createElementTypesFromYml(String elementTypesYml, ICreateElementType<String, Map<String, Object>, ElementDefinition> createApi) {
-
-               List<ElementDefinition> elementTypes = new ArrayList<>();
-               try {
-                       Map<String, Object> toscaJson = (Map<String, Object>) new Yaml().load(elementTypesYml);
-
-                       Iterator<Entry<String, Object>> elementTypesEntryItr = toscaJson.entrySet().iterator();
-                       while (elementTypesEntryItr.hasNext()) {
-                               Entry<String, Object> elementTypeNameDataEntry = elementTypesEntryItr.next();
-                               String elementTypeName = elementTypeNameDataEntry.getKey();
-                               Map<String, Object> elementTypeJsonData = (Map<String, Object>) elementTypeNameDataEntry.getValue();
-                               ElementDefinition elementDefinition = createApi.createElement(elementTypeName, elementTypeJsonData);
-                               elementTypes.add(elementDefinition);
-
-                       }
-
-               } catch (Exception e) {
-                       log.debug("Failed to yaml file {}", elementTypesYml, e);
-                       return Either.right(ActionStatus.INVALID_YAML_FILE);
-               }
-               return Either.left(elementTypes);
-       }
-
-       protected <FieldType> void setField(Map<String, Object> toscaJson, String fieldName, Consumer<FieldType> setter) {
-               if (toscaJson.containsKey(fieldName)) {
-                       FieldType fieldValue = (FieldType) toscaJson.get(fieldName);
-                       setter.accept(fieldValue);
-               }
-
-       }
-
-       public enum ElementTypeEnum {
-               PolicyType, GroupType, DataType, CapabilityType, InterfaceLifecycleType
-       };
-
-       private ActionStatus convertFromStorageResponseForElementType(StorageOperationStatus status, ElementTypeEnum elementTypeEnum) {
-               ActionStatus ret;
-               switch (elementTypeEnum) {
-               case GroupType:
-                       ret = componentsUtils.convertFromStorageResponseForGroupType(status);
-                       break;
-               case DataType:
-                       ret = componentsUtils.convertFromStorageResponseForDataType(status);
-                       break;
-               case CapabilityType:
-                       ret = componentsUtils.convertFromStorageResponseForCapabilityType(status);
-                       break;
-               case InterfaceLifecycleType:
-                       ret = componentsUtils.convertFromStorageResponseForLifecycleType(status);
-                       break;
-               default:
-                       ret = componentsUtils.convertFromStorageResponse(status);
-                       break;
-               }
-               return ret;
-       }
-
-       private <ElementTypeDefinition> ResponseFormat getResponseFormatForElementType(ActionStatus actionStatus, ElementTypeEnum elementTypeEnum, ElementTypeDefinition elementTypeDefinition) {
-               ResponseFormat ret;
-               switch (elementTypeEnum) {
-               case GroupType:
-                       ret = componentsUtils.getResponseFormatByGroupType(actionStatus, (GroupTypeDefinition) elementTypeDefinition);
-                       break;
-               case PolicyType:
-                       ret = componentsUtils.getResponseFormatByPolicyType(actionStatus, (PolicyTypeDefinition) elementTypeDefinition);
-                       break;
-               case DataType:
-                       ret = componentsUtils.getResponseFormatByDataType(actionStatus, (DataTypeDefinition) elementTypeDefinition, null);
-                       break;
-               case CapabilityType:
-                       ret = componentsUtils.getResponseFormatByCapabilityType(actionStatus, (CapabilityTypeDefinition) elementTypeDefinition);
-                       break;
-
-               default:
-                       ret = componentsUtils.getResponseFormat(actionStatus);
-                       break;
-               }
-               return ret;
-       }
-
-       protected <ElementTypeDefinition> Either<List<ImmutablePair<ElementTypeDefinition, Boolean>>, ResponseFormat> createElementTypesByDao(List<ElementTypeDefinition> elementTypesToCreate,
-                       Function<ElementTypeDefinition, Either<ActionStatus, ResponseFormat>> validator, Function<ElementTypeDefinition, ImmutablePair<ElementTypeEnum, String>> elementInfoGetter,
-                       Function<String, Either<ElementTypeDefinition, StorageOperationStatus>> elementFetcher, Function<ElementTypeDefinition, Either<ElementTypeDefinition, StorageOperationStatus>> elementAdder,
-                       BiFunction<ElementTypeDefinition, ElementTypeDefinition, Either<ElementTypeDefinition, StorageOperationStatus>> elementUpgrader) {
-
-               List<ImmutablePair<ElementTypeDefinition, Boolean>> createdElementTypes = new ArrayList<>();
-
-               Either<List<ImmutablePair<ElementTypeDefinition, Boolean>>, ResponseFormat> eitherResult = Either.left(createdElementTypes);
-
-               Iterator<ElementTypeDefinition> elementTypeItr = elementTypesToCreate.iterator();
-
-               try {
-
-                       while (elementTypeItr.hasNext()) {
-                               ElementTypeDefinition elementType = elementTypeItr.next();
-                               final ImmutablePair<ElementTypeEnum, String> elementInfo = elementInfoGetter.apply(elementType);
-                               ElementTypeEnum elementTypeEnum = elementInfo.left;
-                               String elementName = elementInfo.right;
-
-                               Either<ActionStatus, ResponseFormat> validateElementType = validator.apply(elementType);
-                               if (validateElementType.isRight()) {
-                                       ResponseFormat responseFormat = validateElementType.right().value();
-                                       log.debug("Failed in validation of element type: {}. Response is {}", elementType, responseFormat.getFormattedMessage());
-                                       eitherResult = Either.right(responseFormat);
-                                       break;
-                               }
-
-                               log.info("send {} : {} to dao for create", elementTypeEnum.name(), elementName);
-
-                               Either<ElementTypeDefinition, StorageOperationStatus> findElementType = elementFetcher.apply(elementName);
-                               if (findElementType.isRight()) {
-                                       StorageOperationStatus status = findElementType.right().value();
-                                       log.debug("searched {} finished with result:{}", elementTypeEnum.name(), status.name());
-                                       if (status != StorageOperationStatus.NOT_FOUND) {
-                                               ResponseFormat responseFormat = getResponseFormatForElementType(convertFromStorageResponseForElementType(status, elementTypeEnum), elementTypeEnum, elementType);
-                                               eitherResult = Either.right(responseFormat);
-                                               break;
-                                       } else {
-                                               Either<ElementTypeDefinition, StorageOperationStatus> dataModelResponse = elementAdder.apply(elementType);
-
-                                               if (dataModelResponse.isRight()) {
-                                                       try {
-                                                               BeEcompErrorManager.getInstance().logBeFailedAddingNodeTypeError("Create {}", elementTypeEnum.name());
-                                                               log.debug("failed to create {}: {}", elementTypeEnum.name(), elementName);
-                                                               if (dataModelResponse.right().value() != StorageOperationStatus.SCHEMA_VIOLATION) {
-                                                                       ResponseFormat responseFormat = getResponseFormatForElementType(convertFromStorageResponseForElementType(dataModelResponse.right().value(), elementTypeEnum), elementTypeEnum, elementType);
-
-                                                                       eitherResult = Either.right(responseFormat);
-                                                                       break;
-                                                               } else {
-                                                                       createdElementTypes.add(new ImmutablePair<ElementTypeDefinition, Boolean>(elementType, false));
-                                                               }
-                                                       } finally {
-                                                               propertyOperation.getTitanGenericDao().rollback();
-                                                       }
-                                               } else {
-                                                       propertyOperation.getTitanGenericDao().commit();
-                                                       createdElementTypes.add(new ImmutablePair<ElementTypeDefinition, Boolean>(elementType, true));
-                                                       log.debug("{} : {}  was created successfully.", elementTypeEnum.name(), elementName);
-                                               }
-                                               if (!elementTypeItr.hasNext()) {
-                                                       log.info("all {} were created successfully!!!", elementTypeEnum.name());
-                                               }
-
-                                       }
-                               } else {
-
-                                       if (elementUpgrader != null) {
-                                               Either<ElementTypeDefinition, StorageOperationStatus> upgradeResponse = null;
-                                               try {
-                                                       upgradeResponse = elementUpgrader.apply(elementType, findElementType.left().value());
-                                                       if (upgradeResponse.isRight()) {
-                                                               StorageOperationStatus status = upgradeResponse.right().value();
-                                                               if (status == StorageOperationStatus.OK) {
-                                                                       createdElementTypes.add(new ImmutablePair<ElementTypeDefinition, Boolean>(elementType, false));
-                                                               } else {
-                                                                       ResponseFormat responseFormat = getResponseFormatForElementType(convertFromStorageResponseForElementType(upgradeResponse.right().value(), elementTypeEnum), elementTypeEnum, elementType);
-                                                                       eitherResult = Either.right(responseFormat);
-                                                                       break;
-                                                               }
-                                                       } else {
-                                                               log.debug("{} : {}  was upgraded successfully.", elementTypeEnum.name(), elementName);
-                                                               createdElementTypes.add(new ImmutablePair<ElementTypeDefinition, Boolean>(elementType, true));
-                                                       }
-                                               } finally {
-                                                       if (upgradeResponse == null || upgradeResponse.isRight()) {
-                                                               propertyOperation.getTitanGenericDao().rollback();
-                                                       } else {
-                                                               propertyOperation.getTitanGenericDao().commit();
-                                                       }
-                                               }
-
-                                       } else {
-                                               // mshitrit Once GroupType Versions are supported add
-                                               // code here
-                                               createdElementTypes.add(new ImmutablePair<ElementTypeDefinition, Boolean>(elementType, false));
-                                               log.debug("{} : {} already exists.", elementTypeEnum.name(), elementName);
-                                       }
-
-                               }
-
-                       }
-               } finally {
-                       if (eitherResult.isRight()) {
-                               propertyOperation.getTitanGenericDao().rollback();
-                       }
-               }
-
-               return eitherResult;
-
-       }
-
-       public <ElementTypeDefinition> Either<List<ImmutablePair<ElementTypeDefinition, Boolean>>, ResponseFormat> createElementTypes(String elementTypesYml, Function<String, Either<List<ElementTypeDefinition>, ActionStatus>> elementTypeFromYmlCreater,
-                       Function<List<ElementTypeDefinition>, Either<List<ImmutablePair<ElementTypeDefinition, Boolean>>, ResponseFormat>> elementTypeDaoCreater, ElementTypeEnum elementTypeEnum) {
-
-               Either<List<ElementTypeDefinition>, ActionStatus> elementTypes = elementTypeFromYmlCreater.apply(elementTypesYml);
-               if (elementTypes.isRight()) {
-                       ActionStatus status = elementTypes.right().value();
-                       ResponseFormat responseFormat = getResponseFormatForElementType(status, elementTypeEnum, null);
-                       return Either.right(responseFormat);
-               }
-               return elementTypeDaoCreater.apply(elementTypes.left().value());
-
-       }
+    private static final Logger log = LoggerFactory.getLogger(CommonImportManager.class);
+
+    @Resource
+    private ComponentsUtils componentsUtils;
+    @Resource
+    private PropertyOperation propertyOperation;
+
+    protected void setProperties(Map<String, Object> toscaJson, Consumer<List<PropertyDefinition>> consumer) {
+        consumer.accept(getProperties(toscaJson));
+    }
+
+    private List<PropertyDefinition> getProperties(Map<String, Object> toscaJson) {
+        List<PropertyDefinition> values = null;
+        Either<Map<String, PropertyDefinition>, ResultStatusEnum> properties = ImportUtils.getProperties(toscaJson);
+
+        if (properties.isLeft()) {
+            values = new ArrayList<>();
+            Map<String, PropertyDefinition> propertiesMap = properties.left().value();
+            if (propertiesMap != null && propertiesMap.isEmpty() == false) {
+
+                for (Entry<String, PropertyDefinition> entry : propertiesMap.entrySet()) {
+                    String propName = entry.getKey();
+                    PropertyDefinition propertyDefinition = entry.getValue();
+                    PropertyDefinition newPropertyDefinition = new PropertyDefinition(propertyDefinition);
+                    newPropertyDefinition.setName(propName);
+                    values.add(newPropertyDefinition);
+                }
+            }
+        }
+
+        return values;
+    }
+
+    protected void setPropertiesMap(Map<String, Object> toscaJson, Consumer<Map<String, PropertyDefinition>> consumer) {
+        final List<PropertyDefinition> properties = getProperties(toscaJson);
+        if (properties != null) {
+            Map<String, PropertyDefinition> collect = properties.stream().collect(Collectors.toMap(e -> e.getName(), e -> e));
+            consumer.accept(collect);
+        }
+
+    }
+
+    interface ICreateElementType<T1, T2, ElementType> {
+        ElementType createElement(T1 firstArg, T2 secondArg);
+    }
+
+    protected <ElementDefinition> Either<List<ElementDefinition>, ActionStatus> createElementTypesFromYml(String elementTypesYml, ICreateElementType<String, Map<String, Object>, ElementDefinition> createApi) {
+
+        List<ElementDefinition> elementTypes = new ArrayList<>();
+        try {
+            Map<String, Object> toscaJson = (Map<String, Object>) new Yaml().load(elementTypesYml);
+
+            elementTypes = createElementTypesFromToscaJsonMap(createApi, toscaJson);
+        } catch (Exception e) {
+            log.debug("Failed to yaml file {}", elementTypesYml, e);
+            return Either.right(ActionStatus.INVALID_YAML_FILE);
+        }
+        return Either.left(elementTypes);
+    }
+
+        /**
+         * @param createApi * @param createApi
+         * @param elementTypes
+         * @param toscaJson
+         */
+    protected <ElementDefinition> List<ElementDefinition> createElementTypesFromToscaJsonMap(
+                ICreateElementType<String, Map<String, Object>, ElementDefinition> createApi, Map<String, Object> toscaJson) {
+        List<ElementDefinition> elementTypes = new ArrayList<>();
+        
+        Iterator<Entry<String, Object>> elementTypesEntryItr = toscaJson.entrySet().iterator();
+        while (elementTypesEntryItr.hasNext()) {
+            Entry<String, Object> elementTypeNameDataEntry = elementTypesEntryItr.next();
+            String elementTypeName = elementTypeNameDataEntry.getKey();
+            Map<String, Object> elementTypeJsonData = (Map<String, Object>) elementTypeNameDataEntry.getValue();
+            ElementDefinition elementDefinition = createApi.createElement(elementTypeName, elementTypeJsonData);
+            elementTypes.add(elementDefinition);
+        }
+        return elementTypes;
+    }
+
+    protected <FieldType> void setField(Map<String, Object> toscaJson, String fieldName, Consumer<FieldType> setter) {
+        if (toscaJson.containsKey(fieldName)) {
+            FieldType fieldValue = (FieldType) toscaJson.get(fieldName);
+            setter.accept(fieldValue);
+        }
+
+    }
+
+    public enum ElementTypeEnum {
+        PolicyType, GroupType, DataType, CapabilityType, InterfaceLifecycleType
+    };
+
+    private ActionStatus convertFromStorageResponseForElementType(StorageOperationStatus status, ElementTypeEnum elementTypeEnum) {
+        ActionStatus ret;
+        switch (elementTypeEnum) {
+        case GroupType:
+            ret = componentsUtils.convertFromStorageResponseForGroupType(status);
+            break;
+        case DataType:
+            ret = componentsUtils.convertFromStorageResponseForDataType(status);
+            break;
+        case CapabilityType:
+            ret = componentsUtils.convertFromStorageResponseForCapabilityType(status);
+            break;
+        case InterfaceLifecycleType:
+            ret = componentsUtils.convertFromStorageResponseForLifecycleType(status);
+            break;
+        default:
+            ret = componentsUtils.convertFromStorageResponse(status);
+            break;
+        }
+        return ret;
+    }
+
+    private <ElementTypeDefinition> ResponseFormat getResponseFormatForElementType(ActionStatus actionStatus, ElementTypeEnum elementTypeEnum, ElementTypeDefinition elementTypeDefinition) {
+        ResponseFormat ret;
+        switch (elementTypeEnum) {
+        case GroupType:
+            ret = componentsUtils.getResponseFormatByGroupType(actionStatus, (GroupTypeDefinition) elementTypeDefinition);
+            break;
+        case PolicyType:
+            ret = componentsUtils.getResponseFormatByPolicyType(actionStatus, (PolicyTypeDefinition) elementTypeDefinition);
+            break;
+        case DataType:
+            ret = componentsUtils.getResponseFormatByDataType(actionStatus, (DataTypeDefinition) elementTypeDefinition, null);
+            break;
+        case CapabilityType:
+            ret = componentsUtils.getResponseFormatByCapabilityType(actionStatus, (CapabilityTypeDefinition) elementTypeDefinition);
+            break;
+
+        default:
+            ret = componentsUtils.getResponseFormat(actionStatus);
+            break;
+        }
+        return ret;
+    }
+
+    protected <ElementTypeDefinition> Either<List<ImmutablePair<ElementTypeDefinition, Boolean>>, ResponseFormat> createElementTypesByDao(List<ElementTypeDefinition> elementTypesToCreate,
+            Function<ElementTypeDefinition, Either<ActionStatus, ResponseFormat>> validator, Function<ElementTypeDefinition, ImmutablePair<ElementTypeEnum, String>> elementInfoGetter,
+            Function<String, Either<ElementTypeDefinition, StorageOperationStatus>> elementFetcher, Function<ElementTypeDefinition, Either<ElementTypeDefinition, StorageOperationStatus>> elementAdder,
+            BiFunction<ElementTypeDefinition, ElementTypeDefinition, Either<ElementTypeDefinition, StorageOperationStatus>> elementUpgrader) {
+
+        List<ImmutablePair<ElementTypeDefinition, Boolean>> createdElementTypes = new ArrayList<>();
+
+        Either<List<ImmutablePair<ElementTypeDefinition, Boolean>>, ResponseFormat> eitherResult = Either.left(createdElementTypes);
+
+        Iterator<ElementTypeDefinition> elementTypeItr = elementTypesToCreate.iterator();
+
+        try {
+
+            while (elementTypeItr.hasNext()) {
+                ElementTypeDefinition elementType = elementTypeItr.next();
+                final ImmutablePair<ElementTypeEnum, String> elementInfo = elementInfoGetter.apply(elementType);
+                ElementTypeEnum elementTypeEnum = elementInfo.left;
+                String elementName = elementInfo.right;
+
+                Either<ActionStatus, ResponseFormat> validateElementType = validator.apply(elementType);
+                if (validateElementType.isRight()) {
+                    ResponseFormat responseFormat = validateElementType.right().value();
+                    log.debug("Failed in validation of element type: {}. Response is {}", elementType, responseFormat.getFormattedMessage());
+                    eitherResult = Either.right(responseFormat);
+                    break;
+                }
+
+                log.info("send {} : {} to dao for create", elementTypeEnum, elementName);
+
+                Either<ElementTypeDefinition, StorageOperationStatus> findElementType = elementFetcher.apply(elementName);
+                if (findElementType.isRight()) {
+                    StorageOperationStatus status = findElementType.right().value();
+                    log.debug("searched {} finished with result:{}", elementTypeEnum, status.name());
+                    if (status != StorageOperationStatus.NOT_FOUND) {
+                        ResponseFormat responseFormat = getResponseFormatForElementType(convertFromStorageResponseForElementType(status, elementTypeEnum), elementTypeEnum, elementType);
+                        eitherResult = Either.right(responseFormat);
+                        break;
+                    } else {
+                        Either<ElementTypeDefinition, StorageOperationStatus> dataModelResponse = elementAdder.apply(elementType);
+
+                        if (dataModelResponse.isRight()) {
+                            try {
+                                BeEcompErrorManager.getInstance().logBeFailedAddingNodeTypeError("Create {}", elementTypeEnum.name());
+                                log.debug("failed to create {}: {}", elementTypeEnum, elementName);
+                                if (dataModelResponse.right().value() != StorageOperationStatus.SCHEMA_VIOLATION) {
+                                    ResponseFormat responseFormat = getResponseFormatForElementType(convertFromStorageResponseForElementType(dataModelResponse.right().value(), elementTypeEnum), elementTypeEnum, elementType);
+
+                                    eitherResult = Either.right(responseFormat);
+                                    break;
+                                } else {
+                                    createdElementTypes.add(new ImmutablePair<ElementTypeDefinition, Boolean>(elementType, false));
+                                }
+                            } finally {
+                                propertyOperation.getTitanGenericDao().rollback();
+                            }
+                        } else {
+                            propertyOperation.getTitanGenericDao().commit();
+                            createdElementTypes.add(new ImmutablePair<ElementTypeDefinition, Boolean>(elementType, true));
+                            log.debug("{} : {}  was created successfully.", elementTypeEnum, elementName);
+                        }
+                        if (!elementTypeItr.hasNext()) {
+                            log.info("all {} were created successfully!!!", elementTypeEnum);
+                        }
+
+                    }
+                } else {
+
+                    if (elementUpgrader != null) {
+                        Either<ElementTypeDefinition, StorageOperationStatus> upgradeResponse = null;
+                        try {
+                            upgradeResponse = elementUpgrader.apply(elementType, findElementType.left().value());
+                            if (upgradeResponse.isRight()) {
+                                StorageOperationStatus status = upgradeResponse.right().value();
+                                if (status == StorageOperationStatus.OK) {
+                                    createdElementTypes.add(new ImmutablePair<ElementTypeDefinition, Boolean>(elementType, false));
+                                } else {
+                                    ResponseFormat responseFormat = getResponseFormatForElementType(convertFromStorageResponseForElementType(upgradeResponse.right().value(), elementTypeEnum), elementTypeEnum, elementType);
+                                    eitherResult = Either.right(responseFormat);
+                                    break;
+                                }
+                            } else {
+                                log.debug("{} : {}  was upgraded successfully.", elementTypeEnum, elementName);
+                                createdElementTypes.add(new ImmutablePair<ElementTypeDefinition, Boolean>(elementType, true));
+                            }
+                        } finally {
+                            if (upgradeResponse == null || upgradeResponse.isRight()) {
+                                propertyOperation.getTitanGenericDao().rollback();
+                            } else {
+                                propertyOperation.getTitanGenericDao().commit();
+                            }
+                        }
+
+                    } else {
+                        // mshitrit Once GroupType Versions are supported add
+                        // code here
+                        createdElementTypes.add(new ImmutablePair<ElementTypeDefinition, Boolean>(elementType, false));
+                        log.debug("{} : {} already exists.", elementTypeEnum, elementName);
+                    }
+
+                }
+
+            }
+        } finally {
+            if (eitherResult.isRight()) {
+                propertyOperation.getTitanGenericDao().rollback();
+            }
+        }
+
+        return eitherResult;
+
+    }
+
+    public <ElementTypeDefinition> Either<List<ImmutablePair<ElementTypeDefinition, Boolean>>, ResponseFormat> createElementTypes(String elementTypesYml, Function<String, Either<List<ElementTypeDefinition>, ActionStatus>> elementTypeFromYmlCreater,
+            Function<List<ElementTypeDefinition>, Either<List<ImmutablePair<ElementTypeDefinition, Boolean>>, ResponseFormat>> elementTypeDaoCreater, ElementTypeEnum elementTypeEnum) {
+
+        Either<List<ElementTypeDefinition>, ActionStatus> elementTypes = elementTypeFromYmlCreater.apply(elementTypesYml);
+        if (elementTypes.isRight()) {
+            ActionStatus status = elementTypes.right().value();
+            ResponseFormat responseFormat = getResponseFormatForElementType(status, elementTypeEnum, null);
+            return Either.right(responseFormat);
+        }
+        return elementTypeDaoCreater.apply(elementTypes.left().value());
+
+    }
 }