blob: e56f857c2ba9e801c81f3437b091c3c243942a2f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.geronimo.web25.deployment;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.DispatcherType;
import javax.servlet.SessionTrackingMode;
import org.apache.geronimo.common.DeploymentException;
import org.apache.geronimo.web.info.AuthConstraintInfo;
import org.apache.geronimo.web.info.ErrorPageInfo;
import org.apache.geronimo.web.info.FilterInfo;
import org.apache.geronimo.web.info.FilterMappingInfo;
import org.apache.geronimo.web.info.LoginConfigInfo;
import org.apache.geronimo.web.info.MultipartConfigInfo;
import org.apache.geronimo.web.info.SecurityConstraintInfo;
import org.apache.geronimo.web.info.SecurityRoleRefInfo;
import org.apache.geronimo.web.info.ServletInfo;
import org.apache.geronimo.web.info.SessionConfigInfo;
import org.apache.geronimo.web.info.SessionCookieConfigInfo;
import org.apache.geronimo.web.info.WebAppInfo;
import org.apache.geronimo.web.info.WebResourceCollectionInfo;
import org.apache.geronimo.web25.deployment.utils.WebDeploymentValidationUtils;
import org.apache.openejb.jee.Dispatcher;
import org.apache.openejb.jee.ErrorPage;
import org.apache.openejb.jee.Filter;
import org.apache.openejb.jee.FilterMapping;
import org.apache.openejb.jee.Listener;
import org.apache.openejb.jee.LocaleEncodingMapping;
import org.apache.openejb.jee.LocaleEncodingMappingList;
import org.apache.openejb.jee.LoginConfig;
import org.apache.openejb.jee.MimeMapping;
import org.apache.openejb.jee.MultipartConfig;
import org.apache.openejb.jee.ParamValue;
import org.apache.openejb.jee.SecurityConstraint;
import org.apache.openejb.jee.SecurityRole;
import org.apache.openejb.jee.SecurityRoleRef;
import org.apache.openejb.jee.Servlet;
import org.apache.openejb.jee.ServletMapping;
import org.apache.openejb.jee.SessionConfig;
import org.apache.openejb.jee.TrackingMode;
import org.apache.openejb.jee.WebApp;
import org.apache.openejb.jee.WebResourceCollection;
import org.apache.openejb.jee.WelcomeFileList;
/**
* @version $Rev:$ $Date:$
*/
public class WebAppInfoBuilder {
private final WebApp webApp;
private final WebAppInfoFactory webAppInfoFactory;
private WebAppInfo webAppInfo;
public WebAppInfoBuilder(WebApp webApp, WebAppInfoFactory webAppInfoFactory) {
this.webApp = webApp;
this.webAppInfoFactory = webAppInfoFactory;
}
public WebAppInfo build() throws DeploymentException {
if (webAppInfo != null) {
throw new IllegalStateException("already built");
}
// check url-pattern and multiplicities
WebDeploymentValidationUtils.validateWebApp(webApp);
List<String> problems = new ArrayList<String>();
WebAppInfo webAppInfo = webAppInfoFactory.newWebAppInfo();
addParams(webApp.getContextParam(), webAppInfo.contextParams);
webAppInfo.contextRoot = webApp.getContextRoot();
webAppInfo.displayName = webApp.getDisplayName();
webAppInfo.distributable = !webApp.getDistributable().isEmpty();
for (ErrorPage errorPage: webApp.getErrorPage()) {
ErrorPageInfo errorPageInfo = new ErrorPageInfo();
errorPageInfo.location = errorPage.getLocation();
if (errorPage.getErrorCode() != null) {
errorPageInfo.errorCode = errorPage.getErrorCode().intValue();
}
errorPageInfo.exceptionType = errorPage.getExceptionType();
webAppInfo.errorPages.add(errorPageInfo);
}
Map<String, FilterInfo> filterMap = new HashMap<String, FilterInfo>();
for (Filter filter : webApp.getFilter()) {
FilterInfo filterInfo = webAppInfoFactory.newFilterInfo();
filterInfo.filterName = filter.getFilterName().trim();
filterInfo.filterClass = filter.getFilterClass();
filterInfo.asyncSupported = filter.isAsyncSupported();
addParams(filter.getInitParam(), filterInfo.initParams);
webAppInfo.filters.add(filterInfo);
filterMap.put(filterInfo.filterName, filterInfo);
}
for (FilterMapping filterMapping : webApp.getFilterMapping()) {
String filterName = filterMapping.getFilterName().trim();
FilterInfo filterInfo = filterMap.get(filterName);
if (filterInfo == null) {
problems.add("\nNo filter matching filter mappings for " + filterName);
} else {
if (!filterMapping.getServletName().isEmpty()) {
FilterMappingInfo servletMapping = new FilterMappingInfo();
servletMapping.dispatchers = toEnumSet(filterMapping.getDispatcher());
servletMapping.mapping.addAll(filterMapping.getServletName());
filterInfo.servletMappings.add(servletMapping);
}
if (!filterMapping.getUrlPattern().isEmpty()) {
FilterMappingInfo urlMapping = new FilterMappingInfo();
urlMapping.dispatchers = toEnumSet(filterMapping.getDispatcher());
normalizeUrlPatterns(filterMapping.getUrlPattern(), urlMapping.mapping);
filterInfo.urlMappings.add(urlMapping);
}
}
}
for (Listener listener : webApp.getListener()) {
webAppInfo.listeners.add(listener.getListenerClass());
}
for (LocaleEncodingMappingList localeEncodingMappingList: webApp.getLocaleEncodingMappingList()) {
for (LocaleEncodingMapping localeEncodingMapping: localeEncodingMappingList.getLocaleEncodingMapping()) {
webAppInfo.localeEncodingMappings.put(localeEncodingMapping.getLocale(), localeEncodingMapping.getEncoding());
}
}
for (LoginConfig loginConfig: webApp.getLoginConfig()) {
LoginConfigInfo loginConfigInfo = new LoginConfigInfo();
loginConfigInfo.authMethod = loginConfig.getAuthMethod();
loginConfigInfo.realmName = loginConfig.getRealmName();
if (loginConfig.getFormLoginConfig() != null) {
loginConfigInfo.formLoginPage = loginConfig.getFormLoginConfig().getFormLoginPage();
loginConfigInfo.formErrorPage = loginConfig.getFormLoginConfig().getFormErrorPage();
}
webAppInfo.loginConfig = loginConfigInfo;
break;
}
for (MimeMapping mimeMapping: webApp.getMimeMapping()) {
webAppInfo.mimeMappings.put(mimeMapping.getExtension(), mimeMapping.getMimeType());
}
for (SecurityConstraint securityConstraint : webApp.getSecurityConstraint()) {
SecurityConstraintInfo securityConstraintInfo = webAppInfoFactory.newSecurityConstraintInfo();
if (securityConstraint.getAuthConstraint() != null) {
securityConstraintInfo.authConstraint = new AuthConstraintInfo();
securityConstraintInfo.authConstraint.roleNames.addAll(securityConstraint.getAuthConstraint().getRoleName());
}
if (securityConstraint.getUserDataConstraint() != null) {
securityConstraintInfo.userDataConstraint = securityConstraint.getUserDataConstraint().getTransportGuarantee().value();
}
for (WebResourceCollection webResourceCollection : securityConstraint.getWebResourceCollection()) {
WebResourceCollectionInfo webResourceCollectionInfo = new WebResourceCollectionInfo();
webResourceCollectionInfo.webResourceName = webResourceCollection.getWebResourceName();
normalizeUrlPatterns(webResourceCollection.getUrlPattern(), webResourceCollectionInfo.urlPatterns);
if (webResourceCollection.getHttpMethod().size() > 0) {
webResourceCollectionInfo.omission = false;
webResourceCollectionInfo.httpMethods.addAll(webResourceCollection.getHttpMethod());
} else {
webResourceCollectionInfo.omission = true;
webResourceCollectionInfo.httpMethods.addAll(webResourceCollection.getHttpMethodOmission());
}
securityConstraintInfo.webResourceCollections.add(webResourceCollectionInfo);
}
webAppInfo.securityConstraints.add(securityConstraintInfo);
}
for (SecurityRole securityRole : webApp.getSecurityRole()) {
webAppInfo.securityRoles.add(securityRole.getRoleName().trim());
}
Map<String, ServletInfo> servletMap = new HashMap<String, ServletInfo>();
for (Servlet servlet : webApp.getServlet()) {
ServletInfo servletInfo;
if (servlet.getServletClass() != null) {
servletInfo = webAppInfoFactory.newServletInfo();
servletInfo.servletClass = servlet.getServletClass();
} else if (servlet.getJspFile() != null) {
servletInfo = webAppInfoFactory.newJspInfo(servlet.getJspFile());
if(servletInfo == null) {
problems.add("\nNo JSP servlet available, " + servlet.getServletName() + " will not work");
continue;
}
} else {
problems.add("\nNo servlet class or jsp file for servlet " + servlet.getServletName());
continue;
}
servletInfo.servletName = servlet.getServletName();
if (servlet.getAsyncSupported() != null) {
servletInfo.asyncSupported = servlet.getAsyncSupported();
}
servletInfo.loadOnStartup = servlet.getLoadOnStartup();
if (servlet.getRunAs() != null) {
servletInfo.runAsRole = servlet.getRunAs().getRoleName().trim();
}
if (servlet.getMultipartConfig() != null) {
MultipartConfig multipartConfig = servlet.getMultipartConfig();
MultipartConfigInfo multipartConfigInfo = new MultipartConfigInfo();
multipartConfigInfo.location = multipartConfig.getLocation();
multipartConfigInfo.maxFileSize = multipartConfig.getMaxFileSize();
multipartConfigInfo.maxRequestSize = multipartConfig.getMaxRequestSize();
multipartConfigInfo.fileSizeThreshold = multipartConfig.getFileSizeThreshold();
servletInfo.multipartConfigInfo = multipartConfigInfo;
}
addParams(servlet.getInitParam(), servletInfo.initParams);
for (SecurityRoleRef securityRoleRef : servlet.getSecurityRoleRef()) {
SecurityRoleRefInfo securityRoleRefInfo = new SecurityRoleRefInfo();
if (securityRoleRef.getRoleLink() != null) {
securityRoleRefInfo.roleLink = securityRoleRef.getRoleLink().trim();
}
securityRoleRefInfo.roleName = securityRoleRef.getRoleName().trim();
servletInfo.securityRoleRefs.add(securityRoleRefInfo);
}
webAppInfo.servlets.add(servletInfo);
servletMap.put(servletInfo.servletName, servletInfo);
}
for (ServletMapping servletMapping : webApp.getServletMapping()) {
String servletName = servletMapping.getServletName().trim();
ServletInfo servletInfo = servletMap.get(servletName);
if (servletInfo == null) {
problems.add("\nNo servlet matching servlet mappings for " + servletName);
} else {
normalizeUrlPatterns(servletMapping.getUrlPattern(), servletInfo.servletMappings);
}
}
for (SessionConfig sessionConfig: webApp.getSessionConfig()) {
SessionConfigInfo sessionConfigInfo = new SessionConfigInfo();
sessionConfigInfo.sessionTimeoutMinutes = sessionConfig.getSessionTimeout() != null? sessionConfig.getSessionTimeout(): -1;
List<SessionTrackingMode> modes = new ArrayList<SessionTrackingMode>();
for (TrackingMode mode: sessionConfig.getTrackingMode()) {
modes.add(SessionTrackingMode.valueOf(mode.value()));
}
sessionConfigInfo.sessionTrackingModes = modes.isEmpty()? EnumSet.noneOf(SessionTrackingMode.class): EnumSet.copyOf(modes);
if (sessionConfig.getCookieConfig() != null) {
SessionCookieConfigInfo cookieConfigInfo = new SessionCookieConfigInfo();
cookieConfigInfo.name = sessionConfig.getCookieConfig().getName();
cookieConfigInfo.domain = sessionConfig.getCookieConfig().getDomain();
cookieConfigInfo.comment = sessionConfig.getCookieConfig().getComment();
cookieConfigInfo.path = sessionConfig.getCookieConfig().getPath();
cookieConfigInfo.httpOnly = sessionConfig.getCookieConfig().getHttpOnly() != null? sessionConfig.getCookieConfig().getHttpOnly(): false;
cookieConfigInfo.secure = sessionConfig.getCookieConfig().getSecure() != null? sessionConfig.getCookieConfig().getSecure(): false;
cookieConfigInfo.maxAge = sessionConfig.getCookieConfig().getMaxAge() != null? sessionConfig.getCookieConfig().getMaxAge(): -1;
sessionConfigInfo.sessionCookieConfig = cookieConfigInfo;
}
webAppInfo.sessionConfig = sessionConfigInfo;
break;
}
for (WelcomeFileList welcomeFileList: webApp.getWelcomeFileList()) {
webAppInfo.welcomeFiles.addAll(welcomeFileList.getWelcomeFile());
}
for (WelcomeFileList welcomeFileList: webApp.getWelcomeFileList()) {
webAppInfo.welcomeFiles.addAll(welcomeFileList.getWelcomeFile());
}
webAppInfoFactory.complete(webAppInfo);
if (!problems.isEmpty()) {
throw new DeploymentException("Problems encountered parsing web.xml: " + problems);
}
this.webAppInfo = webAppInfo;
return webAppInfo;
}
public WebApp getWebApp() {
return webApp;
}
public WebAppInfo getWebAppInfo() {
return webAppInfo;
}
public ServletInfo copy(ServletInfo servletInfo) {
return webAppInfoFactory.copy(servletInfo);
}
public FilterInfo copy(FilterInfo filterInfo) {
return webAppInfoFactory.copy(filterInfo);
}
public static void normalizeUrlPatterns(Collection<String> source, Collection<String> target) {
for (String pattern : source) {
if (!pattern.startsWith("*") && !pattern.startsWith("/")) {
pattern = "/" + pattern;
//log.info("corrected url pattern to " + pattern);
}
target.add(pattern);
}
}
protected void addParams(List<ParamValue> params, Map<String, String> paramMap) {
for (ParamValue paramValue : params) {
if (!paramMap.containsKey(paramValue.getParamName())) {
paramMap.put(paramValue.getParamName(), paramValue.getParamValue());
}
}
}
private EnumSet<DispatcherType> toEnumSet(List<Dispatcher> dispatchers) {
if (dispatchers.isEmpty()) {
return EnumSet.of(DispatcherType.REQUEST);
}
List<DispatcherType> types = new ArrayList<DispatcherType>(dispatchers.size());
for (Dispatcher dispatcher : dispatchers) {
types.add(toDispatcherType(dispatcher));
}
return EnumSet.copyOf(types);
}
private DispatcherType toDispatcherType(Dispatcher dispatcher) {
return DispatcherType.valueOf(dispatcher.name());
}
}