| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773 |
- <?php
- /*
- * Copyright 2010-2015 by MODX, LLC.
- *
- * This file is part of xPDO.
- *
- * xPDO is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.
- *
- * xPDO is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * xPDO; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- */
- /**
- * Class for reverse and forward engineering xPDO domain models.
- *
- * @package xpdo
- * @subpackage om
- */
- /**
- * A service for reverse and forward engineering xPDO domain models.
- *
- * This service utilizes an xPDOManager instance to generate class stub and
- * meta-data map files from a provided vanilla XML schema of a database
- * structure. It can also reverse-engineer XML schemas from an existing
- * database.
- *
- * @abstract
- * @package xpdo
- * @subpackage om
- */
- abstract class xPDOGenerator {
- /**
- * @var xPDOManager $manager A reference to the xPDOManager using this
- * generator.
- */
- public $manager= null;
- /**
- * @var xPDOSchemaManager $schemaManager
- */
- public $schemaManager= null;
- /**
- * @var string $outputDir The absolute path to output the class and map
- * files to.
- */
- public $outputDir= '';
- /**
- * @var string $schemaFile An absolute path to the schema file.
- */
- public $schemaFile= '';
- /**
- * @var string $schemaContent The stored content of the newly-created schema
- * file.
- */
- public $schemaContent= '';
- /**
- * @var string $classTemplate The class template string to build the class
- * files from.
- */
- public $classTemplate= '';
- /**
- * @var string $platformTemplate The class platform template string to build
- * the class platform files from.
- */
- public $platformTemplate= '';
- /**
- * @var string $metaTemplate The class platform template string to build
- * the meta class map files from.
- */
- public $metaTemplate= '';
- /**
- * @var string $mapHeader The map header string to build the map files from.
- */
- public $mapHeader= '';
- /**
- * @var string $mapFooter The map footer string to build the map files from.
- */
- public $mapFooter= '';
- /**
- * @var array $model The stored model array.
- */
- public $model= array ();
- /**
- * @var array $classes The stored classes array.
- */
- public $classes= array ();
- /**
- * @var array $map The stored map array.
- */
- public $map= array ();
- /**
- * @var SimpleXMLElement
- */
- public $schema= null;
- /**
- * Constructor
- *
- * @access protected
- * @param xPDOManager &$manager A reference to a valid xPDOManager instance.
- * @return xPDOGenerator
- */
- public function __construct(& $manager) {
- $this->manager= & $manager;
- }
- /**
- * Formats a class name to a specific value, stripping the prefix if
- * specified.
- *
- * @access public
- * @param string $string The name to format.
- * @param string $prefix If specified, will strip the prefix out of the
- * first argument.
- * @param boolean $prefixRequired If true, will return a blank string if the
- * prefix specified is not found.
- * @return string The formatting string.
- */
- public function getTableName($string, $prefix= '', $prefixRequired= false) {
- if (!empty($prefix) && strpos($string, $prefix) === 0) {
- $string= substr($string, strlen($prefix));
- }
- elseif ($prefixRequired) {
- $string= '';
- }
- return $string;
- }
- /**
- * Gets a class name from a table name by splitting the string by _ and
- * capitalizing each token.
- *
- * @access public
- * @param string $string The table name to format.
- * @return string The formatted string.
- */
- public function getClassName($string) {
- if (is_string($string) && $strArray= explode('_', $string)) {
- $return= '';
- foreach ($strArray as $k => $v) {
- $return.= strtoupper(substr($v, 0, 1)) . substr($v, 1) . '';
- }
- $string= $return;
- }
- return trim($string);
- }
- /**
- * Format the passed default value as an XML attribute.
- *
- * Override this in different PDO driver implementations if necessary.
- *
- * @access public
- * @param string $value The value to encapsulate in the default tag.
- * @return string The parsed XML string
- */
- public function getDefault($value) {
- $return= '';
- if ($value !== null) {
- $return= ' default="'.$value.'"';
- }
- return $return;
- }
- /**
- * Format the passed database index value as an XML attribute.
- *
- * @abstract Implement this for specific PDO driver implementations.
- * @access public
- * @param string $index The DB representation string of the index
- * @return string The formatted XML attribute string
- */
- abstract public function getIndex($index);
- /**
- * Parses an XPDO XML schema and generates classes and map files from it.
- *
- * Requires SimpleXML for parsing an XML schema.
- *
- * @param string $schemaFile The name of the XML file representing the
- * schema.
- * @param string $outputDir The directory in which to generate the class and
- * map files into.
- * @param boolean $compile Create compiled copies of the classes and maps from the schema.
- * @return boolean True on success, false on failure.
- */
- public function parseSchema($schemaFile, $outputDir= '', $compile= false) {
- $this->schemaFile= $schemaFile;
- $this->classTemplate= $this->getClassTemplate();
- if (!is_file($schemaFile)) {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not find specified XML schema file {$schemaFile}");
- return false;
- }
- $this->schema = new SimpleXMLElement($schemaFile, 0, true);
- if (isset($this->schema)) {
- foreach ($this->schema->attributes() as $attributeKey => $attribute) {
- /** @var SimpleXMLElement $attribute */
- $this->model[$attributeKey] = (string) $attribute;
- }
- if (isset($this->schema->object)) {
- foreach ($this->schema->object as $object) {
- /** @var SimpleXMLElement $object */
- $class = (string) $object['class'];
- $extends = isset($object['extends']) ? (string) $object['extends'] : $this->model['baseClass'];
- $this->classes[$class] = array('extends' => $extends);
- $this->map[$class] = array(
- 'package' => $this->model['package'],
- 'version' => $this->model['version']
- );
- foreach ($object->attributes() as $objAttrKey => $objAttr) {
- if ($objAttrKey == 'class') continue;
- $this->map[$class][$objAttrKey]= (string) $objAttr;
- if (!in_array($objAttrKey, array('package', 'version', 'extends', 'table'))) {
- $this->classes[$class][$objAttrKey] = (string) $objAttr;
- }
- }
- $engine = (string) $object['engine'];
- if (!empty($engine)) {
- $this->map[$class]['tableMeta'] = array('engine' => $engine);
- } elseif (isset($this->model['defaultEngine'])) {
- $this->map[$class]['tableMeta'] = array('engine' => $this->model['defaultEngine']);
- }
- $this->map[$class]['fields']= array();
- $this->map[$class]['fieldMeta']= array();
- if (isset($object->field)) {
- foreach ($object->field as $field) {
- $key = (string) $field['key'];
- $dbtype = (string) $field['dbtype'];
- $defaultType = $this->manager->xpdo->driver->getPhpType($dbtype);
- $this->map[$class]['fields'][$key]= null;
- $this->map[$class]['fieldMeta'][$key]= array();
- foreach ($field->attributes() as $fldAttrKey => $fldAttr) {
- $fldAttrValue = (string) $fldAttr;
- switch ($fldAttrKey) {
- case 'key':
- continue 2;
- case 'default':
- if ($fldAttrValue === 'NULL') {
- $fldAttrValue = null;
- }
- switch ($defaultType) {
- case 'integer':
- case 'boolean':
- case 'bit':
- $fldAttrValue = (integer) $fldAttrValue;
- break;
- case 'float':
- case 'numeric':
- $fldAttrValue = (float) $fldAttrValue;
- break;
- default:
- break;
- }
- $this->map[$class]['fields'][$key]= $fldAttrValue;
- break;
- case 'null':
- $fldAttrValue = (!empty($fldAttrValue) && strtolower($fldAttrValue) !== 'false') ? true : false;
- break;
- default:
- break;
- }
- $this->map[$class]['fieldMeta'][$key][$fldAttrKey]= $fldAttrValue;
- }
- }
- }
- if (isset($object->alias)) {
- $this->map[$class]['fieldAliases'] = array();
- foreach ($object->alias as $alias) {
- $aliasKey = (string) $alias['key'];
- $aliasNode = array();
- foreach ($alias->attributes() as $attrName => $attr) {
- $attrValue = (string) $attr;
- switch ($attrName) {
- case 'key':
- continue 2;
- case 'field':
- $aliasNode = $attrValue;
- break;
- default:
- break;
- }
- }
- if (!empty($aliasKey) && !empty($aliasNode)) {
- $this->map[$class]['fieldAliases'][$aliasKey] = $aliasNode;
- }
- }
- }
- if (isset($object->index)) {
- $this->map[$class]['indexes'] = array();
- foreach ($object->index as $index) {
- $indexNode = array();
- $indexName = (string) $index['name'];
- foreach ($index->attributes() as $attrName => $attr) {
- $attrValue = (string) $attr;
- switch ($attrName) {
- case 'name':
- continue 2;
- case 'primary':
- case 'unique':
- case 'fulltext':
- $attrValue = (empty($attrValue) || $attrValue === 'false' ? false : true);
- default:
- $indexNode[$attrName] = $attrValue;
- break;
- }
- }
- if (!empty($indexNode) && isset($index->column)) {
- $indexNode['columns']= array();
- foreach ($index->column as $column) {
- $columnKey = (string) $column['key'];
- $indexNode['columns'][$columnKey] = array();
- foreach ($column->attributes() as $attrName => $attr) {
- $attrValue = (string) $attr;
- switch ($attrName) {
- case 'key':
- continue 2;
- case 'null':
- $attrValue = (empty($attrValue) || $attrValue === 'false' ? false : true);
- default:
- $indexNode['columns'][$columnKey][$attrName]= $attrValue;
- break;
- }
- }
- }
- if (!empty($indexNode['columns'])) {
- $this->map[$class]['indexes'][$indexName]= $indexNode;
- }
- }
- }
- }
- if (isset($object->composite)) {
- $this->map[$class]['composites'] = array();
- foreach ($object->composite as $composite) {
- $compositeNode = array();
- $compositeAlias = (string) $composite['alias'];
- foreach ($composite->attributes() as $attrName => $attr) {
- $attrValue = (string) $attr;
- switch ($attrName) {
- case 'alias' :
- continue 2;
- case 'criteria' :
- $attrValue = $this->manager->xpdo->fromJSON(urldecode($attrValue));
- default :
- $compositeNode[$attrName]= $attrValue;
- break;
- }
- }
- if (!empty($compositeNode)) {
- if (isset($composite->criteria)) {
- /** @var SimpleXMLElement $criteria */
- foreach ($composite->criteria as $criteria) {
- $criteriaTarget = (string) $criteria['target'];
- $expression = (string) $criteria;
- if (!empty($expression)) {
- $expression = $this->manager->xpdo->fromJSON($expression);
- if (!empty($expression)) {
- if (!isset($compositeNode['criteria'])) $compositeNode['criteria'] = array();
- if (!isset($compositeNode['criteria'][$criteriaTarget])) $compositeNode['criteria'][$criteriaTarget] = array();
- $compositeNode['criteria'][$criteriaTarget] = array_merge($compositeNode['criteria'][$criteriaTarget], (array) $expression);
- }
- }
- }
- }
- $this->map[$class]['composites'][$compositeAlias] = $compositeNode;
- }
- }
- }
- if (isset($object->aggregate)) {
- $this->map[$class]['aggregates'] = array();
- foreach ($object->aggregate as $aggregate) {
- $aggregateNode = array();
- $aggregateAlias = (string) $aggregate['alias'];
- foreach ($aggregate->attributes() as $attrName => $attr) {
- $attrValue = (string) $attr;
- switch ($attrName) {
- case 'alias' :
- continue 2;
- case 'criteria' :
- $attrValue = $this->manager->xpdo->fromJSON(urldecode($attrValue));
- default :
- $aggregateNode[$attrName]= $attrValue;
- break;
- }
- }
- if (!empty($aggregateNode)) {
- if (isset($aggregate->criteria)) {
- /** @var SimpleXMLElement $criteria */
- foreach ($aggregate->criteria as $criteria) {
- $criteriaTarget = (string) $criteria['target'];
- $expression = (string) $criteria;
- if (!empty($expression)) {
- $expression = $this->manager->xpdo->fromJSON($expression);
- if (!empty($expression)) {
- if (!isset($aggregateNode['criteria'])) $aggregateNode['criteria'] = array();
- if (!isset($aggregateNode['criteria'][$criteriaTarget])) $aggregateNode['criteria'][$criteriaTarget] = array();
- $aggregateNode['criteria'][$criteriaTarget] = array_merge($aggregateNode['criteria'][$criteriaTarget], (array) $expression);
- }
- }
- }
- }
- $this->map[$class]['aggregates'][$aggregateAlias] = $aggregateNode;
- }
- }
- }
- if (isset($object->validation)) {
- $this->map[$class]['validation'] = array();
- $validation = $object->validation[0];
- $validationNode = array();
- foreach ($validation->attributes() as $attrName => $attr) {
- $validationNode[$attrName]= (string) $attr;
- }
- if (isset($validation->rule)) {
- $validationNode['rules'] = array();
- foreach ($validation->rule as $rule) {
- $ruleNode = array();
- $field= (string) $rule['field'];
- $name= (string) $rule['name'];
- foreach ($rule->attributes() as $attrName => $attr) {
- $attrValue = (string) $attr;
- switch ($attrName) {
- case 'field' :
- case 'name' :
- continue 2;
- default :
- $ruleNode[$attrName]= $attrValue;
- break;
- }
- }
- if (!empty($field) && !empty($name) && !empty($ruleNode)) {
- $validationNode['rules'][$field][$name]= $ruleNode;
- }
- }
- if (!empty($validationNode['rules'])) {
- $this->map[$class]['validation'] = $validationNode;
- }
- }
- }
- }
- } else {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Schema {$schemaFile} contains no valid object elements.");
- }
- } else {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not read schema from {$schemaFile}.");
- }
- $om_path= XPDO_CORE_PATH . 'om/';
- $path= !empty ($outputDir) ? $outputDir : $om_path;
- if (isset ($this->model['package']) && strlen($this->model['package']) > 0) {
- $path .= strtr($this->model['package'], '.', '/');
- $path .= '/';
- }
- $this->outputMeta($path);
- $this->outputClasses($path);
- $this->outputMaps($path);
- if ($compile) $this->compile($path, $this->model, $this->classes, $this->maps);
- unset($this->model, $this->classes, $this->map);
- return true;
- }
- /**
- * Write the generated class files to the specified path.
- *
- * @access public
- * @param string $path An absolute path to write the generated class files
- * to.
- */
- public function outputClasses($path) {
- $newClassGeneration= false;
- $newPlatformGeneration= false;
- $platform= $this->model['platform'];
- if (!is_dir($path)) {
- $newClassGeneration= true;
- if ($this->manager->xpdo->getCacheManager()) {
- if (!$this->manager->xpdo->cacheManager->writeTree($path)) {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not create model directory at {$path}");
- return false;
- }
- }
- }
- $ppath= $path;
- $ppath .= $platform;
- if (!is_dir($ppath)) {
- $newPlatformGeneration= true;
- if ($this->manager->xpdo->getCacheManager()) {
- if (!$this->manager->xpdo->cacheManager->writeTree($ppath)) {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not create platform subdirectory {$ppath}");
- return false;
- }
- }
- }
- $model= $this->model;
- if (isset($this->model['phpdoc-package'])) {
- $model['phpdoc-package']= '@package ' . $this->model['phpdoc-package'];
- if (isset($this->model['phpdoc-subpackage']) && !empty($this->model['phpdoc-subpackage'])) {
- $model['phpdoc-subpackage']= '@subpackage ' . $this->model['phpdoc-subpackage'] . '.' . $this->model['platform'];
- } else {
- $model['phpdoc-subpackage']= '@subpackage ' . $this->model['platform'];
- }
- } else {
- $basePos= strpos($this->model['package'], '.');
- $package= $basePos
- ? substr($this->model['package'], 0, $basePos)
- : $this->model['package'];
- $subpackage= $basePos
- ? substr($this->model['package'], $basePos + 1)
- : '';
- $model['phpdoc-package']= '@package ' . $package;
- if ($subpackage) $model['phpdoc-subpackage']= '@subpackage ' . $subpackage;
- }
- foreach ($this->classes as $className => $classDef) {
- $newClass= false;
- $classDef['class']= $className;
- $classDef['class-lowercase']= strtolower($className);
- $classDef= array_merge($model, $classDef);
- $replaceVars= array ();
- foreach ($classDef as $varKey => $varValue) {
- if (is_scalar($varValue)) $replaceVars["[+{$varKey}+]"]= $varValue;
- }
- $fileContent= str_replace(array_keys($replaceVars), array_values($replaceVars), $this->classTemplate);
- if (is_dir($path)) {
- $fileName= $path . strtolower($className) . '.class.php';
- if (!file_exists($fileName)) {
- if ($file= @ fopen($fileName, 'wb')) {
- if (!fwrite($file, $fileContent)) {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not write to file: {$fileName}");
- }
- $newClass= true;
- @fclose($file);
- } else {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not open or create file: {$fileName}");
- }
- } else {
- $newClass= false;
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_INFO, "Skipping {$fileName}; file already exists.\nMove existing class files to regenerate them.");
- }
- } else {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not open or create dir: {$path}");
- }
- $fileContent= str_replace(array_keys($replaceVars), array_values($replaceVars), $this->getClassPlatformTemplate($platform));
- if (is_dir($ppath)) {
- $fileName= $ppath . '/' . strtolower($className) . '.class.php';
- if (!file_exists($fileName)) {
- if ($file= @ fopen($fileName, 'wb')) {
- if (!fwrite($file, $fileContent)) {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not write to file: {$fileName}");
- }
- @fclose($file);
- } else {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not open or create file: {$fileName}");
- }
- } else {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_INFO, "Skipping {$fileName}; file already exists.\nMove existing class files to regenerate them.");
- if ($newClassGeneration || $newClass) $this->manager->xpdo->log(xPDO::LOG_LEVEL_WARN, "IMPORTANT: {$fileName} already exists but you appear to have generated classes with an older xPDO version. You need to edit your class definition in this file to extend {$className} rather than {$classDef['extends']}.");
- }
- } else {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not open or create dir: {$path}");
- }
- }
- }
- /**
- * Write the generated class maps to the specified path.
- *
- * @access public
- * @param string $path An absolute path to write the generated maps to.
- */
- public function outputMaps($path) {
- if (!is_dir($path)) {
- mkdir($path, 0777);
- }
- $path .= $this->model['platform'];
- if (!is_dir($path)) {
- mkdir($path, 0777);
- }
- $model= $this->model;
- if (isset($this->model['phpdoc-package'])) {
- $model['phpdoc-package']= '@package ' . $this->model['phpdoc-package'];
- if (isset($this->model['phpdoc-subpackage']) && !empty($this->model['phpdoc-subpackage'])) {
- $model['phpdoc-subpackage']= '@subpackage ' . $this->model['phpdoc-subpackage'] . '.' . $this->model['platform'];
- } else {
- $model['phpdoc-subpackage']= '@subpackage ' . $this->model['platform'];
- }
- } else {
- $basePos= strpos($this->model['package'], '.');
- $package= $basePos
- ? substr($this->model['package'], 0, $basePos)
- : $this->model['package'];
- $subpackage= $basePos
- ? substr($this->model['package'], $basePos + 1) . '.' . $this->model['platform']
- : $this->model['platform'];
- $model['phpdoc-package']= '@package ' . $package;
- $model['phpdoc-subpackage']= '@subpackage ' . $subpackage;
- }
- foreach ($this->map as $className => $map) {
- $lcClassName= strtolower($className);
- $fileName= $path . '/' . strtolower($className) . '.map.inc.php';
- $vars= array_merge($model, $map);
- $replaceVars= array ();
- foreach ($vars as $varKey => $varValue) {
- if (is_scalar($varValue)) $replaceVars["[+{$varKey}+]"]= $varValue;
- }
- $fileContent= str_replace(array_keys($replaceVars), array_values($replaceVars), $this->getMapHeader());
- $fileContent.= "\n\$xpdo_meta_map['$className']= " . var_export($map, true) . ";\n";
- $fileContent.= str_replace(array_keys($replaceVars), array_values($replaceVars), $this->getMapFooter());
- if (is_dir($path)) {
- if ($file= @ fopen($fileName, 'wb')) {
- if (!fwrite($file, $fileContent)) {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not write to file: {$fileName}");
- }
- fclose($file);
- } else {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not open or create file: {$fileName}");
- }
- } else {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not open or create dir: {$path}");
- }
- }
- }
- /**
- * Write the generated meta map to the specified path.
- *
- * @param string $path An absolute path to write the generated maps to.
- * @return bool
- */
- public function outputMeta($path) {
- if (!is_dir($path)) {
- if ($this->manager->xpdo->getCacheManager()) {
- if (!$this->manager->xpdo->cacheManager->writeTree($path)) {
- $this->manager->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not create model directory at {$path}");
- return false;
- }
- }
- }
- $placeholders = array();
- $model= $this->model;
- if (isset($this->model['phpdoc-package'])) {
- $model['phpdoc-package']= '@package ' . $this->model['phpdoc-package'];
- if (isset($this->model['phpdoc-subpackage']) && !empty($this->model['phpdoc-subpackage'])) {
- $model['phpdoc-subpackage']= '@subpackage ' . $this->model['phpdoc-subpackage'] . '.' . $this->model['platform'];
- } else {
- $model['phpdoc-subpackage']= '@subpackage ' . $this->model['platform'];
- }
- } else {
- $basePos= strpos($this->model['package'], '.');
- $package= $basePos
- ? substr($this->model['package'], 0, $basePos)
- : $this->model['package'];
- $subpackage= $basePos
- ? substr($this->model['package'], $basePos + 1) . '.' . $this->model['platform']
- : $this->model['platform'];
- $model['phpdoc-package']= '@package ' . $package;
- $model['phpdoc-subpackage']= '@subpackage ' . $subpackage;
- }
- $placeholders = array_merge($placeholders,$model);
- $classMap = array();
- // $skipClasses = array('xPDOObject','xPDOSimpleObject');
- foreach ($this->classes as $className => $meta) {
- if (!isset($meta['extends'])) {
- $meta['extends'] = 'xPDOObject';
- }
- if (!isset($classMap[$meta['extends']])) {
- $classMap[$meta['extends']] = array();
- }
- $classMap[$meta['extends']][] = $className;
- }
- if ($this->manager->xpdo->getCacheManager()) {
- $placeholders['map'] = var_export($classMap,true);
- $replaceVars = array();
- foreach ($placeholders as $varKey => $varValue) {
- if (is_scalar($varValue)) $replaceVars["[+{$varKey}+]"]= $varValue;
- }
- $fileContent= str_replace(array_keys($replaceVars), array_values($replaceVars), $this->getMetaTemplate());
- $this->manager->xpdo->cacheManager->writeFile("{$path}/metadata.{$model['platform']}.php",$fileContent);
- }
- return true;
- }
- /**
- * Compile the packages into a single file for quicker loading.
- *
- * @abstract
- * @access public
- * @param string $path The absolute path to compile into.
- * @return boolean True if the compiling went successfully.
- */
- abstract public function compile($path= '');
- /**
- * Return the class template for the class files.
- *
- * @access public
- * @return string The class template.
- */
- public function getClassTemplate() {
- if ($this->classTemplate) return $this->classTemplate;
- $template= <<<EOD
- <?php
- class [+class+] extends [+extends+] {}
- EOD;
- return $template;
- }
- /**
- * Return the class platform template for the class files.
- *
- * @access public
- * @return string The class platform template.
- */
- public function getClassPlatformTemplate($platform) {
- if ($this->platformTemplate) return $this->platformTemplate;
- $template= <<<EOD
- <?php
- require_once (dirname(__DIR__) . '/[+class-lowercase+].class.php');
- class [+class+]_$platform extends [+class+] {}
- EOD;
- return $template;
- }
- /**
- * Gets the map header template.
- *
- * @access public
- * @return string The map header template.
- */
- public function getMapHeader() {
- if ($this->mapHeader) return $this->mapHeader;
- $header= <<<EOD
- <?php
- EOD;
- return $header;
- }
- /**
- * Gets the map footer template.
- *
- * @access public
- * @return string The map footer template.
- */
- public function getMapFooter() {
- if ($this->mapFooter) return $this->mapFooter;
- return '';
- }
- /**
- * Gets the meta template.
- *
- * @access public
- * @return string The meta template.
- */
- public function getMetaTemplate() {
- if ($this->metaTemplate) return $this->metaTemplate;
- $tpl= <<<EOD
- <?php
- \n\$xpdo_meta_map = [+map+];
- EOD;
- return $tpl;
- }
- }
|