/* * JBoss, Home of Professional Open Source * Copyright 2010, Red Hat Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.undertow; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.jboss.dmr.ModelNode; import org.jboss.dmr.Property; import org.jboss.metadata.javaee.spec.ParamValueMetaData; import org.jboss.metadata.web.spec.MimeMappingMetaData; import org.jboss.metadata.web.spec.ServletMappingMetaData; import org.jboss.metadata.web.spec.ServletMetaData; import org.jboss.metadata.web.spec.ServletsMetaData; import org.jboss.metadata.web.spec.SessionConfigMetaData; import org.jboss.metadata.web.spec.WebMetaData; import org.jboss.metadata.web.spec.WelcomeFileListMetaData; import static org.jboss.as.undertow.Constants.CHECK_INTERVAL; import static org.jboss.as.undertow.Constants.DEVELOPMENT; import static org.jboss.as.undertow.Constants.DISABLED; import static org.jboss.as.undertow.Constants.DISPLAY_SOURCE_FRAGMENT; import static org.jboss.as.undertow.Constants.DUMP_SMAP; import static org.jboss.as.undertow.Constants.ERROR_ON_USE_BEAN_INVALID_CLASS_ATTRIBUTE; import static org.jboss.as.undertow.Constants.FILE_ENCODING; import static org.jboss.as.undertow.Constants.GENERATE_STRINGS_AS_CHAR_ARRAYS; import static org.jboss.as.undertow.Constants.JAVA_ENCODING; import static org.jboss.as.undertow.Constants.JSP_CONFIGURATION; import static org.jboss.as.undertow.Constants.KEEP_GENERATED; import static org.jboss.as.undertow.Constants.LISTINGS; import static org.jboss.as.undertow.Constants.MAPPED_FILE; import static org.jboss.as.undertow.Constants.MAX_DEPTH; import static org.jboss.as.undertow.Constants.MODIFICATION_TEST_INTERVAL; import static org.jboss.as.undertow.Constants.READ_ONLY; import static org.jboss.as.undertow.Constants.RECOMPILE_ON_FAIL; import static org.jboss.as.undertow.Constants.SCRATCH_DIR; import static org.jboss.as.undertow.Constants.SECRET; import static org.jboss.as.undertow.Constants.SENDFILE; import static org.jboss.as.undertow.Constants.SMAP; import static org.jboss.as.undertow.Constants.SOURCE_VM; import static org.jboss.as.undertow.Constants.STATIC_RESOURCES; import static org.jboss.as.undertow.Constants.TAG_POOLING; import static org.jboss.as.undertow.Constants.TARGET_VM; import static org.jboss.as.undertow.Constants.TRIM_SPACES; import static org.jboss.as.undertow.Constants.WEBDAV; import static org.jboss.as.undertow.Constants.X_POWERED_BY; /** * Internal helper creating a shared web.xml based on the domain configuration. * * @author Emanuel Muckenhuber */ class SharedWebMetaDataBuilder { static final List<String> welcomeFiles = new ArrayList<String>(); static final List<MimeMappingMetaData> mimeMappings = new ArrayList<MimeMappingMetaData>(); static { // Create the default mappings createMappings(mimeMappings); welcomeFiles.add("index.html"); welcomeFiles.add("index.htm"); welcomeFiles.add("index.jsp"); } /** * The common container config. */ private final ModelNode config; SharedWebMetaDataBuilder(final ModelNode containerConfig) { this.config = containerConfig; init(); } private void init() { ModelNode containerConfig = config.get(Constants.CONTAINER); if (containerConfig.hasDefined(Constants.MIME_MAPPING)) { for (final Property mapping : containerConfig.get(Constants.MIME_MAPPING).asPropertyList()) { mimeMappings.add(createMimeMapping(mapping.getName(), mapping.getValue().asString())); } } if (containerConfig.hasDefined(Constants.WELCOME_FILE)) { for (final ModelNode file : containerConfig.get(Constants.WELCOME_FILE).asList()) { welcomeFiles.add(file.asString()); } } } WebMetaData create() { final WebMetaData metadata = new WebMetaData(); metadata.setServlets(new ServletsMetaData()); // Add DefaultServlet enableStaticResouces(metadata); // Add JSPServlet enableJsp(metadata); // Session config final SessionConfigMetaData sessionConfig = new SessionConfigMetaData(); sessionConfig.setSessionTimeout(30); metadata.setSessionConfig(sessionConfig); // Mime mappings metadata.setMimeMappings(Collections.unmodifiableList(mimeMappings)); // Welcome files metadata.setWelcomeFileList(new WelcomeFileListMetaData()); metadata.getWelcomeFileList().setWelcomeFiles(Collections.unmodifiableList(welcomeFiles)); return metadata; } /** * Enable resource serving by adding the {@code DefaultServlet}, using the * domain resource serving configuration. * * @param metadata the shared jboss web metadata */ void enableStaticResouces(final WebMetaData metadata) { final ModelNode resourcesConfig = config.get(STATIC_RESOURCES); // Check disabled if (true || resourcesConfig.require(DISABLED).asBoolean()) { return; } final ServletMetaData servlet = new ServletMetaData(); servlet.setName("default"); servlet.setLoadOnStartup("" + 1); if (resourcesConfig.require(WEBDAV).asBoolean()) { servlet.setServletClass("org.apache.catalina.servlets.WebdavServlet"); } else { servlet.setServletClass("org.apache.catalina.servlets.DefaultServlet"); } final List<ParamValueMetaData> initParams = new ArrayList<ParamValueMetaData>(); initParams.add(createParameter("listings", resourcesConfig.require(LISTINGS).asString())); initParams.add(createParameter("readonly", resourcesConfig.require(READ_ONLY).asString())); initParams.add(createParameter("sendfile", resourcesConfig.require(SENDFILE).asString())); if (resourcesConfig.hasDefined(FILE_ENCODING)) { initParams.add(createParameter("file-encoding", resourcesConfig.get(FILE_ENCODING).asString())); } if (resourcesConfig.hasDefined(SECRET)) { initParams.add(createParameter("secret", resourcesConfig.get(SECRET).asString())); } initParams.add(createParameter("max-depth", resourcesConfig.require(MAX_DEPTH).asString())); servlet.setInitParam(initParams); metadata.getServlets().add(servlet); addServletMapping("default", metadata, "/"); } /** * Add the jsp servlet * * @param metadata the shared jboss.web metadata */ void enableJsp(final WebMetaData metadata) { final ModelNode config = this.config.get(JSP_CONFIGURATION); if (true || config.get(DISABLED).asBoolean(false)) { return; } final ServletMetaData servlet = new ServletMetaData(); servlet.setName("jsp"); servlet.setLoadOnStartup("" + 3); servlet.setServletClass("org.apache.jasper.servlet.JspServlet"); final List<ParamValueMetaData> initParams = new ArrayList<ParamValueMetaData>(); initParams.add(createParameter("development", config.require(DEVELOPMENT).asString())); initParams.add(createParameter("keepgenerated", config.require(KEEP_GENERATED).asString())); initParams.add(createParameter("trimSpaces", config.require(TRIM_SPACES).asString())); initParams.add(createParameter("enablePooling", config.require(TAG_POOLING).asString())); initParams.add(createParameter("mappedfile", config.require(MAPPED_FILE).asString())); initParams.add(createParameter("checkInterval", config.require(CHECK_INTERVAL).asString())); initParams.add(createParameter("modificationTestInterval", config.require(MODIFICATION_TEST_INTERVAL).asString())); initParams.add(createParameter("recompileOnFail", config.require(RECOMPILE_ON_FAIL).asString())); initParams.add(createParameter("suppressSmap", Boolean.toString(!config.require(SMAP).asBoolean()))); initParams.add(createParameter("dumpSmap", config.require(DUMP_SMAP).asString())); initParams.add(createParameter("genStringAsCharArray", config.require(GENERATE_STRINGS_AS_CHAR_ARRAYS).asString())); initParams.add(createParameter("errorOnUseBeanInvalidClassAttribute", config.require(ERROR_ON_USE_BEAN_INVALID_CLASS_ATTRIBUTE).asString())); if (config.hasDefined(SCRATCH_DIR)) { initParams.add(createParameter("scratchdir", config.require(SCRATCH_DIR).asString())); } // jasper will find the right defaults. initParams.add(createParameter("compilerSourceVM", config.require(SOURCE_VM).asString())); initParams.add(createParameter("compilerTargetVM", config.require(TARGET_VM).asString())); initParams.add(createParameter("javaEncoding", config.require(JAVA_ENCODING).asString())); initParams.add(createParameter("xpoweredBy", config.require(X_POWERED_BY).asString())); initParams.add(createParameter("displaySourceFragment", config.require(DISPLAY_SOURCE_FRAGMENT).asString())); servlet.setInitParam(initParams); metadata.getServlets().add(servlet); addServletMapping("jsp", metadata, "*.jsp", "*.jspx"); } static ParamValueMetaData createParameter(String name, String value) { ParamValueMetaData param = new ParamValueMetaData(); param.setParamName(name); param.setParamValue(value); return param; } static void addServletMapping(final String servlet, final WebMetaData metadata, String... names) { List<ServletMappingMetaData> mappings = metadata.getServletMappings(); if (mappings == null) { mappings = new ArrayList<ServletMappingMetaData>(); metadata.setServletMappings(mappings); } ServletMappingMetaData mapping = new ServletMappingMetaData(); mapping.setUrlPatterns(Arrays.asList(names)); mapping.setServletName(servlet); mappings.add(mapping); } static MimeMappingMetaData createMimeMapping(String extension, String mimeType) { MimeMappingMetaData mapping = new MimeMappingMetaData(); mapping.setExtension(extension); mapping.setMimeType(mimeType); return mapping; } static void createMappings(final List<MimeMappingMetaData> mappings) { mappings.add(createMimeMapping("abs", "audio/x-mpeg")); mappings.add(createMimeMapping("ai", "application/postscript")); mappings.add(createMimeMapping("aif", "audio/x-aiff")); mappings.add(createMimeMapping("aifc", "audio/x-aiff")); mappings.add(createMimeMapping("aiff", "audio/x-aiff")); mappings.add(createMimeMapping("aim", "application/x-aim")); mappings.add(createMimeMapping("art", "image/x-jg")); mappings.add(createMimeMapping("asf", "video/x-ms-asf")); mappings.add(createMimeMapping("asx", "video/x-ms-asf")); mappings.add(createMimeMapping("au", "audio/basic")); mappings.add(createMimeMapping("avi", "video/x-msvideo")); mappings.add(createMimeMapping("avx", "video/x-rad-screenplay")); mappings.add(createMimeMapping("bcpio", "application/x-bcpio")); mappings.add(createMimeMapping("bin", "application/octet-stream")); mappings.add(createMimeMapping("bmp", "image/bmp")); mappings.add(createMimeMapping("body", "text/html")); mappings.add(createMimeMapping("cdf", "application/x-cdf")); mappings.add(createMimeMapping("cer", "application/x-x509-ca-cert")); mappings.add(createMimeMapping("class", "application/java")); mappings.add(createMimeMapping("cpio", "application/x-cpio")); mappings.add(createMimeMapping("csh", "application/x-csh")); mappings.add(createMimeMapping("css", "text/css")); mappings.add(createMimeMapping("dib", "image/bmp")); mappings.add(createMimeMapping("doc", "application/msword")); mappings.add(createMimeMapping("dtd", "application/xml-dtd")); mappings.add(createMimeMapping("dv", "video/x-dv")); mappings.add(createMimeMapping("dvi", "application/x-dvi")); mappings.add(createMimeMapping("eps", "application/postscript")); mappings.add(createMimeMapping("etx", "text/x-setext")); mappings.add(createMimeMapping("exe", "application/octet-stream")); mappings.add(createMimeMapping("gif", "image/gif")); mappings.add(createMimeMapping("gtar", "application/x-gtar")); mappings.add(createMimeMapping("gz", "application/x-gzip")); mappings.add(createMimeMapping("hdf", "application/x-hdf")); mappings.add(createMimeMapping("hqx", "application/mac-binhex40")); mappings.add(createMimeMapping("htc", "text/x-component")); mappings.add(createMimeMapping("htm", "text/html")); mappings.add(createMimeMapping("html", "text/html")); mappings.add(createMimeMapping("hqx", "application/mac-binhex40")); mappings.add(createMimeMapping("ief", "image/ief")); mappings.add(createMimeMapping("jad", "text/vnd.sun.j2me.app-descriptor")); mappings.add(createMimeMapping("jar", "application/java-archive")); mappings.add(createMimeMapping("java", "text/plain")); mappings.add(createMimeMapping("jnlp", "application/x-java-jnlp-file")); mappings.add(createMimeMapping("jpe", "image/jpeg")); mappings.add(createMimeMapping("jpeg", "image/jpeg")); mappings.add(createMimeMapping("jpg", "image/jpeg")); mappings.add(createMimeMapping("js", "text/javascript")); mappings.add(createMimeMapping("jsf", "text/plain")); mappings.add(createMimeMapping("jspf", "text/plain")); mappings.add(createMimeMapping("kar", "audio/x-midi")); mappings.add(createMimeMapping("latex", "application/x-latex")); mappings.add(createMimeMapping("m3u", "audio/x-mpegurl")); mappings.add(createMimeMapping("mac", "image/x-macpaint")); mappings.add(createMimeMapping("man", "application/x-troff-man")); mappings.add(createMimeMapping("mathml", "application/mathml+xml")); mappings.add(createMimeMapping("me", "application/x-troff-me")); mappings.add(createMimeMapping("mid", "audio/x-midi")); mappings.add(createMimeMapping("midi", "audio/x-midi")); mappings.add(createMimeMapping("mif", "application/x-mif")); mappings.add(createMimeMapping("mov", "video/quicktime")); mappings.add(createMimeMapping("movie", "video/x-sgi-movie")); mappings.add(createMimeMapping("mp1", "audio/x-mpeg")); mappings.add(createMimeMapping("mp2", "audio/x-mpeg")); mappings.add(createMimeMapping("mp3", "audio/x-mpeg")); mappings.add(createMimeMapping("mp4", "video/mp4")); mappings.add(createMimeMapping("mpa", "audio/x-mpeg")); mappings.add(createMimeMapping("mpe", "video/mpeg")); mappings.add(createMimeMapping("mpeg", "video/mpeg")); mappings.add(createMimeMapping("mpega", "audio/x-mpeg")); mappings.add(createMimeMapping("mpg", "video/mpeg")); mappings.add(createMimeMapping("mpv2", "video/mpeg2")); mappings.add(createMimeMapping("ms", "application/x-wais-source")); mappings.add(createMimeMapping("nc", "application/x-netcdf")); mappings.add(createMimeMapping("oda", "application/oda")); mappings.add(createMimeMapping("odb", "application/vnd.oasis.opendocument.database")); mappings.add(createMimeMapping("odc", "application/vnd.oasis.opendocument.chart")); mappings.add(createMimeMapping("odf", "application/vnd.oasis.opendocument.formula")); mappings.add(createMimeMapping("odg", "application/vnd.oasis.opendocument.graphics")); mappings.add(createMimeMapping("odi", "application/vnd.oasis.opendocument.image")); mappings.add(createMimeMapping("odm", "application/vnd.oasis.opendocument.text-master")); mappings.add(createMimeMapping("odp", "application/vnd.oasis.opendocument.presentation")); mappings.add(createMimeMapping("ods", "application/vnd.oasis.opendocument.spreadsheet")); mappings.add(createMimeMapping("odt", "application/vnd.oasis.opendocument.text")); mappings.add(createMimeMapping("otg ", "application/vnd.oasis.opendocument.graphics-template")); mappings.add(createMimeMapping("oth", "application/vnd.oasis.opendocument.text-web")); mappings.add(createMimeMapping("otp", "application/vnd.oasis.opendocument.presentation-template")); mappings.add(createMimeMapping("ots", "application/vnd.oasis.opendocument.spreadsheet-template ")); mappings.add(createMimeMapping("ott", "application/vnd.oasis.opendocument.text-template")); mappings.add(createMimeMapping("ogx", "application/ogg")); mappings.add(createMimeMapping("ogv", "video/ogg")); mappings.add(createMimeMapping("oga", "audio/ogg")); mappings.add(createMimeMapping("ogg", "audio/ogg")); mappings.add(createMimeMapping("spx", "audio/ogg")); mappings.add(createMimeMapping("flac", "audio/flac")); mappings.add(createMimeMapping("anx", "application/annodex")); mappings.add(createMimeMapping("axa", "audio/annodex")); mappings.add(createMimeMapping("axv", "video/annodex")); mappings.add(createMimeMapping("xspf", "application/xspf+xml")); mappings.add(createMimeMapping("pbm", "image/x-portable-bitmap")); mappings.add(createMimeMapping("pct", "image/pict")); mappings.add(createMimeMapping("pdf", "application/pdf")); mappings.add(createMimeMapping("pgm", "image/x-portable-graymap")); mappings.add(createMimeMapping("pic", "image/pict")); mappings.add(createMimeMapping("pict", "image/pict")); mappings.add(createMimeMapping("pls", "audio/x-scpls")); mappings.add(createMimeMapping("png", "image/png")); mappings.add(createMimeMapping("pnm", "image/x-portable-anymap")); mappings.add(createMimeMapping("pnt", "image/x-macpaint")); mappings.add(createMimeMapping("ppm", "image/x-portable-pixmap")); mappings.add(createMimeMapping("ppt", "application/powerpoint")); mappings.add(createMimeMapping("ps", "application/postscript")); mappings.add(createMimeMapping("psd", "image/x-photoshop")); mappings.add(createMimeMapping("qt", "video/quicktime")); mappings.add(createMimeMapping("qti", "image/x-quicktime")); mappings.add(createMimeMapping("qtif", "image/x-quicktime")); mappings.add(createMimeMapping("ras", "image/x-cmu-raster")); mappings.add(createMimeMapping("rdf", "application/rdf+xml")); mappings.add(createMimeMapping("rgb", "image/x-rgb")); mappings.add(createMimeMapping("rm", "application/vnd.rn-realmedia")); mappings.add(createMimeMapping("roff", "application/x-troff")); mappings.add(createMimeMapping("rtf", "application/rtf")); mappings.add(createMimeMapping("rtx", "text/richtext")); mappings.add(createMimeMapping("sh", "application/x-sh")); mappings.add(createMimeMapping("shar", "application/x-shar")); mappings.add(createMimeMapping("smf", "audio/x-midi")); mappings.add(createMimeMapping("sit", "application/x-stuffit")); mappings.add(createMimeMapping("snd", "audio/basic")); mappings.add(createMimeMapping("src", "application/x-wais-source")); mappings.add(createMimeMapping("sv4cpio", "application/x-sv4cpio")); mappings.add(createMimeMapping("sv4crc", "application/x-sv4crc")); mappings.add(createMimeMapping("swf", "application/x-shockwave-flash")); mappings.add(createMimeMapping("t", "application/x-troff")); mappings.add(createMimeMapping("tar", "application/x-tar")); mappings.add(createMimeMapping("tcl", "application/x-tcl")); mappings.add(createMimeMapping("tex", "application/x-tex")); mappings.add(createMimeMapping("texi", "application/x-texinfo")); mappings.add(createMimeMapping("texinfo", "application/x-texinfo")); mappings.add(createMimeMapping("tif", "image/tiff")); mappings.add(createMimeMapping("tiff", "image/tiff")); mappings.add(createMimeMapping("tr", "application/x-troff")); mappings.add(createMimeMapping("tsv", "text/tab-separated-values")); mappings.add(createMimeMapping("txt", "text/plain")); mappings.add(createMimeMapping("ulw", "audio/basic")); mappings.add(createMimeMapping("ustar", "application/x-ustar")); mappings.add(createMimeMapping("vxml", "application/voicexml+xml")); mappings.add(createMimeMapping("xbm", "image/x-xbitmap")); mappings.add(createMimeMapping("xht", "application/xhtml+xml")); mappings.add(createMimeMapping("xhtml", "application/xhtml+xml")); mappings.add(createMimeMapping("xml", "application/xml")); mappings.add(createMimeMapping("xpm", "image/x-xpixmap")); mappings.add(createMimeMapping("xsl", "application/xml")); mappings.add(createMimeMapping("xslt", "application/xslt+xml")); mappings.add(createMimeMapping("xul", "application/vnd.mozilla.xul+xml")); mappings.add(createMimeMapping("xwd", "image/x-xwindowdump")); mappings.add(createMimeMapping("wav", "audio/x-wav")); mappings.add(createMimeMapping("svg", "image/svg+xml")); mappings.add(createMimeMapping("svgz", "image/svg+xml")); mappings.add(createMimeMapping("vsd", "application/x-visio")); mappings.add(createMimeMapping("wbmp", "image/vnd.wap.wbmp")); mappings.add(createMimeMapping("wml", "text/vnd.wap.wml")); mappings.add(createMimeMapping("wmlc", "application/vnd.wap.wmlc")); mappings.add(createMimeMapping("wmls", "text/vnd.wap.wmlscript")); mappings.add(createMimeMapping("wmlscriptc", "application/vnd.wap.wmlscriptc")); mappings.add(createMimeMapping("wmv", "video/x-ms-wmv")); mappings.add(createMimeMapping("wrl", "x-world/x-vrml")); mappings.add(createMimeMapping("wsdl", "text/xml")); mappings.add(createMimeMapping("xsd", "text/xml")); mappings.add(createMimeMapping("Z", "application/x-compress")); mappings.add(createMimeMapping("z", "application/x-compress")); mappings.add(createMimeMapping("zip", "application/zip")); mappings.add(createMimeMapping("xls", "application/vnd.ms-excel")); mappings.add(createMimeMapping("doc", "application/vnd.ms-word")); mappings.add(createMimeMapping("ppt", "application/vnd.ms-powerpoint")); } }