Exemplo n.º 1
0
 /**
  * @param $class_name string
  * @param $sources    Reflection_Source[]
  * @param $added      Reflection_Source[]
  */
 private function moreSourcesAdd($class_name, &$sources, &$added)
 {
     /** @var $dependency Dependency */
     $dependency = Dao::searchOne(['class_name' => $class_name, 'dependency_name' => $class_name], Dependency::class);
     if (!isset($sources[$dependency->file_name])) {
         $source = new Reflection_Source($dependency->file_name);
         $sources[$dependency->file_name] = $source;
         $added[$dependency->file_name] = $source;
     }
 }
Exemplo n.º 2
0
 /**
  * Search the first result of several search objects list
  * Try each search object. When one is found, then return the first result object
  *
  * @param $objects object[]|array[]|array
  * @param $class_name string
  * @return object
  */
 public static function searchOne($objects, $class_name = null)
 {
     foreach ($objects as $object) {
         $object = Dao::searchOne($object, $class_name);
         if (isset($object)) {
             return $object;
         }
     }
     return null;
 }
Exemplo n.º 3
0
 /**
  * @before SAF\Framework\Dao\Data_Link::write($this)
  */
 public function setNumber()
 {
     if (isA($this, Has_Counter::class)) {
         /** @var $counter Counter */
         $counter = Dao::searchOne(['class_name' => get_class($this)], Counter::class);
         if (!isset($counter)) {
             $counter = Builder::create(Counter::class, [get_class($this)]);
         }
         $this->setCounter($counter->increment());
     }
 }
Exemplo n.º 4
0
 /**
  * Load a counter linked to the class of an object from default data link and increment it
  *
  * @param $object     object The object to use to format the counter
  * @param $identifier string The identifier of the counter ; default is get_class($object)
  * @return string The new counter value
  */
 public static function increment($object, $identifier = null)
 {
     Dao::begin();
     if (empty($identifier)) {
         $identifier = Builder::current()->sourceClassName(get_class($object));
     }
     $counter = Dao::searchOne(['identifier' => $identifier], get_called_class()) ?: new Counter($identifier);
     $next_value = $counter->next($object);
     Dao::write($counter);
     Dao::commit();
     return $next_value;
 }
Exemplo n.º 5
0
 /**
  * Set identifier unique
  */
 public function uniqueIdentifier()
 {
     if (isset($this->identifier)) {
         /** @var $search Identifier */
         $search = Search_Object::create(Identifier::class);
         $search->name = $this->identifier->name;
         if ($find = Dao::searchOne($search)) {
             Dao::replace($this->identifier, $find, false);
         } else {
             Dao::disconnect($this->identifier);
         }
     }
 }
Exemplo n.º 6
0
 /**
  * @param $sources Reflection_Source[]
  * @return Reflection_Source[] added sources list
  */
 public function moreSourcesToCompile(&$sources)
 {
     $added = [];
     // search into dependencies : used classes
     /** @var $search Dependency */
     $search = Search_Object::create(Dependency::class);
     $search->type = Dependency::T_USE;
     foreach ($sources as $source) {
         foreach ($source->getClasses() as $class) {
             if ($class->type === T_TRAIT) {
                 $search->dependency_name = $class->name;
                 foreach (Dao::search($search, Dependency::class) as $dependency) {
                     while ($dependency && Builder::isBuilt($dependency->class_name)) {
                         $search_built_parent = Search_Object::create(Dependency::class);
                         $search_built_parent->class_name = $dependency->class_name;
                         $search_built_parent->type = Dependency::T_EXTENDS;
                         $dependency = Dao::searchOne($search_built_parent);
                         if (!$dependency) {
                             trigger_error('Not parent class for built class ' . $search_built_parent->class_name, E_USER_ERROR);
                         }
                         $search_built_parent->class_name = $dependency->dependency_name;
                         $search_built_parent->type = Dependency::T_DECLARATION;
                         $dependency = Dao::searchOne($search_built_parent);
                         if (!$dependency) {
                             trigger_error('Not declaration dependency for class ' . $search_built_parent->class_name, E_USER_ERROR);
                         }
                     }
                     /** @var $dependency Dependency */
                     if (!isset($sources[$dependency->file_name])) {
                         $source = new Reflection_Source($dependency->file_name);
                         $sources[$dependency->file_name] = $source;
                         $added[$dependency->file_name] = $source;
                     }
                 }
             }
         }
     }
     // search into dependencies : registered methods
     foreach ($sources as $source) {
         $search->file_name = $source->file_name;
         $search->dependency_name = Registerable::class;
         $search->type = Dependency::T_IMPLEMENTS;
         if (Dao::searchOne($search, Dependency::class)) {
             unset($search->dependency_name);
             $search->type = Dependency::T_CLASS;
             foreach (Dao::search($search, Dependency::class) as $dependency) {
                 $source = Reflection_Source::of($dependency->dependency_name);
                 if (!isset($sources[$source->file_name])) {
                     $sources[$source->file_name] = $source;
                     $added[$source->file_name] = $source;
                 }
             }
         }
     }
     // classes that are already into $sources
     $already = [];
     foreach ($sources as $source) {
         foreach ($source->getClasses() as $class) {
             $already[$class->name] = true;
         }
     }
     // search into advices and add sources that have sources to compile as advice
     foreach ($this->weaver->getJoinpoints() as $class_name => $joinpoint) {
         if (!isset($already[$class_name])) {
             foreach ($joinpoint as $advices) {
                 foreach ($advices as $advice) {
                     if (is_array($advice = $advice[1])) {
                         $advice_class = $advice[0];
                         if (is_object($advice_class)) {
                             $advice_class = get_class($advice_class);
                         }
                         if (isset($already[$advice_class])) {
                             $source = Reflection_Source::of($class_name);
                             /*
                             if ($source->file_name && !$source->isInternal() && !is_file($source->file_name)) {
                             	$applicant_source = Reflection_Source::of($advice_class);
                             	if (
                             		!$source->searchFile($class_name, array_keys($applicant_source->getRequires()))
                             	) {
                             		trigger_error(
                             			'Reflection_Source file not found for class ' . $class_name, E_USER_ERROR
                             		);
                             	}
                             }
                             */
                             if ($source->getClass($class_name)) {
                                 $sources[$source->file_name] = $source;
                                 $added[$source->file_name] = $source;
                                 $already[$class_name] = true;
                             } else {
                                 trigger_error('No class ' . $class_name . ' into file ' . $source->file_name, E_USER_ERROR);
                             }
                         }
                     }
                 }
             }
         }
     }
     return $added;
 }
