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