Skip to content

Commit

Permalink
Merge pull request #33 from OPUS4/OPUSVIER-3960
Browse files Browse the repository at this point in the history
OPUSVIER-3960 Fixing DOI update modifying ServerDateModified.
  • Loading branch information
j3nsch authored Nov 22, 2018
2 parents 2d94cfe + da46ace commit 5ee6ec9
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 24 deletions.
35 changes: 12 additions & 23 deletions library/Opus/Model/Plugin/InvalidateDocumentCache.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@
* TODO models should define their own lists (decentralized, object-oriented) - OPUSVIER-3759
* TODO cache should be transparent - important is updating ServerDateModified
*/
class Opus_Model_Plugin_InvalidateDocumentCache extends Opus_Model_Plugin_Abstract {
class Opus_Model_Plugin_InvalidateDocumentCache extends Opus_Model_Plugin_Abstract
{

/**
* Run method invalidateDocumentCacheFor() in postStore if true.
Expand Down Expand Up @@ -76,19 +77,16 @@ public function preStore(Opus_Model_AbstractDb $model)

$config = self::getFilterConfig();

if (isset($config->{$modelClass}))
{
if (isset($config->{$modelClass})) {
$blacklist = $config->{$modelClass}->toArray();

$filter = new Opus_Model_Filter();
$filter->setModel($model);
$filter->setBlacklist($blacklist);
$whitelist = $filter->describe();

foreach ($whitelist as $fieldName)
{
if ($model->hasField($fieldName) && $model->getField($fieldName)->isModified())
{
foreach ($whitelist as $fieldName) {
if ($model->hasField($fieldName) && $model->getField($fieldName)->isModified()) {
// change modifies metadata
$this->_postStoreUpdateDocuments = true;
$this->_updateServerDateModified = true;
Expand All @@ -98,15 +96,12 @@ public function preStore(Opus_Model_AbstractDb $model)

$configKey = 'cache.' . $modelClass;

if (isset($config->{$configKey}))
{
if (isset($config->{$configKey})) {
$cacheList = $config->{$configKey}->toArray();

// check if cache should be deleted for blacklisted field
foreach ($blacklist as $fieldName)
{
if ($model->hasField($fieldName) && $model->getField($fieldName)->isModified() && in_array($fieldName, $cacheList))
{
foreach ($blacklist as $fieldName) {
if ($model->hasField($fieldName) && $model->getField($fieldName)->isModified() && in_array($fieldName, $cacheList)) {
$this->_postStoreUpdateDocuments = true;
$this->_updateServerDateModified = false;
return;
Expand All @@ -124,8 +119,7 @@ public function preStore(Opus_Model_AbstractDb $model)
*/
public function postStore(Opus_Model_AbstractDb $model)
{
if ($this->_postStoreUpdateDocuments)
{
if ($this->_postStoreUpdateDocuments) {
$this->invalidateDocumentCacheFor($model);
}
}
Expand All @@ -140,8 +134,7 @@ public function postStore(Opus_Model_AbstractDb $model)
public function preDelete(Opus_Model_AbstractDb $model)
{
$modelId = $model->getId();
if (!$model->isNewRecord() && !empty($modelId))
{
if (!$model->isNewRecord() && !empty($modelId)) {
$this->invalidateDocumentCacheFor($model);
}
}
Expand Down Expand Up @@ -169,8 +162,7 @@ protected function invalidateDocumentCacheFor(Opus_Model_AbstractDb $model)
$xmlCache = new Opus_Model_Xml_Cache();
$xmlCache->removeAllEntriesWhereSubSelect($select);

if ($this->_updateServerDateModified)
{
if ($this->_updateServerDateModified) {
$date = new Opus_Date();
$date->setNow();
Opus_Document::setServerDateModifiedByIds($date, $ids);
Expand All @@ -184,8 +176,7 @@ protected function invalidateDocumentCacheFor(Opus_Model_AbstractDb $model)
*/
public static function getFilterConfig()
{
if (is_null(self::$_filterConfig))
{
if (is_null(self::$_filterConfig)) {
self::$_filterConfig = new Zend_Config_Ini(dirname(__FILE__) . '/updatedocument_filter.ini');
}

Expand All @@ -201,6 +192,4 @@ public static function setFilterConfig($config)
{
self::$_filterConfig = $config;
}

}

5 changes: 4 additions & 1 deletion library/Opus/Model/Plugin/updatedocument_filter.ini
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
; Changes of fields for a specific model listed here do not trigger
; Changes of fields for a specific model listed here do not trigger
; cache invalidation or an update of the server_date_modified
; of related Opus_Documents. See Opus_Model_Plugin_InvalidateDocumentCache:preStore()
; for implementation details.
Expand Down Expand Up @@ -31,6 +31,9 @@ Opus_Series[]=SortOrder
Opus_Series[]=Infobox
Opus_Series[]=Visible

Opus_Identifier[]=Status
Opus_Identifier[]=RegistrationTs

; explicitly request cache clearing for DisplayFrontdoor
cache.Opus_CollectionRole[]=DisplayFrontdoor
cache.Opus_CollectionRole[]=Visible
Expand Down
60 changes: 60 additions & 0 deletions tests/Opus/IdentifierTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -519,4 +519,64 @@ public function testFromArray()
$this->assertEquals('registered', $identifier->getStatus());
$this->assertEquals('2018-10-11 15:45:21', $identifier->getRegistrationTs());
}

public function testModifyingStatusDoesNotChangeServerDateModified()
{
$doc = new Opus_Document();
$identifier = new Opus_Identifier();
$identifier->setType('old');
$identifier->setValue('123-45678-123');
$doc->addIdentifier($identifier);

$docId = $doc->store();

$doc = new Opus_Document($docId);

$modified = $doc->getServerDateModified();

sleep(2);

$identifier = $doc->getIdentifier(0);

$this->assertNotEquals('registered', $identifier->getStatus());

$identifier->setStatus('registered');
$identifier->store();

$doc = new Opus_Document($docId);

$this->assertEquals(0, $doc->getServerDateModified()->compare($modified));
$this->assertEquals('registered', $doc->getIdentifier(0)->getStatus());
}

public function testModifyingRegistrationTsDoesNotChangeServerDateModified()
{
$doc = new Opus_Document();
$identifier = new Opus_Identifier();
$identifier->setType('old');
$identifier->setValue('123-45678-123');
$doc->addIdentifier($identifier);

$docId = $doc->store();

$doc = new Opus_Document($docId);

$modified = $doc->getServerDateModified();

sleep(2);

$identifier = $doc->getIdentifier(0);

$this->assertNotEquals('registered', $identifier->getStatus());

$timestamp = '2018-10-12 13:45:21';

$identifier->setRegistrationTs($timestamp);
$identifier->store();

$doc = new Opus_Document($docId);

$this->assertEquals(0, $doc->getServerDateModified()->compare($modified));
$this->assertEquals($timestamp, $doc->getIdentifier(0)->getRegistrationTs());
}
}

0 comments on commit 5ee6ec9

Please sign in to comment.