private function transform(KalturaBatchJob $job, KalturaTransformMetadataJobData $data) { $pager = new KalturaFilterPager(); $pager->maxPageSize = 40; if ($this->taskConfig->params && $this->taskConfig->params->maxObjectsEachRun) { $pager->maxPageSize = $this->taskConfig->params->maxObjectsEachRun; } $transformList = $this->kClient->metadataBatch->getTransformMetadataObjects($data->metadataProfileId, $data->srcVersion, $data->destVersion, $pager); if (!$transformList->totalCount) { if (!$transformList->lowerVersionCount) { $this->closeJob($job, null, null, 'All metadata transformed', KalturaBatchJobStatus::FINISHED); return $job; } $this->closeJob($job, null, null, "Waiting for metadata objects [{$transformList->lowerVersionCount}] of lower versions", KalturaBatchJobStatus::RETRY); return $job; } if ($transformList->lowerVersionCount || $transformList->totalCount) { $this->kClient->batch->resetJobExecutionAttempts($job->id, $this->getExclusiveLockKey(), $job->jobType); } foreach ($transformList->objects as $object) { $xml = kXsd::transformXmlData($object->xml, $data->destXsdPath, $data->srcXslPath); if ($xml) { $this->kClient->metadata->update($object->id, $xml); } else { $this->kClient->metadata->invalidate($object->id); } } $this->closeJob($job, null, null, "Metadata objects [" . count($transformList->objects) . "] transformed", KalturaBatchJobStatus::RETRY); return $job; }
public function doTest($path) { $xsdFiles = array(); $xsdDir = dir($path); while (false !== ($entry = $xsdDir->read())) { $matches = null; if (!preg_match('/(\\d+)\\.xsd/', $entry, $matches)) { continue; } $version = $matches[1]; $xsdFiles[$version] = realpath("{$path}/{$entry}"); } $xsdDir->close(); $this->assertGreaterThan(0, count($xsdFiles), "Folder [{$path}] has no XSD files"); $versions = array_keys($xsdFiles); sort($versions); $prevVersion = array_shift($versions); foreach ($versions as $currentVersion) { $fromXsd = $xsdFiles[$prevVersion]; $toXsd = $xsdFiles[$currentVersion]; $xsl = kXsd::compareXsd($fromXsd, $toXsd); $this->assertTrue($xsl, "XSD [{$fromXsd} => {$toXsd}] Created XSL"); $prevVersion = $currentVersion; } }
public static function validateProfileFields($partnerId, $xsd) { $xPaths = array_merge(kXsd::findXpathsByAppInfo($xsd, self::APP_INFO_SEARCH, 'true', false), kXsd::findXpathsByAppInfo($xsd, self::APP_INFO_SEARCH, 'false', false)); foreach ($xPaths as $xPath => $xPathData) { if ($xPathData['type'] === MetadataSearchFilter::KMC_FIELD_TYPE_METADATA_OBJECT && isset($xPathData['metadataProfileId'])) { $relatedMetadataProfileId = $xPathData['metadataProfileId']; $relatedMetadataProfile = MetadataProfilePeer::retrieveByPK($relatedMetadataProfileId); if (!$relatedMetadataProfile) { throw new kCoreException('Metadata profile id [' . $relatedMetadataProfileId . ' was not found', kCoreException::ID_NOT_FOUND, $relatedMetadataProfileId); } } } }
private function upgrade(KalturaBatchJob $job, KalturaTransformMetadataJobData $data) { KalturaLog::debug("transform({$job->id})"); if ($this->taskConfig->params->multiRequestSize) { $this->multiRequestSize = $this->taskConfig->params->multiRequestSize; } $pager = new KalturaFilterPager(); $pager->maxPageSize = 40; if ($this->taskConfig->params && $this->taskConfig->params->maxObjectsEachRun) { $pager->maxPageSize = $this->taskConfig->params->maxObjectsEachRun; } $transformList = $this->kClient->metadataBatch->getTransformMetadataObjects($data->metadataProfileId, $data->srcVersion, $data->destVersion, $pager); if (!$transformList->totalCount) { if (!$transformList->lowerVersionCount) { $this->closeJob($job, null, null, 'All metadata transformed', KalturaBatchJobStatus::FINISHED); return $job; } $this->closeJob($job, null, null, "Waiting for metadata objects [{$transformList->lowerVersionCount}] of lower versions", KalturaBatchJobStatus::RETRY); return $job; } if ($transformList->lowerVersionCount || $transformList->totalCount) { $this->kClient->batch->resetJobExecutionAttempts($job->id, $this->getExclusiveLockKey(), $job->jobType); } $this->kClient->startMultiRequest(); $transformObjectIds = array(); foreach ($transformList->objects as $object) { /* @var $object KalturaMetadata */ $xml = kXsd::transformXmlData($object->xml, $data->destXsdPath, $data->srcXslPath); if ($xml) { $this->kClient->metadata->update($object->id, $xml, $object->version); } else { $this->kClient->metadata->invalidate($object->id, $object->version); } $transformObjectIds[] = $object->id; if ($this->kClient->getMultiRequestQueueSize() >= $this->multiRequestSize) { $results = $this->kClient->doMultiRequest(); $this->invalidateFailedMetadatas($results, $transformObjectIds); $transformObjectIds = array(); $this->kClient->startMultiRequest(); } } $results = $this->kClient->doMultiRequest(); $this->invalidateFailedMetadatas($results, $transformObjectIds); $this->closeJob($job, null, null, "Metadata objects [" . count($transformList->objects) . "] transformed", KalturaBatchJobStatus::RETRY); return $job; }
/** * Check if transforming required and create job if needed * * @param MetadataProfile $metadataProfile * @param int $prevVersion * @param string $prevXsdPath * * @return BatchJob */ public static function diffMetadataProfile(MetadataProfile $metadataProfile, $prevVersion, $prevXsdPath, $newVersion, $newXsdPath) { $xsl = kXsd::compareXsd($prevXsdPath, $newXsdPath); if (!$xsl) { return; } if (is_bool($xsl)) { return self::addTransformMetadataJob($metadataProfile->getPartnerId(), $metadataProfile->getId(), $prevVersion, $newVersion); } return self::addTransformMetadataJob($metadataProfile->getPartnerId(), $metadataProfile->getId(), $prevVersion, $newVersion, $xsl); }
/** * @param string $fromXsd old xsd string * @param string $toXsd new xsd string * @return bool|string true if no change required, or, xsl text if transform required * @throws kXsdException */ public static function compareXsd($fromXsd, $toXsd) { $from = new DOMDocument(); $from->loadXML($fromXsd); if (!$from || !$from->documentElement) { return false; } $to = new DOMDocument(); $to->loadXML($toXsd); if (!$to || !$to->documentElement) { return false; } $xsl = kXsd::compareNode($from->documentElement, $to->documentElement); if (is_bool($xsl)) { if ($xsl) { return true; } return false; } $xsl = '<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"/> <xsl:strip-space elements="*" /> <xsl:template match="/">' . $xsl . ' </xsl:template> </xsl:transform> '; return $xsl; }
public static function validateMetadataProfileField($partnerId, $xsdData, $isPath, $obejctType, $metadataProfileId = null) { $additionalSearchableFieldsCounter = 0; $profileFields = MetadataProfileFieldPeer::retrieveIndexableByPartnerAndType($partnerId, $obejctType); foreach ($profileFields as $profileField) { if ($profileField->getMetadataProfileId() == $metadataProfileId) { continue; } $type = $profileField->getType(); if ($type == MetadataSearchFilter::KMC_FIELD_TYPE_DATE || $type == MetadataSearchFilter::KMC_FIELD_TYPE_INT) { $additionalSearchableFieldsCounter++; } } $xPaths = kXsd::findXpathsByAppInfo($xsdData, kMetadataManager::APP_INFO_SEARCH, 'true', $isPath); foreach ($xPaths as $xPath => $xPathData) { if (isset($xPathData['type']) && ($xPathData['type'] == MetadataSearchFilter::KMC_FIELD_TYPE_DATE || $xPathData['type'] == MetadataSearchFilter::KMC_FIELD_TYPE_INT)) { $additionalSearchableFieldsCounter++; } } $partnerLimit = MetadataPlugin::getAdditionalSearchableFieldsLimit($partnerId, $obejctType); if ($additionalSearchableFieldsCounter > $partnerLimit) { throw new APIException(MetadataErrors::EXCEEDED_ADDITIONAL_SEARCHABLE_FIELDS_LIMIT, $partnerLimit); } }