private function _setExternalIdentifiersRecursively(&$holder, &$inner) { if ($inner !== null) { if ($inner instanceof ListDataType) { $dataSet = array_merge(array($inner), $inner->getOriginal()); } else { $dataSet = array($inner); } //Property inheritance pattern foreach ($dataSet as $object) { if (is_object($object) && method_exists($object, 'getExternalIdentifiers')) { $hash = spl_object_hash($object); //Prevents from endless loops. if (isset($this->known[$hash])) { return; } $this->known[$hash] = true; //Distributes Service interface instances if ($object instanceof AbstractServiceRelatedType && !$object->_getServiceRelatedDatasetUpdated()) { $ins = $object->getServiceNames(); if (!empty($ins)) { $ths = $this->getServiceNames(); if ($holder instanceof AbstractServiceRelatedType) { $hs = $holder->getServiceNames(); } else { $hs = array(); } if (!empty($ths) || !empty($hs)) { $cnt = 0; foreach ($ins as $sn) { $fgetsn = 'get' . ucfirst($sn); $fsetsn = 'set' . ucfirst($sn); if (in_array($sn, $ths) && $this->{$fgetsn}() !== null) { $object->{$fsetsn}($this->{$fgetsn}()); $cnt++; } else { if (in_array($sn, $hs) && $holder->{$fgetsn}() !== null) { $object->{$fsetsn}($holder->{$fgetsn}()); $cnt++; } } } if ($cnt == count($ins)) { $object->_setServiceRelatedDatasetUpdated(true); } } unset($ths); unset($hs); } unset($ins); } if (!$object->_getExternalKeysUpdated()) { $externalIds = $object->getExternalIdentifiers(); $cnt = 0; foreach ($externalIds as $key) { $property = ucfirst($key); $setProperty = 'set' . $property; $getProperty = 'get' . $property; if (property_exists($holder, $key) && $holder->{$key} !== null) { $object->{$setProperty}($holder->{$key}); $cnt++; } else { if ((in_array($key, $holder->getPropertiesForInheritance()) || in_array($key, $holder->getExternalIdentifiers())) && $holder->{$getProperty}() !== null) { $object->{$setProperty}($holder->{$getProperty}()); $cnt++; } } } if ($cnt == count($externalIds)) { $object->_setExternalKeysUpdated(true); } } if ($object instanceof AbstractDataType) { $props = $object->getPropertiesForInheritance(); foreach ($props as $p) { $getProperty = 'get' . $p; $sub = $object->{$getProperty}(); if ($sub instanceof AbstractDataType) { if (!$sub->_hasInheritedDataSet()) { $this->_setExternalIdentifiersRecursively($object, $sub); } } unset($sub); } } } } } }