/** * Provisions all web applications. * * @param \AppserverIo\Psr\Application\ApplicationInterface $application The application instance * * @return void */ public function provision(ApplicationInterface $application) { // check if the webapps directory exists if (is_dir($webappPath = $application->getWebappPath())) { // prepare the glob expression with the application's directories to parse $applicationDirectories = AppEnvironmentHelper::getEnvironmentAwareGlobPattern($webappPath, '{WEB-INF,META-INF}/provision', GLOB_BRACE); // load the service instance /** @var \AppserverIo\Appserver\Core\Api\ProvisioningService $service */ $service = $this->getService(); // load the configuration service instance /** @var \AppserverIo\Appserver\Core\Api\ConfigurationService $configurationService */ $configurationService = $this->getInitialContext()->newService('AppserverIo\\Appserver\\Core\\Api\\ConfigurationService'); // load the container node to initialize the system properties /** @var \AppserverIo\Appserver\Core\Api\Node\ContainerNodeInterface $containerNode */ $containerNode = $application->getContainer()->getContainerNode(); // iterate through all provisioning files (provision.xml), validate them and attach them to the configuration foreach ($service->globDir($applicationDirectories, GLOB_BRACE) as $provisionFile) { try { // validate the file, but skip it if the validation fails $configurationService->validateFile($provisionFile, null); // load the system properties $properties = $service->getSystemProperties($containerNode); // append the application specific properties $properties->add(SystemPropertyKeys::WEBAPP, $webappPath); $properties->add(SystemPropertyKeys::WEBAPP_NAME, basename($webappPath)); $properties->add(SystemPropertyKeys::WEBAPP_CACHE, $application->getCacheDir()); $properties->add(SystemPropertyKeys::WEBAPP_SESSION, $application->getSessionDir()); // create a new provision node instance and replace the properties $provisionNode = new ProvisionNode(); $provisionNode->initFromFile($provisionFile); $provisionNode->replaceProperties($properties); // query whether we've a datasource configured or not if ($datasource = $provisionNode->getDatasource()) { // try to load the datasource from the system configuration $datasourceNode = $service->findByName($datasource->getName()); // try to inject the datasource node if available if ($datasourceNode != null) { $provisionNode->injectDatasource($datasourceNode); } } /* Re-provision the provision.xml (reinitialize). * * ATTENTION: The re-provisioning is extremely important, because * this allows dynamic replacement of placeholders by using the * XML file as a template that will reinterpreted with the PHP * interpreter! */ $provisionNode->reprovision($provisionFile); // execute the provisioning workflow $this->executeProvision($application, $provisionNode, new \SplFileInfo($webappPath)); } catch (ConfigurationException $ce) { // load the logger and log the XML validation errors $systemLogger = $this->getInitialContext()->getSystemLogger(); $systemLogger->error($ce->__toString()); // additionally log a message that DS will be missing $systemLogger->critical(sprintf('Will skip reading provisioning steps in %s, provisioning might not have been done.', $provisionFile)); } } } }