| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064 | 
							- <?php
 - /*
 -  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 -  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 -  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 -  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 -  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 -  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 -  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 -  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 -  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 -  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 -  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -  *
 -  * This software consists of voluntary contributions made by many individuals
 -  * and is licensed under the LGPL. For more information, see
 -  * <http://www.doctrine-project.org>.
 -  */
 - 
 - namespace Doctrine\ORM\Tools;
 - 
 - use Doctrine\ORM\Mapping\ClassMetadataInfo,
 -     Doctrine\ORM\Mapping\AssociationMapping,
 -     Doctrine\Common\Util\Inflector;
 - 
 - /**
 -  * Generic class used to generate PHP5 entity classes from ClassMetadataInfo instances
 -  *
 -  *     [php]
 -  *     $classes = $em->getClassMetadataFactory()->getAllMetadata();
 -  *
 -  *     $generator = new \Doctrine\ORM\Tools\EntityGenerator();
 -  *     $generator->setGenerateAnnotations(true);
 -  *     $generator->setGenerateStubMethods(true);
 -  *     $generator->setRegenerateEntityIfExists(false);
 -  *     $generator->setUpdateEntityIfExists(true);
 -  *     $generator->generate($classes, '/path/to/generate/entities');
 -  *
 -  * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
 -  * @link    www.doctrine-project.org
 -  * @since   2.0
 -  * @version $Revision$
 -  * @author  Benjamin Eberlei <kontakt@beberlei.de>
 -  * @author  Guilherme Blanco <guilhermeblanco@hotmail.com>
 -  * @author  Jonathan Wage <jonwage@gmail.com>
 -  * @author  Roman Borschel <roman@code-factory.org>
 -  */
 - class EntityGenerator
 - {
 -     /**
 -      * @var bool
 -      */
 -     private $_backupExisting = true;
 - 
 -     /** The extension to use for written php files */
 -     private $_extension = '.php';
 - 
 -     /** Whether or not the current ClassMetadataInfo instance is new or old */
 -     private $_isNew = true;
 - 
 -     private $_staticReflection = array();
 - 
 -     /** Number of spaces to use for indention in generated code */
 -     private $_numSpaces = 4;
 - 
 -     /** The actual spaces to use for indention */
 -     private $_spaces = '    ';
 - 
 -     /** The class all generated entities should extend */
 -     private $_classToExtend;
 - 
 -     /** Whether or not to generation annotations */
 -     private $_generateAnnotations = false;
 - 
 -     /**
 -      * @var string
 -      */
 -     private $_annotationsPrefix = '';
 - 
 -     /** Whether or not to generated sub methods */
 -     private $_generateEntityStubMethods = false;
 - 
 -     /** Whether or not to update the entity class if it exists already */
 -     private $_updateEntityIfExists = false;
 - 
 -     /** Whether or not to re-generate entity class if it exists already */
 -     private $_regenerateEntityIfExists = false;
 - 
 -     private static $_classTemplate =
 - '<?php
 - 
 - <namespace>
 - 
 - use Doctrine\ORM\Mapping as ORM;
 - 
 - <entityAnnotation>
 - <entityClassName>
 - {
 - <entityBody>
 - }';
 - 
 -     private static $_getMethodTemplate =
 - '/**
 -  * <description>
 -  *
 -  * @return <variableType>
 -  */
 - public function <methodName>()
 - {
 - <spaces>return $this-><fieldName>;
 - }';
 - 
 -     private static $_setMethodTemplate =
 - '/**
 -  * <description>
 -  *
 -  * @param <variableType>$<variableName>
 -  */
 - public function <methodName>(<methodTypeHint>$<variableName>)
 - {
 - <spaces>$this-><fieldName> = $<variableName>;
 - }';
 - 
 -     private static $_addMethodTemplate =
 - '/**
 -  * <description>
 -  *
 -  * @param <variableType>$<variableName>
 -  */
 - public function <methodName>(<methodTypeHint>$<variableName>)
 - {
 - <spaces>$this-><fieldName>[] = $<variableName>;
 - }';
 - 
 -     private static $_lifecycleCallbackMethodTemplate =
 - '/**
 -  * @<name>
 -  */
 - public function <methodName>()
 - {
 - <spaces>// Add your code here
 - }';
 - 
 -     private static $_constructorMethodTemplate =
 - 'public function __construct()
 - {
 - <spaces><collections>
 - }
 - ';
 - 
 -     public function __construct()
 -     {
 -         if (version_compare(\Doctrine\Common\Version::VERSION, '3.0.0-DEV', '>=')) {
 -             $this->_annotationsPrefix = 'ORM\\';
 -         }
 -     }
 - 
 -     /**
 -      * Generate and write entity classes for the given array of ClassMetadataInfo instances
 -      *
 -      * @param array $metadatas
 -      * @param string $outputDirectory
 -      * @return void
 -      */
 -     public function generate(array $metadatas, $outputDirectory)
 -     {
 -         foreach ($metadatas as $metadata) {
 -             $this->writeEntityClass($metadata, $outputDirectory);
 -         }
 -     }
 - 
 -     /**
 -      * Generated and write entity class to disk for the given ClassMetadataInfo instance
 -      *
 -      * @param ClassMetadataInfo $metadata
 -      * @param string $outputDirectory
 -      * @return void
 -      */
 -     public function writeEntityClass(ClassMetadataInfo $metadata, $outputDirectory)
 -     {
 -         $path = $outputDirectory . '/' . str_replace('\\', DIRECTORY_SEPARATOR, $metadata->name) . $this->_extension;
 -         $dir = dirname($path);
 - 
 -         if ( ! is_dir($dir)) {
 -             mkdir($dir, 0777, true);
 -         }
 - 
 -         $this->_isNew = !file_exists($path) || (file_exists($path) && $this->_regenerateEntityIfExists);
 - 
 -         if ( ! $this->_isNew) {
 -             $this->_parseTokensInEntityFile(file_get_contents($path));
 -         }
 - 
 -         if ($this->_backupExisting && file_exists($path)) {
 -             $backupPath = dirname($path) . DIRECTORY_SEPARATOR . basename($path) . "~";
 -             if (!copy($path, $backupPath)) {
 -                 throw new \RuntimeException("Attempt to backup overwritten entitiy file but copy operation failed.");
 -             }
 -         }
 - 
 -         // If entity doesn't exist or we're re-generating the entities entirely
 -         if ($this->_isNew) {
 -             file_put_contents($path, $this->generateEntityClass($metadata));
 -         // If entity exists and we're allowed to update the entity class
 -         } else if ( ! $this->_isNew && $this->_updateEntityIfExists) {
 -             file_put_contents($path, $this->generateUpdatedEntityClass($metadata, $path));
 -         }
 -     }
 - 
 -     /**
 -      * Generate a PHP5 Doctrine 2 entity class from the given ClassMetadataInfo instance
 -      *
 -      * @param ClassMetadataInfo $metadata
 -      * @return string $code
 -      */
 -     public function generateEntityClass(ClassMetadataInfo $metadata)
 -     {
 -         $placeHolders = array(
 -             '<namespace>',
 -             '<entityAnnotation>',
 -             '<entityClassName>',
 -             '<entityBody>'
 -         );
 - 
 -         $replacements = array(
 -             $this->_generateEntityNamespace($metadata),
 -             $this->_generateEntityDocBlock($metadata),
 -             $this->_generateEntityClassName($metadata),
 -             $this->_generateEntityBody($metadata)
 -         );
 - 
 -         $code = str_replace($placeHolders, $replacements, self::$_classTemplate);
 -         return str_replace('<spaces>', $this->_spaces, $code);
 -     }
 - 
 -     /**
 -      * Generate the updated code for the given ClassMetadataInfo and entity at path
 -      *
 -      * @param ClassMetadataInfo $metadata
 -      * @param string $path
 -      * @return string $code;
 -      */
 -     public function generateUpdatedEntityClass(ClassMetadataInfo $metadata, $path)
 -     {
 -         $currentCode = file_get_contents($path);
 - 
 -         $body = $this->_generateEntityBody($metadata);
 -         $body = str_replace('<spaces>', $this->_spaces, $body);
 -         $last = strrpos($currentCode, '}');
 - 
 -         return substr($currentCode, 0, $last) . $body . (strlen($body) > 0 ? "\n" : ''). "}";
 -     }
 - 
 -     /**
 -      * Set the number of spaces the exported class should have
 -      *
 -      * @param integer $numSpaces
 -      * @return void
 -      */
 -     public function setNumSpaces($numSpaces)
 -     {
 -         $this->_spaces = str_repeat(' ', $numSpaces);
 -         $this->_numSpaces = $numSpaces;
 -     }
 - 
 -     /**
 -      * Set the extension to use when writing php files to disk
 -      *
 -      * @param string $extension
 -      * @return void
 -      */
 -     public function setExtension($extension)
 -     {
 -         $this->_extension = $extension;
 -     }
 - 
 -     /**
 -      * Set the name of the class the generated classes should extend from
 -      *
 -      * @return void
 -      */
 -     public function setClassToExtend($classToExtend)
 -     {
 -         $this->_classToExtend = $classToExtend;
 -     }
 - 
 -     /**
 -      * Set whether or not to generate annotations for the entity
 -      *
 -      * @param bool $bool
 -      * @return void
 -      */
 -     public function setGenerateAnnotations($bool)
 -     {
 -         $this->_generateAnnotations = $bool;
 -     }
 - 
 -     /**
 -      * Set an annotation prefix.
 -      *
 -      * @param string $prefix
 -      */
 -     public function setAnnotationPrefix($prefix)
 -     {
 -         if (version_compare(\Doctrine\Common\Version::VERSION, '3.0.0-DEV', '>=')) {
 -             return;
 -         }
 -         $this->_annotationsPrefix = $prefix;
 -     }
 - 
 -     /**
 -      * Set whether or not to try and update the entity if it already exists
 -      *
 -      * @param bool $bool
 -      * @return void
 -      */
 -     public function setUpdateEntityIfExists($bool)
 -     {
 -         $this->_updateEntityIfExists = $bool;
 -     }
 - 
 -     /**
 -      * Set whether or not to regenerate the entity if it exists
 -      *
 -      * @param bool $bool
 -      * @return void
 -      */
 -     public function setRegenerateEntityIfExists($bool)
 -     {
 -         $this->_regenerateEntityIfExists = $bool;
 -     }
 - 
 -     /**
 -      * Set whether or not to generate stub methods for the entity
 -      *
 -      * @param bool $bool
 -      * @return void
 -      */
 -     public function setGenerateStubMethods($bool)
 -     {
 -         $this->_generateEntityStubMethods = $bool;
 -     }
 - 
 -     /**
 -      * Should an existing entity be backed up if it already exists?
 -      */
 -     public function setBackupExisting($bool)
 -     {
 -         $this->_backupExisting = $bool;
 -     }
 - 
 -     private function _generateEntityNamespace(ClassMetadataInfo $metadata)
 -     {
 -         if ($this->_hasNamespace($metadata)) {
 -             return 'namespace ' . $this->_getNamespace($metadata) .';';
 -         }
 -     }
 - 
 -     private function _generateEntityClassName(ClassMetadataInfo $metadata)
 -     {
 -         return 'class ' . $this->_getClassName($metadata) .
 -             ($this->_extendsClass() ? ' extends ' . $this->_getClassToExtendName() : null);
 -     }
 - 
 -     private function _generateEntityBody(ClassMetadataInfo $metadata)
 -     {
 -         $fieldMappingProperties = $this->_generateEntityFieldMappingProperties($metadata);
 -         $associationMappingProperties = $this->_generateEntityAssociationMappingProperties($metadata);
 -         $stubMethods = $this->_generateEntityStubMethods ? $this->_generateEntityStubMethods($metadata) : null;
 -         $lifecycleCallbackMethods = $this->_generateEntityLifecycleCallbackMethods($metadata);
 - 
 -         $code = array();
 - 
 -         if ($fieldMappingProperties) {
 -             $code[] = $fieldMappingProperties;
 -         }
 - 
 -         if ($associationMappingProperties) {
 -             $code[] = $associationMappingProperties;
 -         }
 - 
 -         $code[] = $this->_generateEntityConstructor($metadata);
 - 
 -         if ($stubMethods) {
 -             $code[] = $stubMethods;
 -         }
 - 
 -         if ($lifecycleCallbackMethods) {
 -             $code[] = $lifecycleCallbackMethods;
 -         }
 - 
 -         return implode("\n", $code);
 -     }
 - 
 -     private function _generateEntityConstructor(ClassMetadataInfo $metadata)
 -     {
 -         if ($this->_hasMethod('__construct', $metadata)) {
 -             return '';
 -         }
 - 
 -         $collections = array();
 -         foreach ($metadata->associationMappings AS $mapping) {
 -             if ($mapping['type'] & ClassMetadataInfo::TO_MANY) {
 -                 $collections[] = '$this->'.$mapping['fieldName'].' = new \Doctrine\Common\Collections\ArrayCollection();';
 -             }
 -         }
 -         if ($collections) {
 -             return $this->_prefixCodeWithSpaces(str_replace("<collections>", implode("\n", $collections), self::$_constructorMethodTemplate));
 -         }
 -         return '';
 -     }
 - 
 -     /**
 -      * @todo this won't work if there is a namespace in brackets and a class outside of it.
 -      * @param string $src
 -      */
 -     private function _parseTokensInEntityFile($src)
 -     {
 -         $tokens = token_get_all($src);
 -         $lastSeenNamespace = "";
 -         $lastSeenClass = false;
 - 
 -         $inNamespace = false;
 -         $inClass = false;
 -         for ($i = 0; $i < count($tokens); $i++) {
 -             $token = $tokens[$i];
 -             if (in_array($token[0], array(T_WHITESPACE, T_COMMENT, T_DOC_COMMENT))) {
 -                 continue;
 -             }
 - 
 -             if ($inNamespace) {
 -                 if ($token[0] == T_NS_SEPARATOR || $token[0] == T_STRING) {
 -                     $lastSeenNamespace .= $token[1];
 -                 } else if (is_string($token) && in_array($token, array(';', '{'))) {
 -                     $inNamespace = false;
 -                 }
 -             }
 - 
 -             if ($inClass) {
 -                 $inClass = false;
 -                 $lastSeenClass = $lastSeenNamespace . ($lastSeenNamespace ? '\\' : '') . $token[1];
 -                 $this->_staticReflection[$lastSeenClass]['properties'] = array();
 -                 $this->_staticReflection[$lastSeenClass]['methods'] = array();
 -             }
 - 
 -             if ($token[0] == T_NAMESPACE) {
 -                 $lastSeenNamespace = "";
 -                 $inNamespace = true;
 -             } else if ($token[0] == T_CLASS) {
 -                 $inClass = true;
 -             } else if ($token[0] == T_FUNCTION) {
 -                 if ($tokens[$i+2][0] == T_STRING) {
 -                     $this->_staticReflection[$lastSeenClass]['methods'][] = $tokens[$i+2][1];
 -                 } else if ($tokens[$i+2] == "&" && $tokens[$i+3][0] == T_STRING) {
 -                     $this->_staticReflection[$lastSeenClass]['methods'][] = $tokens[$i+3][1];
 -                 }
 -             } else if (in_array($token[0], array(T_VAR, T_PUBLIC, T_PRIVATE, T_PROTECTED)) && $tokens[$i+2][0] != T_FUNCTION) {
 -                 $this->_staticReflection[$lastSeenClass]['properties'][] = substr($tokens[$i+2][1], 1);
 -             }
 -         }
 -     }
 - 
 -     private function _hasProperty($property, ClassMetadataInfo $metadata)
 -     {
 -         if ($this->_extendsClass()) {
 -             // don't generate property if its already on the base class.
 -             $reflClass = new \ReflectionClass($this->_getClassToExtend());
 -             if ($reflClass->hasProperty($property)) {
 -                 return true;
 -             }
 -         }
 - 
 -         return (
 -             isset($this->_staticReflection[$metadata->name]) &&
 -             in_array($property, $this->_staticReflection[$metadata->name]['properties'])
 -         );
 -     }
 - 
 -     private function _hasMethod($method, ClassMetadataInfo $metadata)
 -     {
 -         if ($this->_extendsClass()) {
 -             // don't generate method if its already on the base class.
 -             $reflClass = new \ReflectionClass($this->_getClassToExtend());
 -             if ($reflClass->hasMethod($method)) {
 -                 return true;
 -             }
 -         }
 - 
 -         return (
 -             isset($this->_staticReflection[$metadata->name]) &&
 -             in_array($method, $this->_staticReflection[$metadata->name]['methods'])
 -         );
 -     }
 - 
 -     private function _hasNamespace(ClassMetadataInfo $metadata)
 -     {
 -         return strpos($metadata->name, '\\') ? true : false;
 -     }
 - 
 -     private function _extendsClass()
 -     {
 -         return $this->_classToExtend ? true : false;
 -     }
 - 
 -     private function _getClassToExtend()
 -     {
 -         return $this->_classToExtend;
 -     }
 - 
 -     private function _getClassToExtendName()
 -     {
 -         $refl = new \ReflectionClass($this->_getClassToExtend());
 - 
 -         return '\\' . $refl->getName();
 -     }
 - 
 -     private function _getClassName(ClassMetadataInfo $metadata)
 -     {
 -         return ($pos = strrpos($metadata->name, '\\'))
 -             ? substr($metadata->name, $pos + 1, strlen($metadata->name)) : $metadata->name;
 -     }
 - 
 -     private function _getNamespace(ClassMetadataInfo $metadata)
 -     {
 -         return substr($metadata->name, 0, strrpos($metadata->name, '\\'));
 -     }
 - 
 -     private function _generateEntityDocBlock(ClassMetadataInfo $metadata)
 -     {
 -         $lines = array();
 -         $lines[] = '/**';
 -         $lines[] = ' * '.$metadata->name;
 - 
 -         if ($this->_generateAnnotations) {
 -             $lines[] = ' *';
 - 
 -             $methods = array(
 -                 '_generateTableAnnotation',
 -                 '_generateInheritanceAnnotation',
 -                 '_generateDiscriminatorColumnAnnotation',
 -                 '_generateDiscriminatorMapAnnotation'
 -             );
 - 
 -             foreach ($methods as $method) {
 -                 if ($code = $this->$method($metadata)) {
 -                     $lines[] = ' * ' . $code;
 -                 }
 -             }
 - 
 -             if ($metadata->isMappedSuperclass) {
 -                 $lines[] = ' * @' . $this->_annotationsPrefix . 'MappedSuperClass';
 -             } else {
 -                 $lines[] = ' * @' . $this->_annotationsPrefix . 'Entity';
 -             }
 - 
 -             if ($metadata->customRepositoryClassName) {
 -                 $lines[count($lines) - 1] .= '(repositoryClass="' . $metadata->customRepositoryClassName . '")';
 -             }
 - 
 -             if (isset($metadata->lifecycleCallbacks) && $metadata->lifecycleCallbacks) {
 -                 $lines[] = ' * @' . $this->_annotationsPrefix . 'HasLifecycleCallbacks';
 -             }
 -         }
 - 
 -         $lines[] = ' */';
 - 
 -         return implode("\n", $lines);
 -     }
 - 
 -     private function _generateTableAnnotation($metadata)
 -     {
 -         $table = array();
 -         if ($metadata->table['name']) {
 -             $table[] = 'name="' . $metadata->table['name'] . '"';
 -         }
 - 
 -         return '@' . $this->_annotationsPrefix . 'Table(' . implode(', ', $table) . ')';
 -     }
 - 
 -     private function _generateInheritanceAnnotation($metadata)
 -     {
 -         if ($metadata->inheritanceType != ClassMetadataInfo::INHERITANCE_TYPE_NONE) {
 -             return '@' . $this->_annotationsPrefix . 'InheritanceType("'.$this->_getInheritanceTypeString($metadata->inheritanceType).'")';
 -         }
 -     }
 - 
 -     private function _generateDiscriminatorColumnAnnotation($metadata)
 -     {
 -         if ($metadata->inheritanceType != ClassMetadataInfo::INHERITANCE_TYPE_NONE) {
 -             $discrColumn = $metadata->discriminatorValue;
 -             $columnDefinition = 'name="' . $discrColumn['name']
 -                 . '", type="' . $discrColumn['type']
 -                 . '", length=' . $discrColumn['length'];
 - 
 -             return '@' . $this->_annotationsPrefix . 'DiscriminatorColumn(' . $columnDefinition . ')';
 -         }
 -     }
 - 
 -     private function _generateDiscriminatorMapAnnotation($metadata)
 -     {
 -         if ($metadata->inheritanceType != ClassMetadataInfo::INHERITANCE_TYPE_NONE) {
 -             $inheritanceClassMap = array();
 - 
 -             foreach ($metadata->discriminatorMap as $type => $class) {
 -                 $inheritanceClassMap[] .= '"' . $type . '" = "' . $class . '"';
 -             }
 - 
 -             return '@' . $this->_annotationsPrefix . 'DiscriminatorMap({' . implode(', ', $inheritanceClassMap) . '})';
 -         }
 -     }
 - 
 -     private function _generateEntityStubMethods(ClassMetadataInfo $metadata)
 -     {
 -         $methods = array();
 - 
 -         foreach ($metadata->fieldMappings as $fieldMapping) {
 -             if ( ! isset($fieldMapping['id']) || ! $fieldMapping['id'] || $metadata->generatorType == ClassMetadataInfo::GENERATOR_TYPE_NONE) {
 -                 if ($code = $this->_generateEntityStubMethod($metadata, 'set', $fieldMapping['fieldName'], $fieldMapping['type'])) {
 -                     $methods[] = $code;
 -                 }
 -             }
 - 
 -             if ($code = $this->_generateEntityStubMethod($metadata, 'get', $fieldMapping['fieldName'], $fieldMapping['type'])) {
 -                 $methods[] = $code;
 -             }
 -         }
 - 
 -         foreach ($metadata->associationMappings as $associationMapping) {
 -             if ($associationMapping['type'] & ClassMetadataInfo::TO_ONE) {
 -                 if ($code = $this->_generateEntityStubMethod($metadata, 'set', $associationMapping['fieldName'], $associationMapping['targetEntity'])) {
 -                     $methods[] = $code;
 -                 }
 -                 if ($code = $this->_generateEntityStubMethod($metadata, 'get', $associationMapping['fieldName'], $associationMapping['targetEntity'])) {
 -                     $methods[] = $code;
 -                 }
 -             } else if ($associationMapping['type'] & ClassMetadataInfo::TO_MANY) {
 -                 if ($code = $this->_generateEntityStubMethod($metadata, 'add', $associationMapping['fieldName'], $associationMapping['targetEntity'])) {
 -                     $methods[] = $code;
 -                 }
 -                 if ($code = $this->_generateEntityStubMethod($metadata, 'get', $associationMapping['fieldName'], 'Doctrine\Common\Collections\Collection')) {
 -                     $methods[] = $code;
 -                 }
 -             }
 -         }
 - 
 -         return implode("\n\n", $methods);
 -     }
 - 
 -     private function _generateEntityLifecycleCallbackMethods(ClassMetadataInfo $metadata)
 -     {
 -         if (isset($metadata->lifecycleCallbacks) && $metadata->lifecycleCallbacks) {
 -             $methods = array();
 - 
 -             foreach ($metadata->lifecycleCallbacks as $name => $callbacks) {
 -                 foreach ($callbacks as $callback) {
 -                     if ($code = $this->_generateLifecycleCallbackMethod($name, $callback, $metadata)) {
 -                         $methods[] = $code;
 -                     }
 -                 }
 -             }
 - 
 -             return implode("\n\n", $methods);
 -         }
 - 
 -         return "";
 -     }
 - 
 -     private function _generateEntityAssociationMappingProperties(ClassMetadataInfo $metadata)
 -     {
 -         $lines = array();
 - 
 -         foreach ($metadata->associationMappings as $associationMapping) {
 -             if ($this->_hasProperty($associationMapping['fieldName'], $metadata)) {
 -                 continue;
 -             }
 - 
 -             $lines[] = $this->_generateAssociationMappingPropertyDocBlock($associationMapping, $metadata);
 -             $lines[] = $this->_spaces . 'private $' . $associationMapping['fieldName']
 -                      . ($associationMapping['type'] == 'manyToMany' ? ' = array()' : null) . ";\n";
 -         }
 - 
 -         return implode("\n", $lines);
 -     }
 - 
 -     private function _generateEntityFieldMappingProperties(ClassMetadataInfo $metadata)
 -     {
 -         $lines = array();
 - 
 -         foreach ($metadata->fieldMappings as $fieldMapping) {
 -             if ($this->_hasProperty($fieldMapping['fieldName'], $metadata) ||
 -                 $metadata->isInheritedField($fieldMapping['fieldName'])) {
 -                 continue;
 -             }
 - 
 -             $lines[] = $this->_generateFieldMappingPropertyDocBlock($fieldMapping, $metadata);
 -             $lines[] = $this->_spaces . 'private $' . $fieldMapping['fieldName']
 -                      . (isset($fieldMapping['default']) ? ' = ' . var_export($fieldMapping['default'], true) : null) . ";\n";
 -         }
 - 
 -         return implode("\n", $lines);
 -     }
 - 
 -     private function _generateEntityStubMethod(ClassMetadataInfo $metadata, $type, $fieldName, $typeHint = null)
 -     {
 -         if ($type == "add") {
 -             $addMethod = explode("\\", $typeHint);
 -             $addMethod = end($addMethod);
 -             $methodName = $type . $addMethod;
 -         } else {
 -             $methodName = $type . Inflector::classify($fieldName);
 -         }
 - 
 -         if ($this->_hasMethod($methodName, $metadata)) {
 -             return;
 -         }
 -         $this->_staticReflection[$metadata->name]['methods'][] = $methodName;
 - 
 -         $var = sprintf('_%sMethodTemplate', $type);
 -         $template = self::$$var;
 - 
 -         $variableType = $typeHint ? $typeHint . ' ' : null;
 - 
 -         $types = \Doctrine\DBAL\Types\Type::getTypesMap();
 -         $methodTypeHint = $typeHint && ! isset($types[$typeHint]) ? '\\' . $typeHint . ' ' : null;
 - 
 -         $replacements = array(
 -           '<description>'       => ucfirst($type) . ' ' . $fieldName,
 -           '<methodTypeHint>'    => $methodTypeHint,
 -           '<variableType>'      => $variableType,
 -           '<variableName>'      => Inflector::camelize($fieldName),
 -           '<methodName>'        => $methodName,
 -           '<fieldName>'         => $fieldName
 -         );
 - 
 -         $method = str_replace(
 -             array_keys($replacements),
 -             array_values($replacements),
 -             $template
 -         );
 - 
 -         return $this->_prefixCodeWithSpaces($method);
 -     }
 - 
 -     private function _generateLifecycleCallbackMethod($name, $methodName, $metadata)
 -     {
 -         if ($this->_hasMethod($methodName, $metadata)) {
 -             return;
 -         }
 -         $this->_staticReflection[$metadata->name]['methods'][] = $methodName;
 - 
 -         $replacements = array(
 -             '<name>'        => $this->_annotationsPrefix . $name,
 -             '<methodName>'  => $methodName,
 -         );
 - 
 -         $method = str_replace(
 -             array_keys($replacements),
 -             array_values($replacements),
 -             self::$_lifecycleCallbackMethodTemplate
 -         );
 - 
 -         return $this->_prefixCodeWithSpaces($method);
 -     }
 - 
 -     private function _generateJoinColumnAnnotation(array $joinColumn)
 -     {
 -         $joinColumnAnnot = array();
 - 
 -         if (isset($joinColumn['name'])) {
 -             $joinColumnAnnot[] = 'name="' . $joinColumn['name'] . '"';
 -         }
 - 
 -         if (isset($joinColumn['referencedColumnName'])) {
 -             $joinColumnAnnot[] = 'referencedColumnName="' . $joinColumn['referencedColumnName'] . '"';
 -         }
 - 
 -         if (isset($joinColumn['unique']) && $joinColumn['unique']) {
 -             $joinColumnAnnot[] = 'unique=' . ($joinColumn['unique'] ? 'true' : 'false');
 -         }
 - 
 -         if (isset($joinColumn['nullable'])) {
 -             $joinColumnAnnot[] = 'nullable=' . ($joinColumn['nullable'] ? 'true' : 'false');
 -         }
 - 
 -         if (isset($joinColumn['onDelete'])) {
 -             $joinColumnAnnot[] = 'onDelete="' . ($joinColumn['onDelete'] . '"');
 -         }
 - 
 -         if (isset($joinColumn['onUpdate'])) {
 -             $joinColumnAnnot[] = 'onUpdate=' . ($joinColumn['onUpdate'] ? 'true' : 'false');
 -         }
 - 
 -         if (isset($joinColumn['columnDefinition'])) {
 -             $joinColumnAnnot[] = 'columnDefinition="' . $joinColumn['columnDefinition'] . '"';
 -         }
 - 
 -         return '@' . $this->_annotationsPrefix . 'JoinColumn(' . implode(', ', $joinColumnAnnot) . ')';
 -     }
 - 
 -     private function _generateAssociationMappingPropertyDocBlock(array $associationMapping, ClassMetadataInfo $metadata)
 -     {
 -         $lines = array();
 -         $lines[] = $this->_spaces . '/**';
 -         $lines[] = $this->_spaces . ' * @var ' . $associationMapping['targetEntity'];
 - 
 -         if ($this->_generateAnnotations) {
 -             $lines[] = $this->_spaces . ' *';
 - 
 -             $type = null;
 -             switch ($associationMapping['type']) {
 -                 case ClassMetadataInfo::ONE_TO_ONE:
 -                     $type = 'OneToOne';
 -                     break;
 -                 case ClassMetadataInfo::MANY_TO_ONE:
 -                     $type = 'ManyToOne';
 -                     break;
 -                 case ClassMetadataInfo::ONE_TO_MANY:
 -                     $type = 'OneToMany';
 -                     break;
 -                 case ClassMetadataInfo::MANY_TO_MANY:
 -                     $type = 'ManyToMany';
 -                     break;
 -             }
 -             $typeOptions = array();
 - 
 -             if (isset($associationMapping['targetEntity'])) {
 -                 $typeOptions[] = 'targetEntity="' . $associationMapping['targetEntity'] . '"';
 -             }
 - 
 -             if (isset($associationMapping['inversedBy'])) {
 -                 $typeOptions[] = 'inversedBy="' . $associationMapping['inversedBy'] . '"';
 -             }
 - 
 -             if (isset($associationMapping['mappedBy'])) {
 -                 $typeOptions[] = 'mappedBy="' . $associationMapping['mappedBy'] . '"';
 -             }
 - 
 -             if ($associationMapping['cascade']) {
 -                 $cascades = array();
 - 
 -                 if ($associationMapping['isCascadePersist']) $cascades[] = '"persist"';
 -                 if ($associationMapping['isCascadeRemove']) $cascades[] = '"remove"';
 -                 if ($associationMapping['isCascadeDetach']) $cascades[] = '"detach"';
 -                 if ($associationMapping['isCascadeMerge']) $cascades[] = '"merge"';
 -                 if ($associationMapping['isCascadeRefresh']) $cascades[] = '"refresh"';
 - 
 -                 $typeOptions[] = 'cascade={' . implode(',', $cascades) . '}';
 -             }
 - 
 -             if (isset($associationMapping['orphanRemoval']) && $associationMapping['orphanRemoval']) {
 -                 $typeOptions[] = 'orphanRemoval=' . ($associationMapping['orphanRemoval'] ? 'true' : 'false');
 -             }
 - 
 -             $lines[] = $this->_spaces . ' * @' . $this->_annotationsPrefix . '' . $type . '(' . implode(', ', $typeOptions) . ')';
 - 
 -             if (isset($associationMapping['joinColumns']) && $associationMapping['joinColumns']) {
 -                 $lines[] = $this->_spaces . ' * @' . $this->_annotationsPrefix . 'JoinColumns({';
 - 
 -                 $joinColumnsLines = array();
 - 
 -                 foreach ($associationMapping['joinColumns'] as $joinColumn) {
 -                     if ($joinColumnAnnot = $this->_generateJoinColumnAnnotation($joinColumn)) {
 -                         $joinColumnsLines[] = $this->_spaces . ' *   ' . $joinColumnAnnot;
 -                     }
 -                 }
 - 
 -                 $lines[] = implode(",\n", $joinColumnsLines);
 -                 $lines[] = $this->_spaces . ' * })';
 -             }
 - 
 -             if (isset($associationMapping['joinTable']) && $associationMapping['joinTable']) {
 -                 $joinTable = array();
 -                 $joinTable[] = 'name="' . $associationMapping['joinTable']['name'] . '"';
 - 
 -                 if (isset($associationMapping['joinTable']['schema'])) {
 -                     $joinTable[] = 'schema="' . $associationMapping['joinTable']['schema'] . '"';
 -                 }
 - 
 -                 $lines[] = $this->_spaces . ' * @' . $this->_annotationsPrefix . 'JoinTable(' . implode(', ', $joinTable) . ',';
 -                 $lines[] = $this->_spaces . ' *   joinColumns={';
 - 
 -                 foreach ($associationMapping['joinTable']['joinColumns'] as $joinColumn) {
 -                     $lines[] = $this->_spaces . ' *     ' . $this->_generateJoinColumnAnnotation($joinColumn);
 -                 }
 - 
 -                 $lines[] = $this->_spaces . ' *   },';
 -                 $lines[] = $this->_spaces . ' *   inverseJoinColumns={';
 - 
 -                 foreach ($associationMapping['joinTable']['inverseJoinColumns'] as $joinColumn) {
 -                     $lines[] = $this->_spaces . ' *     ' . $this->_generateJoinColumnAnnotation($joinColumn);
 -                 }
 - 
 -                 $lines[] = $this->_spaces . ' *   }';
 -                 $lines[] = $this->_spaces . ' * )';
 -             }
 - 
 -             if (isset($associationMapping['orderBy'])) {
 -                 $lines[] = $this->_spaces . ' * @' . $this->_annotationsPrefix . 'OrderBy({';
 - 
 -                 foreach ($associationMapping['orderBy'] as $name => $direction) {
 -                     $lines[] = $this->_spaces . ' *     "' . $name . '"="' . $direction . '",';
 -                 }
 - 
 -                 $lines[count($lines) - 1] = substr($lines[count($lines) - 1], 0, strlen($lines[count($lines) - 1]) - 1);
 -                 $lines[] = $this->_spaces . ' * })';
 -             }
 -         }
 - 
 -         $lines[] = $this->_spaces . ' */';
 - 
 -         return implode("\n", $lines);
 -     }
 - 
 -     private function _generateFieldMappingPropertyDocBlock(array $fieldMapping, ClassMetadataInfo $metadata)
 -     {
 -         $lines = array();
 -         $lines[] = $this->_spaces . '/**';
 -         $lines[] = $this->_spaces . ' * @var ' . $fieldMapping['type'] . ' $' . $fieldMapping['fieldName'];
 - 
 -         if ($this->_generateAnnotations) {
 -             $lines[] = $this->_spaces . ' *';
 - 
 -             $column = array();
 -             if (isset($fieldMapping['columnName'])) {
 -                 $column[] = 'name="' . $fieldMapping['columnName'] . '"';
 -             }
 - 
 -             if (isset($fieldMapping['type'])) {
 -                 $column[] = 'type="' . $fieldMapping['type'] . '"';
 -             }
 - 
 -             if (isset($fieldMapping['length'])) {
 -                 $column[] = 'length=' . $fieldMapping['length'];
 -             }
 - 
 -             if (isset($fieldMapping['precision'])) {
 -                 $column[] = 'precision=' .  $fieldMapping['precision'];
 -             }
 - 
 -             if (isset($fieldMapping['scale'])) {
 -                 $column[] = 'scale=' . $fieldMapping['scale'];
 -             }
 - 
 -             if (isset($fieldMapping['nullable'])) {
 -                 $column[] = 'nullable=' .  var_export($fieldMapping['nullable'], true);
 -             }
 - 
 -             if (isset($fieldMapping['columnDefinition'])) {
 -                 $column[] = 'columnDefinition="' . $fieldMapping['columnDefinition'] . '"';
 -             }
 - 
 -             if (isset($fieldMapping['unique'])) {
 -                 $column[] = 'unique=' . var_export($fieldMapping['unique'], true);
 -             }
 - 
 -             $lines[] = $this->_spaces . ' * @' . $this->_annotationsPrefix . 'Column(' . implode(', ', $column) . ')';
 - 
 -             if (isset($fieldMapping['id']) && $fieldMapping['id']) {
 -                 $lines[] = $this->_spaces . ' * @' . $this->_annotationsPrefix . 'Id';
 - 
 -                 if ($generatorType = $this->_getIdGeneratorTypeString($metadata->generatorType)) {
 -                     $lines[] = $this->_spaces.' * @' . $this->_annotationsPrefix . 'GeneratedValue(strategy="' . $generatorType . '")';
 -                 }
 - 
 -                 if ($metadata->sequenceGeneratorDefinition) {
 -                     $sequenceGenerator = array();
 - 
 -                     if (isset($metadata->sequenceGeneratorDefinition['sequenceName'])) {
 -                         $sequenceGenerator[] = 'sequenceName="' . $metadata->sequenceGeneratorDefinition['sequenceName'] . '"';
 -                     }
 - 
 -                     if (isset($metadata->sequenceGeneratorDefinition['allocationSize'])) {
 -                         $sequenceGenerator[] = 'allocationSize="' . $metadata->sequenceGeneratorDefinition['allocationSize'] . '"';
 -                     }
 - 
 -                     if (isset($metadata->sequenceGeneratorDefinition['initialValue'])) {
 -                         $sequenceGenerator[] = 'initialValue="' . $metadata->sequenceGeneratorDefinition['initialValue'] . '"';
 -                     }
 - 
 -                     $lines[] = $this->_spaces . ' * @' . $this->_annotationsPrefix . 'SequenceGenerator(' . implode(', ', $sequenceGenerator) . ')';
 -                 }
 -             }
 - 
 -             if (isset($fieldMapping['version']) && $fieldMapping['version']) {
 -                 $lines[] = $this->_spaces . ' * @' . $this->_annotationsPrefix . 'Version';
 -             }
 -         }
 - 
 -         $lines[] = $this->_spaces . ' */';
 - 
 -         return implode("\n", $lines);
 -     }
 - 
 -     private function _prefixCodeWithSpaces($code, $num = 1)
 -     {
 -         $lines = explode("\n", $code);
 - 
 -         foreach ($lines as $key => $value) {
 -             $lines[$key] = str_repeat($this->_spaces, $num) . $lines[$key];
 -         }
 - 
 -         return implode("\n", $lines);
 -     }
 - 
 -     private function _getInheritanceTypeString($type)
 -     {
 -         switch ($type) {
 -             case ClassMetadataInfo::INHERITANCE_TYPE_NONE:
 -                 return 'NONE';
 - 
 -             case ClassMetadataInfo::INHERITANCE_TYPE_JOINED:
 -                 return 'JOINED';
 - 
 -             case ClassMetadataInfo::INHERITANCE_TYPE_SINGLE_TABLE:
 -                 return 'SINGLE_TABLE';
 - 
 -             case ClassMetadataInfo::INHERITANCE_TYPE_TABLE_PER_CLASS:
 -                 return 'PER_CLASS';
 - 
 -             default:
 -                 throw new \InvalidArgumentException('Invalid provided InheritanceType: ' . $type);
 -         }
 -     }
 - 
 -     private function _getChangeTrackingPolicyString($policy)
 -     {
 -         switch ($policy) {
 -             case ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT:
 -                 return 'DEFERRED_IMPLICIT';
 - 
 -             case ClassMetadataInfo::CHANGETRACKING_DEFERRED_EXPLICIT:
 -                 return 'DEFERRED_EXPLICIT';
 - 
 -             case ClassMetadataInfo::CHANGETRACKING_NOTIFY:
 -                 return 'NOTIFY';
 - 
 -             default:
 -                 throw new \InvalidArgumentException('Invalid provided ChangeTrackingPolicy: ' . $policy);
 -         }
 -     }
 - 
 -     private function _getIdGeneratorTypeString($type)
 -     {
 -         switch ($type) {
 -             case ClassMetadataInfo::GENERATOR_TYPE_AUTO:
 -                 return 'AUTO';
 - 
 -             case ClassMetadataInfo::GENERATOR_TYPE_SEQUENCE:
 -                 return 'SEQUENCE';
 - 
 -             case ClassMetadataInfo::GENERATOR_TYPE_TABLE:
 -                 return 'TABLE';
 - 
 -             case ClassMetadataInfo::GENERATOR_TYPE_IDENTITY:
 -                 return 'IDENTITY';
 - 
 -             case ClassMetadataInfo::GENERATOR_TYPE_NONE:
 -                 return 'NONE';
 - 
 -             default:
 -                 throw new \InvalidArgumentException('Invalid provided IdGeneratorType: ' . $type);
 -         }
 -     }
 - }
 
 
  |