/**
* Parses the servlet context's deployment descriptor file for servlets
* that has to be registered in the object manager.
*
* @return void
*/
public function parse()
{
// load the web application base directory
$webappPath = $this->getServletContext()->getWebappPath();
// prepare the deployment descriptor
$deploymentDescriptor = $webappPath . DIRECTORY_SEPARATOR . 'WEB-INF' . DIRECTORY_SEPARATOR . 'web.xml';
// query whether we found epb.xml deployment descriptor file
if (file_exists($deploymentDescriptor) === false) {
return;
}
// validate the passed configuration file
/** @var \AppserverIo\Appserver\Core\Api\ConfigurationService $configurationService */
$configurationService = $this->getApplication()->newService('AppserverIo\\Appserver\\Core\\Api\\ConfigurationService');
$configurationService->validateFile($deploymentDescriptor, null, true);
// load the object manager instance
/** @var \AppserverIo\Appserver\DependencyInjectionContainer\Interfaces\ObjectManagerInterface $objectManager */
$objectManager = $this->getApplication()->search('ObjectManagerInterface');
// prepare and initialize the configuration node
$webAppNode = new WebAppNode();
$webAppNode->initFromFile($deploymentDescriptor);
/** @var \AppserverIo\Appserver\Core\Api\Node\ServletNode $servletNode */
foreach ($webAppNode->getServlets() as $servletNode) {
// iterate over all configured descriptors and try to load object description
/** \AppserverIo\Appserver\Core\Api\Node\DescriptorNode $descriptor */
foreach ($objectManager->getConfiguredDescriptors() as $descriptor) {
try {
// load the descriptor class
$descriptorClass = $descriptor->getNodeValue()->getValue();
// load the object descriptor, initialize the servlet mappings and add it to the object manager
/** \AppserverIo\Psr\Deployment\DescriptorInterface $objectDescriptor */
if ($objectDescriptor = $descriptorClass::newDescriptorInstance()->fromConfiguration($servletNode)) {
/** @var \AppserverIo\Appserver\Core\Api\Node\ServletMappingNode $servletMappingNode */
foreach ($webAppNode->getServletMappings() as $servletMappingNode) {
// query whether or not we've to add the URL pattern for the servlet
if ((string) $servletNode->getServletName() === (string) $servletMappingNode->getServletName()) {
$objectDescriptor->addUrlPattern((string) $servletMappingNode->getUrlPattern());
}
}
// add the object descriptor for the servlet
$objectManager->addObjectDescriptor($objectDescriptor, true);
}
// proceed with the next descriptor
continue;
// if class can not be reflected continue with next class
} catch (\Exception $e) {
// log an error message
$this->getApplication()->getInitialContext()->getSystemLogger()->error($e->__toString());
// proceed with the next descriptor
continue;
}
}
}
// initialize the session configuration if available
/** @var \AppserverIo\Appserver\Core\Api\Node\SessionConfigNode $sessionConfig */
if ($sessionConfig = $webAppNode->getSessionConfig()) {
foreach ($sessionConfig->toArray() as $key => $value) {
$this->getServletContext()->addSessionParameter($key, $value);
}
}
// initialize the error page configuration if available
/** @var \AppserverIo\Appserver\Core\Api\Node\ErrorPageNode $errorPageNode */
foreach ($webAppNode->getErrorPages() as $errorPageNode) {
$this->getServletContext()->addErrorPage((string) $errorPageNode->getErrorCodePattern(), (string) $errorPageNode->getErrorLocation());
}
// initialize the context with the context parameters
/** @var \AppserverIo\Appserver\Core\Api\Node\ContextParamNode $contextParamNode */
foreach ($webAppNode->getContextParams() as $contextParamNode) {
$this->getServletContext()->addInitParameter((string) $contextParamNode->getParamName(), (string) $contextParamNode->getParamValue());
}
}