/**
  * Has been automatically invoked by the container after the application
  * instance has been created.
  *
  * @param \AppserverIo\Psr\Application\ApplicationInterface $application The application instance
  *
  * @return void
  * @see \AppserverIo\Psr\Application\ManagerInterface::initialize()
  */
 public function initialize(ApplicationInterface $application)
 {
     // register the default autoloader
     require SERVER_AUTOLOADER;
     // register the class loader again, because each thread has its own context
     $application->registerClassLoaders();
     // build up META-INF directory var
     $metaInfDir = $application->getWebappPath() . DIRECTORY_SEPARATOR . 'META-INF';
     // check if we've found a valid directory
     if (is_dir($metaInfDir) === false) {
         return;
     }
     // load the timer service executor and timer factories
     $timerFactory = $this->getTimerFactory();
     $calendarTimerFactory = $this->getCalendarTimerFactory();
     $timerServiceExecutor = $this->getTimerServiceExecutor();
     // load the service to iterate over application folders
     /** @var \AppserverIo\Appserver\Core\Api\DeploymentService $service */
     $service = $application->newService('AppserverIo\\Appserver\\Core\\Api\\DeploymentService');
     $phpFiles = $service->globDir($metaInfDir . DIRECTORY_SEPARATOR . '*.php');
     // iterate all php files
     foreach ($phpFiles as $phpFile) {
         try {
             // cut off the META-INF directory and replace OS specific directory separators
             $relativePathToPhpFile = str_replace(DIRECTORY_SEPARATOR, '\\', str_replace($metaInfDir, '', $phpFile));
             // now cut off the first directory, that will be '/classes' by default
             $pregResult = preg_replace('%^(\\\\*)[^\\\\]+%', '', $relativePathToPhpFile);
             $className = substr($pregResult, 0, -4);
             // create the reflection class instance
             $reflectionClass = new \ReflectionClass($className);
             // initialize the timed object instance with the data from the reflection class
             $timedObject = TimedObject::fromPhpReflectionClass($reflectionClass);
             // check if we have a bean with a @Stateless, @Singleton or @MessageDriven annotation
             if ($timedObject->hasAnnotation(Stateless::ANNOTATION) === false && $timedObject->hasAnnotation(Singleton::ANNOTATION) === false && $timedObject->hasAnnotation(MessageDriven::ANNOTATION) === false) {
                 continue;
                 // if not, we don't care here!
             }
             // initialize the stackable for the timeout methods
             $timeoutMethods = new StackableStorage();
             // create the timed object invoker
             $timedObjectInvoker = new TimedObjectInvoker();
             $timedObjectInvoker->injectApplication($application);
             $timedObjectInvoker->injectTimedObject($timedObject);
             $timedObjectInvoker->injectTimeoutMethods($timeoutMethods);
             $timedObjectInvoker->start(PTHREADS_INHERIT_NONE | PTHREADS_INHERIT_CONSTANTS);
             // initialize the stackable for the timers
             $timers = new StackableStorage();
             // initialize the timer service
             $timerService = new TimerService();
             $timerService->injectTimers($timers);
             $timerService->injectTimerFactory($timerFactory);
             $timerService->injectTimedObjectInvoker($timedObjectInvoker);
             $timerService->injectCalendarTimerFactory($calendarTimerFactory);
             $timerService->injectTimerServiceExecutor($timerServiceExecutor);
             $timerService->start(PTHREADS_INHERIT_NONE | PTHREADS_INHERIT_CONSTANTS);
             // register the initialized timer service
             $this->register($timerService);
             // log a message that the timer service has been registered
             $application->getInitialContext()->getSystemLogger()->info(sprintf('Successfully registered timer service for bean %s', $reflectionClass->getName()));
             // if class can not be reflected continue with next class
         } catch (\Exception $e) {
             // log an error message
             $application->getInitialContext()->getSystemLogger()->error($e->__toString());
             // proceed with the next bean
             continue;
         }
     }
 }