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