Omeka SのOAI-PMHリポジトリのresumptionTokenの不具合への対応

2024/10/10に公開

概要

Omeka SのOAI-PMHリポジトリのresumptionTokenにおいて、有効期限内にもかかわらず、以下のように、[badResumptionToken]が出力される事例に遭遇しました。

この不具合への対処方法についてメモします。

対応

以下のファイルについて、$currentTime$expirationTimeを比較する処理を加えたところ、有効期限内のtokenが残るようになりました。

OaiPmhRepository/src/OaiPmh/ResponseGenerator.php
...
    private function resumeListResponse($token): void
    {
        $api = $this->serviceLocator->get('ControllerPluginManager')->get('api');
        $expiredTokens = $api->search('oaipmh_repository_tokens', [
            'expired' => true,
        ])->getContent();
        foreach ($expiredTokens as $expiredToken) {
            $currentTime = new \DateTime(); // 追加
            $expirationTime = $expiredToken->expiration(); // 追加
            if (!$expiredToken || $currentTime > $expirationTime) { // 追加
                $api->delete('oaipmh_repository_tokens', $expiredToken->id());
            } // 追加
        }

上記のような対応をしなくてもうまくいくケースがあったので、PHPのバージョン等による違いがあるのかもしれません。

参考

参考までに、OAI-PMHリポジトリモジュールによって作成されるテーブルの中身を確認しました。

mysql> DESCRIBE oaipmhrepository_token;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int          | NO   | PRI | NULL    | auto_increment |
| verb            | varchar(15)  | NO   |     | NULL    |                |
| metadata_prefix | varchar(190) | NO   |     | NULL    |                |
| cursor          | int          | NO   |     | NULL    |                |
| from            | datetime     | YES  |     | NULL    |                |
| until           | datetime     | YES  |     | NULL    |                |
| set             | varchar(190) | YES  |     | NULL    |                |
| expiration      | datetime     | NO   | MUL | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+
8 rows in set (0.01 sec)

mysql> SELECT * FROM oaipmhrepository_token LIMIT 10;
+----+-------------+-----------------+--------+------+-------+------+---------------------+
| id | verb        | metadata_prefix | cursor | from | until | set  | expiration          |
+----+-------------+-----------------+--------+------+-------+------+---------------------+
|  8 | ListRecords | oai_dc          |     50 | NULL | NULL  | NULL | 2024-10-10 07:07:40 |
|  9 | ListRecords | oai_dc          |     50 | NULL | NULL  | NULL | 2024-10-10 07:07:44 |
| 10 | ListRecords | oai_dc          |    100 | NULL | NULL  | NULL | 2024-10-10 07:07:49 |
| 11 | ListRecords | oai_dc          |    150 | NULL | NULL  | NULL | 2024-10-10 07:07:54 |
| 12 | ListRecords | oai_dc          |     50 | NULL | NULL  | NULL | 2024-10-10 08:16:31 |
| 13 | ListRecords | oai_dc          |    100 | NULL | NULL  | NULL | 2024-10-10 08:16:36 |
| 14 | ListRecords | oai_dc          |    150 | NULL | NULL  | NULL | 2024-10-10 08:16:41 |
| 15 | ListRecords | oai_dc          |    200 | NULL | NULL  | NULL | 2024-10-10 08:16:44 |
+----+-------------+-----------------+--------+------+-------+------+---------------------+

まとめ

不完全な点があるかと思いますが、参考になりましたら幸いです。

Discussion