# PrimitivePolymorphicIdentifier.class.php

Go to the documentation of this file.

    00001 <?php
    00002 /***************************************************************************
    00003  *   Copyright (C) 2008 by Ivan Y. Khvostishkov                            *
    00004  *                                                                         *
    00005  *   This program is free software; you can redistribute it and/or modify  *
    00006  *   it under the terms of the GNU Lesser General Public License as        *
    00007  *   published by the Free Software Foundation; either version 3 of the    *
    00008  *   License, or (at your option) any later version.                       *
    00009  *                                                                         *
    00010  ***************************************************************************/
    00011
    00016     final class PrimitivePolymorphicIdentifier extends PrimitiveIdentifier
    00017     {
    00018         const WRONG_CID_FORMAT  = 201;
    00019         const WRONG_CLASS       = 202;
    00020
    00021         const DELIMITER         = '.';
    00022
    00023         private $baseClassName  = null;
    00024
    00025         public static function export($value)
    00026         {
    00027             if ($value === null)
    00028                 return null;
    00029
    00030             Assert::isInstance($value, 'Identifiable');
    00031
    00032             return get_class($value).self::DELIMITER.$value->getId();
    00033         }
    00034
    00038         public function of($class)
    00039         {
    00040             throw new WrongStateException(
    00041                 'of() must not be called directly, use ofBase()'
    00042             );
    00043         }
    00044
    00049         public function ofBase($className)
    00050         {
    00051             Assert::classExists($className);
    00052
    00053             Assert::isInstance(
    00054                 $className,
    00055                 'DAOConnected',
    00056                 "class '{$className}' must implement DAOConnected interface"
    00057             );
    00058
    00059             $this->baseClassName = $className;
    00060
    00061             return $this;
    00062         }
    00063
    00064         public function getBaseClassName()
    00065         {
    00066             return $this->baseClassName;
    00067         }
    00068
    00072         public function setValue($value)
    00073         {
    00074             Assert::isInstance($value, $this->baseClassName);
    00075
    00076             parent::of(get_class($value));
    00077
    00078             return parent::setValue($value);
    00079         }
    00080
    00081         public function exportValue()
    00082         {
    00083             if ($this->value === null)
    00084                 return null;
    00085
    00086             return self::export($this->value);
    00087         }
    00088
    00089         public function importValue($value)
    00090         {
    00091             return $this->import(
    00092                 array(
    00093                     $this->getName() => self::export($value)
    00094                 )
    00095             );
    00096         }
    00097
    00098         public function import($scope)
    00099         {
    00100             $savedRaw = null;
    00101
    00102             if (isset($scope[$this->name]) && $scope[$this->name]) {
    00103                 $savedRaw = $scope[$this->name];
    00104
    00105                 $this->customError = null;
    00106
    00107                 try {
    00108
    00109                     list($class, $id) = explode(self::DELIMITER, $savedRaw, 2);
    00110
    00111                 } catch (BaseException $e) {
    00112
    00113                     $this->customError = self::WRONG_CID_FORMAT;
    00114
    00115                 }
    00116
    00117                 if (
    00118                     !$this->customError
    00119                     && !ClassUtils::isInstanceOf($class, $this->baseClassName)
    00120                 ) {
    00121
    00122                     $this->customError = self::WRONG_CLASS;
    00123
    00124                 }
    00125
    00126
    00127                 if (!$this->customError) {
    00128                     parent::of($class);
    00129
    00130                     $scope[$this->name] = $id;
    00131                 }
    00132
    00133             } else {
    00134                 // we need some class in any case
    00135                 parent::of($this->baseClassName);
    00136             }
    00137
    00138             if (!$this->customError)
    00139                 $result = parent::import($scope);
    00140             else {
    00141                 $this->value = null;
    00142                 $result = false;
    00143             }
    00144
    00145             if ($savedRaw)
    00146                 $this->raw = $savedRaw;
    00147
    00148             return $result;
    00149         }
    00150     }
    00151 ?>