1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeau 4*04fd306cSNickeaunamespace ComboStrap\Meta\Api; 5*04fd306cSNickeau 6*04fd306cSNickeauuse ComboStrap\DataType; 7*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument; 8*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 9*04fd306cSNickeauuse ComboStrap\LogUtility; 10*04fd306cSNickeauuse ComboStrap\WikiPath; 11*04fd306cSNickeau 12*04fd306cSNickeau/** 13*04fd306cSNickeau * Class MetadataWikiPath 14*04fd306cSNickeau * @package ComboStrap 15*04fd306cSNickeau * A wiki path value where the separator is a {@link WikiPath::NAMESPACE_SEPARATOR_DOUBLE_POINT} 16*04fd306cSNickeau * 17*04fd306cSNickeau 18*04fd306cSNickeau */ 19*04fd306cSNickeauabstract class MetadataWikiPath extends Metadata 20*04fd306cSNickeau{ 21*04fd306cSNickeau 22*04fd306cSNickeau /** 23*04fd306cSNickeau * @return string - the drive from where the path should be created (ie the poth string only is stored) 24*04fd306cSNickeau */ 25*04fd306cSNickeau public abstract static function getDrive(): string; 26*04fd306cSNickeau 27*04fd306cSNickeau 28*04fd306cSNickeau /** 29*04fd306cSNickeau * @return string 30*04fd306cSNickeau * 31*04fd306cSNickeau * We don't extend text because the default wiki path 32*04fd306cSNickeau * can be an image that is not a simple path but an image 33*04fd306cSNickeau * in the resources 34*04fd306cSNickeau * 35*04fd306cSNickeau * We store still the image path in the store as text 36*04fd306cSNickeau */ 37*04fd306cSNickeau public static function getDataType(): string 38*04fd306cSNickeau { 39*04fd306cSNickeau return DataType::TEXT_TYPE_VALUE; 40*04fd306cSNickeau } 41*04fd306cSNickeau 42*04fd306cSNickeau 43*04fd306cSNickeau /** 44*04fd306cSNickeau * @var WikiPath 45*04fd306cSNickeau */ 46*04fd306cSNickeau protected WikiPath $value; 47*04fd306cSNickeau 48*04fd306cSNickeau /** 49*04fd306cSNickeau * @param WikiPath|string|null $value 50*04fd306cSNickeau * @return Metadata 51*04fd306cSNickeau */ 52*04fd306cSNickeau public function setValue($value): Metadata 53*04fd306cSNickeau { 54*04fd306cSNickeau if ($value === null) { 55*04fd306cSNickeau return $this; 56*04fd306cSNickeau } 57*04fd306cSNickeau 58*04fd306cSNickeau if ($value instanceof WikiPath) { 59*04fd306cSNickeau $this->value = $value; 60*04fd306cSNickeau return $this; 61*04fd306cSNickeau } 62*04fd306cSNickeau 63*04fd306cSNickeau if ($value === "" || $value === ":") { 64*04fd306cSNickeau // form send empty string 65*04fd306cSNickeau // for the root `:`, non canonical 66*04fd306cSNickeau return $this; 67*04fd306cSNickeau } 68*04fd306cSNickeau $value = WikiPath::toValidAbsolutePath($value); 69*04fd306cSNickeau $this->value = WikiPath::createWikiPath($value, $this->getDrive()); 70*04fd306cSNickeau return $this; 71*04fd306cSNickeau } 72*04fd306cSNickeau 73*04fd306cSNickeau 74*04fd306cSNickeau public function toStoreValue() 75*04fd306cSNickeau { 76*04fd306cSNickeau try { 77*04fd306cSNickeau /** 78*04fd306cSNickeau * {@link self::getValue()} because 79*04fd306cSNickeau * it may be overwritten by derived metadata 80*04fd306cSNickeau */ 81*04fd306cSNickeau $actualPath = $this->getValue(); 82*04fd306cSNickeau } catch (ExceptionNotFound $e) { 83*04fd306cSNickeau return null; 84*04fd306cSNickeau } 85*04fd306cSNickeau /** 86*04fd306cSNickeau * The absolute id with the extension if not a wiki file 87*04fd306cSNickeau */ 88*04fd306cSNickeau return $actualPath->toAbsoluteId(); 89*04fd306cSNickeau } 90*04fd306cSNickeau 91*04fd306cSNickeau public function toStoreDefaultValue() 92*04fd306cSNickeau { 93*04fd306cSNickeau try { 94*04fd306cSNickeau $defaultValue = $this->getDefaultValue(); 95*04fd306cSNickeau if (!($defaultValue instanceof WikiPath)) { 96*04fd306cSNickeau LogUtility::internalError("The value ($defaultValue) is not a wiki path"); 97*04fd306cSNickeau return $defaultValue; 98*04fd306cSNickeau } 99*04fd306cSNickeau return $defaultValue->toAbsoluteId(); 100*04fd306cSNickeau } catch (ExceptionNotFound $e) { 101*04fd306cSNickeau return null; 102*04fd306cSNickeau } 103*04fd306cSNickeau } 104*04fd306cSNickeau 105*04fd306cSNickeau 106*04fd306cSNickeau public function setFromStoreValueWithoutException($value): Metadata 107*04fd306cSNickeau { 108*04fd306cSNickeau if ($value === null || trim($value) === "") { 109*04fd306cSNickeau return $this; 110*04fd306cSNickeau } 111*04fd306cSNickeau 112*04fd306cSNickeau if ($value instanceof WikiPath) { 113*04fd306cSNickeau $this->value = $value; 114*04fd306cSNickeau return $this; 115*04fd306cSNickeau } 116*04fd306cSNickeau 117*04fd306cSNickeau $value = WikiPath::toValidAbsolutePath($value); 118*04fd306cSNickeau 119*04fd306cSNickeau $drive = $this->getDrive(); 120*04fd306cSNickeau if ($drive === WikiPath::MARKUP_DRIVE) { 121*04fd306cSNickeau /** 122*04fd306cSNickeau * For a Markup drive, a file path should have an extension 123*04fd306cSNickeau * What fucked up is fucked up 124*04fd306cSNickeau */ 125*04fd306cSNickeau try { 126*04fd306cSNickeau $this->value = WikiPath::createMarkupPathFromPath($value); 127*04fd306cSNickeau } catch (ExceptionBadArgument $e) { 128*04fd306cSNickeau LogUtility::internalError("This is not a relative path, we should not get this error"); 129*04fd306cSNickeau $this->value = WikiPath::createFromPath($value, $drive); 130*04fd306cSNickeau } 131*04fd306cSNickeau } else { 132*04fd306cSNickeau $this->value = WikiPath::createFromPath($value, $drive); 133*04fd306cSNickeau } 134*04fd306cSNickeau return $this; 135*04fd306cSNickeau 136*04fd306cSNickeau } 137*04fd306cSNickeau 138*04fd306cSNickeau 139*04fd306cSNickeau /** 140*04fd306cSNickeau * @return WikiPath 141*04fd306cSNickeau * @throws ExceptionNotFound 142*04fd306cSNickeau */ 143*04fd306cSNickeau public function getValue(): WikiPath 144*04fd306cSNickeau { 145*04fd306cSNickeau $this->buildCheck(); 146*04fd306cSNickeau if (isset($this->value)) { 147*04fd306cSNickeau return $this->value; 148*04fd306cSNickeau } 149*04fd306cSNickeau throw new ExceptionNotFound("No value found"); 150*04fd306cSNickeau } 151*04fd306cSNickeau 152*04fd306cSNickeau public function valueIsNotNull(): bool 153*04fd306cSNickeau { 154*04fd306cSNickeau return isset($this->value); 155*04fd306cSNickeau } 156*04fd306cSNickeau 157*04fd306cSNickeau 158*04fd306cSNickeau public function getDefaultValue() 159*04fd306cSNickeau { 160*04fd306cSNickeau throw new ExceptionNotFound("No default value"); 161*04fd306cSNickeau } 162*04fd306cSNickeau 163*04fd306cSNickeau} 164