/[openfoncier]/trunk/obj/MetadataFactory.class.php
ViewVC logotype

Annotation of /trunk/obj/MetadataFactory.class.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10573 - (hide annotations)
Thu Oct 14 12:43:35 2021 UTC (3 years, 3 months ago) by softime
File size: 3757 byte(s)
* Fusion de la branche d'intégration 5.0.0-develop dans le trunk

1 mbideau 9946 <?php
2    
3     use \ReflectionObject;
4     use \DirectoryIterator;
5    
6     require_once __DIR__.'/Metadata.class.php';
7    
8     /**
9     * Représente une usine (logicielle) à Métadonnées.
10     */
11     class MetadataFactory
12     {
13     const METADATA_BASE_CLASSNAME = 'Metadata';
14    
15     protected $minimalSetOfKv = array();
16    
17     /**
18     * Construit un ensemble de metadonnée à partir d'un type.
19     *
20     * @param string $type Type de métadonnée à construire
21     * @param array $key Clés/valeurs à assigner (doit contenir au moins les métadonnées de la
22     * classe de base METADATA_BASE_CLASSNAME)
23     *
24     * @return string|Metadata Chaîne si une erreur est rencontrée, Metadata sinon
25     */
26     public function build(string $type, array $kv) {
27    
28     // s'assure que le minimum des métadonnées est renseigné
29     foreach(self::getMinimalSetOfKv() as $key) {
30     if (! isset($kv[$key]) || empty($kv[$key])) {
31     return __("La métadonnée '$key' est obligatoire (de base)");
32     }
33     }
34    
35     // charge la classe de cet ensemble de métadonnées
36     $className = '/Metadata'.ucwords($type).'.class.php';
37     $classPath = __DIR__."/$className";
38     if (! file_exists($classPath)) {
39     return __("Le fichier '$classPath' des métadonnées de type '$type' n'existe pas");
40     }
41     require_once "$classPath";
42    
43     // constuit l'objet
44     return $this->build($className, $kv);
45     }
46    
47     /**
48     * Obtient l'ensemble minimum de métadonnée à fournir pour construire un ensemble.
49     *
50     * @return array La liste des noms des métadonnées à fournir
51     */
52     protected function getMinimalSetOfKv() {
53     if (empty($this->minimalSetOfKv)) {
54     $refObj = new ReflectionObject(self::METADATA_BASE_CLASSNAME);
55     $props = $refObj->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED);
56     foreach($props as $prop) {
57     $this->minimalSetOfKv[] = $prop->getName();
58     }
59     }
60     return $this->minimalSetOfKv;
61     }
62    
63     /**
64     * Construit l'objet de l'ensemble de métadonnées.
65     *
66     * @param string $type Type de métadonnée à construire
67     * @param array $key Clés/valeurs à assigner (doit contenir au moins les métadonnées de la
68     * classe générique 'Metadata')
69     *
70     * @return string|Metadata Chaîne si une erreur est rencontrée, Metadata sinon
71     */
72     protected function buildMetadata(string $className, array $kv) {
73     $md = new $className();
74    
75     $refObj = new ReflectionObject($md);
76     $props = $refObj->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED);
77     foreach($props as $prop) {
78     $propName = $prop->getName();
79     if (isset($kv[$propName]) && ! empty($kv[$propName])) {
80     $md->$propName = $kv[$propName];
81     }
82     }
83     return $md;
84     }
85    
86     /**
87     * Liste les différents types de métadonnées existantes
88     * (basés sur les nom des fichiers des classes de métadonnées).
89     *
90     * @return array La liste des nom des types de métadonnées disponibles
91     */
92     public function listTypes() {
93     $types = array();
94     foreach (new DirectoryIterator(__DIR__) as $file) {
95     if ($file->isFile()) {
96     $fn = $file->getFilename();
97     if (strpos($fn, self::METADATA_BASE_CLASSNAME) === 0 && $fn != basename(__FILE__) &&
98     substr($fn, -10, 10) == '.class.php') {
99     $types[] = substr($fn, strlen(self::METADATA_BASE_CLASSNAME), -10);
100     }
101     }
102     }
103     return $types;
104     }
105     }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26