public void addGBeans(EARContext earContext, Module module, Bundle bundle, Collection repository) throws DeploymentException {
EARContext moduleContext = module.getEarContext();
AbstractName moduleName = module.getModuleName();
WebModule webModule = (WebModule) module;
WebAppType webApp = (WebAppType) webModule.getSpecDD();
JettyWebAppType jettyWebApp = (JettyWebAppType) webModule.getVendorDD();
GBeanData webModuleData = new GBeanData(moduleName, WebAppContextWrapper.class);
configureBasicWebModuleAttributes(webApp, jettyWebApp, moduleContext, earContext, webModule, webModuleData);
// unsharableResources, applicationManagedSecurityResources
GBeanResourceEnvironmentBuilder rebuilder = new GBeanResourceEnvironmentBuilder(webModuleData);
//N.B. use earContext not moduleContext
//TODO fix this for javaee 5 !!!
resourceEnvironmentSetter.setResourceEnvironment(rebuilder, webApp.getResourceRefArray(), jettyWebApp.getResourceRefArray());
try {
moduleContext.addGBean(webModuleData);
// configure WebAppContextManager with right priority so that it starts last
AbstractName contextManagerName = earContext.getNaming().createChildName(moduleName, "WebAppContextManager", NameFactory.SERVICE_MODULE);
GBeanData contextManagerGBean = new GBeanData(contextManagerName, WebAppContextManager.class);
contextManagerGBean.setPriority(100);
contextManagerGBean.setReferencePattern("webApp", moduleName);
moduleContext.addGBean(contextManagerGBean);
// configure hosts and virtual-hosts
configureHosts(earContext, jettyWebApp, webModuleData);
String contextPath = webModule.getContextRoot();
if (contextPath == null) {
throw new DeploymentException("null contextPath");
}
if (!contextPath.startsWith("/")) {
contextPath = "/" + contextPath;
}
webModuleData.setAttribute("contextPath", contextPath);
if (jettyWebApp.isSetWorkDir()) {
String workDir = jettyWebApp.getWorkDir();
webModuleData.setAttribute("workDir", workDir);
}
if (jettyWebApp.isSetWebContainer()) {
AbstractNameQuery webContainerName = ENCConfigBuilder.getGBeanQuery(GBeanInfoBuilder.DEFAULT_J2EE_TYPE, jettyWebApp.getWebContainer());
webModuleData.setReferencePattern("JettyContainer", webContainerName);
} else {
webModuleData.setReferencePattern("JettyContainer", jettyContainerObjectName);
}
//stuff that jetty used to do
if (webApp.getDisplayNameArray().length > 0) {
webModuleData.setAttribute("displayName", webApp.getDisplayNameArray()[0].getStringValue());
}
// configure context parameters.
configureContextParams(webApp, webModuleData);
// configure listeners.
configureListeners(webApp, webModuleData);
webModuleData.setAttribute(WebAppContextWrapper.GBEAN_ATTR_SESSION_TIMEOUT,
(webApp.getSessionConfigArray().length == 1 && webApp.getSessionConfigArray(0).getSessionTimeout() != null) ?
webApp.getSessionConfigArray(0).getSessionTimeout().getBigIntegerValue().intValue() * 60 :
defaultSessionTimeoutSeconds);
Boolean distributable = webApp.getDistributableArray().length == 1 ? TRUE : FALSE;
webModuleData.setAttribute("distributable", distributable);
if (TRUE == distributable) {
clusteringBuilders.build(jettyWebApp, earContext, moduleContext);
if (webModuleData.getReferencePatterns(WebAppContextWrapper.GBEAN_REF_SESSION_HANDLER_FACTORY) == null) {
log.warn("No clustering builders configured: app will not be clustered");
configureNoClustering(moduleContext, webModuleData);
}
} else {
configureNoClustering(moduleContext, webModuleData);
}
// configure mime mappings.
configureMimeMappings(webApp, webModuleData);
// configure welcome file lists.
configureWelcomeFileLists(webApp, webModuleData);
// configure local encoding mapping lists.
configureLocaleEncodingMappingLists(webApp, webModuleData);
// configure error pages.
configureErrorPages(webApp, webModuleData);
// configure tag libs.
Set<String> knownServletMappings = new HashSet<String>();
Set<String> knownJspMappings = new HashSet<String>();
Map<String, Set<String>> servletMappings = new HashMap<String, Set<String>>();
if (jspServlet != null) {
configureTagLibs(module, webApp, webModuleData, servletMappings, knownJspMappings, jspServlet.getServletName());
GBeanData jspServletData = configureDefaultServlet(jspServlet, earContext, moduleName, knownJspMappings);
knownServletMappings.addAll(knownJspMappings);
module.getSharedContext().put(DEFAULT_JSP_SERVLET_KEY, jspServletData);
}
// configure login configs.
configureAuthentication(module, webApp, jettyWebApp, webModuleData);
// Make sure that servlet mappings point to available servlets and never add a duplicate pattern.
buildServletMappings(module, webApp, servletMappings, knownServletMappings);
//be careful that the jsp servlet defaults don't override anything configured in the app.
if (jspServlet != null) {
GBeanData jspServletData = (GBeanData) module.getSharedContext().get(DEFAULT_JSP_SERVLET_KEY);
Set<String> jspMappings = (Set<String>) jspServletData.getAttribute("servletMappings");
jspMappings.removeAll(knownServletMappings);
jspMappings.addAll(knownJspMappings);
jspServletData.setAttribute("servletMappings", jspMappings);
}
//"previous" filter mapping for linked list to keep dd's ordering.
AbstractName previous = null;
//add default filters
if (defaultFilters != null) {
previous = addDefaultFiltersGBeans(earContext, moduleContext, moduleName, previous);
}
//add default filtermappings
// if (defaultFilterMappings != null) {
// for (Iterator iterator = defaultFilterMappings.iterator(); iterator.hasNext();) {
// Object defaultFilterMapping = iterator.next();
// GBeanData filterMappingGBeanData = getGBeanData(kernel, defaultFilterMapping);
// String filterName = (String) filterMappingGBeanData.getAttribute("filterName");
// ObjectName defaultFilterMappingObjectName;
// if (filterMappingGBeanData.getAttribute("urlPattern") != null) {
// String urlPattern = (String) filterMappingGBeanData.getAttribute("urlPattern");
// defaultFilterMappingObjectName = NameFactory.getWebFilterMappingName(null, null, null, null, filterName, null, urlPattern, moduleName);
// } else {
// Set servletNames = filterMappingGBeanData.getReferencePatterns("Servlet");
// if (servletNames == null || servletNames.size() != 1) {
// throw new DeploymentException("Exactly one servlet name must be supplied");
// }
// ObjectName servletObjectName = (ObjectName) servletNames.iterator().next();
// String servletName = servletObjectName.getKeyProperty("name");
// defaultFilterMappingObjectName = NameFactory.getWebFilterMappingName(null, null, null, null, filterName, servletName, null, moduleName);
// }
// filterMappingGBeanData.setName(defaultFilterMappingObjectName);
// filterMappingGBeanData.setReferencePattern("JettyFilterMappingRegistration", webModuleName);
// moduleContext.addGBean(filterMappingGBeanData);
// }
// }
// add filter mapping GBeans.
addFilterMappingsGBeans(earContext, moduleContext, moduleName, webApp, previous);
// add filter GBeans.
addFiltersGBeans(earContext, moduleContext, moduleName, webApp);
//add default servlets
if (defaultServlets != null) {
addDefaultServletsGBeans(earContext, moduleContext, moduleName, knownServletMappings);
}
//set up servlet gbeans.
ServletType[] servletTypes = webApp.getServletArray();
addServlets(moduleName, webModule, servletTypes, servletMappings, moduleContext);
if (jettyWebApp.isSetSecurityRealmName()) {
configureSecurityRealm(earContext, webApp, jettyWebApp, bundle, webModuleData);
}
//See Jetty-386, GERONIMO-3738
if (jettyWebApp.getCompactPath()) {
webModuleData.setAttribute("compactPath", Boolean.TRUE);
}
//TODO this may definitely not be the best place for this!
for (ModuleBuilderExtension mbe : moduleBuilderExtensions) {
mbe.addGBeans(earContext, module, bundle, repository);
}
//not truly metadata complete until MBEs have run
if (!webApp.getMetadataComplete()) {
webApp.setMetadataComplete(true);
if (INITIAL_WEB_XML_SCHEMA_VERSION.get(earContext.getGeneralData()) >= 2.5f) {
String specDeploymentPlan = getSpecDDAsString(webModule);
module.setOriginalSpecDD(specDeploymentPlan);
earContext.addFile(new URI("./WEB-INF/web.xml"), specDeploymentPlan);
}