From c0504b7de3e471e5846875f3b649427b88b1cfb1 Mon Sep 17 00:00:00 2001
From: David Maus <maus@hab.de>
Date: Mon, 6 Aug 2012 13:50:10 +0200
Subject: [PATCH] Set and get containing parent records

* php/HAB/Pica/Record/TitleRecord.php (removeLocalRecord)
(addLocalRecord): Set and unset parent record reference.
* php/HAB/Pica/Record/LocalRecord.php (getTitleRecord)
(unsetTitleRecord, setTitleRecord): New functions. Set, get, unset
containing title record.
(addCopyRecord, removeCopyRecord): Set and unset parent record
reference.
* php/HAB/Pica/Record/CopyRecord.php (getLocalRecord)
(unsetLocalRecord, setLocalRecord): New functions. Set, get, unset
containing local record.
---
 src/php/HAB/Pica/Record/CopyRecord.php        | 38 ++++++++++++++++++
 src/php/HAB/Pica/Record/LocalRecord.php       | 40 +++++++++++++++++++
 src/php/HAB/Pica/Record/TitleRecord.php       |  2 +
 .../php/HAB/Pica/Record/CopyRecordTest.php    | 11 +++++
 .../php/HAB/Pica/Record/LocalRecordTest.php   | 11 +++++
 5 files changed, 102 insertions(+)

diff --git a/src/php/HAB/Pica/Record/CopyRecord.php b/src/php/HAB/Pica/Record/CopyRecord.php
index 98cc095..b3ac3fd 100644
--- a/src/php/HAB/Pica/Record/CopyRecord.php
+++ b/src/php/HAB/Pica/Record/CopyRecord.php
@@ -125,4 +125,42 @@ class CopyRecord extends Record {
       $this->append(new Field('203@', $this->getItemNumber(), array(new Subfield('0', $epn))));
     }
   }
+
+  /**
+   * Set the containing local record.
+   *
+   * @param  \HAB\Pica\Record\LocalRecord $record Local record
+   * @return void
+   */
+  public function setLocalRecord (\HAB\Pica\Record\LocalRecord $record) {
+      $this->unsetLocalRecord();
+      if (!$record->containsCopyRecord($this)) {
+          $record->addCopyRecord($this);
+      }
+      $this->_parent = $record;
+  }
+
+  /**
+   * Unset the containing local record.
+   *
+   * @return void
+   */
+  public function unsetLocalRecord () {
+      if ($this->_parent) {
+          if ($this->_parent->containsCopyRecord($this)) {
+              $this->_parent->removeCopyRecord($this);
+          }
+          $this->_parent = null;
+      }
+  }
+
+  /**
+   * Return the containing local record.
+   *
+   * @return \HAB\Pica\Record\LocalRecord|null
+   */
+  public function getLocalRecord () {
+      return $this->_parent;
+  }
+
 }
\ No newline at end of file
diff --git a/src/php/HAB/Pica/Record/LocalRecord.php b/src/php/HAB/Pica/Record/LocalRecord.php
index c959c99..48c4fed 100644
--- a/src/php/HAB/Pica/Record/LocalRecord.php
+++ b/src/php/HAB/Pica/Record/LocalRecord.php
@@ -68,6 +68,7 @@ class LocalRecord extends NestedRecord {
       throw new \InvalidArgumentException("Cannot add copy record: Copy record with item number {$record->getItemNumber()} already present");
     }
     $this->addRecord($record);
