123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445 |
- <?php
- declare(strict_types=1);
- /**
- * @copyright 2023 Maxence Lange <maxence@artificial-owl.com>
- *
- * @author Maxence Lange <maxence@artificial-owl.com>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- namespace OC\FilesMetadata\Model;
- use OCP\FilesMetadata\Exceptions\FilesMetadataNotFoundException;
- use OCP\FilesMetadata\Exceptions\FilesMetadataTypeException;
- use OCP\FilesMetadata\Model\IMetadataValueWrapper;
- /**
- * @inheritDoc
- * @see IFilesMetadata
- * @since 28.0.0
- */
- class MetadataValueWrapper implements IMetadataValueWrapper {
- private string $type;
- /** @var string|int|float|bool|array|string[]|int[] */
- private mixed $value = null;
- private string $etag = '';
- private bool $indexed = false;
- private int $editPermission = self::EDIT_FORBIDDEN;
- /**
- * @param string $type value type
- *
- * @inheritDoc
- * @see self::TYPE_INT
- * @see self::TYPE_FLOAT
- * @see self::TYPE_BOOL
- * @see self::TYPE_ARRAY
- * @see self::TYPE_STRING_LIST
- * @see self::TYPE_INT_LIST
- * @see self::TYPE_STRING
- * @since 28.0.0
- */
- public function __construct(string $type = '') {
- $this->type = $type;
- }
- /**
- * @inheritDoc
- * @return string value type
- * @see self::TYPE_INT
- * @see self::TYPE_FLOAT
- * @see self::TYPE_BOOL
- * @see self::TYPE_ARRAY
- * @see self::TYPE_STRING_LIST
- * @see self::TYPE_INT_LIST
- * @see self::TYPE_STRING
- * @since 28.0.0
- */
- public function getType(): string {
- return $this->type;
- }
- /**
- * @param string $type value type
- *
- * @inheritDoc
- * @return bool
- * @see self::TYPE_INT
- * @see self::TYPE_FLOAT
- * @see self::TYPE_BOOL
- * @see self::TYPE_ARRAY
- * @see self::TYPE_STRING_LIST
- * @see self::TYPE_INT_LIST
- * @see self::TYPE_STRING
- * @since 28.0.0
- */
- public function isType(string $type): bool {
- return (strtolower($type) === strtolower($this->type));
- }
- /**
- * @param string $type value type
- *
- * @inheritDoc
- * @return self
- * @throws FilesMetadataTypeException if type cannot be confirmed
- * @see self::TYPE_INT
- * @see self::TYPE_BOOL
- * @see self::TYPE_ARRAY
- * @see self::TYPE_STRING_LIST
- * @see self::TYPE_INT_LIST
- * @see self::TYPE_STRING
- * @see self::TYPE_FLOAT
- * @since 28.0.0
- */
- public function assertType(string $type): self {
- if (!$this->isType($type)) {
- throw new FilesMetadataTypeException('type is \'' . $this->getType() . '\', expecting \'' . $type . '\'');
- }
- return $this;
- }
- /**
- * @param string $value string to be set as value
- *
- * @inheritDoc
- * @return self
- * @throws FilesMetadataTypeException if wrapper was not set to store a string
- * @since 28.0.0
- */
- public function setValueString(string $value): self {
- $this->assertType(self::TYPE_STRING);
- $this->value = $value;
- return $this;
- }
- /**
- * @param int $value int to be set as value
- *
- * @inheritDoc
- * @return self
- * @throws FilesMetadataTypeException if wrapper was not set to store an int
- * @since 28.0.0
- */
- public function setValueInt(int $value): self {
- $this->assertType(self::TYPE_INT);
- $this->value = $value;
- return $this;
- }
- /**
- * @param float $value float to be set as value
- *
- * @inheritDoc
- * @return self
- * @throws FilesMetadataTypeException if wrapper was not set to store a float
- * @since 28.0.0
- */
- public function setValueFloat(float $value): self {
- $this->assertType(self::TYPE_FLOAT);
- $this->value = $value;
- return $this;
- }
- /**
- * @param bool $value bool to be set as value
- *
- * @inheritDoc
- * @return self
- * @throws FilesMetadataTypeException if wrapper was not set to store a bool
- * @since 28.0.0
- */
- public function setValueBool(bool $value): self {
- $this->assertType(self::TYPE_BOOL);
- $this->value = $value;
- return $this;
- }
- /**
- * @param array $value array to be set as value
- *
- * @inheritDoc
- * @return self
- * @throws FilesMetadataTypeException if wrapper was not set to store an array
- * @since 28.0.0
- */
- public function setValueArray(array $value): self {
- $this->assertType(self::TYPE_ARRAY);
- $this->value = $value;
- return $this;
- }
- /**
- * @param string[] $value string list to be set as value
- *
- * @inheritDoc
- * @return self
- * @throws FilesMetadataTypeException if wrapper was not set to store a string list
- * @since 28.0.0
- */
- public function setValueStringList(array $value): self {
- $this->assertType(self::TYPE_STRING_LIST);
- // TODO confirm value is an array or string ?
- $this->value = $value;
- return $this;
- }
- /**
- * @param int[] $value int list to be set as value
- *
- * @inheritDoc
- * @return self
- * @throws FilesMetadataTypeException if wrapper was not set to store an int list
- * @since 28.0.0
- */
- public function setValueIntList(array $value): self {
- $this->assertType(self::TYPE_INT_LIST);
- // TODO confirm value is an array of int ?
- $this->value = $value;
- return $this;
- }
- /**
- * @inheritDoc
- * @return string set value
- * @throws FilesMetadataTypeException if wrapper was not set to store a string
- * @throws FilesMetadataNotFoundException if value is not set
- * @since 28.0.0
- */
- public function getValueString(): string {
- $this->assertType(self::TYPE_STRING);
- if (null === $this->value) {
- throw new FilesMetadataNotFoundException('value is not set');
- }
- return (string)$this->value;
- }
- /**
- * @inheritDoc
- * @return int set value
- * @throws FilesMetadataTypeException if wrapper was not set to store an int
- * @throws FilesMetadataNotFoundException if value is not set
- * @since 28.0.0
- */
- public function getValueInt(): int {
- $this->assertType(self::TYPE_INT);
- if (null === $this->value) {
- throw new FilesMetadataNotFoundException('value is not set');
- }
- return (int)$this->value;
- }
- /**
- * @inheritDoc
- * @return float set value
- * @throws FilesMetadataTypeException if wrapper was not set to store a float
- * @throws FilesMetadataNotFoundException if value is not set
- * @since 28.0.0
- */
- public function getValueFloat(): float {
- $this->assertType(self::TYPE_FLOAT);
- if (null === $this->value) {
- throw new FilesMetadataNotFoundException('value is not set');
- }
- return (float)$this->value;
- }
- /**
- * @inheritDoc
- * @return bool set value
- * @throws FilesMetadataTypeException if wrapper was not set to store a bool
- * @throws FilesMetadataNotFoundException if value is not set
- * @since 28.0.0
- */
- public function getValueBool(): bool {
- $this->assertType(self::TYPE_BOOL);
- if (null === $this->value) {
- throw new FilesMetadataNotFoundException('value is not set');
- }
- return (bool)$this->value;
- }
- /**
- * @inheritDoc
- * @return array set value
- * @throws FilesMetadataTypeException if wrapper was not set to store an array
- * @throws FilesMetadataNotFoundException if value is not set
- * @since 28.0.0
- */
- public function getValueArray(): array {
- $this->assertType(self::TYPE_ARRAY);
- if (null === $this->value) {
- throw new FilesMetadataNotFoundException('value is not set');
- }
- return (array)$this->value;
- }
- /**
- * @inheritDoc
- * @return string[] set value
- * @throws FilesMetadataTypeException if wrapper was not set to store a string list
- * @throws FilesMetadataNotFoundException if value is not set
- * @since 28.0.0
- */
- public function getValueStringList(): array {
- $this->assertType(self::TYPE_STRING_LIST);
- if (null === $this->value) {
- throw new FilesMetadataNotFoundException('value is not set');
- }
- return (array)$this->value;
- }
- /**
- * @inheritDoc
- * @return int[] set value
- * @throws FilesMetadataTypeException if wrapper was not set to store an int list
- * @throws FilesMetadataNotFoundException if value is not set
- * @since 28.0.0
- */
- public function getValueIntList(): array {
- $this->assertType(self::TYPE_INT_LIST);
- if (null === $this->value) {
- throw new FilesMetadataNotFoundException('value is not set');
- }
- return (array)$this->value;
- }
- /**
- * @inheritDoc
- * @return string|int|float|bool|array|string[]|int[] set value
- * @throws FilesMetadataNotFoundException if value is not set
- * @since 28.0.0
- */
- public function getValueAny(): mixed {
- if (null === $this->value) {
- throw new FilesMetadataNotFoundException('value is not set');
- }
- return $this->value;
- }
- /**
- * @inheritDoc
- * @return string stored etag
- * @since 29.0.0
- */
- public function getEtag(): string {
- return $this->etag;
- }
- /**
- * @param string $etag etag value
- *
- * @inheritDoc
- * @return self
- * @since 29.0.0
- */
- public function setEtag(string $etag): self {
- $this->etag = $etag;
- return $this;
- }
- /**
- * @param bool $indexed TRUE to set the stored value as an indexed value
- *
- * @inheritDoc
- * @return self
- * @since 28.0.0
- */
- public function setIndexed(bool $indexed): self {
- $this->indexed = $indexed;
- return $this;
- }
- /**
- * @inheritDoc
- * @return bool TRUE if value is an indexed value
- * @since 28.0.0
- */
- public function isIndexed(): bool {
- return $this->indexed;
- }
- /**
- * @param int $permission edit permission
- *
- * @inheritDoc
- * @return self
- * @since 28.0.0
- */
- public function setEditPermission(int $permission): self {
- $this->editPermission = $permission;
- return $this;
- }
- /**
- * @inheritDoc
- * @return int edit permission
- * @since 28.0.0
- */
- public function getEditPermission(): int {
- return $this->editPermission;
- }
- /**
- * @param array $data serialized version of the object
- *
- * @inheritDoc
- * @return self
- * @see jsonSerialize
- * @since 28.0.0
- */
- public function import(array $data): self {
- $this->value = $data['value'] ?? null;
- $this->type = $data['type'] ?? '';
- $this->setEtag($data['etag'] ?? '');
- $this->setIndexed($data['indexed'] ?? false);
- $this->setEditPermission($data['editPermission'] ?? self::EDIT_FORBIDDEN);
- return $this;
- }
- public function jsonSerialize(bool $emptyValues = false): array {
- return [
- 'value' => ($emptyValues) ? null : $this->value,
- 'type' => $this->getType(),
- 'etag' => $this->getEtag(),
- 'indexed' => $this->isIndexed(),
- 'editPermission' => $this->getEditPermission()
- ];
- }
- }
|