/** * Checks if NSPI server has an updated SPI data definition. * If it does, then this function updates local copy of SPI definition data. * * @return boolean * True if SPI definition data has been updated */ private function updateDefinition() { $core_version = substr(\Drupal::VERSION, 0, 1); $spi_def_end_point = '/spi_def/get/' . $core_version; $response = $this->client->getDefinition($spi_def_end_point); if (!$response) { \Drupal::logger('acquia spi')->error('Failed to obtain latest SPI data definition.'); return FALSE; } else { $response_data = $response; $expected_data_types = array('drupal_version' => 'string', 'timestamp' => 'string', 'acquia_spi_variables' => 'array'); // Make sure that $response_data contains everything expected. foreach ($expected_data_types as $key => $values) { if (!array_key_exists($key, $response_data) || gettype($response_data[$key]) != $expected_data_types[$key]) { \Drupal::logger('acquia spi')->error('Received SPI data definition does not match expected pattern while checking "@key". Received and expected data: @data', array('@key' => $key, '@data' => var_export(array_merge(array('expected_data' => $expected_data_types), array('response_data' => $response_data)), 1), TRUE)); return FALSE; } } if ($response_data['drupal_version'] != $core_version) { \Drupal::logger('acquia spi')->notice('Received SPI data definition does not match with current version of your Drupal installation. Data received for Drupal @version', array('@version' => $response_data['drupal_version'])); return FALSE; } } // NSPI response is in expected format. if ((int) $response_data['timestamp'] > (int) $this->config('acquia_connector.settings')->get('spi.def_timestamp')) { // Compare stored variable names to incoming and report on update. $old_vars = $this->config('acquia_connector.settings')->get('spi.def_vars'); $new_vars = $response_data['acquia_spi_variables']; $new_optional_vars = 0; foreach ($new_vars as $new_var_name => $new_var) { // Count if received from NSPI optional variable is not present in old local SPI definition // or if it already was in old SPI definition, but was not optional if ($new_var['optional'] && !array_key_exists($new_var_name, $old_vars) || $new_var['optional'] && isset($old_vars[$new_var_name]) && !$old_vars[$new_var_name]['optional']) { $new_optional_vars++; } } // Clean up waived vars that are not exposed by NSPI anymore. $waived_spi_def_vars = $this->config('acquia_connector.settings')->get('spi.def_waived_vars'); $changed_bool = FALSE; foreach ($waived_spi_def_vars as $key => $waived_var) { if (!in_array($waived_var, $new_vars)) { unset($waived_spi_def_vars[$key]); $changed_bool = TRUE; } } $config = \Drupal::configFactory()->getEditable('acquia_connector.settings'); if ($changed_bool) { $config->set('spi.def_waived_vars', $waived_spi_def_vars); } // Finally, save SPI definition data. if ($new_optional_vars > 0) { $config->set('spi.new_optional_data', 1); } $config->set('spi.def_timestamp', $response_data['timestamp']); $config->set('spi.def_vars', $response_data['acquia_spi_variables']); $config->save(); return TRUE; } return FALSE; }