public void addGBeans(EARContext earContext, Module module, ClassLoader cl) throws DeploymentException {
J2eeContext earJ2eeContext = earContext.getJ2eeContext();
J2eeContext moduleJ2eeContext = J2eeContextImpl.newModuleContextFromApplication(earJ2eeContext, NameFactory.WEB_MODULE, module.getName());
WebModule webModule = (WebModule) module;
WebAppType webApp = (WebAppType) webModule.getSpecDD();
JettyWebAppType jettyWebApp = (JettyWebAppType) webModule.getVendorDD();
boolean contextPriorityClassLoader = defaultContextPriorityClassloader;
if (jettyWebApp.isSetContextPriorityClassloader()) {
contextPriorityClassLoader = jettyWebApp.getContextPriorityClassloader();
}
// construct the webClassLoader
ClassLoader webClassLoader = getWebClassLoader(earContext, webModule, cl, contextPriorityClassLoader);
GbeanType[] gbeans = jettyWebApp.getGbeanArray();
ServiceConfigBuilder.addGBeans(gbeans, webClassLoader, moduleJ2eeContext, earContext);
ObjectName webModuleName = null;
try {
webModuleName = NameFactory.getModuleName(null, null, null, null, null, moduleJ2eeContext);
} catch (MalformedObjectNameException e) {
throw new DeploymentException("Could not construct module name", e);
}
UserTransaction userTransaction = new OnlineUserTransaction();
//this may add to the web classpath with enhanced classes.
Map compContext = buildComponentContext(earContext, webModule, webApp, jettyWebApp, userTransaction, webClassLoader);
GBeanData webModuleData = new GBeanData(webModuleName, JettyWebAppContext.GBEAN_INFO);
try {
webModuleData.setReferencePattern("J2EEServer", earContext.getServerObjectName());
if (!earContext.getJ2EEApplicationName().equals("null")) {
webModuleData.setReferencePattern("J2EEApplication", earContext.getApplicationObjectName());
}
webModuleData.setAttribute("deploymentDescriptor", module.getOriginalSpecDD());
Set securityRoles = collectRoleNames(webApp);
Map rolePermissions = new HashMap();
webModuleData.setAttribute("uri", URI.create(module.getTargetPath() + "/"));
String[] hosts = jettyWebApp.getVirtualHostArray();
for (int i = 0; i < hosts.length; i++) {
hosts[i] = hosts[i].trim();
}
webModuleData.setAttribute("virtualHosts", hosts);
webModuleData.setAttribute("componentContext", compContext);
webModuleData.setAttribute("userTransaction", userTransaction);
//classpath may have been augmented with enhanced classes
webModuleData.setAttribute("webClassPath", webModule.getWebClasspath());
// unsharableResources, applicationManagedSecurityResources
GBeanResourceEnvironmentBuilder rebuilder = new GBeanResourceEnvironmentBuilder(webModuleData);
ENCConfigBuilder.setResourceEnvironment(earContext, webModule.getModuleURI(), rebuilder, webApp.getResourceRefArray(), jettyWebApp.getResourceRefArray());
webModuleData.setAttribute("contextPath", webModule.getContextRoot());
webModuleData.setAttribute("contextPriorityClassLoader", Boolean.valueOf(contextPriorityClassLoader));
webModuleData.setReferencePattern("TransactionContextManager", earContext.getTransactionContextManagerObjectName());
webModuleData.setReferencePattern("TrackedConnectionAssociator", earContext.getConnectionTrackerObjectName());
webModuleData.setReferencePattern("JettyContainer", jettyContainerObjectName);
//stuff that jetty used to do
if (webApp.getDisplayNameArray().length > 0) {
webModuleData.setAttribute("displayName", webApp.getDisplayNameArray()[0].getStringValue());
}
ParamValueType[] contextParamArray = webApp.getContextParamArray();
Map contextParams = new HashMap();
for (int i = 0; i < contextParamArray.length; i++) {
ParamValueType contextParam = contextParamArray[i];
contextParams.put(contextParam.getParamName().getStringValue().trim(), contextParam.getParamValue().getStringValue().trim());
}
webModuleData.setAttribute("contextParamMap", contextParams);
ListenerType[] listenerArray = webApp.getListenerArray();
Collection listeners = new ArrayList();
for (int i = 0; i < listenerArray.length; i++) {
ListenerType listenerType = listenerArray[i];
listeners.add(listenerType.getListenerClass().getStringValue());
}
webModuleData.setAttribute("listenerClassNames", listeners);
webModuleData.setAttribute("distributable", webApp.getDistributableArray().length == 1 ? Boolean.TRUE : Boolean.FALSE);
webModuleData.setAttribute("sessionTimeoutSeconds",
(webApp.getSessionConfigArray().length == 1 && webApp.getSessionConfigArray(0).getSessionTimeout() != null) ?
new Integer(webApp.getSessionConfigArray(0).getSessionTimeout().getBigIntegerValue().intValue() * 60) :
defaultSessionTimeoutSeconds);
MimeMappingType[] mimeMappingArray = webApp.getMimeMappingArray();
Map mimeMappingMap = new HashMap();
for (int i = 0; i < mimeMappingArray.length; i++) {
MimeMappingType mimeMappingType = mimeMappingArray[i];
mimeMappingMap.put(mimeMappingType.getExtension().getStringValue(), mimeMappingType.getMimeType().getStringValue());
}
webModuleData.setAttribute("mimeMap", mimeMappingMap);
WelcomeFileListType[] welcomeFileArray = webApp.getWelcomeFileListArray();
List welcomeFiles;
if (welcomeFileArray.length > 0) {
welcomeFiles = new ArrayList();
for (int i = 0; i < welcomeFileArray.length; i++) {
String[] welcomeFileListType = welcomeFileArray[i].getWelcomeFileArray();
for (int j = 0; j < welcomeFileListType.length; j++) {
String welcomeFile = welcomeFileListType[j].trim();
welcomeFiles.add(welcomeFile);
}
}
} else {
welcomeFiles = new ArrayList(defaultWelcomeFiles);
}
webModuleData.setAttribute("welcomeFiles", welcomeFiles.toArray(new String[welcomeFiles.size()]));
LocaleEncodingMappingListType[] localeEncodingMappingListArray = webApp.getLocaleEncodingMappingListArray();
Map localeEncodingMappingMap = new HashMap();
for (int i = 0; i < localeEncodingMappingListArray.length; i++) {
LocaleEncodingMappingType[] localeEncodingMappingArray = localeEncodingMappingListArray[i].getLocaleEncodingMappingArray();
for (int j = 0; j < localeEncodingMappingArray.length; j++) {
LocaleEncodingMappingType localeEncodingMapping = localeEncodingMappingArray[j];
localeEncodingMappingMap.put(localeEncodingMapping.getLocale(), localeEncodingMapping.getEncoding());
}
}
webModuleData.setAttribute("localeEncodingMapping", localeEncodingMappingMap);
ErrorPageType[] errorPageArray = webApp.getErrorPageArray();
Map errorPageMap = new HashMap();
for (int i = 0; i < errorPageArray.length; i++) {
ErrorPageType errorPageType = errorPageArray[i];
if (errorPageType.isSetErrorCode()) {
errorPageMap.put(errorPageType.getErrorCode().getStringValue(), errorPageType.getLocation().getStringValue());
} else {
errorPageMap.put(errorPageType.getExceptionType().getStringValue(), errorPageType.getLocation().getStringValue());
}
}
webModuleData.setAttribute("errorPages", errorPageMap);
JspConfigType[] jspConfigArray = webApp.getJspConfigArray();
if (jspConfigArray.length > 1) {
throw new DeploymentException("At most one jsp-config element, not " + jspConfigArray.length);
}
Map tagLibMap = new HashMap();
for (int i = 0; i < jspConfigArray.length; i++) {
TaglibType[] tagLibArray = jspConfigArray[i].getTaglibArray();
for (int j = 0; j < tagLibArray.length; j++) {
TaglibType taglib = tagLibArray[j];
tagLibMap.put(taglib.getTaglibUri().getStringValue().trim(), taglib.getTaglibLocation().getStringValue().trim());
}
}
webModuleData.setAttribute("tagLibMap", tagLibMap);
LoginConfigType[] loginConfigArray = webApp.getLoginConfigArray();
if (loginConfigArray.length > 1) {
throw new DeploymentException("At most one login-config element, not " + loginConfigArray.length);
}
if (loginConfigArray.length == 1) {
LoginConfigType loginConfig = loginConfigArray[0];
if (loginConfig.isSetAuthMethod()) {
String authMethod = loginConfig.getAuthMethod().getStringValue();
if ("BASIC".equals(authMethod)) {
webModuleData.setAttribute("authenticator", new BasicAuthenticator());
} else if ("DIGEST".equals(authMethod)) {
webModuleData.setAttribute("authenticator", new DigestAuthenticator());
} else if ("FORM".equals(authMethod)) {
FormAuthenticator formAuthenticator = new FormAuthenticator();
webModuleData.setAttribute("authenticator", formAuthenticator);
if (loginConfig.isSetFormLoginConfig()) {
FormLoginConfigType formLoginConfig = loginConfig.getFormLoginConfig();
formAuthenticator.setLoginPage(formLoginConfig.getFormLoginPage().getStringValue());
formAuthenticator.setErrorPage(formLoginConfig.getFormErrorPage().getStringValue());
}
} else if ("CLIENT-CERT".equals(authMethod)) {
webModuleData.setAttribute("authenticator", new ClientCertAuthenticator());
}
}
if (loginConfig.isSetRealmName()) {
webModuleData.setAttribute("realmName", loginConfig.getRealmName().getStringValue());
}
}
earContext.addGBean(webModuleData);
//never add a duplicate pattern.
Set knownServletMappings = new HashSet();
ServletMappingType[] servletMappingArray = webApp.getServletMappingArray();
Map servletMappings = new HashMap();
for (int i = 0; i < servletMappingArray.length; i++) {
ServletMappingType servletMappingType = servletMappingArray[i];
String servletName = servletMappingType.getServletName().getStringValue().trim();
String urlPattern = servletMappingType.getUrlPattern().getStringValue();
if (!knownServletMappings.contains(urlPattern)) {
knownServletMappings.add(urlPattern);
checkString(urlPattern);
Set urlsForServlet = (Set) servletMappings.get(servletName);
if (urlsForServlet == null) {
urlsForServlet = new HashSet();
servletMappings.put(servletName, urlsForServlet);
}
urlsForServlet.add(urlPattern);
}
}
//"previous" filter mapping for linked list to keep dd's ordering.
ObjectName previous = null;
//add default filters
if (defaultFilters != null) {
for (Iterator iterator = defaultFilters.iterator(); iterator.hasNext();) {
Object defaultFilter = iterator.next();
GBeanData filterGBeanData = getGBeanData(kernel, defaultFilter);
String filterName = (String) filterGBeanData.getAttribute("filterName");
ObjectName defaultFilterObjectName = NameFactory.getWebComponentName(null, null, null, null, filterName, NameFactory.WEB_FILTER, moduleJ2eeContext);
filterGBeanData.setName(defaultFilterObjectName);
filterGBeanData.setReferencePattern("JettyServletRegistration", webModuleName);
earContext.addGBean(filterGBeanData);
//add a mapping to /*
GBeanData filterMappingGBeanData = new GBeanData(JettyFilterMapping.GBEAN_INFO);
filterMappingGBeanData.setReferencePattern("Previous", previous);
filterMappingGBeanData.setReferencePattern("JettyServletRegistration", webModuleName);
String urlPattern = "/*";
filterMappingGBeanData.setAttribute("urlPattern", urlPattern);
ObjectName filterMappingName = NameFactory.getWebFilterMappingName(null, null, null, null, filterName, null, urlPattern, moduleJ2eeContext);
filterMappingGBeanData.setName(filterMappingName);
previous = filterMappingName;
filterMappingGBeanData.setAttribute("requestDispatch", Boolean.TRUE);
filterMappingGBeanData.setAttribute("forwardDispatch", Boolean.TRUE);
filterMappingGBeanData.setAttribute("includeDispatch", Boolean.TRUE);
filterMappingGBeanData.setAttribute("errorDispatch", Boolean.FALSE);
filterMappingGBeanData.setReferencePattern("Filter", defaultFilterObjectName);
earContext.addGBean(filterMappingGBeanData);
}
}
//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, moduleJ2eeContext);
// } 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, moduleJ2eeContext);
// }
// filterMappingGBeanData.setName(defaultFilterMappingObjectName);
// filterMappingGBeanData.setReferencePattern("JettyFilterMappingRegistration", webModuleName);
// earContext.addGBean(filterMappingGBeanData);
// }
// }
FilterMappingType[] filterMappingArray = webApp.getFilterMappingArray();
for (int i = 0; i < filterMappingArray.length; i++) {
FilterMappingType filterMappingType = filterMappingArray[i];
String filterName = filterMappingType.getFilterName().getStringValue().trim();
GBeanData filterMappingData = new GBeanData(JettyFilterMapping.GBEAN_INFO);
filterMappingData.setReferencePattern("Previous", previous);
filterMappingData.setReferencePattern("JettyServletRegistration", webModuleName);
ObjectName filterMappingName = null;
if (filterMappingType.isSetUrlPattern()) {
//do not trim!
String urlPattern = filterMappingType.getUrlPattern().getStringValue();
filterMappingData.setAttribute("urlPattern", urlPattern);
filterMappingName = NameFactory.getWebFilterMappingName(null, null, null, null, filterName, null, urlPattern, moduleJ2eeContext);
}
if (filterMappingType.isSetServletName()) {
String servletName = filterMappingType.getServletName().getStringValue().trim();
ObjectName servletObjectName = NameFactory.getWebComponentName(null, null, null, null, servletName, NameFactory.SERVLET, moduleJ2eeContext);
filterMappingData.setReferencePattern("Servlet", servletObjectName);
filterMappingName = NameFactory.getWebFilterMappingName(null, null, null, null, filterName, servletName, null, moduleJ2eeContext);
}
filterMappingData.setName(filterMappingName);
previous = filterMappingName;
boolean request = filterMappingType.getDispatcherArray().length == 0;
boolean forward = false;
boolean include = false;
boolean error = false;
for (int j = 0; j < filterMappingType.getDispatcherArray().length; j++) {
DispatcherType dispatcherType = filterMappingType.getDispatcherArray()[j];
if (dispatcherType.getStringValue().equals("REQUEST")) {
request = true;
} else if (dispatcherType.getStringValue().equals("FORWARD")) {
forward = true;
} else if (dispatcherType.getStringValue().equals("INCLUDE")) {
include = true;
} else if (dispatcherType.getStringValue().equals("ERROR")) {
error = true;
}
}
filterMappingData.setAttribute("requestDispatch", Boolean.valueOf(request));
filterMappingData.setAttribute("forwardDispatch", Boolean.valueOf(forward));
filterMappingData.setAttribute("includeDispatch", Boolean.valueOf(include));
filterMappingData.setAttribute("errorDispatch", Boolean.valueOf(error));
ObjectName filterObjectName = NameFactory.getWebComponentName(null, null, null, null, filterName, NameFactory.WEB_FILTER, moduleJ2eeContext);
filterMappingData.setReferencePattern("Filter", filterObjectName);
earContext.addGBean(filterMappingData);
}
FilterType[] filterArray = webApp.getFilterArray();
for (int i = 0; i < filterArray.length; i++) {
FilterType filterType = filterArray[i];
String filterName = filterType.getFilterName().getStringValue().trim();
ObjectName filterObjectName = NameFactory.getWebComponentName(null, null, null, null, filterName, NameFactory.WEB_FILTER, moduleJ2eeContext);
GBeanData filterData = new GBeanData(filterObjectName, JettyFilterHolder.GBEAN_INFO);
filterData.setAttribute("filterName", filterName);
filterData.setAttribute("filterClass", filterType.getFilterClass().getStringValue().trim());
Map initParams = new HashMap();
ParamValueType[] initParamArray = filterType.getInitParamArray();
for (int j = 0; j < initParamArray.length; j++) {
ParamValueType paramValueType = initParamArray[j];
initParams.put(paramValueType.getParamName().getStringValue().trim(), paramValueType.getParamValue().getStringValue().trim());
}
filterData.setAttribute("initParams", initParams);
filterData.setReferencePattern("JettyServletRegistration", webModuleName);
earContext.addGBean(filterData);
}
//add default servlets
if (defaultServlets != null) {
for (Iterator iterator = defaultServlets.iterator(); iterator.hasNext();) {
Object defaultServlet = iterator.next();
GBeanData servletGBeanData = getGBeanData(kernel, defaultServlet);
ObjectName defaultServletObjectName = NameFactory.getWebComponentName(null, null, null, null, (String) servletGBeanData.getAttribute("servletName"), NameFactory.SERVLET, moduleJ2eeContext);
servletGBeanData.setName(defaultServletObjectName);
servletGBeanData.setReferencePattern("JettyServletRegistration", webModuleName);
Set defaultServletMappings = new HashSet((Collection) servletGBeanData.getAttribute("servletMappings"));
defaultServletMappings.removeAll(knownServletMappings);
servletGBeanData.setAttribute("servletMappings", defaultServletMappings);
earContext.addGBean(servletGBeanData);
}
}
//set up servlet gbeans.
ServletType[] servletTypes = webApp.getServletArray();
Map portMap = webModule.getPortMap();
addServlets(webModuleName, webModule.getModuleFile(), servletTypes, servletMappings, securityRoles, rolePermissions, portMap, webClassLoader, moduleJ2eeContext, earContext);
if (jettyWebApp.isSetSecurityRealmName()) {