/**
  * @see Form::execute()
  */
 function execute()
 {
     $ofrPlugin =& PluginRegistry::getPlugin('generic', $this->parentPluginName);
     $journal =& Request::getJournal();
     $journalId = $journal->getId();
     $ofrPlugin->import('classes.ReviewObjectType');
     $reviewObjectTypeDao =& DAORegistry::getDAO('ReviewObjectTypeDAO');
     if ($this->reviewObjectType == null) {
         $reviewObjectType = $reviewObjectTypeDao->newDataObject();
         $reviewObjectType->setContextId($journalId);
         $reviewObjectType->setActive(0);
     } else {
         $reviewObjectType =& $this->reviewObjectType;
     }
     $reviewObjectType->setName($this->getData('name'), null);
     // Localized
     $reviewObjectType->setDescription($this->getData('description'), null);
     // Localized
     if ($reviewObjectType->getId() != null) {
         $reviewObjectTypeDao->updateObject($reviewObjectType);
     } else {
         //install common metadata
         $ofrPlugin->import('classes.ReviewObjectMetadata');
         $multipleOptionsTypes = ReviewObjectMetadata::getMultipleOptionsTypes();
         $dtdTypes = ReviewObjectMetadata::getMetadataDTDTypes();
         $reviewObjectMetadataDao =& DAORegistry::getDAO('ReviewObjectMetadataDAO');
         $reviewObjectMetadataArray = array();
         $availableLocales = $journal->getSupportedLocaleNames();
         foreach ($availableLocales as $locale => $localeName) {
             $xmlDao = new XMLDAO();
             $commonDataPath = $ofrPlugin->getPluginPath() . DIRECTORY_SEPARATOR . 'xml' . DIRECTORY_SEPARATOR . 'commonMetadata.xml';
             $commonData = $xmlDao->parse($commonDataPath);
             $commonMetadata = $commonData->getChildByName('objectMetadata');
             foreach ($commonMetadata->getChildren() as $metadataNode) {
                 $key = $metadataNode->getAttribute('key');
                 if (array_key_exists($key, $reviewObjectMetadataArray)) {
                     $reviewObjectMetadata = $reviewObjectMetadataArray[$key];
                 } else {
                     $reviewObjectMetadata = $reviewObjectMetadataDao->newDataObject();
                     $reviewObjectMetadata->setSequence(REALLY_BIG_NUMBER);
                     $metadataType = $dtdTypes[$metadataNode->getAttribute('type')];
                     $reviewObjectMetadata->setMetadataType($metadataType);
                     $required = $metadataNode->getAttribute('required');
                     $reviewObjectMetadata->setRequired($required == 'true' ? 1 : 0);
                     $display = $metadataNode->getAttribute('display');
                     $reviewObjectMetadata->setDisplay($display == 'true' ? 1 : 0);
                 }
                 $name = __($metadataNode->getChildValue('name'), array(), $locale);
                 $reviewObjectMetadata->setName($name, $locale);
                 if ($key == 'role') {
                     $reviewObjectMetadata->setPossibleOptions($this->getData('possibleOptions'), null);
                     // Localized
                 } else {
                     if (in_array($reviewObjectMetadata->getMetadataType(), $multipleOptionsTypes)) {
                         $selectionOptions = $metadataNode->getChildByName('selectionOptions');
                         $possibleOptions = array();
                         $index = 1;
                         foreach ($selectionOptions->getChildren() as $selectionOptionNode) {
                             $possibleOptions[] = array('order' => $index, 'content' => __($selectionOptionNode->getValue(), array(), $locale));
                             $index++;
                         }
                         $reviewObjectMetadata->setPossibleOptions($possibleOptions, $locale);
                     } else {
                         $reviewObjectMetadata->setPossibleOptions(null, null);
                     }
                 }
                 $reviewObjectMetadataArray[$key] = $reviewObjectMetadata;
             }
         }
         $reviewObjectTypeId = $reviewObjectTypeDao->insertObject($reviewObjectType);
         // insert review object metadata
         foreach ($reviewObjectMetadataArray as $key => $reviewObjectMetadata) {
             $reviewObjectMetadata->setReviewObjectTypeId($reviewObjectTypeId);
             $reviewObjectMetadata->setKey($key);
             $reviewObjectMetadataDao->insertObject($reviewObjectMetadata);
             $reviewObjectMetadataDao->resequence($reviewObjectTypeId);
         }
     }
 }
 /**
  * Update or install review objects
  * @param $journal Journal
  * @param $reviewObjects array of review object types keys or ids
  * @param $locales array of locales
  * @param $action string (install or update)
  */
 function _updateOrInstallReviewObjectTypes($journal, $reviewObjects, $locales, $action)
 {
     $plugin =& $this->_getObjectsForReviewPlugin();
     if (!isset($journal) || !isset($reviewObjects) || !isset($locales) || !isset($action)) {
         return false;
     }
     $journalId = $journal->getId();
     $plugin->import('classes.ReviewObjectType');
     $plugin->import('classes.ReviewObjectMetadata');
     $reviewObjectTypeDao =& DAORegistry::getDAO('ReviewObjectTypeDAO');
     $reviewObjectMetadataDao =& DAORegistry::getDAO('ReviewObjectMetadataDAO');
     $onlyCommonMetadata = false;
     foreach ($reviewObjects as $keyOrId) {
         if ($action == 'install') {
             // Create a new review object type
             $reviewObjectType = $reviewObjectTypeDao->newDataObject();
             $reviewObjectType->setContextId($journalId);
             $reviewObjectType->setActive(0);
             $reviewObjectType->setKey($keyOrId);
         } elseif ($action == 'update') {
             // Get the review object type
             $reviewObjectType =& $reviewObjectTypeDao->getById($keyOrId, $journalId);
             if (!isset($reviewObjectType)) {
                 return false;
             }
             // If the type was created by the user, update only the common metadata
             if ($reviewObjectType->getKey() == NULL) {
                 $onlyCommonMetadata = true;
             }
         }
         // Callect the metadata in the array
         $reviewObjectMetadataArray = array();
         // For all languages
         foreach ($locales as $locale) {
             // Register the locale/translation file
             $localePath = $plugin->getPluginPath() . '/locale/' . $locale . '/locale.xml';
             AppLocale::registerLocaleFile($locale, $localePath, true);
             $xmlDao = new XMLDAO();
             // Get common metadata
             $commonDataPath = $plugin->getPluginPath() . '/xml/commonMetadata.xml';
             $commonData = $xmlDao->parse($commonDataPath);
             $commonMetadata = $commonData->getChildByName('objectMetadata');
             $allMetadataChildren = $commonMetadata->getChildren();
             // Get the object metadata
             if (!$onlyCommonMetadata) {
                 // Parse the review object XML file
                 $itemPath = $plugin->getPluginPath() . '/xml/reviewObjects/' . $reviewObjectType->getKey() . '.xml';
                 $data = $xmlDao->parse($itemPath);
                 if (!$data) {
                     return false;
                 }
                 // Set the review object name
                 $itemTypeName = __($data->getChildValue('objectType'), array(), $locale);
                 $reviewObjectType->setName($itemTypeName, $locale);
                 // $reviewObjectType->setDescription($itemTypeNameDescription, $locale);
                 // Get the review object role selection options
                 $roleSelectionOptions = $data->getChildByName('roleSelectionOptions');
                 // Handle Metadata
                 // Get multiple options metadata types
                 $multipleOptionsTypes = ReviewObjectMetadata::getMultipleOptionsTypes();
                 // Get metadata types defined in DTD
                 $dtdTypes = ReviewObjectMetadata::getMetadataDTDTypes();
                 // Get the review object metadata
                 $itemMetadata = $data->getChildByName('objectMetadata');
                 // Merge all (common + review objec) metadata
                 $allMetadataChildren = array_merge($commonMetadata->getChildren(), $itemMetadata->getChildren());
             }
             // Go through the metadata
             foreach ($allMetadataChildren as $metadataNode) {
                 $key = $metadataNode->getAttribute('key');
                 // If we have already went througt, collected/considered the metadata
                 if (array_key_exists($key, $reviewObjectMetadataArray)) {
                     $reviewObjectMetadata = $reviewObjectMetadataArray[$key];
                 } else {
                     if ($action == 'update') {
                         // Get the metadata
                         $reviewObjectMetadata = $reviewObjectMetadataDao->getByKey($key, $reviewObjectType->getId());
                     }
                     if ($action == 'install' || !isset($reviewObjectMetadata)) {
                         // Create a new metadata
                         $reviewObjectMetadata = $reviewObjectMetadataDao->newDataObject();
                         $reviewObjectMetadata->setSequence(REALLY_BIG_NUMBER);
                         $metadataType = $dtdTypes[$metadataNode->getAttribute('type')];
                         $reviewObjectMetadata->setMetadataType($metadataType);
                         $required = $metadataNode->getAttribute('required');
                         $reviewObjectMetadata->setRequired($required == 'true' ? 1 : 0);
                         $display = $metadataNode->getAttribute('display');
                         $reviewObjectMetadata->setDisplay($display == 'true' ? 1 : 0);
                     }
                 }
                 // Set metadata name
                 $name = __($metadataNode->getChildValue('name'), array(), $locale);
                 $reviewObjectMetadata->setName($name, $locale);
                 // Set roles options
                 if ($key == REVIEW_OBJECT_METADATA_KEY_ROLE) {
                     if (!$onlyCommonMetadata) {
                         $possibleOptions = array();
                         $index = 1;
                         foreach ($roleSelectionOptions->getChildren() as $selectionOptionNode) {
                             $possibleOptions[] = array('order' => $index, 'content' => __($selectionOptionNode->getValue(), array(), $locale));
                             $index++;
                         }
                         $reviewObjectMetadata->setPossibleOptions($possibleOptions, $locale);
                     }
                 } else {
                     // Set possible options for multiple options metadata type
                     if (in_array($reviewObjectMetadata->getMetadataType(), $multipleOptionsTypes)) {
                         $selectionOptions = $metadataNode->getChildByName('selectionOptions');
                         $possibleOptions = array();
                         $index = 1;
                         foreach ($selectionOptions->getChildren() as $selectionOptionNode) {
                             $possibleOptions[] = array('order' => $index, 'content' => __($selectionOptionNode->getValue(), array(), $locale));
                             $index++;
                         }
                         $reviewObjectMetadata->setPossibleOptions($possibleOptions, $locale);
                     } else {
                         $reviewObjectMetadata->setPossibleOptions(null, null);
                     }
                 }
                 // Collect/consider the metadata
                 $reviewObjectMetadataArray[$key] = $reviewObjectMetadata;
                 unset($reviewObjectMetadata);
             }
             // End foreach metadata
         }
         // End foreach locales
         // Insert resp. update the review object type
         if ($action == 'install') {
             $reviewObjectTypeId = $reviewObjectTypeDao->insertObject($reviewObjectType);
         } elseif ($action == 'update') {
             $reviewObjectTypeDao->updateObject($reviewObjectType);
         }
         // Insert resp. update review object metadata
         foreach ($reviewObjectMetadataArray as $key => $reviewObjectMetadata) {
             // if this is a new metadata insert it
             if ($reviewObjectMetadata->getKey() == '') {
                 $reviewObjectMetadata->setKey($key);
                 $reviewObjectMetadata->setReviewObjectTypeId($reviewObjectType->getId());
                 $reviewObjectMetadataDao->insertObject($reviewObjectMetadata);
                 $reviewObjectMetadataDao->resequence($reviewObjectType->getId());
             } else {
                 $reviewObjectMetadataDao->updateObject($reviewObjectMetadata);
             }
         }
         unset($reviewObjectType);
     }
     // End foreach review objects
 }