/** * This method is the main part of the roundtrip functionality * It looks for a previous version of the current domain object and * parses the existing class file for that domain model * compares all properties and methods with the previous version. * * Methods are either removed/added or updated according to the new property names * * @param Tx_ExtensionBuilder_Domain_Model_DomainObject $domainObject The new domain object * * @return Tx_ExtensionBuilder_Domain_Model_Class OR NULL */ public function getDomainModelClass(Tx_ExtensionBuilder_Domain_Model_DomainObject $currentDomainObject) { if (isset($this->oldDomainObjects[$currentDomainObject->getUniqueIdentifier()])) { t3lib_div::devlog('domainObject identified:' . $currentDomainObject->getName(), 'extension_builder', 0); $oldDomainObject = $this->oldDomainObjects[$currentDomainObject->getUniqueIdentifier()]; $extensionDir = $this->previousExtensionDirectory; $fileName = Tx_ExtensionBuilder_Service_CodeGenerator::getFolderForClassFile($extensionDir, 'Model', FALSE) . $oldDomainObject->getName() . '.php'; if (file_exists($fileName)) { // import the classObject from the existing file include_once $fileName; $className = $oldDomainObject->getClassName(); $this->classObject = $this->classParser->parse($className); //t3lib_div::devlog('Model class methods','extension_builder',0,$this->classObject->getMethods()); if ($oldDomainObject->getName() != $currentDomainObject->getName() || $this->extensionRenamed) { if (!$this->extensionRenamed) { t3lib_div::devlog('domainObject renamed. old: ' . $oldDomainObject->getName() . ' new: ' . $currentDomainObject->getName(), 'extension_builder'); } $newClassName = $currentDomainObject->getClassName(); $this->classObject->setName($newClassName); $this->classObject->setFileName($currentDomainObject->getName() . '.php'); $this->cleanUp(Tx_ExtensionBuilder_Service_CodeGenerator::getFolderForClassFile($extensionDir, 'Model'), $oldDomainObject->getName() . '.php'); $this->cleanUp($extensionDir . 'Configuration/TCA/', $oldDomainObject->getName() . '.php'); } $this->updateModelClassProperties($oldDomainObject, $currentDomainObject); $newActions = array(); foreach ($currentDomainObject->getActions() as $newAction) { $newActions[$newAction->getName()] = $newAction; } $oldActions = $oldDomainObject->getActions(); if (empty($newActions) && !$currentDomainObject->isAggregateRoot() && (!empty($oldActions) || $oldDomainObject->isAggregateRoot())) { // remove the controller $this->cleanUp(Tx_ExtensionBuilder_Service_CodeGenerator::getFolderForClassFile($extensionDir, 'Controller'), $oldDomainObject->getName() . 'Controller.php'); } // the parent class settings configuration $parentClass = $currentDomainObject->getParentClass(); $oldParentClass = $oldDomainObject->getParentClass(); if (!empty($parentClass)) { if ($oldParentClass != $parentClass) { // the parent class was just new added $this->classObject->setParentClass($parentClass); } } else { if (!empty($oldParentClass)) { // the old object had a parent class setting, but it's removed now if ($currentDomainObject->isEntity()) { $parentClass = $this->configurationManager->getParentClassForEntityObject($this->extension->getExtensionKey()); } else { $parentClass = $this->configurationManager->getParentClassForValueObject($this->extension->getExtensionKey()); } $this->classObject->setParentClass($parentClass); } } if ($currentDomainObject->isEntity() && !$oldDomainObject->isEntity()) { // the object type was changed in the modeler $this->classObject->setParentClass($this->configurationManager->getParentClassForEntityObject($this->extension->getExtensionKey())); } elseif (!$currentDomainObject->isEntity() && $oldDomainObject->isEntity()) { // the object type was changed in the modeler $this->classObject->setParentClass($this->configurationManager->getParentClassForValueObject($this->extension->getExtensionKey())); } return $this->classObject; } else { t3lib_div::devLog('class file didn\'t exist:' . $fileName, 'extension_builder', 0); } } else { t3lib_div::devlog('domainObject not identified:' . $currentDomainObject->getName(), 'extension_builder', 0, $this->oldDomainObjects); $fileName = Tx_ExtensionBuilder_Service_CodeGenerator::getFolderForClassFile($this->extensionDirectory, 'Model', FALSE) . $currentDomainObject->getName() . '.php'; if (file_exists($fileName)) { // import the classObject from the existing file include_once $fileName; $className = $currentDomainObject->getClassName(); $this->classObject = $this->classParser->parse($className); t3lib_div::devLog('class file found:' . $currentDomainObject->getName() . '.php', 'extension_builder', 0, (array) $this->classObject->getAnnotations()); return $this->classObject; } } return NULL; }
/** * This method generates the class schema object, which is passed to the template * it keeps all methods and properties including user modified method bodies and comments * needed to create a domain object class file * * @param Tx_ExtensionBuilder_Domain_Model_DomainObject $domainObject * @param boolean mergeWithExistingClass * * @return Tx_ExtensionBuilder_Domain_Model_Class_Class */ public function generateModelClassObject($domainObject, $mergeWithExistingClass) { t3lib_div::devlog('------------------------------------- generateModelClassObject(' . $domainObject->getName() . ') ---------------------------------', 'extension_builder', 0); $this->classObject = NULL; // reference to the resulting class file, $className = $domainObject->getClassName(); if ($mergeWithExistingClass) { try { $this->classObject = $this->roundTripService->getDomainModelClass($domainObject); } catch (Exception $e) { t3lib_div::devLog('Class ' . $className . ' could not be imported: ' . $e->getMessage(), 'extension_builder', 2); } } if ($this->classObject == NULL) { $this->classObject = new Tx_ExtensionBuilder_Domain_Model_Class_Class($className); if ($domainObject->isEntity()) { $parentClass = $domainObject->getParentClass(); if (empty($parentClass)) { $parentClass = $this->configurationManager->getParentClassForEntityObject($this->extension->getExtensionKey()); } } else { $parentClass = $this->configurationManager->getParentClassForValueObject($this->extension->getExtensionKey()); } $this->classObject->setParentClass($parentClass); } if (!$this->classObject->hasDescription()) { $this->classObject->setDescription($domainObject->getDescription()); } $this->addInitStorageObjectCalls($domainObject); //TODO the following part still needs some enhancement: //what should be obligatory in existing properties and methods foreach ($domainObject->getProperties() as $domainProperty) { $propertyName = $domainProperty->getName(); // add the property to class Object (or update an existing class Object property) if ($this->classObject->propertyExists($propertyName)) { $classProperty = $this->classObject->getProperty($propertyName); //$classPropertyTags = $classProperty->getTags(); //t3lib_div::devLog('Property found: ' . $propertyName . ':' . $domainProperty->getTypeForComment(), 'extension_builder', 1, (array)$classProperty); } else { $classProperty = new Tx_ExtensionBuilder_Domain_Model_Class_Property($propertyName); $classProperty->setTag('var', $domainProperty->getTypeForComment()); $classProperty->addModifier('protected'); //t3lib_div::devLog('New property: ' . $propertyName . ':' . $domainProperty->getTypeForComment(), 'extension_builder', 1); } $classProperty->setAssociatedDomainObjectProperty($domainProperty); if ($domainProperty->getRequired()) { if (!$classProperty->isTaggedWith('validate')) { $validateTag = explode(' ', trim($domainProperty->getValidateAnnotation())); $classProperty->setTag('validate', $validateTag[1]); } } if ($domainProperty->isRelation() && $domainProperty->getLazyLoading()) { if (!$classProperty->isTaggedWith('lazy')) { $classProperty->setTag('lazy', ''); } } if ($domainProperty->getHasDefaultValue()) { $classProperty->setDefault($domainProperty->getDefaultValue()); } $this->classObject->setProperty($classProperty); if ($domainProperty->isNew()) { $this->setPropertyRelatedMethods($domainProperty); } } //t3lib_div::devlog('Methods before sorting','extension_builder',0,array_keys($this->classObject->getMethods())); //$this->sortMethods($domainObject); return $this->classObject; }