From b92ae4539d1bb6c31ae6f9ddb002b0ccf5afb512 Mon Sep 17 00:00:00 2001
From: David Maus <maus@hab.de>
Date: Thu, 30 May 2013 11:27:05 +0200
Subject: [PATCH] Attach SOLR ErrorListener to backend instance, not name

---
 .../Search/Solr/AbstractErrorListener.php     | 27 ++++++++-----------
 .../VuFind/Search/Solr/V3/ErrorListener.php   |  2 +-
 .../VuFind/Search/Solr/V4/ErrorListener.php   |  2 +-
 .../src/Search/Solr/V3/ErrorListenerTest.php  | 12 +++++----
 .../src/Search/Solr/V4/ErrorListenerTest.php  | 10 ++++---
 5 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/module/VuFind/src/VuFind/Search/Solr/AbstractErrorListener.php b/module/VuFind/src/VuFind/Search/Solr/AbstractErrorListener.php
index 5ee81b7691c..43561a87e09 100644
--- a/module/VuFind/src/VuFind/Search/Solr/AbstractErrorListener.php
+++ b/module/VuFind/src/VuFind/Search/Solr/AbstractErrorListener.php
@@ -33,6 +33,8 @@ use VuFindSearch\Backend\BackendInterface;
 
 use Zend\EventManager\EventInterface;
 
+use SplObjectStorage;
+
 /**
  * Abstract base class of SOLR error listeners.
  *
@@ -56,7 +58,7 @@ abstract class AbstractErrorListener
     /**
      * Backends to listen for.
      *
-     * @var array
+     * @var SplObjectStorage
      */
     protected $backends;
 
@@ -67,41 +69,34 @@ abstract class AbstractErrorListener
      *
      * @return void
      */
-    public function __construct($backend)
+    public function __construct(BackendInterface $backend)
     {
-        $this->backends = array();
+        $this->backends = new SplObjectStorage();
         $this->addBackend($backend);
     }
 
     /**
      * Add backend to listen for.
      *
-     * @param BackendInterface|string $backend Backend instance or name of backend
+     * @param BackendInterface $backend Backend instance
      *
      * @return void
      */
-    public function addBackend($backend)
+    public function addBackend(BackendInterface $backend)
     {
-        if ($backend instanceOf BackendInterface) {
-            $this->backends[] = $backend->getName();
-        } else {
-            $this->backends[] = $backend;
-        }
+        $this->backends->attach($backend);
     }
 
     /**
      * Return true if listeners listens for backend errors.
      *
-     * @param BackendInterface|string $backend Backend instance or name of backend
+     * @param BackendInterface $backend Backend instance
      *
      * @return boolean
      */
