mbe.initContext(earContext, module, cl);
}
}
public void addGBeans(EARContext earContext, Module module, ClassLoader cl, Collection repository) throws DeploymentException {
EARContext moduleContext = module.getEarContext();
ClassLoader webClassLoader = moduleContext.getClassLoader();
AbstractName moduleName = moduleContext.getModuleName();
WebModule webModule = (WebModule) module;
WebAppType webApp = (WebAppType) webModule.getSpecDD();
TomcatWebAppType tomcatWebApp = (TomcatWebAppType) webModule.getVendorDD();
GBeanData webModuleData = new GBeanData(moduleName, TomcatWebAppContext.GBEAN_INFO);
configureBasicWebModuleAttributes(webApp, tomcatWebApp, moduleContext, earContext, webModule, webModuleData);
try {
moduleContext.addGBean(webModuleData);
Set<String> securityRoles = collectRoleNames(webApp);
Map<String, PermissionCollection> rolePermissions = new HashMap<String, PermissionCollection>();
webModuleData.setAttribute("contextPath", webModule.getContextRoot());
// unsharableResources, applicationManagedSecurityResources
GBeanResourceEnvironmentBuilder rebuilder = new GBeanResourceEnvironmentBuilder(webModuleData);
//N.B. use earContext not moduleContext
resourceEnvironmentSetter.setResourceEnvironment(rebuilder, webApp.getResourceRefArray(), tomcatWebApp.getResourceRefArray());
if (tomcatWebApp.isSetWebContainer()) {
AbstractNameQuery webContainerName = ENCConfigBuilder.getGBeanQuery(NameFactory.GERONIMO_SERVICE, tomcatWebApp.getWebContainer());
webModuleData.setReferencePattern("Container", webContainerName);
} else {
webModuleData.setReferencePattern("Container", tomcatContainerName);
}
// Process the Tomcat container-config elements
if (tomcatWebApp.isSetHost()) {
String virtualServer = tomcatWebApp.getHost().trim();
webModuleData.setAttribute("virtualServer", virtualServer);
}
if (tomcatWebApp.isSetCrossContext()) {
webModuleData.setAttribute("crossContext", Boolean.TRUE);
}
if (tomcatWebApp.isSetWorkDir()) {
String workDir = tomcatWebApp.getWorkDir();
webModuleData.setAttribute("workDir", workDir);
}
if (tomcatWebApp.isSetDisableCookies()) {
webModuleData.setAttribute("disableCookies", Boolean.TRUE);
}
if (tomcatWebApp.isSetTomcatRealm()) {
String tomcatRealm = tomcatWebApp.getTomcatRealm().trim();
AbstractName realmName = earContext.getNaming().createChildName(moduleName, tomcatRealm, RealmGBean.GBEAN_INFO.getJ2eeType());
webModuleData.setReferencePattern("TomcatRealm", realmName);
}
if (tomcatWebApp.isSetValveChain()) {
String valveChain = tomcatWebApp.getValveChain().trim();
AbstractName valveName = earContext.getNaming().createChildName(moduleName, valveChain, ValveGBean.J2EE_TYPE);
webModuleData.setReferencePattern("TomcatValveChain", valveName);
}
if (tomcatWebApp.isSetListenerChain()) {
String listenerChain = tomcatWebApp.getListenerChain().trim();
AbstractName listenerName = earContext.getNaming().createChildName(moduleName, listenerChain, LifecycleListenerGBean.J2EE_TYPE);
webModuleData.setReferencePattern("LifecycleListenerChain", listenerName);
}
if (tomcatWebApp.isSetCluster()) {
String cluster = tomcatWebApp.getCluster().trim();
AbstractName clusterName = earContext.getNaming().createChildName(moduleName, cluster, CatalinaClusterGBean.J2EE_TYPE);
webModuleData.setReferencePattern("Cluster", clusterName);
}
if (tomcatWebApp.isSetManager()) {
String manager = tomcatWebApp.getManager().trim();
AbstractName managerName = earContext.getNaming().createChildName(moduleName, manager, ManagerGBean.J2EE_TYPE);
webModuleData.setReferencePattern(TomcatWebAppContext.GBEAN_REF_MANAGER_RETRIEVER, managerName);
}
Boolean distributable = webApp.getDistributableArray().length == 1 ? TRUE : FALSE;
if (TRUE == distributable) {
clusteringBuilders.build(tomcatWebApp, earContext, moduleContext);
if (null == webModuleData.getReferencePatterns(TomcatWebAppContext.GBEAN_REF_CLUSTERED_VALVE_RETRIEVER)) {
log.warn("No clustering builders configured: app will not be clustered");
}
}
//Handle the role permissions and webservices on the servlets.
ServletType[] servletTypes = webApp.getServletArray();
Map<String, AbstractName> webServices = new HashMap<String, AbstractName>();
Class baseServletClass;
try {
baseServletClass = webClassLoader.loadClass(Servlet.class.getName());
} catch (ClassNotFoundException e) {
throw new DeploymentException("Could not load javax.servlet.Servlet in web classloader", e); // TODO identify web app in message
}
for (ServletType servletType : servletTypes) {
//Handle the Role Ref Permissions
processRoleRefPermissions(servletType, securityRoles, rolePermissions);
if (servletType.isSetServletClass()) {
String servletName = servletType.getServletName().getStringValue().trim();
String servletClassName = servletType.getServletClass().getStringValue().trim();
Class servletClass;
try {
servletClass = webClassLoader.loadClass(servletClassName);
} catch (ClassNotFoundException e) {
throw new DeploymentException("Could not load servlet class " + servletClassName, e); // TODO identify web app in message
}
if (!baseServletClass.isAssignableFrom(servletClass)) {
//fake servletData
AbstractName servletAbstractName = moduleContext.getNaming().createChildName(moduleName, servletName, NameFactory.SERVLET);
GBeanData servletData = new GBeanData();
servletData.setAbstractName(servletAbstractName);
//let the web service builder deal with configuring the gbean with the web service stack
//Here we just extract the factory reference
boolean configured = false;
for (WebServiceBuilder serviceBuilder : webServiceBuilder) {
if (serviceBuilder.configurePOJO(servletData, servletName, module, servletClassName, moduleContext)) {
configured = true;
break;
}
}
if (!configured) {
throw new DeploymentException("POJO web service: " + servletName + " not configured by any web service builder");
}
ReferencePatterns patterns = servletData.getReferencePatterns("WebServiceContainerFactory");
AbstractName wsContainerFactoryName = patterns.getAbstractName();
webServices.put(servletName, wsContainerFactoryName);
//force all the factories to start before the web app that needs them.
webModuleData.addDependency(wsContainerFactoryName);
}
}
}
// JACC v1.0 secion B.19
addUnmappedJSPPermissions(securityRoles, rolePermissions);
webModuleData.setAttribute("webServices", webServices);
if (tomcatWebApp.isSetSecurityRealmName()) {
if (earContext.getSecurityConfiguration() == null) {
throw new DeploymentException("You have specified a <security-realm-name> for the webapp " + moduleName + " but no <security> configuration (role mapping) is supplied in the Geronimo plan for the web application (or the Geronimo plan for the EAR if the web app is in an EAR)");
}
SecurityHolder securityHolder = new SecurityHolder();
securityHolder.setSecurityRealm(tomcatWebApp.getSecurityRealmName().trim());
webModuleData.setReferencePattern("RunAsSource", earContext.getJaccManagerName());
/**
* TODO - go back to commented version when possible.
*/
String policyContextID = moduleName.toString().replaceAll("[, :]", "_");
securityHolder.setPolicyContextID(policyContextID);
ComponentPermissions componentPermissions = buildSpecSecurityConfig(webApp, securityRoles, rolePermissions);
earContext.addSecurityContext(policyContextID, componentPermissions);
//TODO WTF is this for?
securityHolder.setSecurity(true);
webModuleData.setAttribute("securityHolder", securityHolder);
}
//listeners added directly to the StandardContext will get loaded by the tomcat classloader, not the app classloader!
//TODO this may definitely not be the best place for this!
for (ModuleBuilderExtension mbe : moduleBuilderExtensions) {
mbe.addGBeans(earContext, module, cl, repository);
}
//not truly metadata complete until MBEs have run
if (!webApp.getMetadataComplete()) {
webApp.setMetadataComplete(true);
module.setOriginalSpecDD(module.getSpecDD().toString());
}
webModuleData.setAttribute("deploymentDescriptor", module.getOriginalSpecDD());
/**
* This next bit of code is kind of a kludge to get Tomcat to get a default
* web.xml if one does not exist. This is primarily for jaxws. This code is
* necessary because Tomcat either has a bug or there is a problem dynamically
* adding a wrapper to an already running context. Although the wrapper
* can be added, the url mappings do not get picked up at the proper level
* and therefore Tomcat cannot dispatch the request. Hence, creating and
* writing out a web.xml to the deployed location is the only way around this
* until Tomcat fixes that bug.
*
* For myfaces/jsf, the spec dd may have been updated with a listener. So, we need to write it out again whether or not
* there originally was one. This might not work on windows due to file locking problems.
*/
if ((Boolean)module.getSharedContext().get(IS_JAVAEE)) {
WebAppType shortWebApp = (WebAppType) webApp.copy();
shortWebApp.setEjbLocalRefArray(new EjbLocalRefType[0]);
shortWebApp.setEjbRefArray(new EjbRefType[0]);
shortWebApp.setEnvEntryArray(new EnvEntryType[0]);
shortWebApp.setMessageDestinationArray(new MessageDestinationType[0]);
shortWebApp.setMessageDestinationRefArray(new MessageDestinationRefType[0]);
shortWebApp.setPersistenceContextRefArray(new PersistenceContextRefType[0]);
shortWebApp.setPersistenceUnitRefArray(new PersistenceUnitRefType[0]);
shortWebApp.setPostConstructArray(new LifecycleCallbackType[0]);
shortWebApp.setPreDestroyArray(new LifecycleCallbackType[0]);
shortWebApp.setResourceEnvRefArray(new ResourceEnvRefType[0]);
shortWebApp.setResourceRefArray(new ResourceRefType[0]);
shortWebApp.setServiceRefArray(new ServiceRefType[0]);
// TODO Tomcat will fail web services tck tests if the following security settings are set in shortWebApp
// need to figure out why...
//One clue is that without this stuff tomcat does not install an authenticator.... so there's no security
// shortWebApp.setSecurityConstraintArray(new SecurityConstraintType[0]);
// shortWebApp.setSecurityRoleArray(new SecurityRoleType[0]);
File webXml = new File(moduleContext.getBaseDir(), "/WEB-INF/web.xml");
File inPlaceDir = moduleContext.getInPlaceConfigurationDir();
if (inPlaceDir != null) {
webXml = new File(inPlaceDir, "/WEB-INF/web.xml");
}
// boolean webXmlExists = (inPlaceDir != null && new File(inPlaceDir,"/WEB-INF/web.xml").exists()) || webXml.exists();
// if (!webXmlExists) {
webXml.getParentFile().mkdirs();
try {
FileWriter outFile = new FileWriter(webXml);
XmlOptions opts = new XmlOptions();
opts.setSaveAggressiveNamespaces();
opts.setSaveSyntheticDocumentElement(WebAppDocument.type.getDocumentElementName());
opts.setUseDefaultNamespace();
opts.setSavePrettyPrint();
// WebAppDocument doc = WebAppDocument.Factory.newInstance();
// doc.setWebApp(webApp);
outFile.write(shortWebApp.xmlText(opts));
outFile.flush();
outFile.close();
} catch (Exception e) {
throw new DeploymentException(e);
}
// }
}
if (!module.isStandAlone()) {
ConfigurationData moduleConfigurationData = moduleContext.getConfigurationData();
earContext.addChildConfiguration(module.getTargetPath(), moduleConfigurationData);
}
} catch (DeploymentException de) {
throw de;
} catch (Exception e) {