From 7b5fff7ecd866be35100b5da35d42765bf2b334a Mon Sep 17 00:00:00 2001
From: Gregor Gawol <gawol@gawol-OptiPlex-9020-AIO.(none)>
Date: Mon, 26 Jan 2015 13:30:38 +0100
Subject: [PATCH] refs #4394: * completed implementation of SolrMarc methods in
 SolrMarcRemote

---
 .../src/finc/RecordDriver/SolrMarcRemote.php  | 337 +++++++++++++++---
 1 file changed, 292 insertions(+), 45 deletions(-)

diff --git a/module/finc/src/finc/RecordDriver/SolrMarcRemote.php b/module/finc/src/finc/RecordDriver/SolrMarcRemote.php
index e972457bb52..7c307fe7ca3 100644
--- a/module/finc/src/finc/RecordDriver/SolrMarcRemote.php
+++ b/module/finc/src/finc/RecordDriver/SolrMarcRemote.php
@@ -61,6 +61,13 @@ class SolrMarcRemote extends \VuFind\RecordDriver\SolrMarc
      * @var string
      */
     protected $uriPattern = '';
+    
+    /**
+     * holds config.ini data
+     * 
+     * @var array
+     */
+    protected $mainConfig;
 
     /**
      * Constructor
@@ -86,6 +93,8 @@ class SolrMarcRemote extends \VuFind\RecordDriver\SolrMarc
         } else {
             $this->uriPattern = $recordConfig->General->get('baseUrl');
         }
+        
+        $this->mainConfig = $mainConfig;
     }
 
     /**
@@ -105,51 +114,6 @@ class SolrMarcRemote extends \VuFind\RecordDriver\SolrMarc
         // Don't call the parent's set method as this would require the fullrecord in the Solr-Data
         // Instead perform basic assignment of data to fields
         $this->fields = $data;
-
-        // handle availability of fullrecord
-        if (isset($data['fullrecord'])) {
-            // standard Vufind2-behaviour
-
-            // also process the MARC record:
-            $marc = trim($data['fullrecord']);
-
-        } else {
-            // fallback: retrieve fullrecord from external source
-
-            if (! isset($data['id'])) {
-                throw new \File_MARC_Exception('No unique id given for fullrecord retrieval');
-            }
-
-            $marc = $this->retrieveFullrecord($data['id']);
-
-        }
-
-        if (isset($marc)) {
-            // continue with standard Vufind2-behaviour if marcrecord is present
-
-            // check if we are dealing with MARCXML
-            $xmlHead = '<?xml version';
-            if (strcasecmp(substr($marc, 0, strlen($xmlHead)), $xmlHead) === 0) {
-                $marc = new \File_MARCXML($marc, \File_MARCXML::SOURCE_STRING);
-            } else {
-                // When indexing over HTTP, SolrMarc may use entities instead of certain
-                // control characters; we should normalize these:
-                $marc = str_replace(
-                    array('#29;', '#30;', '#31;'), array("\x1D", "\x1E", "\x1F"), $marc
-                );
-                $marc = new \File_MARC($marc, \File_MARC::SOURCE_STRING);
-            }
-
-            $this->marcRecord = $marc->next();
-            if (!$this->marcRecord) {
-                throw new \File_MARC_Exception('Cannot Process MARC Record');
-            }
-        } else {
-            // no marcrecord was found
-
-            throw new \Exception('no Marc was found neither on the marc server nor in the solr-record for id ' . $this->fields['id']);
-        }
-
     }
 
     /**
@@ -203,6 +167,59 @@ class SolrMarcRemote extends \VuFind\RecordDriver\SolrMarc
 
     }
 
+    /**
+     * Load data from remote server
+     *
+     * @throws \Exception
+     * @throws \File_MARC_Exception
+     */
+    private function getRemoteData() {
+
+        // handle availability of fullrecord
+        if (isset($this->fields['fullrecord'])) {
+            // standard Vufind2-behaviour
+
+            // also process the MARC record:
+            $marc = trim($this->fields['fullrecord']);
+
+        } else {
+            // fallback: retrieve fullrecord from external source
+
+            if (! isset($this->fields['id'])) {
+                throw new \File_MARC_Exception('No unique id given for fullrecord retrieval');
+            }
+
+            $marc = $this->retrieveFullrecord($this->fields['id']);
+
+        }
+
+        if (isset($marc)) {
+            // continue with standard Vufind2-behaviour if marcrecord is present
+
+            // check if we are dealing with MARCXML
+            $xmlHead = '<?xml version';
+            if (strcasecmp(substr($marc, 0, strlen($xmlHead)), $xmlHead) === 0) {
+                $marc = new \File_MARCXML($marc, \File_MARCXML::SOURCE_STRING);
+            } else {
+                // When indexing over HTTP, SolrMarc may use entities instead of certain
+                // control characters; we should normalize these:
+                $marc = str_replace(
+                    array('#29;', '#30;', '#31;'), array("\x1D", "\x1E", "\x1F"), $marc
+                );
+                $marc = new \File_MARC($marc, \File_MARC::SOURCE_STRING);
+            }
+
+            $this->marcRecord = $marc->next();
+            if (!$this->marcRecord) {
+                throw new \File_MARC_Exception('Cannot Process MARC Record');
+            }
+        } else {
+            // no marcrecord was found
+
+            throw new \Exception('no Marc was found neither on the marc server nor in the solr-record for id ' . $this->fields['id']);
+        }
+    }
+
     /**
      * Get the field-value identified by $string
      *
@@ -240,4 +257,234 @@ class SolrMarcRemote extends \VuFind\RecordDriver\SolrMarc
             $this->logger->debug(get_class($this) . ": $msg");
         }
     }
+    
+    /**
+     * Return an array of associative URL arrays with one or more of the following
+     * keys:
+     *
+     * <li>
+     *   <ul>desc: URL description text to display (optional)</ul>
+     *   <ul>url: fully-formed URL (required if 'route' is absent)</ul>
+     *   <ul>route: VuFind route to build URL with (required if 'url' is absent)</ul>
+     *   <ul>routeParams: Parameters for route (optional)</ul>
+     *   <ul>queryString: Query params to append after building route (optional)</ul>
+     * </li>
+     *
+     * @return array
+     */
+    public function getURLs()
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getURLs();
+    }
+
+    /**
+     * Get all subject headings associated with this record.  Each heading is
+     * returned as an array of chunks, increasing from least specific to most
+     * specific.
+     *
+     * @return array
+     */
+    public function getAllSubjectHeadings()
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getAllSubjectHeadings();
+    }
+
+    /**
+     * Get the bibliographic level of the current record.
+     *
+     * @return string
+     */
+    public function getBibliographicLevel()
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getBibliographicLevel();
+    }
+
+    /**
+     * Return an array of all values extracted from the specified field/subfield
+     * combination.  If multiple subfields are specified and $concat is true, they
+     * will be concatenated together in the order listed -- each entry in the array
+     * will correspond with a single MARC field.  If $concat is false, the return
+     * array will contain separate entries for separate subfields.
+     *
+     * @param string $field     The MARC field number to read
+     * @param array  $subfields The MARC subfield codes to read
+     * @param bool   $concat    Should we concatenate subfields?
+     *
+     * @return array
+     */
+    protected function getFieldArray($field, $subfields = null, $concat = true)
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getFieldArray($field, $subfields, $concat);
+    }
+
+    /**
+     * Get the item's publication information
+     *
+     * @param string $subfield The subfield to retrieve ('a' = location, 'c' = date)
+     *
+     * @return array
+     */
+    protected function getPublicationInfo($subfield = 'a')
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getPublicationInfo($subfield);
+    }
+
+    /**
+     * Support method for getSeries() -- given a field specification, look for
+     * series information in the MARC record.
+     *
+     * @param array $fieldInfo Associative array of field => subfield information
+     * (used to find series name)
+     *
+     * @return array
+     */
+    protected function getSeriesFromMARC($fieldInfo)
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getSeriesFromMARC($fieldInfo);
+    }
+
+    /**
+     * Get an array of lines from the table of contents.
+     *
+     * @return array
+     */
+    public function getTOC()
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getTOC();
+    }
+
+    /**
+     * Get hierarchical place names (MARC field 752)
+     *
+     * returns an array of formatted hierarchical place names, consisting of all
+     * alpha-subfields, concatenated for display
+     *
+     * @return array
+     */
+    public function getHierarchicalPlaceNames()
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getHierarchicalPlaceNames();
+    }
+
+    /**
+     * Get all record links related to the current record. Each link is returned as
+     * array.
+     * Format:
+     * array(
+     *        array(
+     *               'title' => label_for_title
+     *               'value' => link_name
+     *               'link'  => link_URI
+     *        ),
+     *        ...
+     * )
+     *
+     * @return null|array
+     */
+    public function getAllRecordLinks()
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getAllRecordLinks();
+    }
+
+    /**
+     * Get Status/Holdings Information from the internally stored MARC Record
+     * (support method used by the NoILS driver).
+     *
+     * @param array $field The MARC Field to retrieve
+     * @param array $data  A keyed array of data to retrieve from subfields
+     *
+     * @return array
+     */
+    public function getFormattedMarcDetails($field, $data)
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getFormattedMarcDetails($field, $data);
+    }
+
+    /**
+     * Return an XML representation of the record using the specified format.
+     * Return false if the format is unsupported.
+     *
+     * @param string     $format     Name of format to use (corresponds with OAI-PMH
+     * metadataPrefix parameter).
+     * @param string     $baseUrl    Base URL of host containing VuFind (optional;
+     * may be used to inject record URLs into XML when appropriate).
+     * @param RecordLink $recordLink Record link helper (optional; may be used to
+     * inject record URLs into XML when appropriate).
+     *
+     * @return mixed         XML, or false if format unsupported.
+     */
+    public function getXML($format, $baseUrl = null, $recordLink = null)
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getXML($format, $baseUrl, $recordLink);
+    }
+
+    /**
+     * Get access to the raw File_MARC object.
+     *
+     * @return File_MARCBASE
+     */
+    public function getMarcRecord()
+    {
+
+        if(empty($this->marcRecord)) {
+            $this->getRemoteData();
+        }
+
+        return parent::getMarcRecord();
+    }
 }
-- 
GitLab