/**
  * @param string $controllerName
  * @param array $actionNames
  * @param string $label related plugin or module
  * @param Tx_ExtensionBuilder_Domain_Model_Extension $extension
  * @param boolean $firstControllerAction
  * @return void
  */
 private function validateActionConfiguration($controllerName, $actionNames, $label, $extension, $firstControllerAction = FALSE)
 {
     if ($firstControllerAction) {
         // the first Controller action config is the default Controller action
         // we show a warning if that's an action that requires a domain object as parameter
         $defaultAction = reset($actionNames);
         //t3lib_div::devlog('Invalid action configuration:'.$defaultAction, 'extension_builder', 1, array($controllerName, $actionNames));
         if (in_array($defaultAction, array('show', 'edit'))) {
             t3lib_div::devlog('Invalid action configurations', 'extension_builder', 1, array($controllerName, $actionNames));
             $this->validationResult['warnings'][] = new Tx_ExtensionBuilder_Domain_Exception_ExtensionException('Potential misconfiguration in ' . $label . ':<br />Default action ' . $controllerName . '->' . $defaultAction . '  can not be called without a domain object parameter', self::ERROR_MISCONFIGURATION);
         }
     }
     $relatedDomainObject = $extension->getDomainObjectByName($controllerName);
     if (!$relatedDomainObject) {
         $this->validationResult['warnings'][] = new Tx_ExtensionBuilder_Domain_Exception_ExtensionException('Potential misconfiguration in ' . $label . ':<br />Controller ' . $controllerName . ' has no related Domain Object', self::ERROR_MISCONFIGURATION);
     } else {
         $existingActions = $relatedDomainObject->getActions();
         $existingActionNames = array();
         foreach ($existingActions as $existingAction) {
             $existingActionNames[] = $existingAction->getName();
         }
         foreach ($actionNames as $actionName) {
             if (!in_array($actionName, $existingActionNames)) {
                 $this->validationResult['warnings'][] = new Tx_ExtensionBuilder_Domain_Exception_ExtensionException('Potential misconfiguration in ' . $label . ':<br />Controller ' . $controllerName . ' has no action named ' . $actionName, self::ERROR_MISCONFIGURATION);
             }
         }
     }
 }
 /**
  * @param array $extensionBuildConfiguration
  * @param Tx_ExtensionBuilder_Domain_Model_Extension $extension
  * @throws Exception
  */
 protected function setExtensionRelations($extensionBuildConfiguration, &$extension)
 {
     $existingRelations = array();
     foreach ($extensionBuildConfiguration['wires'] as $wire) {
         if ($wire['tgt']['terminal'] !== 'SOURCES') {
             if ($wire['src']['terminal'] == 'SOURCES') {
                 // this happens if a relation wire was drawn from child to parent
                 // swap the two arrays
                 $tgtModuleId = $wire['src']['moduleId'];
                 $wire['src'] = $wire['tgt'];
                 $wire['tgt'] = array('moduleId' => $tgtModuleId, 'terminal' => 'SOURCES');
             } else {
                 throw new Exception('A wire has always to connect a relation with a model, not with another relation');
             }
         }
         $srcModuleId = $wire['src']['moduleId'];
         $relationId = substr($wire['src']['terminal'], 13);
         // strip "relationWire_"
         $relationJsonConfiguration = $extensionBuildConfiguration['modules'][$srcModuleId]['value']['relationGroup']['relations'][$relationId];
         if (!is_array($relationJsonConfiguration)) {
             t3lib_div::devlog('Error in JSON relation configuration!', 'extension_builder', 3, $extensionBuildConfiguration);
             $errorMessage = 'Missing relation config in domain object: ' . $extensionBuildConfiguration['modules'][$srcModuleId]['value']['name'];
             throw new Exception($errorMessage);
         }
         $foreignModelName = $extensionBuildConfiguration['modules'][$wire['tgt']['moduleId']]['value']['name'];
         $localModelName = $extensionBuildConfiguration['modules'][$wire['src']['moduleId']]['value']['name'];
         //$relation = $this->objectSchemaBuilder->buildRelation($relationJsonConfiguration);
         if (!isset($existingRelations[$localModelName])) {
             $existingRelations[$localModelName] = array();
         }
         $domainObject = $extension->getDomainObjectByName($localModelName);
         $relation = $domainObject->getPropertyByName($relationJsonConfiguration['relationName']);
         if (!$relation) {
             t3lib_div::devlog('Relation not found: ' . $localModelName . '->' . $relationJsonConfiguration['relationName'], 'extension_builder', 2, $relationJsonConfiguration);
             throw new Exception('Relation not found: ' . $localModelName . '->' . $relationJsonConfiguration['relationName']);
         }
         // get unique foreign key names for multiple relations to the same foreign class
         if (in_array($foreignModelName, $existingRelations[$localModelName])) {
             if (is_a($relation, Tx_ExtensionBuilder_Domain_Model_DomainObject_Relation_ZeroToManyRelation)) {
                 $relation->setForeignKeyName(strtolower($localModelName) . count($existingRelations[$localModelName]));
             }
             if (is_a($relation, Tx_ExtensionBuilder_Domain_Model_DomainObject_Relation_AnyToManyRelation)) {
                 $relation->setUseExtendedRelationTableName(TRUE);
             }
         }
         $existingRelations[$localModelName][] = $foreignModelName;
         $relation->setForeignModel($extension->getDomainObjectByName($foreignModelName));
     }
 }