xref: /plugin/combo/ComboStrap/Meta/Api/MetadataSystem.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace ComboStrap\Meta\Api;
4*04fd306cSNickeau
5*04fd306cSNickeauuse ComboStrap\CacheExpirationDate;
6*04fd306cSNickeauuse ComboStrap\CacheExpirationFrequency;
7*04fd306cSNickeauuse ComboStrap\Canonical;
8*04fd306cSNickeauuse ComboStrap\DisqusIdentifier;
9*04fd306cSNickeauuse ComboStrap\DokuwikiId;
10*04fd306cSNickeauuse ComboStrap\EndDate;
11*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument;
12*04fd306cSNickeauuse ComboStrap\ExceptionNotFound;
13*04fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal;
14*04fd306cSNickeauuse ComboStrap\ExecutionContext;
15*04fd306cSNickeauuse ComboStrap\FeaturedIcon;
16*04fd306cSNickeauuse ComboStrap\FirstImage;
17*04fd306cSNickeauuse ComboStrap\FirstRasterImage;
18*04fd306cSNickeauuse ComboStrap\FirstSvgIllustration;
19*04fd306cSNickeauuse ComboStrap\Label;
20*04fd306cSNickeauuse ComboStrap\Lang;
21*04fd306cSNickeauuse ComboStrap\LdJson;
22*04fd306cSNickeauuse ComboStrap\Lead;
23*04fd306cSNickeauuse ComboStrap\Locale;
24*04fd306cSNickeauuse ComboStrap\LogUtility;
25*04fd306cSNickeauuse ComboStrap\LowQualityCalculatedIndicator;
26*04fd306cSNickeauuse ComboStrap\LowQualityPageOverwrite;
27*04fd306cSNickeauuse ComboStrap\Meta\Field\Aliases;
28*04fd306cSNickeauuse ComboStrap\Meta\Field\AliasPath;
29*04fd306cSNickeauuse ComboStrap\Meta\Field\AliasType;
30*04fd306cSNickeauuse ComboStrap\Meta\Field\AncestorImage;
31*04fd306cSNickeauuse ComboStrap\Meta\Field\FacebookImage;
32*04fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedImage;
33*04fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedRasterImage;
34*04fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedSvgImage;
35*04fd306cSNickeauuse ComboStrap\Meta\Field\PageH1;
36*04fd306cSNickeauuse ComboStrap\Meta\Field\PageImage;
37*04fd306cSNickeauuse ComboStrap\Meta\Field\PageImagePath;
38*04fd306cSNickeauuse ComboStrap\Meta\Field\PageImages;
39*04fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName;
40*04fd306cSNickeauuse ComboStrap\Meta\Field\Region;
41*04fd306cSNickeauuse ComboStrap\Meta\Field\SocialCardImage;
42*04fd306cSNickeauuse ComboStrap\Meta\Field\TwitterImage;
43*04fd306cSNickeauuse ComboStrap\ModificationDate;
44*04fd306cSNickeauuse ComboStrap\CreationDate;
45*04fd306cSNickeauuse ComboStrap\PageDescription;
46*04fd306cSNickeauuse ComboStrap\PageId;
47*04fd306cSNickeauuse ComboStrap\PageImageUsage;
48*04fd306cSNickeauuse ComboStrap\PageKeywords;
49*04fd306cSNickeauuse ComboStrap\PageLevel;
50*04fd306cSNickeauuse ComboStrap\PagePath;
51*04fd306cSNickeauuse ComboStrap\PagePublicationDate;
52*04fd306cSNickeauuse ComboStrap\PageTitle;
53*04fd306cSNickeauuse ComboStrap\PageType;
54*04fd306cSNickeauuse ComboStrap\PageUrlPath;
55*04fd306cSNickeauuse ComboStrap\PluginUtility;
56*04fd306cSNickeauuse ComboStrap\QualityDynamicMonitoringOverwrite;
57*04fd306cSNickeauuse ComboStrap\References;
58*04fd306cSNickeauuse ComboStrap\ReplicationDate;
59*04fd306cSNickeauuse ComboStrap\ResourceName;
60*04fd306cSNickeauuse ComboStrap\Slug;
61*04fd306cSNickeauuse ComboStrap\StartDate;
62*04fd306cSNickeau
63*04fd306cSNickeauclass MetadataSystem
64*04fd306cSNickeau{
65*04fd306cSNickeau
66*04fd306cSNickeau    /**
67*04fd306cSNickeau     * All known metadatas
68*04fd306cSNickeau     */
69*04fd306cSNickeau    public const METADATAS = [
70*04fd306cSNickeau        Aliases::PROPERTY_NAME => Aliases::class,
71*04fd306cSNickeau        Canonical::PROPERTY_NAME => Canonical::class,
72*04fd306cSNickeau        EndDate::PROPERTY_NAME => EndDate::class,
73*04fd306cSNickeau        PageType::PROPERTY_NAME => PageType::class,
74*04fd306cSNickeau        PageH1::PROPERTY_NAME => PageH1::class,
75*04fd306cSNickeau        PageUrlPath::PROPERTY_NAME => PageUrlPath::class,
76*04fd306cSNickeau        Lang::PROPERTY_NAME => Lang::class,
77*04fd306cSNickeau        LdJson::PROPERTY_NAME => LdJson::class,
78*04fd306cSNickeau        LdJson::OLD_ORGANIZATION_PROPERTY => LdJson::class,
79*04fd306cSNickeau        PageTitle::PROPERTY_NAME => PageTitle::class,
80*04fd306cSNickeau        PagePublicationDate::PROPERTY_NAME => PagePublicationDate::class,
81*04fd306cSNickeau        PagePublicationDate::OLD_META_KEY => PagePublicationDate::class,
82*04fd306cSNickeau        Region::PROPERTY_NAME => Region::class,
83*04fd306cSNickeau        ResourceName::PROPERTY_NAME => ResourceName::class,
84*04fd306cSNickeau        StartDate::PROPERTY_NAME => StartDate::class,
85*04fd306cSNickeau        PageDescription::PROPERTY_NAME => PageDescription::class,
86*04fd306cSNickeau        DisqusIdentifier::PROPERTY_NAME => DisqusIdentifier::class,
87*04fd306cSNickeau        Slug::PROPERTY_NAME => Slug::class,
88*04fd306cSNickeau        PageKeywords::PROPERTY_NAME => PageKeywords::class,
89*04fd306cSNickeau        CacheExpirationFrequency::PROPERTY_NAME => CacheExpirationFrequency::class,
90*04fd306cSNickeau        QualityDynamicMonitoringOverwrite::PROPERTY_NAME => QualityDynamicMonitoringOverwrite::class,
91*04fd306cSNickeau        LowQualityPageOverwrite::PROPERTY_NAME => LowQualityPageOverwrite::class,
92*04fd306cSNickeau        Locale::PROPERTY_NAME=>Locale::class,
93*04fd306cSNickeau        CacheExpirationDate::PROPERTY_NAME=>CacheExpirationDate::class,
94*04fd306cSNickeau        FeaturedImage::PROPERTY_NAME => FeaturedImage::class,
95*04fd306cSNickeau        FeaturedSvgImage::PROPERTY_NAME => FeaturedSvgImage::class,
96*04fd306cSNickeau        FeaturedRasterImage::PROPERTY_NAME => FeaturedRasterImage::class,
97*04fd306cSNickeau        FeaturedIcon::PROPERTY_NAME => FeaturedIcon::class,
98*04fd306cSNickeau        Lead::PROPERTY_NAME => Lead::class,
99*04fd306cSNickeau        Label::PROPERTY_NAME => Label::class,
100*04fd306cSNickeau        TwitterImage::PROPERTY_NAME => TwitterImage::class,
101*04fd306cSNickeau        FacebookImage::PROPERTY_NAME => FacebookImage::class,
102*04fd306cSNickeau        AliasPath::PROPERTY_NAME => Aliases::class,
103*04fd306cSNickeau        AliasType::PROPERTY_NAME => Aliases::class,
104*04fd306cSNickeau        PageImages::PROPERTY_NAME => PageImages::class,
105*04fd306cSNickeau        PageImages::OLD_PROPERTY_NAME => PageImages::class,
106*04fd306cSNickeau        PageImagePath::PROPERTY_NAME => PageImages::class,
107*04fd306cSNickeau        PageImageUsage::PROPERTY_NAME => PageImages::class,
108*04fd306cSNickeau        SocialCardImage::PROPERTY_NAME => SocialCardImage::class,
109*04fd306cSNickeau        AncestorImage::PROPERTY_NAME => AncestorImage::class,
110*04fd306cSNickeau        FirstImage::PROPERTY_NAME => FirstImage::class,
111*04fd306cSNickeau        Region::OLD_REGION_PROPERTY => Region::class,
112*04fd306cSNickeau        PageTemplateName::PROPERTY_NAME => PageTemplateName::class,
113*04fd306cSNickeau        PageTemplateName::PROPERTY_NAME_OLD => PageTemplateName::class,
114*04fd306cSNickeau        DokuwikiId::DOKUWIKI_ID_ATTRIBUTE => DokuwikiId::class,
115*04fd306cSNickeau        ReplicationDate::PROPERTY_NAME => ReplicationDate::class,
116*04fd306cSNickeau        References::PROPERTY_NAME => References::class,
117*04fd306cSNickeau        LowQualityCalculatedIndicator::PROPERTY_NAME => LowQualityCalculatedIndicator::class,
118*04fd306cSNickeau        PagePath::PROPERTY_NAME => PagePath::class,
119*04fd306cSNickeau        CreationDate::PROPERTY_NAME => CreationDate::class,
120*04fd306cSNickeau        ModificationDate::PROPERTY_NAME => ModificationDate::class,
121*04fd306cSNickeau        PageLevel::PROPERTY_NAME => PageLevel::class,
122*04fd306cSNickeau        PageId::PROPERTY_NAME => PageId::class
123*04fd306cSNickeau    ];
124*04fd306cSNickeau
125*04fd306cSNickeau
126*04fd306cSNickeau    /**
127*04fd306cSNickeau     * @return Metadata[]
128*04fd306cSNickeau     */
129*04fd306cSNickeau    public static function getMetadataObjects(): array
130*04fd306cSNickeau    {
131*04fd306cSNickeau        /**
132*04fd306cSNickeau         * TODO: create a metadata metadata object and a metadata processing object
133*04fd306cSNickeau         *   We can't cache as we mix for now, in the same object
134*04fd306cSNickeau         *     * the metadata metadata (ie {@link Metadata::isOnForm()}, ...
135*04fd306cSNickeau         *     * and the process object {@link Metadata::setReadStore()}, writestore, value
136*04fd306cSNickeau         */
137*04fd306cSNickeau        $metadatas = [];
138*04fd306cSNickeau        foreach (self::METADATAS as $metadataClass) {
139*04fd306cSNickeau            $metadatas[] = new $metadataClass();
140*04fd306cSNickeau        }
141*04fd306cSNickeau        return $metadatas;
142*04fd306cSNickeau
143*04fd306cSNickeau    }
144*04fd306cSNickeau
145*04fd306cSNickeau    /**
146*04fd306cSNickeau     * @return Metadata[]
147*04fd306cSNickeau     */
148*04fd306cSNickeau    public static function getMetadataClasses(): array
149*04fd306cSNickeau    {
150*04fd306cSNickeau        return self::METADATAS;
151*04fd306cSNickeau    }
152*04fd306cSNickeau
153*04fd306cSNickeau    /**
154*04fd306cSNickeau     * @param object|string $class
155*04fd306cSNickeau     * @param Metadata|null $parent
156*04fd306cSNickeau     * @return Metadata
157*04fd306cSNickeau     * @throws ExceptionBadArgument - if the class is not a metadata class
158*04fd306cSNickeau     */
159*04fd306cSNickeau    public static function toMetadataObject($class, Metadata $parent = null): Metadata
160*04fd306cSNickeau    {
161*04fd306cSNickeau        if (!is_subclass_of($class, Metadata::class)) {
162*04fd306cSNickeau            throw new ExceptionBadArgument("The class ($class) is not a metadata class");
163*04fd306cSNickeau        }
164*04fd306cSNickeau        return new $class($parent);
165*04fd306cSNickeau    }
166*04fd306cSNickeau
167*04fd306cSNickeau    /**
168*04fd306cSNickeau     * @return Metadata[]
169*04fd306cSNickeau     */
170*04fd306cSNickeau    public static function getMutableMetadata(): array
171*04fd306cSNickeau    {
172*04fd306cSNickeau        $metas = [];
173*04fd306cSNickeau        foreach (MetadataSystem::getMetadataObjects() as $metadata) {
174*04fd306cSNickeau            if ($metadata::isMutable()) {
175*04fd306cSNickeau                $metas[] = $metadata;
176*04fd306cSNickeau            }
177*04fd306cSNickeau        }
178*04fd306cSNickeau        return $metas;
179*04fd306cSNickeau    }
180*04fd306cSNickeau
181*04fd306cSNickeau
182*04fd306cSNickeau    /**
183*04fd306cSNickeau     * @throws ExceptionNotFound
184*04fd306cSNickeau     */
185*04fd306cSNickeau    public static function getForName(string $name): Metadata
186*04fd306cSNickeau    {
187*04fd306cSNickeau
188*04fd306cSNickeau        $name = strtolower(trim($name));
189*04fd306cSNickeau        $metadataClass = self::METADATAS[$name];
190*04fd306cSNickeau        if ($metadataClass !== null) {
191*04fd306cSNickeau            return new $metadataClass();
192*04fd306cSNickeau        }
193*04fd306cSNickeau        throw new ExceptionNotFound("No metadata found with the name ($name)");
194*04fd306cSNickeau
195*04fd306cSNickeau    }
196*04fd306cSNickeau}
197