xref: /plugin/combo/ComboStrap/Meta/Api/MetadataWikiPath.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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