Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 163 | Blame | Last modification | View Log | RSS feed

<?php
class ParametresVerificateur {
        private $parametres = null;
        private $parametresApi = array();
        private $erreursParametres = array();
        private $typesVerif = array(
                'recherche' => 'Simple',
                'ns.format' => 'Simple',
                'retour' => 'Simple',
                'retour.format' => 'Simple',
                'retour.langue' => 'RegExp',
                'ns.structure' => 'Multiple',
                'version.projet' => 'RegExp'
        );
        private $valeursPermises = array(
                'recherche' => 'stricte|floue|etendue',
                'ns.format' => 'htm|txt',
                'retour' => 'application/json|image/jpeg',
                'retour.format' => 'min|max|oss|perso',
                'retour.langue' => '/^(?:[*]|orig|[a-z]{2})$/',
                'ns.structure' => '|an|au|bib|ad',
                'version.projet' => '/^(?:[0-9]+[.][0-9]+|[*+])$/'
        );

        public function __construct(Parametres $parametres, Array $parametresApi) {
                $this->parametres = $parametres;
                $this->parametresApi = $parametresApi;
        }

        public function verifier() {
                $this->verifierConformiteApi();
                $this->verifierValeurs();
        }

        public function verifierConformiteApi() {
                $this->parametres->rewind();
                while (is_null($parametre = $this->parametres->key()) === false) {
                        if (in_array($parametre, $this->parametresApi) === false) {
                                $message = "Le paramètre '$parametre' n'est pas pris en compte par cette version de l'API.";
                                $code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
                                throw new Exception($message, $code);
                        }
                        $this->parametres->next();
                }
        }

        public function verifierValeurs() {
                foreach ($this->typesVerif as $parametre => $type) {
                        $methode = "verifierValeur$type";
                        $this->$methode($parametre);
                }

                if (count($this->erreursParametres) > 0) {
                        array_unshift($this->erreursParametres, 'Erreur dans le paramètrage de votre URL :');
                        $message = implode('<br/>', $this->erreursParametres);
                        $code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
                        throw new Exception($message, $code);
                }
        }

        private function verifierValeurSimple($parametre) {
                $valeur = $this->parametres->get($parametre);
                $valeursPermises = $this->valeursPermises[$parametre];
                $permissionOk = $this->verifierValeursPermises($valeur, $valeursPermises);
                if ($permissionOk == false) {
                        $this->erreursParametres[] = "Le paramètre '$parametre' ne peut pas prendre la valeur '$valeur'. Valeurs permises : $valeursPermises";
                }
        }

        private function verifierValeursPermises($valeur, $valeursPermises) {
                $permise = false;
                if (in_array($valeur, explode('|', $valeursPermises))) {
                        $permise = true;
                }
                return $permise;
        }

        private function verifierValeurRegExp($parametre) {
                $valeur = $this->parametres->get($parametre);
                $regexp = $this->valeursPermises[$parametre];
                $permissionOk = preg_match($regexp, $valeur) ? true : false;
                if ($permissionOk == false) {
                        $this->erreursParametres[] = "Le paramètre '$parametre' ne peut pas prendre la valeur '$valeur'. Valeurs permises : $regexp";
                }
        }

        private function verifierValeurMultiple($parametre) {
                $valeursConcatenees = $this->parametres->get($parametre);
                $valeursPermises = $this->valeursPermises[$parametre];
                $valeurs = explode(',', $valeursConcatenees);
                foreach ($valeurs as $valeur) {
                        $permissionOk = $this->verifierValeursPermises($valeur, $valeursPermises);
                        if ($permissionOk == false) {
                                $this->erreursParametres[] = "Le paramètre '$parametre' ne peut pas prendre la valeur '$valeur'. Valeurs permises : $valeursPermises";
                        }
                }
        }
}
?>