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;
        }
    }