-    public function listenForBackend($backend)
+    public function listenForBackend(BackendInterface $backend)
     {
-        if ($backend instanceOf BackendInterface) {
-            $backend = $backend->getName();
-        }
-        return in_array($backend, $this->backends);
+        return $this->backends->contains($backend);
     }
 
     /**
diff --git a/module/VuFind/src/VuFind/Search/Solr/V3/ErrorListener.php b/module/VuFind/src/VuFind/Search/Solr/V3/ErrorListener.php
index f42bb6cb2c9..5133f75b27e 100644
--- a/module/VuFind/src/VuFind/Search/Solr/V3/ErrorListener.php
+++ b/module/VuFind/src/VuFind/Search/Solr/V3/ErrorListener.php
@@ -55,7 +55,7 @@ class ErrorListener extends AbstractErrorListener
      */
     public function onSearchError(EventInterface $event)
     {
-        $backend = $event->getParam('backend');
+        $backend = $event->getParam('backend_instance');
         if ($this->listenForBackend($backend)) {
             $error  = $event->getTarget();
             if ($error instanceOf HttpErrorException) {
diff --git a/module/VuFind/src/VuFind/Search/Solr/V4/ErrorListener.php b/module/VuFind/src/VuFind/Search/Solr/V4/ErrorListener.php
index 8458a439b17..af6fa05ce86 100644
--- a/module/VuFind/src/VuFind/Search/Solr/V4/ErrorListener.php
+++ b/module/VuFind/src/VuFind/Search/Solr/V4/ErrorListener.php
@@ -65,7 +65,7 @@ class ErrorListener extends AbstractErrorListener
      */
     public function onSearchError(EventInterface $event)
     {
-        $backend = $event->getParam('backend');
+        $backend = $event->getParam('backend_instance');
         if ($this->listenForBackend($backend)) {
             $error = $event->getTarget();
             if ($error instanceOf HttpErrorException) {
diff --git a/module/VuFind/tests/unit-tests/src/Search/Solr/V3/ErrorListenerTest.php b/module/VuFind/tests/unit-tests/src/Search/Solr/V3/ErrorListenerTest.php
index 708fe31e593..50dcb9e10d9 100644
--- a/module/VuFind/tests/unit-tests/src/Search/Solr/V3/ErrorListenerTest.php
+++ b/module/VuFind/tests/unit-tests/src/Search/Solr/V3/ErrorListenerTest.php
@@ -58,12 +58,13 @@ class ErrorListenerTest extends TestCase
      */
     public function testDetectParseError()
     {
-        $response  = $this->createResponse('solr3-parse-error');
+        $response = $this->createResponse('solr3-parse-error');
+        $backend  = $this->getMockForAbstractClass('VuFindSearch\Backend\BackendInterface');
 
         $exception = HttpErrorException::createFromResponse($response);
-        $params    = array('backend' => 'test');
+        $params    = array('backend_instance' => $backend);
         $event     = new Event(null, $exception, $params);
-        $listener  = new ErrorListener('test');
+        $listener  = new ErrorListener($backend);
         $listener->onSearchError($event);
         $this->assertTrue($exception->hasTag('VuFind\Search\ParserError'));
     }
@@ -76,11 +77,12 @@ class ErrorListenerTest extends TestCase
     public function testDetectUndefinedFieldError()
     {
         $response = $this->createResponse('solr3-undefined-field-error');
+        $backend  = $this->getMockForAbstractClass('VuFindSearch\Backend\BackendInterface');
 
         $exception = HttpErrorException::createFromResponse($response);
-        $params    = array('backend' => 'test');
+        $params    = array('backend_instance' => $backend);
         $event     = new Event(null, $exception, $params);
-        $listener  = new ErrorListener('test');
+        $listener  = new ErrorListener($backend);
         $listener->onSearchError($event);
         $this->assertTrue($exception->hasTag('VuFind\Search\ParserError'));
     }
diff --git a/module/VuFind/tests/unit-tests/src/Search/Solr/V4/ErrorListenerTest.php b/module/VuFind/tests/unit-tests/src/Search/Solr/V4/ErrorListenerTest.php
index 84d51543757..a4b3e8a7813 100644
--- a/module/VuFind/tests/unit-tests/src/Search/Solr/V4/ErrorListenerTest.php
+++ b/module/VuFind/tests/unit-tests/src/Search/Solr/V4/ErrorListenerTest.php
@@ -59,11 +59,12 @@ class ErrorListenerTest extends TestCase
     public function testDetectParseError()
     {
         $response  = $this->createResponse('solr4-parse-error');
+        $backend   = $this->getMockForAbstractClass('VuFindSearch\Backend\BackendInterface');
 
         $exception = HttpErrorException::createFromResponse($response);
-        $params    = array('backend' => 'test');
+        $params    = array('backend_instance' => $backend);
         $event     = new Event(null, $exception, $params);
-        $listener  = new ErrorListener('test');
+        $listener  = new ErrorListener($backend);
         $listener->onSearchError($event);
         $this->assertTrue($exception->hasTag('VuFind\Search\ParserError'));
     }
@@ -76,11 +77,12 @@ class ErrorListenerTest extends TestCase
     public function testDetectUndefinedFieldError()
     {
         $response = $this->createResponse('solr4-undefined-field-error');
+        $backend  = $this->getMockForAbstractClass('VuFindSearch\Backend\BackendInterface');
 
         $exception = HttpErrorException::createFromResponse($response);
-        $params    = array('backend' => 'test');
+        $params    = array('backend_instance' => $backend);
         $event     = new Event(null, $exception, $params);
-        $listener  = new ErrorListener('test');
+        $listener  = new ErrorListener($backend);
         $listener->onSearchError($event);
         $this->assertTrue($exception->hasTag('VuFind\Search\ParserError'));
     }
-- 
GitLab