/**
  * Visitor method that adds a initialized class loader to the passed application.
  *
  * @param \TechDivision\Application\Interfaces\ApplicationInterface         $application   The application instance
  * @param \TechDivision\ApplicationServer\Api\Node\ClassLoaderNodeInterface $configuration The class loader configuration node
  *
  * @return void
  */
 public static function visit(ApplicationInterface $application, ClassLoaderNodeInterface $configuration = null)
 {
     // load the application directory
     $webappPath = $application->getWebappPath();
     // initialize the array with the configured directories
     $directories = array();
     // load the composer class loader for the configured directories
     foreach ($configuration->getDirectories() as $directory) {
         // we prepare the directories to include scripts AFTER registering (in application context)
         $directories[] = $webappPath . $directory->getNodeValue();
         // check if an autoload.php is available
         if (file_exists($webappPath . $directory->getNodeValue() . DIRECTORY_SEPARATOR . 'autoload.php')) {
             // if yes, we try to instanciate a new class loader instance
             $classLoader = new ComposerClassLoader($directories);
             // set the composer include paths
             if (file_exists($webappPath . $directory->getNodeValue() . '/composer/include_paths.php')) {
                 $includePaths = (require $webappPath . $directory->getNodeValue() . '/composer/include_paths.php');
                 array_push($includePaths, get_include_path());
                 set_include_path(join(PATH_SEPARATOR, $includePaths));
             }
             // add the composer namespace declarations
             if (file_exists($webappPath . $directory->getNodeValue() . '/composer/autoload_namespaces.php')) {
                 $map = (require $webappPath . $directory->getNodeValue() . '/composer/autoload_namespaces.php');
                 foreach ($map as $namespace => $path) {
                     $classLoader->set($namespace, $path);
                 }
             }
             // add the composer PSR-4 compatible namespace declarations
             if (file_exists($webappPath . $directory->getNodeValue() . '/composer/autoload_psr4.php')) {
                 $map = (require $webappPath . $directory->getNodeValue() . '/composer/autoload_psr4.php');
                 foreach ($map as $namespace => $path) {
                     $classLoader->setPsr4($namespace, $path);
                 }
             }
             // add the composer class map
             if (file_exists($webappPath . $directory->getNodeValue() . '/composer/autoload_classmap.php')) {
                 $classMap = (require $webappPath . $directory->getNodeValue() . '/composer/autoload_classmap.php');
                 if ($classMap) {
                     $classLoader->addClassMap($classMap);
                 }
             }
             // add the class loader instance
             $application->addClassLoader($classLoader);
         }
     }
 }
 /**
  * Visitor method that adds a initialized class loader to the passed application.
  *
  * @param \TechDivision\Application\Interfaces\ApplicationInterface         $application   The application instance
  * @param \TechDivision\ApplicationServer\Api\Node\ClassLoaderNodeInterface $configuration The class loader configuration node
  *
  * @return void
  */
 public static function visit(ApplicationInterface $application, ClassLoaderNodeInterface $configuration = null)
 {
     // load the web application path we want to register the class loader for
     $webappPath = $application->getWebappPath();
     // initialize the array with the applications additional include paths
     $includePath = array();
     // add the possible class path if folder is available
     foreach ($configuration->getDirectories() as $directory) {
         if (is_dir($webappPath . $directory->getNodeValue())) {
             array_push($includePath, $webappPath . $directory->getNodeValue());
         }
     }
     // initialize the SPL class loader instance
     $classLoader = new SplClassLoader($application->getInitialContext(), null, $includePath);
     // add the class loader instance
     $application->addClassLoader($classLoader);
 }
 /**
  * Visitor method that adds a initialized class loader to the passed application.
  *
  * @param \TechDivision\Application\Interfaces\ApplicationInterface         $application   The application instance
  * @param \TechDivision\ApplicationServer\Api\Node\ClassLoaderNodeInterface $configuration The class loader configuration node
  *
  * @return void
  */
 public static function visit(ApplicationInterface $application, ClassLoaderNodeInterface $configuration = null)
 {
     // load the web application path we want to register the class loader for
     $webappPath = $application->getWebappPath();
     // initialize the class path and the enforcement directories
     $classPath = array();
     $enforcementDirs = array();
     // add the possible class path if folder is available
     foreach ($configuration->getDirectories() as $directory) {
         if (is_dir($webappPath . $directory->getNodeValue())) {
             array_push($classPath, $webappPath . $directory->getNodeValue());
             if ($directory->isEnforced()) {
                 array_push($enforcementDirs, $webappPath . $directory->getNodeValue());
             }
         }
     }
     // initialize the arrays of different omit possibilities
     $omittedEnforcement = array();
     $omittedAutoLoading = array();
     // iterate over all namespaces and check if they are omitted in one or the other way
     foreach ($configuration->getNamespaces() as $namespace) {
         // is the enforcement omitted for this namespace?
         if ($namespace->omitEnforcement()) {
             $omittedEnforcement[] = $namespace->getNodeValue()->__toString();
         }
         // is the autoloading omitted for this namespace?
         if ($namespace->omitAutoLoading()) {
             $omittedAutoLoading[] = $namespace->getNodeValue()->__toString();
         }
     }
     // initialize the class loader configuration
     $config = new Config();
     // set the environment mode we want to use
     $config->setValue('environment', $configuration->getEnvironment());
     // set the cache directory
     $config->setValue('cache/dir', $application->getCacheDir());
     // set the default autoloader values
     $config->setValue('autoloader/dirs', $classPath);
     // collect the omitted namespaces (if any)
     $config->setValue('autoloader/omit', $omittedAutoLoading);
     $config->setValue('enforcement/omit', $omittedEnforcement);
     // set the default enforcement configuration values
     $config->setValue('enforcement/dirs', $enforcementDirs);
     $config->setValue('enforcement/enforce-default-type-safety', $configuration->getTypeSafety());
     $config->setValue('enforcement/processing', $configuration->getProcessing());
     $config->setValue('enforcement/level', $configuration->getEnforcementLevel());
     $config->setValue('enforcement/logger', $application->getInitialContext()->getSystemLogger());
     // create the autoloader instance and fill the structure map
     $autoLoader = new self($config);
     // add the class loader instance to the application
     $application->addClassLoader($autoLoader);
 }