protected function loadMetaData(AbstractDataProvider $dataProvider, array $dataSubmitters = NULL) { $dataProvider->startReading(); $columnNames = $this->parseNextRecord($dataProvider, $dataSubmitters); if ($this->isHeaderPresent) { $dataProvider->endReading(); if (!isset($columnNames)) { throw new IllegalStateException(t('Upload operation resulted in error. No data was detected')); } } else { // we intentionally processed the row to just identify number of columns $dataProvider->rollbackReading(); // it means the file contains one empty column if (!isset($columnNames)) { $columnNames[] = ''; } } $providerMetaData = $this->initiateMetaData(); for ($i = 0, $count = count($columnNames); $i < $count; $i++) { $originalColumnName = $this->isHeaderPresent ? $this->stringDataTypeHandler->castValue($columnNames[$i]) : NULL; $column = $providerMetaData->initiateColumn(); $column->columnIndex = $i; $column->persistence = ColumnMetaData::PERSISTENCE__NO_STORAGE; $column->source = $originalColumnName; $this->prepareMetaDataColumn($dataSubmitters, $providerMetaData, $column, $originalColumnName); // adjusting public name if not provided if (!isset($column->publicName)) { $column->publicName = $column->name; } $providerMetaData->registerColumnInstance($column); } // comparing structure with existing meta data if (isset($this->metadata)) { // number of columns has to be the same $existingColumnCount = $this->metadata->getColumnCount(FALSE, TRUE); $newColumnCount = $providerMetaData->getColumnCount(FALSE); if ($existingColumnCount !== $newColumnCount) { LogHelper::log_debug($this->metadata); LogHelper::log_debug($providerMetaData); throw new DataParserException(t( 'Loaded structure with %newColumnCount column(s) vs %existingColumnCount in original dataset', array('%existingColumnCount' => $existingColumnCount, '%newColumnCount' => $newColumnCount))); } // if header is present comparing column names if ($this->isHeaderPresent) { foreach ($providerMetaData->getColumns(FALSE) as $column) { $structureMatches = TRUE; $oldColumn = $this->metadata->findColumnByIndex($column->columnIndex); if (isset($oldColumn)) { if (isset($oldColumn->source)) { $structureMatches = $oldColumn->source == $column->source; } else { // 'source' property is not set. Checking if other columns in the dataset point to the same source $sourceMoved = FALSE; foreach ($this->metadata->columns as $c) { if (isset($c->source) && ($c->source == $column->source)) { $sourceMoved = TRUE; break; } } if ($sourceMoved) { $structureMatches = FALSE; } } } else { // for some reason a column with the column index does not exist in old meta data $structureMatches = FALSE; } if (!$structureMatches) { LogHelper::log_debug($column); LogHelper::log_debug($oldColumn); throw new DataParserException(t( '%datasetColumnName column is inconsistent with %dataColumnName from source of data', array( '%datasetColumnName' => $oldColumn->publicName, '%dataColumnName' => $column->publicName))); } } } } else { $this->metadata = $providerMetaData; } }