/** * @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; } }
/** * 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; }
/** * @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()); } }
/** * 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; }
/** * 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); } } }
/** * @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; }
/** * 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); } }
/** * @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; }
/** * @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; }
/** * @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; }
/** * 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); } } } } }