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