1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeau 4*04fd306cSNickeaunamespace ComboStrap\Meta\Api; 5*04fd306cSNickeau 6*04fd306cSNickeau 7*04fd306cSNickeauuse ComboStrap\DataType; 8*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument; 9*04fd306cSNickeauuse ComboStrap\ExceptionBadSyntax; 10*04fd306cSNickeauuse ComboStrap\ExceptionCompile; 11*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 12*04fd306cSNickeauuse ComboStrap\ExceptionRuntime; 13*04fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal; 14*04fd306cSNickeauuse ComboStrap\Iso8601Date; 15*04fd306cSNickeauuse ComboStrap\LogUtility; 16*04fd306cSNickeauuse DateTime; 17*04fd306cSNickeau 18*04fd306cSNickeauabstract class MetadataDateTime extends Metadata 19*04fd306cSNickeau{ 20*04fd306cSNickeau 21*04fd306cSNickeau /** 22*04fd306cSNickeau * @var DateTime|null 23*04fd306cSNickeau * may be null as this is a stored value 24*04fd306cSNickeau * but throw a not found exception when the value is null 25*04fd306cSNickeau */ 26*04fd306cSNickeau protected ?DateTime $dateTimeValue = null; 27*04fd306cSNickeau 28*04fd306cSNickeau 29*04fd306cSNickeau /** 30*04fd306cSNickeau * Helper function for date metadata 31*04fd306cSNickeau * @return string|array (may be an array for dokuwiki ie {@link CreationDate::toStoreValue()} for instance 32*04fd306cSNickeau */ 33*04fd306cSNickeau public function toStoreValue() 34*04fd306cSNickeau { 35*04fd306cSNickeau 36*04fd306cSNickeau $this->buildCheck(); 37*04fd306cSNickeau try { 38*04fd306cSNickeau $value = $this->getValue(); 39*04fd306cSNickeau } catch (ExceptionNotFound $e) { 40*04fd306cSNickeau return null; 41*04fd306cSNickeau } 42*04fd306cSNickeau try { 43*04fd306cSNickeau return $this->toPersistentDateTimeUtility($value); 44*04fd306cSNickeau } catch (ExceptionBadArgument $e) { 45*04fd306cSNickeau throw ExceptionRuntimeInternal::withMessageAndError("The date time should have been checked on set. This error should not happen", $e); 46*04fd306cSNickeau } 47*04fd306cSNickeau 48*04fd306cSNickeau } 49*04fd306cSNickeau 50*04fd306cSNickeau /** 51*04fd306cSNickeau * @param DateTime|null $value 52*04fd306cSNickeau * @return $this 53*04fd306cSNickeau */ 54*04fd306cSNickeau public function setValue($value): Metadata 55*04fd306cSNickeau { 56*04fd306cSNickeau if ($value === null) { 57*04fd306cSNickeau $this->dateTimeValue = null; 58*04fd306cSNickeau return $this; 59*04fd306cSNickeau } 60*04fd306cSNickeau if (!($value instanceof DateTime)) { 61*04fd306cSNickeau throw new ExceptionRuntime("The value is not a date time. Value: " . var_export($value, true)); 62*04fd306cSNickeau } 63*04fd306cSNickeau $this->dateTimeValue = $value; 64*04fd306cSNickeau return $this; 65*04fd306cSNickeau } 66*04fd306cSNickeau 67*04fd306cSNickeau /** 68*04fd306cSNickeau * @throws ExceptionCompile 69*04fd306cSNickeau */ 70*04fd306cSNickeau public function setFromStoreValue($value): Metadata 71*04fd306cSNickeau { 72*04fd306cSNickeau return $this->setValue($this->fromPersistentDateTimeUtility($value)); 73*04fd306cSNickeau } 74*04fd306cSNickeau 75*04fd306cSNickeau 76*04fd306cSNickeau public function toStoreDefaultValue(): ?string 77*04fd306cSNickeau { 78*04fd306cSNickeau 79*04fd306cSNickeau try { 80*04fd306cSNickeau $defaultValue = $this->getDefaultValue(); 81*04fd306cSNickeau } catch (ExceptionNotFound $e) { 82*04fd306cSNickeau return null; 83*04fd306cSNickeau } 84*04fd306cSNickeau try { 85*04fd306cSNickeau return $this->toPersistentDateTimeUtility($defaultValue); 86*04fd306cSNickeau } catch (ExceptionBadArgument $e) { 87*04fd306cSNickeau $message = "The date time ($this) has a default value ($defaultValue) that is not valid. Error: {$e->getMessage()}"; 88*04fd306cSNickeau LogUtility::internalError($message); 89*04fd306cSNickeau return null; 90*04fd306cSNickeau } 91*04fd306cSNickeau 92*04fd306cSNickeau } 93*04fd306cSNickeau 94*04fd306cSNickeau public static function getDataType(): string 95*04fd306cSNickeau { 96*04fd306cSNickeau return DataType::DATETIME_TYPE_VALUE; 97*04fd306cSNickeau } 98*04fd306cSNickeau 99*04fd306cSNickeau 100*04fd306cSNickeau public function buildFromReadStore(): MetadataDateTime 101*04fd306cSNickeau { 102*04fd306cSNickeau $value = $this->getReadStore()->get($this); 103*04fd306cSNickeau try { 104*04fd306cSNickeau $this->dateTimeValue = $this->fromPersistentDateTimeUtility($value); 105*04fd306cSNickeau } catch (ExceptionCompile $e) { 106*04fd306cSNickeau LogUtility::msg($e->getMessage(), $this->getCanonical()); 107*04fd306cSNickeau } 108*04fd306cSNickeau return $this; 109*04fd306cSNickeau } 110*04fd306cSNickeau 111*04fd306cSNickeau /** 112*04fd306cSNickeau * @throws ExceptionBadSyntax - if the string is not a date string 113*04fd306cSNickeau * @throws ExceptionBadArgument - if this is not a string 114*04fd306cSNickeau */ 115*04fd306cSNickeau protected function fromPersistentDateTimeUtility($value) 116*04fd306cSNickeau { 117*04fd306cSNickeau if ($value === null || $value === "") { 118*04fd306cSNickeau return null; 119*04fd306cSNickeau } 120*04fd306cSNickeau if (!is_string($value)) { 121*04fd306cSNickeau throw new ExceptionBadArgument("This is not a string value"); 122*04fd306cSNickeau } 123*04fd306cSNickeau return Iso8601Date::createFromString($value)->getDateTime(); 124*04fd306cSNickeau } 125*04fd306cSNickeau 126*04fd306cSNickeau /** 127*04fd306cSNickeau * @throws ExceptionNotFound 128*04fd306cSNickeau */ 129*04fd306cSNickeau public function getValue(): DateTime 130*04fd306cSNickeau { 131*04fd306cSNickeau $this->buildCheck(); 132*04fd306cSNickeau if ($this->dateTimeValue === null) { 133*04fd306cSNickeau throw new ExceptionNotFound("The resource does not have this date time ($this)"); 134*04fd306cSNickeau } 135*04fd306cSNickeau return $this->dateTimeValue; 136*04fd306cSNickeau } 137*04fd306cSNickeau 138*04fd306cSNickeau 139*04fd306cSNickeau /** 140*04fd306cSNickeau * @throws ExceptionBadArgument - if the value is not valid 141*04fd306cSNickeau */ 142*04fd306cSNickeau private function toPersistentDateTimeUtility($value): string 143*04fd306cSNickeau { 144*04fd306cSNickeau if ($value === null) { 145*04fd306cSNickeau throw new ExceptionBadArgument("The passed value is null"); 146*04fd306cSNickeau } 147*04fd306cSNickeau if (!($value instanceof DateTime)) { 148*04fd306cSNickeau throw new ExceptionBadArgument("This is not a date time"); 149*04fd306cSNickeau } 150*04fd306cSNickeau return Iso8601Date::createFromDateTime($value)->toString(); 151*04fd306cSNickeau } 152*04fd306cSNickeau 153*04fd306cSNickeau public static function getCanonical(): string 154*04fd306cSNickeau { 155*04fd306cSNickeau return "date"; 156*04fd306cSNickeau } 157*04fd306cSNickeau 158*04fd306cSNickeau public function valueIsNotNull(): bool 159*04fd306cSNickeau { 160*04fd306cSNickeau return $this->dateTimeValue !== null; 161*04fd306cSNickeau } 162*04fd306cSNickeau 163*04fd306cSNickeau public function setFromStoreValueWithoutException($value): Metadata 164*04fd306cSNickeau { 165*04fd306cSNickeau try { 166*04fd306cSNickeau $this->dateTimeValue = $this->fromPersistentDateTimeUtility($value); 167*04fd306cSNickeau } catch (ExceptionCompile $e) { 168*04fd306cSNickeau LogUtility::msg($e->getMessage(), LogUtility::LVL_MSG_ERROR, $e->getCanonical()); 169*04fd306cSNickeau } 170*04fd306cSNickeau return $this; 171*04fd306cSNickeau } 172*04fd306cSNickeau 173*04fd306cSNickeau 174*04fd306cSNickeau} 175