/**
  *
  * @param array $extensionBuildConfiguration
  * @return Tx_ExtensionBuilder_Domain_Model_Extension $extension
  */
 public function build(array $extensionBuildConfiguration)
 {
     $extension = t3lib_div::makeInstance('Tx_ExtensionBuilder_Domain_Model_Extension');
     $globalProperties = $extensionBuildConfiguration['properties'];
     if (!is_array($globalProperties)) {
         t3lib_div::devlog('Error: Extension properties not submitted! ' . $extension->getOriginalExtensionKey(), 'builder', 3, $globalProperties);
         throw new Exception('Extension properties not submitted!');
     }
     $this->setExtensionProperties($extension, $globalProperties);
     foreach ($globalProperties['persons'] as $personValues) {
         $person = $this->buildPerson($personValues);
         $extension->addPerson($person);
     }
     foreach ($globalProperties['plugins'] as $pluginValues) {
         $plugin = $this->buildPlugin($pluginValues);
         $extension->addPlugin($plugin);
     }
     foreach ($globalProperties['backendModules'] as $backendModuleValues) {
         $backendModule = $this->buildBackendModule($backendModuleValues);
         $extension->addBackendModule($backendModule);
     }
     // classes
     if (is_array($extensionBuildConfiguration['modules'])) {
         foreach ($extensionBuildConfiguration['modules'] as $singleModule) {
             $domainObject = $this->objectSchemaBuilder->build($singleModule['value']);
             if ($domainObject->isSubClass() && !$domainObject->isMappedToExistingTable()) {
                 // we try to get the table from Extbase configuration
                 $classSettings = $this->configurationManager->getExtbaseClassConfiguration($domainObject->getParentClass());
                 //t3lib_div::devlog('!isMappedToExistingTable:' . strtolower($domainObject->getParentClass()), 'extension_builder', 0, $classSettings);
                 if (isset($classSettings['tableName'])) {
                     $tableName = $classSettings['tableName'];
                 } else {
                     // we use the default table name
                     $tableName = strtolower($domainObject->getParentClass());
                 }
                 if (!isset($GLOBALS['TCA'][$tableName])) {
                     throw new Exception('Table definitions for table ' . $tableName . ' could not be loaded. You can only map to tables with existing TCA or extend classes of installed extensions!');
                 }
                 $domainObject->setMapToTable($tableName);
             }
             $extension->addDomainObject($domainObject);
         }
         $classHierarchy = $extension->getClassHierarchy();
         foreach ($extension->getDomainObjects() as $domainObject) {
             if (isset($classHierarchy[$domainObject->getClassName()])) {
                 foreach ($classHierarchy[$domainObject->getClassName()] as $directChild) {
                     $domainObject->addChildObject($directChild);
                 }
             }
         }
     }
     // relations
     if (is_array($extensionBuildConfiguration['wires'])) {
         $this->setExtensionRelations($extensionBuildConfiguration, $extension);
     }
     return $extension;
 }
 /**
  * Write a simple model class for a non aggregate root domain obbject
  * @test
  */
 function relatedMethodsReflectRenamingARelatedModel()
 {
     $modelName = 'Model8';
     $this->generateInitialModelClassFile($modelName);
     // create an "old" domainObject
     $domainObject = $this->buildDomainObject($modelName);
     $this->assertTrue(is_object($domainObject), 'No domain object');
     $relationJsonConfiguration = array('lazyLoading' => 0, 'propertyIsExcludeField' => 1, 'relationDescription' => '', 'relationName' => 'children', 'relationType' => 'manyToMany');
     $relation = Tx_ExtensionBuilder_Service_ObjectSchemaBuilder::buildRelation($relationJsonConfiguration);
     $uniqueIdentifier1 = md5(microtime() . 'children');
     $relation->setUniqueIdentifier($uniqueIdentifier1);
     $relation->setForeignModel($this->buildDomainObject('ChildModel'));
     $domainObject->addProperty($relation);
     $uniqueIdentifier2 = md5(microtime() . 'Model8');
     $domainObject->setUniqueIdentifier($uniqueIdentifier2);
     $this->roundTripService->_set('oldDomainObjects', array($domainObject->getUniqueIdentifier() => $domainObject));
     // create an "old" class object.
     $modelClassObject = $this->classBuilder->generateModelClassObject($domainObject);
     $this->assertTrue(is_object($modelClassObject), 'No class object');
     // Check that the property related methods exist
     $this->assertTrue($modelClassObject->methodExists('setChildren'));
     $this->assertTrue($modelClassObject->methodExists('getChildren'));
     $this->assertTrue($modelClassObject->methodExists('addChild'));
     $this->assertTrue($modelClassObject->methodExists('removeChild'));
     // set the class object manually, this is usually parsed from an existing class file
     $this->roundTripService->_set('classObject', $modelClassObject);
     // build a new domain object with the same unique identifiers
     $newDomainObject = $this->buildDomainObject('Model8');
     $newRelation = Tx_ExtensionBuilder_Service_ObjectSchemaBuilder::buildRelation($relationJsonConfiguration);
     $newRelation->setUniqueIdentifier($uniqueIdentifier1);
     $newRelation->setForeignModel($this->buildDomainObject('RenamedModel'));
     $newRelation->setName('children');
     $newDomainObject->addProperty($newRelation);
     $newDomainObject->setUniqueIdentifier($uniqueIdentifier2);
     // now the slass object should be updated
     $this->roundTripService->_call('updateModelClassProperties', $domainObject, $newDomainObject);
     $modifiedModelClassObject = $this->roundTripService->_get('classObject');
     $newAddMethod = $modifiedModelClassObject->getMethod('addChild');
     $parameters = $newAddMethod->getParameters();
     $this->assertEquals(count($parameters), 1);
     $addParameter = current($parameters);
     $this->assertEquals($addParameter->getTypeHint(), 'Tx_Dummy_Domain_Model_RenamedModel');
     $newRemoveMethod = $modifiedModelClassObject->getMethod('removeChild');
     $parameters = $newRemoveMethod->getParameters();
     $this->assertEquals(count($parameters), 1);
     $addParameter = current($parameters);
     $this->assertEquals($addParameter->getTypeHint(), 'Tx_Dummy_Domain_Model_RenamedModel');
 }