/**
  * Parse input structure
  *
  * @param array $data
  * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher
  *
  * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct
  */
 public function parse(array $data, ParsingDispatcher $parsingDispatcher)
 {
     $fieldDefinitionUpdate = $this->contentTypeService->newFieldDefinitionUpdateStruct();
     if (array_key_exists('identifier', $data)) {
         $fieldDefinitionUpdate->identifier = $data['identifier'];
     }
     // @todo XSD says that descriptions is mandatory, but field definition can be updated without it
     if (array_key_exists('names', $data)) {
         if (!is_array($data['names']) || !array_key_exists('value', $data['names']) || !is_array($data['names']['value'])) {
             throw new Exceptions\Parser("Invalid 'names' element for FieldDefinitionUpdate.");
         }
         $fieldDefinitionUpdate->names = $this->parserTools->parseTranslatableList($data['names']);
     }
     // @todo XSD says that descriptions is mandatory, but field definition can be updated without it
     if (array_key_exists('descriptions', $data)) {
         if (!is_array($data['descriptions']) || !array_key_exists('value', $data['descriptions']) || !is_array($data['descriptions']['value'])) {
             throw new Exceptions\Parser("Invalid 'descriptions' element for FieldDefinitionUpdate.");
         }
         $fieldDefinitionUpdate->descriptions = $this->parserTools->parseTranslatableList($data['descriptions']);
     }
     // @todo XSD says that fieldGroup is mandatory, but field definition can be updated without it
     if (array_key_exists('fieldGroup', $data)) {
         $fieldDefinitionUpdate->fieldGroup = $data['fieldGroup'];
     }
     // @todo XSD says that position is mandatory, but field definition can be updated without it
     if (array_key_exists('position', $data)) {
         $fieldDefinitionUpdate->position = (int) $data['position'];
     }
     // @todo XSD says that isTranslatable is mandatory, but field definition can be updated without it
     if (array_key_exists('isTranslatable', $data)) {
         $fieldDefinitionUpdate->isTranslatable = $this->parserTools->parseBooleanValue($data['isTranslatable']);
     }
     // @todo XSD says that isRequired is mandatory, but field definition can be updated without it
     if (array_key_exists('isRequired', $data)) {
         $fieldDefinitionUpdate->isRequired = $this->parserTools->parseBooleanValue($data['isRequired']);
     }
     // @todo XSD says that isInfoCollector is mandatory, but field definition can be updated without it
     if (array_key_exists('isInfoCollector', $data)) {
         $fieldDefinitionUpdate->isInfoCollector = $this->parserTools->parseBooleanValue($data['isInfoCollector']);
     }
     // @todo XSD says that isSearchable is mandatory, but field definition can be updated without it
     if (array_key_exists('isSearchable', $data)) {
         $fieldDefinitionUpdate->isSearchable = $this->parserTools->parseBooleanValue($data['isSearchable']);
     }
     $fieldDefinition = $this->getFieldDefinition($data);
     // @todo XSD says that defaultValue is mandatory, but content type can be created without it
     if (array_key_exists('defaultValue', $data)) {
         $fieldDefinitionUpdate->defaultValue = $this->fieldTypeParser->parseValue($fieldDefinition->fieldTypeIdentifier, $data['defaultValue']);
     }
     if (array_key_exists('validatorConfiguration', $data)) {
         $fieldDefinitionUpdate->validatorConfiguration = $this->fieldTypeParser->parseValidatorConfiguration($fieldDefinition->fieldTypeIdentifier, $data['validatorConfiguration']);
     }
     if (array_key_exists('fieldSettings', $data)) {
         $fieldDefinitionUpdate->fieldSettings = $this->fieldTypeParser->parseFieldSettings($fieldDefinition->fieldTypeIdentifier, $data['fieldSettings']);
     }
     return $fieldDefinitionUpdate;
 }
 /**
  * Instantiates a field definition update class
  *
  * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct
  */
 public function newFieldDefinitionUpdateStruct()
 {
     return $this->service->newFieldDefinitionUpdateStruct();
 }
 /**
  * Helper function to update field definitions based to be added to a new/existing content type.
  *
  * @todo Add translation support if needed
  * @param ContentTypeService $contentTypeService
  * @param array $attribute
  * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct
  * @throws \Exception
  */
 private function updateFieldDefinition(ContentTypeService $contentTypeService, array $attribute)
 {
     if (!isset($attribute['identifier'])) {
         throw new \Exception("The 'identifier' of an attribute is missing in the content type update definition.");
     }
     $fieldDefinitionUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct();
     foreach ($attribute as $key => $value) {
         switch ($key) {
             case 'new_identifier':
                 $fieldDefinitionUpdateStruct->identifier = $value;
                 break;
             case 'name':
                 $fieldDefinitionUpdateStruct->names = array($this->getLanguageCode() => $value);
                 break;
             case 'description':
                 $fieldDefinitionUpdateStruct->descriptions = array($this->getLanguageCode() => $value);
                 break;
             case 'required':
                 $fieldDefinitionUpdateStruct->isRequired = $value;
                 break;
             case 'searchable':
                 $fieldDefinitionUpdateStruct->isSearchable = $value;
                 break;
             case 'info-collector':
                 $fieldDefinitionUpdateStruct->isInfoCollector = $value;
                 break;
             case 'disable-translation':
                 $fieldDefinitionUpdateStruct->isTranslatable = !$value;
                 break;
             case 'category':
                 $fieldDefinitionUpdateStruct->fieldGroup = $value == 'default' ? 'content' : $value;
                 break;
             case 'default-value':
                 $fieldDefinitionUpdateStruct->defaultValue = $value;
                 break;
             case 'field-settings':
                 $fieldDefinitionUpdateStruct->fieldSettings = $this->getFieldSettings($value);
                 break;
             case 'position':
                 $fieldDefinitionUpdateStruct->position = $value;
                 break;
             case 'validator-configuration':
                 $fieldDefinitionUpdateStruct->validatorConfiguration = $value;
                 break;
         }
     }
     return $fieldDefinitionUpdateStruct;
 }