/DatabaseSchema/src/handlers/persistent/class_writer.php
https://github.com/F5/zetacomponents · PHP · 290 lines · 124 code · 20 blank · 146 comment · 7 complexity · 53b8e5f2317a89bc7f65b0a354cc603f MD5 · raw file
- <?php
- /**
- * File containing the ezcDbSchemaPersistentClassWriter class.
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * @package DatabaseSchema
- * @version //autogentag//
- * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
- */
- /**
- * This handler creates PHP classes to be used with PersistentObject from a
- * DatabaseSchema.
- *
- * @package DatabaseSchema
- * @version //autogentag//
- */
- class ezcDbSchemaPersistentClassWriter implements ezcDbSchemaFileWriter
- {
- /**
- * If files should be overwritten.
- *
- * @var boolean
- */
- private $overwrite;
- /**
- * Class prefix.
- *
- * @var string
- */
- private $prefix;
- /**
- * Creates a new writer instance
- *
- * @param bool $overwrite Overwrite existsing files?
- * @param string $classPrefix Prefix for class names.
- * @return void
- */
- public function __construct( $overwrite = false, $classPrefix = null )
- {
- $this->overwrite = $overwrite;
- $this->prefix = ( $classPrefix === null ) ? "" : $classPrefix;
- }
-
- /**
- * Returns what type of schema writer this class implements.
- * This method always returns ezcDbSchema::FILE
- *
- * @return int The type of this schema writer.
- */
- public function getWriterType()
- {
- return ezcDbSchema::FILE;
- }
- /**
- * Writes the schema definition in $dbSchema to files located in $dir.
- * This method dumps the given schema to PersistentObject definitions, which
- * will be located in the given directory.
- *
- * @param string $dir The directory to store definitions in.
- * @param ezcDbSchema $dbSchema The schema object to create defs for.
- *
- * @throws ezcBaseFileNotFoundException If the given directory could not be
- * found.
- * @throws ezcBaseFilePermissionException If the given directory is not
- * writable.
- */
- public function saveToFile( $dir, ezcDbSchema $dbSchema )
- {
- if ( !is_dir( $dir ) )
- {
- throw new ezcBaseFileNotFoundException( $dir, 'directory' );
- }
- if ( !is_writable( $dir ) )
- {
- throw new ezcBaseFilePermissionException( $dir, ezcBaseFileException::WRITE );
- }
- $schema = $dbSchema->getSchema();
- foreach ( $schema as $tableName => $table )
- {
- $this->writeClass( $dir, $tableName, $table );
- }
- }
- /**
- * Writes the list of attributes.
- *
- * @param resource $file
- * @param array $fields
- * @return void
- */
- private function writeAttributes( $file, $fields )
- {
- foreach ( $fields as $fieldName => $field )
- {
- fwrite( $file, " /**\n" );
- fwrite( $file, " * $fieldName\n" );
- fwrite( $file, " *\n" );
- fwrite( $file, " * @var {$this->translateType($field->type)}\n" );
- fwrite( $file, " */\n" );
- fwrite( $file, " private \$$fieldName;\n" );
- }
- }
- /**
- * Writes the setState() method for the class.
- *
- * @param resource $file
- * @return void
- */
- private function writeSetState( $file )
- {
- fwrite( $file, " /**\n" );
- fwrite( $file, " * Set the PersistentObject state.\n" );
- fwrite( $file, " *\n" );
- fwrite( $file, " * @param array(string=>mixed) \$state The state to set.\n" );
- fwrite( $file, " * @return void\n" );
- fwrite( $file, " */\n" );
- fwrite( $file, " public function setState( array \$state )\n" );
- fwrite( $file, " {\n" );
- fwrite( $file, " foreach ( \$state as \$attribute => \$value )\n" );
- fwrite( $file, " {\n" );
- fwrite( $file, " \$this->\$attribute = \$value;\n" );
- fwrite( $file, " }\n" );
- fwrite( $file, " }\n" );
- }
- /**
- * Writes the getState() method for the class.
- *
- * @param resource $file
- * @param array $fields The table fields.
- * @return void
- */
- private function writeGetState( $file, $fields )
- {
- fwrite( $file, " /**\n" );
- fwrite( $file, " * Get the PersistentObject state.\n" );
- fwrite( $file, " *\n" );
- fwrite( $file, " * @return array(string=>mixed) The state of the object.\n" );
- fwrite( $file, " */\n" );
- fwrite( $file, " public function getState()\n" );
- fwrite( $file, " {\n" );
- fwrite( $file, " return array(\n" );
- foreach ( $fields as $fieldName => $field )
- {
- fwrite( $file, " '$fieldName' => \$this->$fieldName,\n" );
- }
- fwrite( $file, " );\n" );
- fwrite( $file, " }\n" );
- }
- /**
- * Writes a PHP class.
- * This method writes a PHP class from a table definition.
- *
- * @param string $dir The directory to write the defititions to.
- * @param string $tableName Name of the database table.
- * @param ezcDbSchemaTable $table The table definition.
- */
- private function writeClass( $dir, $tableName, ezcDbSchemaTable $table )
- {
- $file = $this->openFile( $dir, $tableName );
- fwrite( $file, "/**\n" );
- fwrite( $file, " * Data class $tableName.\n" );
- fwrite( $file, " * Class to be used with eZ Components PersistentObject.\n" );
- fwrite( $file, " */\n" );
- fwrite( $file, "class {$this->prefix}$tableName\n" );
- fwrite( $file, "{\n" );
- // attributes
- $this->writeAttributes( $file, $table->fields );
- fwrite( $file, "\n" );
- // methods
- $this->writeSetState( $file );
- fwrite( $file, "\n" );
- $this->writeGetState( $file, $table->fields );
- fwrite( $file, "}\n" );
- $this->closeFile( $file );
- }
- /**
- * Open a file for writing a PersistentObject definition to.
- * This method opens a file for writing a PersistentObject definition to
- * and writes the basic PHP open tag to it.
- *
- * @param string $dir The diretory to open the file in.
- * @param string $name The table name.
- * @return resource(file) The file resource used for writing.
- *
- * @throws ezcBaseFileIoException
- * if the file to write to already exists.
- * @throws ezcBaseFilePermissionException
- * if the file could not be opened for writing.
- */
- private function openFile( $dir, $name )
- {
- $filename = $dir . DIRECTORY_SEPARATOR . strtolower( $this->prefix ) . strtolower( $name ) . '.php';
- // We do not want to overwrite files
- if ( file_exists( $filename ) && ( $this->overwrite === false || is_writable( $filename ) === false ) )
- {
- throw new ezcBaseFileIoException( $filename, ezcBaseFileException::WRITE, "File already exists or is not writeable. Use --overwrite to ignore existance." );
- }
- $file = @fopen( $filename, 'w' );
- if ( $file === false )
- {
- throw new ezcBaseFilePermissionException( $file, ezcBaseFileException::WRITE );
- }
- fwrite( $file, "<?php\n" );
- fwrite( $file, "// Autogenerated class file\n" );
- fwrite( $file, "\n" );
- return $file;
- }
- /**
- * Close a file where a PersistentObject definition has been written to.
- * This method closes a file after writing a PersistentObject definition to
- * it and writes the PHP closing tag to it.
- *
- * @param resource(file) $file The file resource to close.
- * @return void
- */
- private function closeFile( $file )
- {
- fwrite( $file, "?>\n" );
- fclose( $file );
- }
- /**
- * Translates eZ DatabaseSchema data types to eZ PersistentObject types.
- * This method receives a type string from a ezcDbSchemaField object and
- * returns the corresponding type value from PersistentObject.
- *
- * @todo Why does PersistentObject not support "boolean" types?
- *
- * @see ezcPersistentObjectProperty::TYPE_INT
- * @see ezcPersistentObjectProperty::TYPE_FLOAT
- * @see ezcPersistentObjectProperty::TYPE_STRING
- *
- * @param string $dbType The DatabaseSchema type string.
- * @return int The ezcPersistentObjectProperty::TYPE_* value.
- */
- private function translateType( $dbType )
- {
- switch ( $dbType )
- {
- case 'integer':
- case 'timestamp':
- return 'int';
- case 'float':
- case 'decimal':
- return 'float';
- case 'text':
- case 'blob':
- case 'clob':
- return 'string';
- case 'time':
- case 'date':
- return 'mixed';
- default:
- }
- }
- }
- ?>