Ejemplo n.º 1
0
 /**
  * Gets/sets current environment's object
  *
  * @param $set_current mixed
  * @return Current
  */
 public static function current($set_current = null)
 {
     $called_class = get_called_class();
     // set current (ignore Reflection_Property : to enable use of @default Class::current)
     if ($set_current && !is_a($set_current, Reflection_Property::class)) {
         static::$current = $set_current;
         if (!is_a($called_class, Plugin::class, true)) {
             Session::current()->set($set_current, Builder::current()->sourceClassName($called_class));
         }
     } elseif (!isset(static::$current)) {
         // get current plugin from plugins manager
         if (is_a($called_class, Plugin::class, true)) {
             if ($called_class === Builder::class) {
                 static::$current = new Builder();
             } else {
                 $plugin = Session::current()->plugins->get(Builder::current()->sourceClassName($called_class));
                 if (!isset(static::$current)) {
                     static::$current = $plugin;
                 }
             }
         } else {
             static::$current = Session::current()->get($called_class);
         }
     }
     return static::$current;
 }
Ejemplo n.º 2
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;
 }
Ejemplo n.º 3
0
 /**
  * @param $sources Reflection_Source[] Key is the file path
  * @return Reflection_Source[] added sources list
  */
 public function moreSourcesToCompile(&$sources)
 {
     $added = [];
     foreach ($sources as $file_path => $source) {
         if (!strpos($file_path, SL)) {
             $reload = true;
             break;
         }
     }
     if (isset($reload)) {
         $old_compositions = Builder::current()->getCompositions();
         $old_levels = Session::current()->plugins->getAll(true);
         if (isset(Main::$current)) {
             Main::$current->resetSession();
         }
         $new_compositions = Builder::current()->getCompositions();
         $new_levels = Session::current()->plugins->getAll(true);
         // add classes where builder composition changed
         foreach ($old_compositions as $class_name => $old_composition) {
             if (!isset($new_compositions[$class_name]) || $old_composition != $new_compositions[$class_name] || is_array($old_composition) && (array_diff($old_composition, $new_compositions[$class_name]) || array_diff($new_compositions[$class_name], $old_composition))) {
                 $this->moreSourcesAdd($class_name, $sources, $added);
             }
         }
         foreach ($new_compositions as $class_name => $new_composition) {
             if (!isset($old_compositions[$class_name])) {
                 $this->moreSourcesAdd($class_name, $sources, $added);
             }
         }
         // add classes of globally added/removed plugins
         foreach ($old_levels as $level => $old_plugins) {
             foreach ($old_plugins as $class_name => $old_plugin) {
                 if (!isset($new_levels[$level][$class_name])) {
                     $this->moreSourcesAdd($class_name, $sources, $added);
                 }
             }
         }
         foreach ($new_levels as $level => $new_plugins) {
             foreach ($new_plugins as $class_name => $new_plugin) {
                 if (!isset($old_levels[$level][$class_name])) {
                     $this->moreSourcesAdd($class_name, $sources, $added);
                 }
             }
         }
     }
     return $added;
 }
Ejemplo n.º 4
0
 /**
  * Extends the list of sources to compile
  *
  * When you modify a file, all these classes may have their matching mysql structure changed :
  * - the class itself
  * - all classes that extend the class or use the trait
  *
  * @param &$sources Reflection_Source[]
  * @return Reflection_Source[] added sources list
  */
 public function moreSourcesToCompile(&$sources)
 {
     $added = [];
     // Builder is disabled during the listing as we want to get the original linked class name when
     // reading class annotation @link
     Builder::current()->enabled = false;
     /** @var $search Dependency */
     $search = Search_Object::create(Dependency::class);
     $search->file_name = Func::notLike('cache/%');
     $search->type = Func::orOp([Dependency::T_EXTENDS, Dependency::T_USE]);
     foreach ($sources as $source) {
         foreach ($source->getClasses() as $class) {
             while ($linked_class = $class->getAnnotation('link')->value) {
                 $source = Reflection_Class::of($linked_class)->source;
                 if (!isset($sources[$source->file_name])) {
                     $sources[$source->file_name] = $source;
                     $added[$source->file_name] = $source;
                 }
                 $class = $source->getClass($linked_class);
             }
             $search->dependency_name = $class->name;
             foreach (Dao::search($search, Dependency::class) as $dependency) {
                 /** @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;
                 }
             }
         }
     }
     Builder::current()->enabled = true;
     return $added;
 }