/**
  * Convert ECS content to rule matchable values
  * 
  * @param string $a_resource_id
  * @param int $a_server_id
  * @param object $a_ecs_content
  * @param int $a_owner
  * @return array
  */
 public static function getMatchableContent($a_resource_id, $a_server_id, $a_ecs_content, $a_owner)
 {
     include_once './Services/WebServices/ECS/classes/class.ilECSCategoryMappingRule.php';
     include_once './Services/WebServices/ECS/classes/class.ilECSCommunitiesCache.php';
     // see ilECSCategoryMapping::getPossibleFields();
     $res = array();
     $res["part_id"] = array($a_owner, ilECSCategoryMappingRule::ATTR_INT);
     $res["community"] = array(ilECSCommunitiesCache::getInstance()->lookupTitle($a_server_id, $a_owner), ilECSCategoryMappingRule::ATTR_STRING);
     $definition = self::getEContentDefinition($a_resource_id);
     $timePlace = null;
     foreach ($definition as $id => $type) {
         if (is_array($type)) {
             $target = $type[1];
             $type = $type[0];
         } else {
             $target = $id;
         }
         switch ($type) {
             case ilECSUtils::TYPE_ARRAY:
                 $value = array(implode(',', (array) $a_ecs_content->{$target}), ilECSCategoryMappingRule::ATTR_ARRAY);
                 break;
             case ilECSUtils::TYPE_INT:
                 $value = array((int) $a_ecs_content->{$target}, ilECSCategoryMappingRule::ATTR_INT);
                 break;
             case ilECSUtils::TYPE_STRING:
                 $value = array((string) $a_ecs_content->{$target}, ilECSCategoryMappingRule::ATTR_STRING);
                 break;
             case ilECSUtils::TYPE_TIMEPLACE:
                 if (!is_object($timePlace)) {
                     include_once './Services/WebServices/ECS/classes/class.ilECSTimePlace.php';
                     if (is_object($a_ecs_content->{$target})) {
                         $timePlace = new ilECSTimePlace();
                         $timePlace->loadFromJSON($a_ecs_content->{$target});
                     } else {
                         $timePlace = new ilECSTimePlace();
                     }
                 }
                 switch ($id) {
                     case 'begin':
                     case 'end':
                         $value = array($timePlace->{'getUT' . ucfirst($id)}(), ilECSCategoryMappingRule::ATTR_INT);
                         break;
                     case 'room':
                     case 'cycle':
                         $value = array($timePlace->{'get' . ucfirst($id)}(), ilECSCategoryMappingRule::ATTR_STRING);
                         break;
                 }
                 break;
         }
         $res[$id] = $value;
     }
     return $res;
 }
 /**
  * Add advanced metadata to json (export)
  * 
  * @param object $a_json
  * @param ilECSSetting $a_server
  * @param array $a_definition
  * @param int $a_mapping_mode
  */
 protected function importMetadataFromJson($a_json, ilECSSetting $a_server, array $a_definition, $a_mapping_mode)
 {
     global $ilLog;
     $ilLog->write("importing metadata from json: " . print_r($a_definition, true));
     include_once './Services/WebServices/ECS/classes/class.ilECSDataMappingSettings.php';
     include_once './Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php';
     include_once './Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php';
     $mappings = ilECSDataMappingSettings::getInstanceByServerId($a_server->getServerId());
     foreach ($a_definition as $id => $type) {
         if (is_array($type)) {
             $target = $type[1];
             $type = $type[0];
         } else {
             $target = $id;
         }
         $timePlace = null;
         if ($field = $mappings->getMappingByECSName($a_mapping_mode, $id)) {
             switch ($type) {
                 case ilECSUtils::TYPE_ARRAY:
                     $value = implode(',', (array) $a_json->{$target});
                     break;
                 case ilECSUtils::TYPE_INT:
                     $value = (int) $a_json->{$target};
                     break;
                 case ilECSUtils::TYPE_STRING:
                     $value = (string) $a_json->{$target};
                     break;
                 case ilECSUtils::TYPE_TIMEPLACE:
                     if (!is_object($timePlace)) {
                         include_once './Services/WebServices/ECS/classes/class.ilECSTimePlace.php';
                         if (is_object($a_json->{$target})) {
                             $timePlace = new ilECSTimePlace();
                             $timePlace->loadFromJSON($a_json->{$target});
                         } else {
                             $timePlace = new ilECSTimePlace();
                         }
                     }
                     switch ($id) {
                         case 'begin':
                         case 'end':
                             $field_type = ilAdvancedMDFieldDefinition::_lookupFieldType($field);
                             if ($field_type == ilAdvancedMDFieldDefinition::TYPE_DATE || $field_type == ilAdvancedMDFieldDefinition::TYPE_DATETIME) {
                                 $value = $timePlace->{'getUT' . ucfirst($id)}();
                                 break;
                             }
                             // fallthrough
                         // fallthrough
                         case 'room':
                         case 'cycle':
                             $value = $timePlace->{'get' . ucfirst($id)}();
                             break;
                     }
                     break;
             }
             include_once './Services/AdvancedMetaData/classes/class.ilAdvancedMDValue.php';
             $mdv = ilAdvancedMDValue::_getInstance($this->getId(), $field);
             $mdv->toggleDisabledStatus(true);
             $mdv->setValue($value);
             $mdv->save();
         }
     }
 }
 /**
  * Add advanced metadata to json (export)
  * 
  * @param object $a_json
  * @param ilECSSetting $a_server
  * @param array $a_definition
  * @param int $a_mapping_mode
  */
 protected function importMetadataFromJson($a_json, ilECSSetting $a_server, array $a_definition, $a_mapping_mode)
 {
     global $ilLog;
     $ilLog->write("importing metadata from json: " . print_r($a_json, true));
     include_once './Services/WebServices/ECS/classes/class.ilECSDataMappingSettings.php';
     include_once './Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php';
     include_once './Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php';
     $mappings = ilECSDataMappingSettings::getInstanceByServerId($a_server->getServerId());
     $values_records = ilAdvancedMDValues::getInstancesForObjectId($this->getId(), $this->getType());
     foreach ($values_records as $values_record) {
         // this correctly binds group and definitions
         $values_record->read();
     }
     $do_save = false;
     foreach ($a_definition as $id => $type) {
         if (is_array($type)) {
             $target = $type[1];
             $type = $type[0];
         } else {
             $target = $id;
         }
         $timePlace = null;
         if ($field = $mappings->getMappingByECSName($a_mapping_mode, $id)) {
             // find element in records
             $adv_md_def = null;
             foreach ($values_records as $values_record) {
                 $adv_md_defs = $values_record->getDefinitions();
                 if (isset($adv_md_defs[$field])) {
                     $adv_md_def = $adv_md_defs[$field];
                     break;
                 }
             }
             if (!$adv_md_def) {
                 continue;
             }
             $raw_value = $a_json->{$target};
             if ($type == ilECSUtils::TYPE_TIMEPLACE) {
                 if (!is_object($timePlace)) {
                     include_once './Services/WebServices/ECS/classes/class.ilECSTimePlace.php';
                     if (is_object($raw_value)) {
                         $timePlace = new ilECSTimePlace();
                         $timePlace->loadFromJSON($raw_value);
                     } else {
                         $timePlace = new ilECSTimePlace();
                     }
                 }
                 $raw_value = $timePlace;
             }
             if ($adv_md_def->importFromECS($type, $raw_value, $id)) {
                 $do_save = true;
             }
         }
     }
     if ($do_save) {
         foreach ($values_records as $values_record) {
             $additional = array();
             foreach ($values_record->getADTGroup()->getElements() as $element_id => $element) {
                 if (!$element->isNull()) {
                     $additional[$element_id] = array("disabled" => array("integer", 1));
                 }
             }
             $values_record->write($additional);
         }
     }
 }