private function writeBaseFilterForType(KalturaTypeReflector $type) { $map = KAutoloader::getClassMap(); if (!isset($map[$type->getType()])) { return; } $filterClassName = $type->getType() . "BaseFilter"; $filterPath = dirname($map[$type->getType()]) . "/filters/base/{$filterClassName}.php"; $this->_txt = ""; $parentType = $type; while (1) { $parentType = $parentType->getParentTypeReflector(); if ($parentType === null || $parentType->isFilterable()) { break; } } $partnetClassName = $parentType ? $parentType->getType() . "Filter" : ($type->isRelatedFilterable() ? "KalturaRelatedFilter" : "KalturaFilter"); $subpackage = ($type->getPackage() == 'api' ? '' : 'api.') . 'filters.base'; $this->appendLine("<?php"); $this->appendLine("/**"); $this->appendLine(" * @package " . $type->getPackage()); $this->appendLine(" * @subpackage {$subpackage}"); $this->appendLine(" * @abstract"); $this->appendLine(" */"); $this->appendLine("abstract class {$filterClassName} extends {$partnetClassName}"); $this->appendLine("{"); $this->appendLine("\tstatic private \$map_between_objects = array"); $this->appendLine("\t("); // properies map foreach ($type->getCurrentProperties() as $prop) { $filters = $prop->getFilters(); foreach ($filters as $filter) { if ($filter != "order") { $propertyName = $this->formatFilterPropertyName($filter, $prop->getName()); $filterName = $this->formatFilterPropertyValue($filter, $prop->getName()); $this->appendLine("\t\t\"" . $propertyName . "\" => \"{$filterName}\","); } } } // extra filters properties map $extraFilters = null; $reflectionClass = new ReflectionClass($type->getType()); // invoke getExtraFilter only if it was defined in the current class if (!$type->isAbstract() && $reflectionClass->getMethod("getExtraFilters")->getDeclaringClass()->getName() === $reflectionClass->getName()) { $extraFilters = $type->getInstance()->getExtraFilters(); if (!$extraFilters) { $extraFilters = array(); } foreach ($extraFilters as $filterFields) { if (isset($filterFields["filter"])) { $filter = $filterFields["filter"]; $fields = $filterFields["fields"]; $propertyName = $this->formatFilterPropertyNameForFields($filter, $fields); $filterName = $this->formatFilterPropertyValueForFields($filter, $fields); $this->appendLine("\t\t\"" . $propertyName . "\" => \"{$filterName}\","); } } } $this->appendLine("\t);"); $this->appendLine(""); // order by map $this->appendLine("\tstatic private \$order_by_map = array"); $this->appendLine("\t("); foreach ($type->getCurrentProperties() as $prop) { /* @var $prop KalturaPropertyInfo */ $filters = $prop->getFilters(); foreach ($filters as $filter) { if ($filter == "order") { $propertyName = $prop->getName(); $orderFieldName = $this->formatOrderPropertyValue($propertyName); $this->appendLine("\t\t\"+" . $propertyName . "\" => \"+{$orderFieldName}\","); $this->appendLine("\t\t\"-" . $propertyName . "\" => \"-{$orderFieldName}\","); } } } if (is_array($extraFilters)) { foreach ($extraFilters as $filterFields) { if (isset($filterFields["order"])) { $propertyName = $filterFields["order"]; $orderFieldName = $this->formatOrderPropertyValue($propertyName); $this->appendLine("\t\t\"+{$propertyName}\" => \"+{$orderFieldName}\","); $this->appendLine("\t\t\"-{$propertyName}\" => \"-{$orderFieldName}\","); } } } $this->appendLine("\t);"); $this->appendLine(""); $this->appendLine("\tpublic function getMapBetweenObjects()"); $this->appendLine("\t{"); $this->appendLine("\t\treturn array_merge(parent::getMapBetweenObjects(), self::\$map_between_objects);"); $this->appendLine("\t}"); $this->appendLine(); $this->appendLine("\tpublic function getOrderByMap()"); $this->appendLine("\t{"); $this->appendLine("\t\treturn array_merge(parent::getOrderByMap(), self::\$order_by_map);"); $this->appendLine("\t}"); // class properties foreach ($type->getCurrentProperties() as $prop) { $filters = $prop->getFilters(); foreach ($filters as $filter) { if ($filter != "order") { $filterProp = $this->formatFilterPropertyName($filter, $prop->getName()); $filterPropType = $prop->getType(); if ($filterPropType == 'bool' || $filter == baseObjectFilter::IS_EMPTY) { $filterPropType = 'KalturaNullableBoolean'; } if ($prop->isTime()) { $filterPropType = 'time'; } $filterDynamicType = null; if (in_array($filter, array(baseObjectFilter::IN, baseObjectFilter::NOT_IN, baseObjectFilter::MATCH_OR, baseObjectFilter::MATCH_AND))) { if ($prop->isDynamicEnum()) { $filterDynamicType = $filterPropType; } $filterPropType = "string"; } $this->appendLine(); $this->appendLine("\t/**"); if (!$type->isAbstract()) { $filterableObject = $type->getInstance(); $filterDocs = $filterableObject->getFilterDocs(); if (isset($filterDocs[$filterProp])) { $filterDocs = explode("\n", $filterDocs[$filterProp]); foreach ($filterDocs as $filterDoc) { $this->appendLine("\t * {$filterDoc}"); } $this->appendLine("\t * "); } } if ($filterDynamicType) { $this->appendLine("\t * @dynamicType {$filterDynamicType}"); } $this->appendLine("\t * @var {$filterPropType}"); $this->appendLine("\t */"); $this->appendLine("\tpublic \${$filterProp};"); } } } // extra filters for class properties if ($extraFilters !== null) { foreach ($extraFilters as $filterFields) { if (isset($filterFields["filter"])) { $this->appendLine(); $filter = $filterFields["filter"]; $fields = $filterFields["fields"]; $this->appendLine("\t/**"); $this->appendLine("\t * @var string"); $this->appendLine("\t */"); $this->appendLine("\tpublic \$" . $this->formatFilterPropertyNameForFields($filter, $fields) . ";"); } } } $this->appendLine("}"); $this->writeToFile($filterPath, $this->_txt); }