Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 42
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
SummonBackendFactory
0.00% covered (danger)
0.00%
0 / 42
0.00% covered (danger)
0.00%
0 / 6
72
0.00% covered (danger)
0.00%
0 / 1
 __invoke
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
6
 createBackend
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 createConnector
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 isAuthed
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 createQueryBuilder
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 createRecordCollectionFactory
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3/**
4 * Factory for Summon backends.
5 *
6 * PHP version 8
7 *
8 * Copyright (C) Villanova University 2013.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2,
12 * as published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22 *
23 * @category VuFind
24 * @package  Search
25 * @author   David Maus <maus@hab.de>
26 * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
27 * @link     https://vufind.org Main Site
28 */
29
30namespace VuFind\Search\Factory;
31
32use Psr\Container\ContainerInterface;
33use SerialsSolutions\Summon\Laminas as Connector;
34use VuFindSearch\Backend\Solr\LuceneSyntaxHelper;
35use VuFindSearch\Backend\Summon\Backend;
36use VuFindSearch\Backend\Summon\QueryBuilder;
37use VuFindSearch\Backend\Summon\Response\RecordCollectionFactory;
38
39/**
40 * Factory for Summon backends.
41 *
42 * @category VuFind
43 * @package  Search
44 * @author   David Maus <maus@hab.de>
45 * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
46 * @link     https://vufind.org Main Site
47 */
48class SummonBackendFactory extends AbstractBackendFactory
49{
50    /**
51     * Logger.
52     *
53     * @var \Laminas\Log\LoggerInterface
54     */
55    protected $logger;
56
57    /**
58     * VuFind configuration
59     *
60     * @var \Laminas\Config\Config
61     */
62    protected $config;
63
64    /**
65     * Summon configuration
66     *
67     * @var \Laminas\Config\Config
68     */
69    protected $summonConfig;
70
71    /**
72     * Create service
73     *
74     * @param ContainerInterface $sm      Service manager
75     * @param string             $name    Requested service name (unused)
76     * @param array              $options Extra options (unused)
77     *
78     * @return Backend
79     *
80     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
81     */
82    public function __invoke(ContainerInterface $sm, $name, array $options = null)
83    {
84        $this->setup($sm);
85        $configReader = $this->getService(\VuFind\Config\PluginManager::class);
86        $this->config = $configReader->get('config');
87        $this->summonConfig = $configReader->get('Summon');
88        if ($this->serviceLocator->has(\VuFind\Log\Logger::class)) {
89            $this->logger = $this->getService(\VuFind\Log\Logger::class);
90        }
91        $connector = $this->createConnector();
92        $backend   = $this->createBackend($connector);
93        return $backend;
94    }
95
96    /**
97     * Create the Summon backend.
98     *
99     * @param Connector $connector Connector
100     *
101     * @return Backend
102     */
103    protected function createBackend(Connector $connector)
104    {
105        $backend = new Backend($connector, $this->createRecordCollectionFactory());
106        $backend->setLogger($this->logger);
107        $backend->setQueryBuilder($this->createQueryBuilder());
108        return $backend;
109    }
110
111    /**
112     * Create the Summon connector.
113     *
114     * @return Connector
115     */
116    protected function createConnector()
117    {
118        // Load credentials:
119        $id = $this->config->Summon->apiId ?? null;
120        $key = $this->config->Summon->apiKey ?? null;
121
122        // Create connector:
123        $options = ['authedUser' => $this->isAuthed()];
124        $connector = new Connector(
125            $id,
126            $key,
127            $options,
128            $this->createHttpClient($this->summonConfig->General->timeout ?? 30)
129        );
130        $connector->setLogger($this->logger);
131        return $connector;
132    }
133
134    /**
135     * Is the current user of the Summon connector authenticated?
136     *
137     * @return bool
138     */
139    protected function isAuthed()
140    {
141        return $this->getService(\LmcRbacMvc\Service\AuthorizationService::class)
142            ->isGranted('access.SummonExtendedResults');
143    }
144
145    /**
146     * Create the Summon query builder.
147     *
148     * @return QueryBuilder
149     */
150    protected function createQueryBuilder()
151    {
152        $builder = new QueryBuilder();
153        $caseSensitiveBooleans
154            = $this->summonConfig->General->case_sensitive_bools ?? true;
155        $helper = new LuceneSyntaxHelper($caseSensitiveBooleans);
156        $builder->setLuceneHelper($helper);
157        return $builder;
158    }
159
160    /**
161     * Create the record collection factory
162     *
163     * @return RecordCollectionFactory
164     */
165    protected function createRecordCollectionFactory()
166    {
167        $manager = $this->getService(\VuFind\RecordDriver\PluginManager::class);
168        $stripSnippets = !($this->summonConfig->General->snippets ?? false);
169        $callback = function ($data) use ($manager, $stripSnippets) {
170            $driver = $manager->get('Summon');
171            if ($stripSnippets) {
172                unset($data['Snippet']);
173            }
174            $driver->setRawData($data);
175            return $driver;
176        };
177        return new RecordCollectionFactory($callback);
178    }
179}