You are here

function services_client_migrate_hook in Services Client 7.2

Migrate old hook with mapping to new system.

Parameters

string $name: Hook machine name.

Throws

Exception When migration fails Exception is thrown with description error message.

1 call to services_client_migrate_hook()
drush_services_client_migrate_hooks in ./services_client.drush.inc
Migrate old system hooks to new event system.

File

./services_client.legacy.inc, line 27
Contains functions required for automated converting old Services Client version 1 hooks to events. This file is included only in drush command 'services-client-migrate-hooks'.

Code

function services_client_migrate_hook($name) {
  $hook = db_query("SELECT * FROM {services_client_connection_hook} WHERE name = :name", array(
    ':name' => $name,
  ))
    ->fetch();
  if (empty($hook)) {
    throw new Exception("Specified hook name wasn't found.");
  }
  if (!empty($hook->config)) {
    $hook->config = unserialize($hook->config);
  }
  elseif (!empty($hook->hook_mappings)) {
    $hook->hook_mappings = unserialize($hook->hook_mappings);
  }
  if (!empty($hook->hook_conditions)) {
    $hook->hook_conditions = unserialize($hook->hook_conditions);
  }

  // Define how to process legacy field map
  $field_mapping = array();
  $field_mapping_processor = function ($item) use (&$field_mapping) {
    list($remote, $local) = explode("|", trim($item));
    $field_mapping[trim($local)] = trim($remote);
  };

  // Define how to process legacy empty map
  $field_empty_mapping = array();
  $empty_mapping_processor = function ($item) use (&$field_empty_mapping) {
    list($source, $destination, $value) = explode("|", trim($item));
    $field_empty_mapping[trim($destination)] = trim($value);
  };
  $filter_remove_empty = function ($item) {
    return !empty($item);
  };
  $node_type_mapping = NULL;
  $conditions = array();

  // Newer exportable format
  if (!empty($hook->config)) {
    array_map($field_mapping_processor, explode("\n", $hook->config['mapping']['config']['field_mapping']));
    array_map($empty_mapping_processor, explode("\n", $hook->config['mapping']['config']['field_mapping_empty']));
    if ($hook->hook == 'node_save' && !empty($hook->config['mapping']['config']['node_type_mapping'])) {
      $node_type_mapping = explode("|", $hook->config['mapping']['config']['node_type_mapping']);
    }
    if (!empty($hook->config['condition']['config'])) {
      $conditions = $hook->config['condition']['config'];
    }
  }
  else {
    array_map($field_mapping_processor, explode("\n", $hook->hook_mappings['field_mapping']));
    array_map($empty_mapping_processor, explode("\n", $hook->hook_mappings['field_mapping_empty']));
    if ($hook->hook == 'node_save' && !empty($hook->hook_mappings['node_type_mapping'])) {
      $node_type_mapping = explode("|", $hook->hook_mappings['node_type_mapping']);
    }
    if (!empty($hook->hook_conditions)) {
      $conditions = $hook->hook_conditions;
    }
  }

  // Remove possible empty lines
  $field_mapping = array_filter($field_mapping, $filter_remove_empty);
  $field_empty_mapping = array_filter($field_empty_mapping, $filter_remove_empty);
  ctools_include('export');
  $event = ctools_export_crud_new('services_client_connection_event');
  $event->connection = $hook->conn_name;
  $event->name = $hook->name;
  $event->title = $hook->title;
  if ($hook->hook == 'node_save') {
    $event->event = 'save';
    $event->entity_type = 'node';
    $event->plugin = 'NodeSaveHandler';
    $handler = $event
      ->getHandler();
    $config = $handler
      ->getConfiguration();
    $config['uuid_resource'] = 'node';
    $config['resource'] = 'node_raw';
    if (!empty($node_type_mapping)) {
      $config['node_type'] = $node_type_mapping[1];
    }
    $handler
      ->setConfiguration($config);

    // Node type plugin
    if (isset($conditions['node_type'])) {
      $uuid = $handler
        ->addPlugin('condition', 'ServicesClientPropertyCondition');
      $config = array(
        'property' => 'type',
        'condition' => 'equals',
        'value' => $conditions['node_type'],
      );
      $handler
        ->setPluginConfig('condition', $uuid, $config);
    }
    services_client_migrate_add_mapping($handler, $field_mapping, $field_empty_mapping);
    $event = $handler
      ->getEvent();
  }
  elseif ($hook->hook == 'node_delete') {
    $event->event = 'delete';
    $event->entity_type = 'node';
    $event->plugin = 'EntityDeleteHandler';
    $handler = $event
      ->getHandler();
    $config = $handler
      ->getConfiguration();
    $config['uuid_resource'] = 'node';
    $config['resource'] = 'node';
    $config['queue'] = 1;
    if (!empty($node_type_mapping)) {
      $config['node_type'] = $node_type_mapping[1];
    }
    $handler
      ->setConfiguration($config);

    // Node type plugin
    if (isset($conditions['node_type'])) {
      $uuid = $handler
        ->addPlugin('condition', 'ServicesClientPropertyCondition');
      $config = array(
        'property' => 'type',
        'condition' => 'equals',
        'value' => $conditions['node_type'],
      );
      $handler
        ->setPluginConfig('condition', $uuid, $config);
    }
    services_client_migrate_add_mapping($handler, $field_mapping, $field_empty_mapping);
    $event = $handler
      ->getEvent();
  }
  elseif ($hook->hook == 'user_save') {
    $event->event = 'save';
    $event->entity_type = 'user';
    $event->plugin = 'UserSaveHandler';
    $handler = $event
      ->getHandler();
    $config = $handler
      ->getConfiguration();
    $config['uuid_resource'] = 'user';
    $config['resource'] = 'user_raw';
    $config['user_sync_by_name'] = TRUE;
    $config['user_map_roles'] = FALSE;
    $config['user_map_roles_map'] = array();
    if (!empty($hook->hook_mappings['user_sync_roles'])) {
      $config['user_map_roles'] = TRUE;
      $config['user_map_roles_map'] = array();
      $roles = array_flip(user_roles(TRUE));
      $roles_mapping = array();
      array_map(function ($item) use (&$roles_mapping) {
        list($local, $remote) = explode("|", trim($item));
        $roles_mapping[trim($local)] = trim($remote);
      }, explode("\n", trim($hook->hook_mappings['user_sync_roles'])));
      foreach ($roles_mapping as $local => $remote) {
        if (isset($roles[$local])) {
          $config['user_map_roles_map'][] = array(
            'local' => $roles[$local],
            'remote' => $remote,
          );
        }
      }
    }
    $handler
      ->setConfiguration($config);
    services_client_migrate_add_mapping($handler, $field_mapping, $field_empty_mapping);
    $event = $handler
      ->getEvent();
  }
  return $event;
}