+    $record->setLocalRecord($this);
   }
 
   /**
@@ -79,6 +80,7 @@ class LocalRecord extends NestedRecord {
    */
   public function removeCopyRecord (\HAB\Pica\Record\CopyRecord $record) {
     $this->removeRecord($record);
+    $record->unsetLocalRecord();
   }
 
   /**
@@ -131,6 +133,43 @@ class LocalRecord extends NestedRecord {
     return $this->containsRecord($record);
   }
 
+  /**
+   * Set the containing title record.
+   *
+   * @param  \HAB\Pica\Record\TitleRecord $record Title record
+   * @return void
+   */
+  public function setTitleRecord (\HAB\Pica\Record\TitleRecord $record) {
+      $this->unsetTitleRecord();
+      if (!$record->containsLocalRecord($this)) {
+          $record->addLocalRecord($this);
+      }
+      $this->_parent = $record;
+  }
+
+  /**
+   * Unset the containing title record.
+   *
+   * @return void
+   */
+  public function unsetTitleRecord () {
+      if ($this->_parent) {
+          if ($this->_parent->containsLocalRecord($this)) {
+              $this->_parent->removeLocalRecord($this);
+          }
+          $this->_parent = null;
+      }
+  }
+
+  /**
+   * Return the containing local record.
+   *
+   * @return \HAB\Pica\Record\TitleRecord|null
+   */
+  public function getTitleRecord () {
+      return $this->_parent;
+  }
+
   /**
    * Compare two copy records.
    *
@@ -146,4 +185,5 @@ class LocalRecord extends NestedRecord {
   protected function compareRecords (\HAB\Pica\Record\Record $a, \HAB\Pica\Record\Record $b) {
     return $a->getItemNumber() - $b->getItemNumber();
   }
+
 }
\ No newline at end of file
diff --git a/src/php/HAB/Pica/Record/TitleRecord.php b/src/php/HAB/Pica/Record/TitleRecord.php
index 6ec2c76..6dd7fe5 100644
--- a/src/php/HAB/Pica/Record/TitleRecord.php
+++ b/src/php/HAB/Pica/Record/TitleRecord.php
@@ -103,6 +103,7 @@ class TitleRecord extends NestedRecord {
    */
   public function addLocalRecord (\HAB\Pica\Record\LocalRecord $record) {
     $this->addRecord($record);
+    $record->setTitleRecord($this);
   }
 
   /**
@@ -114,6 +115,7 @@ class TitleRecord extends NestedRecord {
    */
   public function removeLocalRecord (\HAB\Pica\Record\LocalRecord $record) {
     $this->removeRecord($record);
+    $record->unsetTitleRecord();
   }
 
   /**
diff --git a/src/tests/unit-tests/php/HAB/Pica/Record/CopyRecordTest.php b/src/tests/unit-tests/php/HAB/Pica/Record/CopyRecordTest.php
index c84ae0d..86cf24a 100644
--- a/src/tests/unit-tests/php/HAB/Pica/Record/CopyRecordTest.php
+++ b/src/tests/unit-tests/php/HAB/Pica/Record/CopyRecordTest.php
@@ -42,6 +42,17 @@ class CopyRecordTest extends \PHPUnit_FrameWork_TestCase {
     $this->assertEquals('epn', $r->getEPN());
   }
 
+  public function testLocalRecordReference () {
+    $l = new LocalRecord();
+    $c = new CopyRecord();
+    $this->assertNull($c->getLocalRecord());
+    $l->addCopyRecord($c);
+    $this->assertSame($l, $c->getLocalRecord());
+    $c->unsetLocalRecord();
+    $this->assertNull($c->getLocalRecord());
+    $this->assertFalse($l->containsCopyRecord($c));
+  }
+
   ///
 
   /**
diff --git a/src/tests/unit-tests/php/HAB/Pica/Record/LocalRecordTest.php b/src/tests/unit-tests/php/HAB/Pica/Record/LocalRecordTest.php
index 98536af..3e86447 100644
--- a/src/tests/unit-tests/php/HAB/Pica/Record/LocalRecordTest.php
+++ b/src/tests/unit-tests/php/HAB/Pica/Record/LocalRecordTest.php
@@ -111,6 +111,17 @@ class LocalRecordTest extends \PHPUnit_FrameWork_TestCase {
     $this->assertTrue($r->containsCopyRecord($c));
   }
 
+  public function testTitleRecordReference () {
+    $t = new TitleRecord();
+    $l = new LocalRecord();
+    $this->assertNull($l->getTitleRecord());
+    $t->addLocalRecord($l);
+    $this->assertSame($t, $l->getTitleRecord());
+    $l->unsetTitleRecord();
+    $this->assertNull($l->getTitleRecord());
+    $this->assertFalse($t->containsLocalRecord($l));
+  }
+
   ///
 
   /**
-- 
GitLab