/**
  * Convert custom attribute data array to array of AttributeValue Data Object
  *
  * @param array $customAttributesValueArray
  * @param string $dataObjectClassName
  * @return AttributeValue[]
  */
 protected function convertCustomAttributeValue($customAttributesValueArray, $dataObjectClassName)
 {
     $result = [];
     $dataObjectClassName = ltrim($dataObjectClassName, '\\');
     $camelCaseAttributeCodeKey = lcfirst(SimpleDataObjectConverter::snakeCaseToUpperCamelCase(AttributeValue::ATTRIBUTE_CODE));
     foreach ($customAttributesValueArray as $key => $customAttribute) {
         if (!is_array($customAttribute)) {
             $customAttribute = [AttributeValue::ATTRIBUTE_CODE => $key, AttributeValue::VALUE => $customAttribute];
         }
         if (isset($customAttribute[AttributeValue::ATTRIBUTE_CODE])) {
             $customAttributeCode = $customAttribute[AttributeValue::ATTRIBUTE_CODE];
         } elseif (isset($customAttribute[$camelCaseAttributeCodeKey])) {
             $customAttributeCode = $customAttribute[$camelCaseAttributeCodeKey];
         } else {
             $customAttributeCode = null;
         }
         //Check if type is defined, else default to string
         $type = $this->customAttributeTypeLocator->getType($customAttributeCode, $dataObjectClassName);
         $type = $type ? $type : TypeProcessor::ANY_TYPE;
         $customAttributeValue = $customAttribute[AttributeValue::VALUE];
         if (is_array($customAttributeValue)) {
             //If type for AttributeValue's value as array is mixed, further processing is not possible
             if ($type === TypeProcessor::ANY_TYPE) {
                 $attributeValue = $customAttributeValue;
             } else {
                 $attributeValue = $this->_createDataObjectForTypeAndArrayValue($type, $customAttributeValue);
             }
         } else {
             $attributeValue = $this->convertValue($customAttributeValue, $type);
         }
         //Populate the attribute value data object once the value for custom attribute is derived based on type
         $result[$customAttributeCode] = $this->attributeValueFactory->create()->setAttributeCode($customAttributeCode)->setValue($attributeValue);
     }
     return $result;
 }
 /**
  * Convert custom attribute data array to array of AttributeValue Data Object
  *
  * @param array $customAttributesValueArray
  * @param string $dataObjectClassName
  * @return AttributeValue[]
  * @throws SerializationException
  */
 protected function convertCustomAttributeValue($customAttributesValueArray, $dataObjectClassName)
 {
     $result = [];
     $dataObjectClassName = ltrim($dataObjectClassName, '\\');
     foreach ($customAttributesValueArray as $key => $customAttribute) {
         if (!is_array($customAttribute)) {
             $customAttribute = [AttributeValue::ATTRIBUTE_CODE => $key, AttributeValue::VALUE => $customAttribute];
         }
         list($customAttributeCode, $customAttributeValue) = $this->processCustomAttribute($customAttribute);
         $type = $this->customAttributeTypeLocator->getType($customAttributeCode, $dataObjectClassName);
         if ($this->typeProcessor->isTypeAny($type) || $this->typeProcessor->isTypeSimple($type) || !is_array($customAttributeValue)) {
             try {
                 $attributeValue = $this->convertValue($customAttributeValue, $type);
             } catch (SerializationException $e) {
                 throw new SerializationException(new Phrase('Attribute "%attribute_code" has invalid value. %details', ['attribute_code' => $customAttributeCode, 'details' => $e->getMessage()]));
             }
         } else {
             $attributeValue = $this->_createDataObjectForTypeAndArrayValue($type, $customAttributeValue);
         }
         //Populate the attribute value data object once the value for custom attribute is derived based on type
         $result[$customAttributeCode] = $this->attributeValueFactory->create()->setAttributeCode($customAttributeCode)->setValue($attributeValue);
     }
     return $result;
 }