Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 45
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 / 45
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 / 10
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 / 3
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 / 11
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->serviceLocator
86            ->get(\VuFind\Config\PluginManager::class);
87        $this->config = $configReader->get('config');
88        $this->summonConfig = $configReader->get('Summon');
89        if ($this->serviceLocator->has(\VuFind\Log\Logger::class)) {
90            $this->logger = $this->serviceLocator->get(\VuFind\Log\Logger::class);
91        }
92        $connector = $this->createConnector();
93        $backend   = $this->createBackend($connector);
94        return $backend;
95    }
96
97    /**
98     * Create the Summon backend.
99     *
100     * @param Connector $connector Connector
101     *
102     * @return Backend
103     */
104    protected function createBackend(Connector $connector)
105    {
106        $backend = new Backend($connector, $this->createRecordCollectionFactory());
107        $backend->setLogger($this->logger);
108        $backend->setQueryBuilder($this->createQueryBuilder());
109        return $backend;
110    }
111
112    /**
113     * Create the Summon connector.
114     *
115     * @return Connector
116     */
117    protected function createConnector()
118    {
119        // Load credentials:
120        $id = $this->config->Summon->apiId ?? null;
121        $key = $this->config->Summon->apiKey ?? null;
122
123        // Create connector:
124        $options = ['authedUser' => $this->isAuthed()];
125        $connector = new Connector(
126            $id,
127            $key,
128            $options,
129            $this->createHttpClient($this->summonConfig->General->timeout ?? 30)
130        );
131        $connector->setLogger($this->logger);
132        return $connector;
133    }
134
135    /**
136     * Is the current user of the Summon connector authenticated?
137     *
138     * @return bool
139     */
140    protected function isAuthed()
141    {
142        return $this->serviceLocator
143            ->get(\LmcRbacMvc\Service\AuthorizationService::class)
144            ->isGranted('access.SummonExtendedResults');
145    }
146
147    /**
148     * Create the Summon query builder.
149     *
150     * @return QueryBuilder
151     */
152    protected function createQueryBuilder()
153    {
154        $builder = new QueryBuilder();
155        $caseSensitiveBooleans
156            = $this->summonConfig->General->case_sensitive_bools ?? true;
157        $helper = new LuceneSyntaxHelper($caseSensitiveBooleans);
158        $builder->setLuceneHelper($helper);
159        return $builder;
160    }
161
162    /**
163     * Create the record collection factory
164     *
165     * @return RecordCollectionFactory
166     */
167    protected function createRecordCollectionFactory()
168    {
169        $manager = $this->serviceLocator
170            ->get(\VuFind\RecordDriver\PluginManager::class);
171        $stripSnippets = !($this->summonConfig->General->snippets ?? false);
172        $callback = function ($data) use ($manager, $stripSnippets) {
173            $driver = $manager->get('Summon');
174            if ($stripSnippets) {
175                unset($data['Snippet']);
176            }
177            $driver->setRawData($data);
178            return $driver;
179        };
180        return new RecordCollectionFactory($callback);
181    }
182}