SearchApiSolrAcquiaConnector.php in Acquia Search 2.x        
                          
                  
                        
  
  
  
  
File
  src/Plugin/SolrConnector/SearchApiSolrAcquiaConnector.php
  
    View source  
  <?php
namespace Drupal\acquia_search\Plugin\SolrConnector;
use Drupal\acquia_connector\Helper\Storage;
use Drupal\acquia_search\Client\Adapter\TimeoutAwarePsr18Adapter;
use Drupal\acquia_search\PreferredSearchCoreService;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\search_api_solr\SolrConnector\SolrConnectorPluginBase;
use Http\Adapter\Guzzle6\Client as Guzzle6Client;
use Solarium\Core\Client\Client;
use Symfony\Component\DependencyInjection\ContainerInterface;
class SearchApiSolrAcquiaConnector extends SolrConnectorPluginBase {
  
  protected $searchSubscriber;
  
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    $plugin = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $plugin->searchSubscriber = $container
      ->get('acquia_search.search_subscriber');
    return $plugin;
  }
  
  public function defaultConfiguration() {
    $configuration = parent::defaultConfiguration();
    $storage = new Storage();
    $configuration['index_id'] = $storage
      ->getIdentifier();
    $configuration['path'] = '/';
    $configuration['host'] = acquia_search_get_search_host();
    $configuration['scheme'] = empty($configuration['scheme']) ? 'http' : $configuration['scheme'];
    $default_port = $configuration['scheme'] == 'https' ? 443 : 80;
    $configuration['port'] = empty($configuration['port']) ? $default_port : $configuration['port'];
    unset($configuration['overridden_by_acquia_search']);
    
    if (acquia_search_is_auto_switch_disabled()) {
      return $configuration;
    }
    
    if (acquia_search_is_connection_config_overridden()) {
      $configuration = $this
        ->setOverriddenCore($configuration);
      return $configuration;
    }
    $preferred_core_service = acquia_search_get_core_service();
    
    if ($preferred_core_service
      ->isPreferredCoreAvailable()) {
      $configuration = $this
        ->setPreferredCore($configuration, $preferred_core_service);
    }
    else {
      
      if (acquia_search_should_set_read_only_mode()) {
        $configuration = $this
          ->setReadOnlyMode($configuration);
      }
    }
    return $configuration;
  }
  
  protected function setPreferredCore(array $configuration, PreferredSearchCoreService $preferred_core_service) {
    $configuration['host'] = $preferred_core_service
      ->getPreferredCoreHostname();
    $configuration['core'] = $preferred_core_service
      ->getPreferredCoreId();
    $configuration['index_id'] = $preferred_core_service
      ->getPreferredCoreId();
    $configuration['overridden_by_acquia_search'] = ACQUIA_SEARCH_OVERRIDE_AUTO_SET;
    return $configuration;
  }
  
  protected function setOverriddenCore(array $configuration) {
    $override = \Drupal::config('acquia_search.settings')
      ->get('connection_override');
    $configuration['overridden_by_acquia_search'] = ACQUIA_SEARCH_EXISTING_OVERRIDE;
    $configuration['path'] = '/';
    $override['core'] = $override['index_id'];
    return array_merge($configuration, $override);
  }
  
  protected function setReadOnlyMode(array $configuration) {
    $configuration['overridden_by_acquia_search'] = ACQUIA_SEARCH_AUTO_OVERRIDE_READ_ONLY;
    return $configuration;
  }
  
  public function pingServer() {
    return $this
      ->doPing([
      'handler' => 'admin/system',
    ], 'core');
  }
  
  public function getServerInfo($reset = FALSE) {
    $this
      ->useTimeout();
    return $this
      ->getDataFromHandler('admin/system', $reset);
  }
  
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);
    unset($form['host']);
    unset($form['port']);
    unset($form['path']);
    unset($form['core']);
    return $form;
  }
  
  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
    
  }
  
  protected function connect() {
    if ($this->solr) {
      return;
    }
    
    $httpClient = new Guzzle6Client();
    $adapter = new TimeoutAwarePsr18Adapter($httpClient);
    $this->solr = new Client($adapter, $this->eventDispatcher);
    
    $this->configuration['scheme'] = 'https';
    $this->configuration['port'] = 443;
    $this->configuration['key'] = 'core';
    $this->configuration['path'] = '/';
    $this->configuration[self::QUERY_TIMEOUT] = $this->configuration['timeout'];
    $this->solr
      ->createEndpoint($this->configuration, TRUE);
    $this->solr
      ->registerPlugin('acquia_search_subscriber', $this->searchSubscriber);
  }
  
  protected function getServerUri() {
    $this
      ->connect();
    return $this->solr
      ->getEndpoint()
      ->getServerUri();
  }
  
  public function getUpdateQuery() {
    $this
      ->connect();
    $overridden = $this->solr
      ->getEndpoint('core')
      ->getOption('overridden_by_acquia_search');
    if ($overridden === ACQUIA_SEARCH_AUTO_OVERRIDE_READ_ONLY) {
      $message = 'The Search API Server serving this index is currently in read-only mode.';
      \Drupal::logger('acquia search')
        ->error($message);
      throw new \Exception($message);
    }
    return $this->solr
      ->createUpdate();
  }
  
  public function getExtractQuery() {
    $this
      ->connect();
    $query = $this->solr
      ->createExtract();
    $query
      ->setHandler('extract/tika');
    return $query;
  }
  
  public function getMoreLikeThisQuery() {
    $this
      ->connect();
    $query = $this->solr
      ->createMoreLikeThis();
    $query
      ->setHandler('select');
    $query
      ->addParam('qt', 'mlt');
    return $query;
  }
  
  public function viewSettings() {
    $uri = Url::fromUri('https://docs.acquia.com/acquia-search/', [
      'absolute' => TRUE,
    ]);
    $link = Link::fromTextAndUrl($this
      ->t('Acquia Search'), $uri);
    $message = $this
      ->t('Search is provided by @acquia_search.', [
      '@acquia_search' => $link
        ->toString(),
    ]);
    $this
      ->messenger()
      ->addStatus($message);
    return parent::viewSettings();
  }
  
  public function reloadCore() {
    return FALSE;
  }
}