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;
     }
 }
Example #3
0
 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;
 }
Example #5
0
 /**
  * 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);
     }
 }