URL warUrl = new URL(warUrlStr);
ClassLoader loader = Thread.currentThread().getContextClassLoader();
metaData.setContextLoader(loader);
StandardContext context = (StandardContext)Class.forName(config.getContextClassName()).newInstance();
DeploymentUnit depUnit = webApp.getDeploymentUnit();
// Find all TLDs that have been processed by deployers, and place them in a map keyed by location
Map<String, TldMetaData> tldMetaDataMap = new HashMap<String, TldMetaData>();
Map<String, Object> attachements = depUnit.getAttachments();
Iterator<String> attachementNames = attachements.keySet().iterator();
while (attachementNames.hasNext()) {
String name = attachementNames.next();
Object attachement = depUnit.getAttachment(name);
if (attachement != null && attachement instanceof TldMetaData
&& name.startsWith(TldMetaData.class.getName() + ":"))
{
tldMetaDataMap.put(name, (TldMetaData) attachement);
}
}
List<TldMetaData> sharedTldMetaData = (List<TldMetaData>)
depUnit.getAttachment(SharedTldMetaDataDeployer.SHARED_TLDS_ATTACHMENT_NAME);
if (sharedTldMetaData != null)
{
for (TldMetaData tldMetaData : sharedTldMetaData)
{
tldMetaDataMap.put("shared:" + tldMetaData.toString(), tldMetaData);
}
}
this.component = createJavaEEComponent();
TomcatInjectionContainer injectionContainer =
new TomcatInjectionContainer(webApp, depUnit, context,
getPersistenceUnitDependencyResolver(), config.getDynamicClassloaders(), component, this.getInjectionManager());
Loader webLoader = depUnit.getAttachment(Loader.class);
if (webLoader == null)
webLoader = getWebLoader(depUnit, metaData, loader, warUrl, injectionContainer);
webApp.setName(warUrl.getPath());
webApp.setClassLoader(loader);
webApp.setURL(warUrl);
String objectNameS = config.getCatalinaDomain() + ":j2eeType=WebModule,name=//" + ((hostName == null) ? "localhost" : hostName) + ctxPath
+ ",J2EEApplication=none,J2EEServer=none";
ObjectName objectName = new ObjectName(objectNameS);
if (Registry.getRegistry(null, null).getMBeanServer().isRegistered(objectName))
throw new DeploymentException("Web mapping already exists for deployment URL " + warUrlStr);
Registry.getRegistry(null, null).registerComponent(context, objectName, config.getContextClassName());
context.setInstanceManager(injectionContainer);
context.setPublicId(metaData.getPublicID());
String docBase = depUnit.getAttachment("org.jboss.web.explicitDocBase", String.class);
if (docBase == null)
docBase = VFS.getChild(warUrl).getPhysicalFile().getAbsolutePath();
context.setDocBase(docBase);
// If there is an alt-dd set it
if (metaData.getAlternativeDD() != null)
{
log.debug("Setting altDDName to: " + metaData.getAlternativeDD());
context.setAltDDName(metaData.getAlternativeDD());
}
context.setJavaVMs(javaVMs);
context.setServer(serverName);
if (webLoader != null)
{
context.setLoader(webLoader);
}
else
{
context.setParentClassLoader(loader);
}
// Set the session cookies flag according to metadata
switch (metaData.getSessionCookies())
{
case JBossWebMetaData.SESSION_COOKIES_ENABLED:
context.setCookies(true);
log.debug("Enabling session cookies");
break;
case JBossWebMetaData.SESSION_COOKIES_DISABLED:
context.setCookies(false);
log.debug("Disabling session cookies");
break;
default:
log.debug("Using session cookies default setting");
}
String metaDataSecurityDomain = metaData.getSecurityDomain();
if (metaDataSecurityDomain != null)
metaDataSecurityDomain = metaDataSecurityDomain.trim();
// Add a valve to establish security and naming context
SecurityContextEstablishmentValve scevalve = new SecurityContextEstablishmentValve(metaDataSecurityDomain, SecurityUtil.unprefixSecurityDomain(config
.getDefaultSecurityDomain()), SecurityActions.loadClass(config.getSecurityContextClassName()), getSecurityManagement(), component);
context.addValve(scevalve);
// Add a valve to estalish the JACC context before authorization valves
Certificate[] certs = null;
CodeSource cs = new CodeSource(warUrl, certs);
JaccContextValve jaccValve = new JaccContextValve(metaData, cs);
context.addValve(jaccValve);
// Set listener
context.setConfigClass("org.jboss.web.tomcat.service.deployers.JBossContextConfig");
context.addLifecycleListener(new EncListener(loader, webLoader, injectionContainer, webApp));
// Pass the metadata to the RunAsListener via a thread local
RunAsListener.metaDataLocal.set(metaData);
JBossContextConfig.metaDataLocal.set(metaData);
JBossContextConfig.deployerConfig.set(config);
JBossContextConfig.tldMetaDataMapLocal.set(tldMetaDataMap);
NamingListener.idLocal.set(component);
JBossContextConfig.kernelLocal.set(kernel);
JBossContextConfig.deploymentUnitLocal.set(unit);
try
{
// JBAS-8406: Temp hack, will move to NamingListener
CurrentComponent.push(component);
// Start it
CDIExceptionStore.reset();
context.start();
// Build the ENC
// JBAS-8278: abort deployment if there are CDI definitions errors
if (CDIExceptionStore.currentExceptions().size()>0)
{
throw CDIExceptionStore.currentExceptions().get(0);
}
}
catch (Throwable t)
{
context.destroy();
DeploymentException.rethrowAsDeploymentException("URL " + warUrlStr + " deployment failed", t);
}
finally
{
RunAsListener.metaDataLocal.set(null);
JBossContextConfig.metaDataLocal.set(null);
JBossContextConfig.deployerConfig.set(null);
JBossContextConfig.tldMetaDataMapLocal.set(null);
NamingListener.idLocal.set(null);
JBossContextConfig.kernelLocal.set(null);
JBossContextConfig.deploymentUnitLocal.set(null);
// JBAS-8406: Temp hack, will move to NamingListener
CurrentComponent.pop();
// JBAS-8278
CDIExceptionStore.reset();
}
if (context.getState() != 1)
{
context.destroy();
throw new DeploymentException("URL " + warUrlStr + " deployment failed");
}
/*
* Add security association valve after the authorization valves so that the authenticated user may be associated
* with the request thread/session.
*/
if (!config.isStandalone())
{
SecurityAssociationValve securityAssociationValve = new SecurityAssociationValve(metaData, config.getSecurityManagerService());
securityAssociationValve.setSubjectAttributeName(config.getSubjectAttributeName());
context.addValve(securityAssociationValve);
}
/*
* TODO: Retrieve the state, and throw an exception in case of a failure Integer state = (Integer)
* server.getAttribute(objectName, "state"); if (state.intValue() != 1) { throw new DeploymentException("URL " +