/**
  * @param string $assetHandle
  * @param array $assetSourceDefinition
  * @return AssetSourceModel
  */
 private function populateAssetSource($assetHandle, array $assetSourceDefinition)
 {
     $assetSource = $sourceRecord = AssetSourceRecord::model()->findByAttributes(['handle' => $assetHandle]);
     $assetSource = $assetSource ? AssetSourceModel::populateModel($assetSource) : new AssetSourceModel();
     $assetSource->setAttributes(array('handle' => $assetHandle, 'type' => $assetSourceDefinition['type'], 'name' => $assetSourceDefinition['name'], 'sortOrder' => $assetSourceDefinition['sortOrder'], 'settings' => $assetSourceDefinition['settings']));
     return $assetSource;
 }
 /**
  * Gets an asset source by its ID.
  *
  * @param int $sourceId
  * @return AssetSourceModel|null
  */
 public function getSourceById($sourceId)
 {
     $sourceRecord = AssetSourceRecord::model()->findById($sourceId);
     if ($sourceRecord) {
         return AssetSourceModel::populateModel($sourceRecord);
     }
 }
 /**
  * Saves an asset source.
  *
  * @param AssetSourceModel $source
  *
  * @throws \Exception
  * @return bool
  */
 public function saveSource(AssetSourceModel $source)
 {
     $sourceRecord = $this->_getSourceRecordById($source->id);
     $isNewSource = $sourceRecord->isNewRecord();
     if (!$isNewSource) {
         $oldSource = AssetSourceModel::populateModel($sourceRecord);
     }
     $sourceRecord->name = $source->name;
     $sourceRecord->handle = $source->handle;
     $sourceRecord->type = $source->type;
     $sourceRecord->fieldLayoutId = $source->fieldLayoutId;
     $sourceType = $this->populateSourceType($source);
     $processedSettings = $sourceType->prepSettings($source->settings);
     $sourceRecord->settings = $source->settings = $processedSettings;
     $sourceType->setSettings($processedSettings);
     $recordValidates = $sourceRecord->validate();
     $settingsValidate = $sourceType->getSettings()->validate();
     $sourceErrors = $sourceType->getSourceErrors();
     if ($recordValidates && $settingsValidate && empty($sourceErrors)) {
         $transaction = craft()->db->getCurrentTransaction() === null ? craft()->db->beginTransaction() : null;
         try {
             if ($isNewSource) {
                 // Set the sort order
                 $maxSortOrder = craft()->db->createCommand()->select('max(sortOrder)')->from('assetsources')->queryScalar();
                 $sourceRecord->sortOrder = $maxSortOrder + 1;
             }
             if (!$isNewSource && $oldSource->fieldLayoutId) {
                 // Drop the old field layout
                 craft()->fields->deleteLayoutById($oldSource->fieldLayoutId);
             }
             // Save the new one
             $fieldLayout = $source->getFieldLayout();
             craft()->fields->saveLayout($fieldLayout);
             // Update the source record/model with the new layout ID
             $source->fieldLayoutId = $fieldLayout->id;
             $sourceRecord->fieldLayoutId = $fieldLayout->id;
             // Save the source
             $sourceRecord->save(false);
             if ($isNewSource) {
                 // Now that we have a source ID, save it on the model
                 $source->id = $sourceRecord->id;
             } else {
                 // Update the top folder's name with the source's new name
                 $topFolder = craft()->assets->findFolder(array('sourceId' => $source->id, 'parentId' => ':empty:'));
                 if ($topFolder->name != $source->name) {
                     $topFolder->name = $source->name;
                     craft()->assets->storeFolder($topFolder);
                 }
             }
             craft()->assetIndexing->ensureTopFolder($source);
             if ($transaction !== null) {
                 $transaction->commit();
             }
         } catch (\Exception $e) {
             if ($transaction !== null) {
                 $transaction->rollback();
             }
             throw $e;
         }
         if ($isNewSource && $this->_fetchedAllSources) {
             $this->_sourcesById[$source->id] = $source;
         }
         if (isset($this->_viewableSourceIds)) {
             if (craft()->userSession->checkPermission('viewAssetSource:' . $source->id)) {
                 $this->_viewableSourceIds[] = $source->id;
             }
         }
         return true;
     } else {
         $source->addErrors($sourceRecord->getErrors());
         $source->addSettingErrors($sourceType->getSettings()->getErrors());
         $source->addSettingErrors($sourceErrors);
         return false;
     }
 }