/*
* JBoss, Home of Professional Open Source.
* Copyright 2017, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file 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.wildfly.extension.undertow;
import static org.jboss.as.controller.PersistentResourceXMLDescription.builder;
import org.jboss.as.controller.PersistentResourceXMLDescription;
import org.jboss.as.controller.PersistentResourceXMLParser;
import org.jboss.as.controller.operations.common.Util;
import org.wildfly.extension.undertow.filters.BasicAuthHandler;
import org.wildfly.extension.undertow.filters.CustomFilterDefinition;
import org.wildfly.extension.undertow.filters.ErrorPageDefinition;
import org.wildfly.extension.undertow.filters.FilterDefinitions;
import org.wildfly.extension.undertow.filters.FilterRefDefinition;
import org.wildfly.extension.undertow.filters.GzipFilter;
import org.wildfly.extension.undertow.filters.RequestLimitHandler;
import org.wildfly.extension.undertow.filters.ResponseHeaderFilter;
import org.wildfly.extension.undertow.handlers.FileHandler;
import org.wildfly.extension.undertow.handlers.HandlerDefinitions;
import org.wildfly.extension.undertow.handlers.ReverseProxyHandler;
import org.wildfly.extension.undertow.handlers.ReverseProxyHandlerHost;
/**
* @author <a href="mailto:tomaz.cerar@redhat.com">Tomaz Cerar</a> (c) 2012 Red Hat Inc.
*/
public class UndertowSubsystemParser_1_2 extends PersistentResourceXMLParser {
private final PersistentResourceXMLDescription xmlDescription;
UndertowSubsystemParser_1_2(){
xmlDescription = builder(UndertowRootDefinition.INSTANCE.getPathElement(), Namespace.UNDERTOW_1_2.getUriString())
.addAttributes(UndertowRootDefinition.DEFAULT_VIRTUAL_HOST, UndertowRootDefinition.DEFAULT_SERVLET_CONTAINER, UndertowRootDefinition.DEFAULT_SERVER, UndertowRootDefinition.INSTANCE_ID)
.addAttribute(UndertowRootDefinition.STATISTICS_ENABLED)
.addChild(
builder(BufferCacheDefinition.INSTANCE.getPathElement())
.addAttributes(BufferCacheDefinition.BUFFER_SIZE, BufferCacheDefinition.BUFFERS_PER_REGION, BufferCacheDefinition.MAX_REGIONS)
)
.addChild(builder(ServerDefinition.INSTANCE.getPathElement())
.addAttributes(ServerDefinition.DEFAULT_HOST, ServerDefinition.SERVLET_CONTAINER)
.addChild(
builder(AjpListenerResourceDefinition.INSTANCE.getPathElement())
.addAttributes(AjpListenerResourceDefinition.SCHEME, AjpListenerResourceDefinition.BUFFER_POOL, AjpListenerResourceDefinition.ENABLED, AjpListenerResourceDefinition.SOCKET_BINDING, AjpListenerResourceDefinition.WORKER, ListenerResourceDefinition.REDIRECT_SOCKET)
.addAttribute(ListenerResourceDefinition.RESOLVE_PEER_ADDRESS)
.addAttributes(ListenerResourceDefinition.MAX_HEADER_SIZE, ListenerResourceDefinition.MAX_ENTITY_SIZE,
ListenerResourceDefinition.BUFFER_PIPELINED_DATA, ListenerResourceDefinition.MAX_PARAMETERS, ListenerResourceDefinition.MAX_HEADERS, ListenerResourceDefinition.MAX_COOKIES,ListenerResourceDefinition.ALLOW_ENCODED_SLASH, ListenerResourceDefinition.DECODE_URL,
ListenerResourceDefinition.URL_CHARSET, ListenerResourceDefinition.ALWAYS_SET_KEEP_ALIVE, ListenerResourceDefinition.MAX_BUFFERED_REQUEST_SIZE, ListenerResourceDefinition.RECORD_REQUEST_START_TIME,
ListenerResourceDefinition.ALLOW_EQUALS_IN_COOKIE_VALUE,ListenerResourceDefinition.NO_REQUEST_TIMEOUT, ListenerResourceDefinition.REQUEST_PARSE_TIMEOUT)
.addAttributes(ListenerResourceDefinition.BACKLOG, ListenerResourceDefinition.RECEIVE_BUFFER, ListenerResourceDefinition.SEND_BUFFER, ListenerResourceDefinition.KEEP_ALIVE, ListenerResourceDefinition.READ_TIMEOUT, ListenerResourceDefinition.WRITE_TIMEOUT)
)
.addChild(
builder(HttpListenerResourceDefinition.INSTANCE.getPathElement())
.addAttributes(HttpListenerResourceDefinition.BUFFER_POOL, HttpListenerResourceDefinition.CERTIFICATE_FORWARDING, HttpListenerResourceDefinition.ENABLED, HttpListenerResourceDefinition.SOCKET_BINDING, HttpListenerResourceDefinition.WORKER, ListenerResourceDefinition.REDIRECT_SOCKET, HttpListenerResourceDefinition.PROXY_ADDRESS_FORWARDING)
.addAttribute(ListenerResourceDefinition.RESOLVE_PEER_ADDRESS)
.addAttributes(ListenerResourceDefinition.MAX_HEADER_SIZE, ListenerResourceDefinition.MAX_ENTITY_SIZE,
ListenerResourceDefinition.BUFFER_PIPELINED_DATA, ListenerResourceDefinition.MAX_PARAMETERS, ListenerResourceDefinition.MAX_HEADERS, ListenerResourceDefinition.MAX_COOKIES,ListenerResourceDefinition.ALLOW_ENCODED_SLASH, ListenerResourceDefinition.DECODE_URL,
ListenerResourceDefinition.URL_CHARSET, ListenerResourceDefinition.ALWAYS_SET_KEEP_ALIVE, ListenerResourceDefinition.MAX_BUFFERED_REQUEST_SIZE, ListenerResourceDefinition.RECORD_REQUEST_START_TIME,
ListenerResourceDefinition.ALLOW_EQUALS_IN_COOKIE_VALUE, ListenerResourceDefinition.NO_REQUEST_TIMEOUT, ListenerResourceDefinition.REQUEST_PARSE_TIMEOUT)
.addAttributes(ListenerResourceDefinition.BACKLOG, ListenerResourceDefinition.RECEIVE_BUFFER, ListenerResourceDefinition.SEND_BUFFER, ListenerResourceDefinition.KEEP_ALIVE, ListenerResourceDefinition.READ_TIMEOUT, ListenerResourceDefinition.WRITE_TIMEOUT)
).addChild(
builder(HttpsListenerResourceDefinition.INSTANCE.getPathElement())
.addAttributes(AjpListenerResourceDefinition.SOCKET_BINDING, AjpListenerResourceDefinition.WORKER, AjpListenerResourceDefinition.BUFFER_POOL, AjpListenerResourceDefinition.ENABLED)
.addAttribute(ListenerResourceDefinition.RESOLVE_PEER_ADDRESS)
.addAttributes(HttpsListenerResourceDefinition.SECURITY_REALM, HttpsListenerResourceDefinition.VERIFY_CLIENT, HttpsListenerResourceDefinition.ENABLED_CIPHER_SUITES, HttpsListenerResourceDefinition.ENABLED_PROTOCOLS)
.addAttributes(ListenerResourceDefinition.MAX_HEADER_SIZE, ListenerResourceDefinition.MAX_ENTITY_SIZE,
ListenerResourceDefinition.BUFFER_PIPELINED_DATA, ListenerResourceDefinition.MAX_PARAMETERS, ListenerResourceDefinition.MAX_HEADERS, ListenerResourceDefinition.MAX_COOKIES, ListenerResourceDefinition.ALLOW_ENCODED_SLASH, ListenerResourceDefinition.DECODE_URL,
ListenerResourceDefinition.URL_CHARSET, ListenerResourceDefinition.ALWAYS_SET_KEEP_ALIVE, ListenerResourceDefinition.MAX_BUFFERED_REQUEST_SIZE, ListenerResourceDefinition.RECORD_REQUEST_START_TIME,
ListenerResourceDefinition.ALLOW_EQUALS_IN_COOKIE_VALUE, ListenerResourceDefinition.NO_REQUEST_TIMEOUT, ListenerResourceDefinition.REQUEST_PARSE_TIMEOUT)
.addAttributes(ListenerResourceDefinition.BACKLOG, ListenerResourceDefinition.RECEIVE_BUFFER, ListenerResourceDefinition.SEND_BUFFER, ListenerResourceDefinition.KEEP_ALIVE, ListenerResourceDefinition.READ_TIMEOUT, ListenerResourceDefinition.WRITE_TIMEOUT)
).addChild(
builder(HostDefinition.INSTANCE.getPathElement())
.addAttributes(HostDefinition.ALIAS, HostDefinition.DEFAULT_WEB_MODULE)
.addChild(
builder(LocationDefinition.INSTANCE.getPathElement())
.addAttributes(LocationDefinition.HANDLER)
.addChild(
builder(FilterRefDefinition.INSTANCE.getPathElement())
.addAttributes(FilterRefDefinition.PREDICATE, FilterRefDefinition.PRIORITY)
)
).addChild(
builder(AccessLogDefinition.INSTANCE.getPathElement())
.addAttributes(AccessLogDefinition.PATTERN, AccessLogDefinition.DIRECTORY, AccessLogDefinition.PREFIX, AccessLogDefinition.SUFFIX, AccessLogDefinition.WORKER, AccessLogDefinition.ROTATE)
).addChild(
builder(FilterRefDefinition.INSTANCE.getPathElement())
.addAttributes(FilterRefDefinition.PREDICATE, FilterRefDefinition.PRIORITY)
).addChild(
builder(UndertowExtension.PATH_SSO)
.addAttribute(SingleSignOnDefinition.Attribute.DOMAIN.getDefinition())
.addAttribute(SingleSignOnDefinition.Attribute.PATH.getDefinition())
.addAttribute(SingleSignOnDefinition.Attribute.HTTP_ONLY.getDefinition())
.addAttribute(SingleSignOnDefinition.Attribute.SECURE.getDefinition())
.addAttribute(SingleSignOnDefinition.Attribute.COOKIE_NAME.getDefinition())
)
)
)
.addChild(
builder(ServletContainerDefinition.INSTANCE.getPathElement())
.addAttribute(ServletContainerDefinition.ALLOW_NON_STANDARD_WRAPPERS)
.addAttribute(ServletContainerDefinition.DEFAULT_BUFFER_CACHE)
.addAttribute(ServletContainerDefinition.STACK_TRACE_ON_ERROR)
.addAttribute(ServletContainerDefinition.USE_LISTENER_ENCODING)
.addAttribute(ServletContainerDefinition.DEFAULT_ENCODING)
.addAttribute(ServletContainerDefinition.IGNORE_FLUSH)
.addAttribute(ServletContainerDefinition.EAGER_FILTER_INIT)
.addAttribute(ServletContainerDefinition.DEFAULT_SESSION_TIMEOUT)
.addAttribute(ServletContainerDefinition.DISABLE_CACHING_FOR_SECURED_PAGES)
.addChild(
builder(JspDefinition.INSTANCE.getPathElement())
.setXmlElementName(Constants.JSP_CONFIG)
.addAttributes(
JspDefinition.DISABLED,
JspDefinition.DEVELOPMENT,
JspDefinition.KEEP_GENERATED,
JspDefinition.TRIM_SPACES,
JspDefinition.TAG_POOLING,
JspDefinition.MAPPED_FILE,
JspDefinition.CHECK_INTERVAL,
JspDefinition.MODIFICATION_TEST_INTERVAL,
JspDefinition.RECOMPILE_ON_FAIL,
JspDefinition.SMAP,
JspDefinition.DUMP_SMAP,
JspDefinition.GENERATE_STRINGS_AS_CHAR_ARRAYS,
JspDefinition.ERROR_ON_USE_BEAN_INVALID_CLASS_ATTRIBUTE,
JspDefinition.SCRATCH_DIR,
JspDefinition.SOURCE_VM,
JspDefinition.TARGET_VM,
JspDefinition.JAVA_ENCODING,
JspDefinition.X_POWERED_BY,
JspDefinition.DISPLAY_SOURCE_FRAGMENT)
)
.addChild(
builder(SessionCookieDefinition.INSTANCE.getPathElement())
.addAttributes(
SessionCookieDefinition.NAME,
SessionCookieDefinition.DOMAIN,
SessionCookieDefinition.COMMENT,
SessionCookieDefinition.HTTP_ONLY,
SessionCookieDefinition.SECURE,
SessionCookieDefinition.MAX_AGE
)
)
.addChild(
builder(PersistentSessionsDefinition.INSTANCE.getPathElement())
.addAttributes(
PersistentSessionsDefinition.PATH,
PersistentSessionsDefinition.RELATIVE_TO
)
)
.addChild(
builder(WebsocketsDefinition.INSTANCE.getPathElement())
.addAttributes(
WebsocketsDefinition.WORKER,
WebsocketsDefinition.BUFFER_POOL,
WebsocketsDefinition.DISPATCH_TO_WORKER
)
)
)
.addChild(
builder(HandlerDefinitions.INSTANCE.getPathElement())
.setXmlElementName(Constants.HANDLERS)
.setNoAddOperation(true)
.addChild(
builder(FileHandler.INSTANCE.getPathElement())
.addAttributes(
FileHandler.PATH,
FileHandler.CACHE_BUFFER_SIZE,
FileHandler.CACHE_BUFFERS,
FileHandler.DIRECTORY_LISTING)
)
.addChild(
builder(ReverseProxyHandler.INSTANCE.getPathElement())
.addAttributes(
ReverseProxyHandler.CONNECTIONS_PER_THREAD,
ReverseProxyHandler.SESSION_COOKIE_NAMES,
ReverseProxyHandler.PROBLEM_SERVER_RETRY,
ReverseProxyHandler.MAX_REQUEST_TIME)
.addChild(builder(ReverseProxyHandlerHost.INSTANCE.getPathElement())
.setXmlElementName(Constants.HOST)
.addAttributes(ReverseProxyHandlerHost.INSTANCE_ID, ReverseProxyHandlerHost.PATH, ReverseProxyHandlerHost.SCHEME, ReverseProxyHandlerHost.OUTBOUND_SOCKET_BINDING))
)
)
.addChild(
builder(FilterDefinitions.INSTANCE.getPathElement())
.setXmlElementName(Constants.FILTERS)
.setNoAddOperation(true)
.addChild(
builder(BasicAuthHandler.INSTANCE.getPathElement())
.addAttributes(BasicAuthHandler.SECURITY_DOMAIN)
)
.addChild(
builder(RequestLimitHandler.INSTANCE.getPathElement())
.setXmlElementName("connection-limit")
.addAttributes(RequestLimitHandler.MAX_CONCURRENT_REQUESTS, RequestLimitHandler.QUEUE_SIZE)
).addChild(
builder(ResponseHeaderFilter.INSTANCE.getPathElement())
.addAttributes(ResponseHeaderFilter.NAME, ResponseHeaderFilter.VALUE)
).addChild(
builder(GzipFilter.INSTANCE.getPathElement())
).addChild(
builder(ErrorPageDefinition.INSTANCE.getPathElement())
.addAttributes(ErrorPageDefinition.CODE, ErrorPageDefinition.PATH)
).addChild(
builder(CustomFilterDefinition.INSTANCE.getPathElement())
.addAttributes(CustomFilterDefinition.CLASS_NAME, CustomFilterDefinition.MODULE, CustomFilterDefinition.PARAMETERS)
.setXmlElementName("filter")
)
)
//here to make sure we always add filters & handlers path to mgmt model
.setAdditionalOperationsGenerator((address, addOperation, operations) -> {
operations.add(Util.createAddOperation(address.append(UndertowExtension.PATH_FILTERS)));
operations.add(Util.createAddOperation(address.append(UndertowExtension.PATH_HANDLERS)));
})
.build();
}
@Override
public PersistentResourceXMLDescription getParserDescription() {
return xmlDescription;
}
}