예제 #1
0
 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);
 }