Exemplo n.º 7
0
 /**
  * If $save_name is set : saves the Data_List_Settings object into the Settings set
  * If $save_name is not set : saves the Data_List_Settings object for current user and session
  *
  * @param $save_name string
  */
 public function save($save_name = null)
 {
     if (isset($save_name)) {
         $this->name = $save_name;
         $setting = new Setting($this->class_name . DOT . static::customId() . DOT . $save_name);
         $setting = Dao::searchOne($setting) ?: $setting;
         $setting->value = $this;
         Dao::write($setting);
     } elseif ($this) {
         Dao::write($this->setting);
     }
 }
Exemplo n.º 8
0
 /**
  * @param $class_name string
  * @param $search     array
  * @return array
  */
 private function createArrayReference($class_name, $search)
 {
     $array = isset($search) ? [Builder::fromArray($class_name, $search)] : null;
     $class = new Link_Class($class_name);
     $link_class = $class->getAnnotation('link')->value;
     if ($link_class) {
         $object = reset($array);
         $link_search = Builder::create($link_class);
         $composite_property_name = $class->getCompositeProperty()->name;
         foreach (array_keys($class->getLinkedProperties()) as $property_name) {
             if (isset($search[$property_name])) {
                 $link_search->{$property_name} = $search[$property_name];
             }
         }
         $object->{$composite_property_name} = Dao::searchOne($link_search) ?: $link_search;
     }
     return $array;
 }
Exemplo n.º 9
0
 /**
  * @param $class_name     string
  * @param $property_names string[]
  * @return object
  */
 public function searchMainObject($class_name, $property_names)
 {
     $search = [];
     foreach ($property_names as $property_name) {
         $search[$property_name] = $this->getRawParameter($property_name);
     }
     $object = Dao::searchOne($search, $class_name);
     if ($object) {
         $this->unshift($object);
     }
     return $object;
 }
Exemplo n.º 10
0
 /**
  * @param $array
  * @param $object
  * @return array
  */
 private function initLinkObject(&$array, &$object)
 {
     /** @var $link Class_\Link_Annotation */
     $link = $this->class->getAnnotation('link');
     if ($link->value) {
         $id_property_value = null;
         $linked_class_name = null;
         $link_properties = $link->getLinkProperties();
         $search = [];
         foreach ($link_properties as $property) {
             if ($property->getType()->isClass()) {
                 $property_name = $property->getName();
                 $id_property_name = 'id_' . $property_name;
                 if (isset($array[$id_property_name]) && $array[$id_property_name]) {
                     $search[$property_name] = $array[$id_property_name];
                 }
                 $property_class_name = $property->getType()->asString();
                 if (is_a($property_class_name, $link->value, true)) {
                     $id_property_value = isset($array[$id_property_name]) ? $array[$id_property_name] : null;
                     $linked_class_name = $property_class_name;
                     if (!isset($array[$id_property_name]) && !isset($array[$property_name])) {
                         $linked_array = $array;
                         foreach (array_keys($link_properties) as $link_property_name) {
                             unset($linked_array[$link_property_name]);
                         }
                         $builder = new Object_Builder_Array($property_class_name, $this->from_form);
                         $array[$property_name] = $builder->build($linked_array);
                     }
                 }
             }
         }
         if (count($search) >= 2) {
             $object = Dao::searchOne($search, $this->class->name);
         }
         if ($id_property_value && !$object) {
             $object = Builder::createClone(Dao::read($id_property_value, $linked_class_name), $this->class->name);
         }
         return $search;
     }
     return null;
 }
Exemplo n.º 11
0
 /**
  * Be sure that recipients are unique into data storage
  * - they can be common to several emails
  * - modification of recipients is not allowed
  */
 private function uniqueRecipents()
 {
     /** @var $search Recipient */
     $search = Search_Object::create(Recipient::class);
     $recipients = array_merge([$this->from, $this->reply_to, $this->return_path], $this->to, $this->copy_to, $this->blind_copy_to);
     $already = [];
     foreach ($recipients as $recipient) {
         if (isset($recipient)) {
             $search->email = $recipient->email;
             $search->name = $recipient->name;
             if (isset($already[strval($search)])) {
                 Dao::replace($recipient, $already[strval($search)], false);
             } else {
                 $already[strval($search)] = $recipient;
                 if ($find = Dao::searchOne($recipient)) {
                     Dao::replace($recipient, $find, false);
                 } else {
                     Dao::disconnect($recipient);
                 }
             }
         }
     }
 }