/**
* Copyright 2015-2016 Red Hat, Inc, and individual contributors.
*
* Licensed 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.wildfly.swarm.undertow;
import org.wildfly.swarm.config.Undertow;
import org.wildfly.swarm.config.runtime.AttributeDocumentation;
import org.wildfly.swarm.config.undertow.BufferCache;
import org.wildfly.swarm.config.undertow.HandlerConfiguration;
import org.wildfly.swarm.config.undertow.Server;
import org.wildfly.swarm.config.undertow.ServletContainer;
import org.wildfly.swarm.config.undertow.server.Host;
import org.wildfly.swarm.config.undertow.servlet_container.JSPSetting;
import org.wildfly.swarm.config.undertow.servlet_container.WebsocketsSetting;
import org.wildfly.swarm.spi.api.Defaultable;
import org.wildfly.swarm.spi.api.Fraction;
import org.wildfly.swarm.spi.api.annotations.Configurable;
import org.wildfly.swarm.spi.api.annotations.ConfigurableAlias;
import org.wildfly.swarm.spi.api.annotations.DeploymentModule;
import org.wildfly.swarm.spi.api.annotations.MarshalDMR;
import org.wildfly.swarm.spi.api.annotations.WildFlyExtension;
import static org.wildfly.swarm.spi.api.Defaultable.bool;
import static org.wildfly.swarm.spi.api.Defaultable.ifAnyExplicitlySet;
import static org.wildfly.swarm.spi.api.Defaultable.integer;
import static org.wildfly.swarm.undertow.UndertowProperties.DEFAULT_AJP_PORT;
import static org.wildfly.swarm.undertow.UndertowProperties.DEFAULT_HOST;
import static org.wildfly.swarm.undertow.UndertowProperties.DEFAULT_HTTPS_PORT;
import static org.wildfly.swarm.undertow.UndertowProperties.DEFAULT_HTTP_LISTENER;
import static org.wildfly.swarm.undertow.UndertowProperties.DEFAULT_HTTP_PORT;
import static org.wildfly.swarm.undertow.UndertowProperties.DEFAULT_SERVER;
/**
* @author Bob McWhirter
*/
@MarshalDMR
@WildFlyExtension(module = "org.wildfly.extension.undertow")
@DeploymentModule(name = "org.jboss.modules")
public class UndertowFraction extends Undertow<UndertowFraction> implements Fraction {
/**
* Create the default, HTTP-only fraction.
*
* @return The configured fraction.
*/
public static UndertowFraction createDefaultFraction() {
UndertowFraction fraction = new UndertowFraction();
return fraction.applyDefaults();
}
public UndertowFraction applyDefaults() {
server(new Server(DEFAULT_SERVER)
.httpListener(DEFAULT_HTTP_LISTENER, (listener) -> {
listener.socketBinding("http");
})
.host(new Host(DEFAULT_HOST)))
.bufferCache(new BufferCache("default"))
.servletContainer(new ServletContainer("default")
.websocketsSetting(new WebsocketsSetting())
.jspSetting(new JSPSetting()))
.handlerConfiguration(new HandlerConfiguration());
return this;
}
/**
* Create the default HTTP and HTTPS fraction.
*
* <p>This default requires configuration for accessing a keystore.
* The application also <b>must</b> include the <code>management</code>
* fraction in its dependencies.</p>
*
* @param path The keystore path.
* @param password The keystore password.
* @param alias The server certificate alias.
* @return The configured fraction.
* @see #enableHTTPS(String, String, String)
*/
public static UndertowFraction createDefaultFraction(String path, String password, String alias) {
return createDefaultFraction()
.enableHTTPS(path, password, alias);
}
/**
* Create the default HTTP and AJP fraction.
*
* @return The configured fraction.
* @see #enableAJP()
*/
public static UndertowFraction createDefaultAndEnableAJPFraction() {
return createDefaultFraction()
.enableAJP();
}
/**
* Create the default HTTPS-only fraction.
*
* <p>This default inhibits the non-SSL HTTP endpoint, and only creates
* the default HTTPS endpoint. The application also <b>must</b> include
* the <code>management</code> fraction in its dependencies.</p>
*
* @param path The keystore path.
* @param password The keystore password.
* @param alias The server certificate alias.
* @return The configured fraction;
* @see #enableHTTPS(String, String, String)
*/
public static UndertowFraction createDefaultHTTPSOnlyFraction(String path, String password, String alias) {
UndertowFraction fraction = createDefaultFraction();
fraction.removeHttpListenersFromDefaultServer()
.enableHTTPS(path, password, alias);
return fraction;
}
/**
* Create the default AJP-only fraction.
*
* <p>This default inhibits the HTTP endpoint, and only creates
* the default AJP endpoint.</p>
*
* @return The configured fraction.
* @see #enableAJP()
*/
public static UndertowFraction createDefaultAJPOnlyFraction() {
UndertowFraction fraction = createDefaultFraction();
fraction.removeHttpListenersFromDefaultServer()
.enableAJP();
return fraction;
}
/**
* Enable HTTPS on this fraction.
*
* <p>This will enable HTTPS of the fraction. The application also
* <b>must</b> include the <code>management</code> fraction in its
* dependencies.</p>
*
* @param path The keystore path.
* @param password The keystore password.
* @param alias The server certificate alias.
* @return This fraction.
*/
public UndertowFraction enableHTTPS(String path, String password, String alias) {
return enableHTTPS(path, password, password, alias);
}
/**
* Enable HTTPS on this fraction.
*
* <p>This will enable HTTPS of the fraction. The application also
* <b>must</b> include the <code>management</code> fraction in its
* dependencies.</p>
*
* @param path The keystore path.
* @param keystorePassword The keystore password.
* @param keyPassword The key password inside the keystore.
* @param alias The server certificate alias.
* @return This fraction.
*/
public UndertowFraction enableHTTPS(String path, String keystorePassword, String keyPassword, String alias) {
this.keystorePath = path;
this.keystorePassword = keystorePassword;
this.keyPassword = keyPassword;
this.alias = alias;
return this;
}
/**
* Enable AJP on this fraction.
*
* @return This fraction.
*/
public UndertowFraction enableAJP() {
this.enableAJP.set(true);
return this;
}
public UndertowFraction onlyHTTPS() {
this.onlyHTTPS.set(true);
return this;
}
public String keystorePassword() {
return this.keystorePassword;
}
public String keyPassword() {
return this.keyPassword;
}
public String keystorePath() {
return this.keystorePath;
}
public String alias() {
return this.alias;
}
public boolean isOnlyHTTPS() {
return this.onlyHTTPS.get();
}
public boolean isEnableAJP() {
return this.enableAJP.get();
}
public UndertowFraction removeHttpListenersFromDefaultServer() {
this.subresources().server("default-server")
.subresources().httpListeners().clear();
return this;
}
public UndertowFraction httpPort(int httpPort) {
this.httpPort.set(httpPort);
return this;
}
public int httpPort() {
return this.httpPort.get();
}
public UndertowFraction httpsPort(int httpsPort) {
this.httpsPort.set(httpsPort);
return this;
}
public int httpsPort() {
return this.httpsPort.get();
}
public UndertowFraction ajpPort(int ajpPort) {
this.ajpPort.set(ajpPort);
return this;
}
public int ajpPort() {
return this.ajpPort.get();
}
@Configurable("swarm.http.port")
@AttributeDocumentation("Set the port for the default HTTP listener")
private Defaultable<Integer> httpPort = integer(DEFAULT_HTTP_PORT);
@Configurable("swarm.https.port")
@AttributeDocumentation("Set the port for the default HTTPS listener")
private Defaultable<Integer> httpsPort = integer(DEFAULT_HTTPS_PORT);
@Configurable("swarm.ajp.port")
@AttributeDocumentation("Set the port for the default AJP listener")
private Defaultable<Integer> ajpPort = integer(DEFAULT_AJP_PORT);
/**
* Path to the keystore.
*/
@Configurable("swarm.https.keystore.path")
@ConfigurableAlias("swarm.http.keystore.path")
@AttributeDocumentation("Path to the server keystore")
private String keystorePath;
/**
* Password for the keystore.
*/
@Configurable("swarm.https.keystore.password")
@ConfigurableAlias("swarm.http.keystore.password")
@AttributeDocumentation("Password to the server keystore")
private String keystorePassword;
/**
* Password for the key.
*/
@Configurable("swarm.https.key.password")
@ConfigurableAlias("swarm.http.key.password")
@AttributeDocumentation("Password to the server certificate")
private String keyPassword;
/**
* Alias of Server certificate key entry in the keystore.
*/
@Configurable("swarm.https.key.alias")
@ConfigurableAlias("swarm.http.certificate.alias")
@AttributeDocumentation("Alias to the server certificate key entry in the keystore")
private String alias;
/**
* Whether or not disable HTTP interface
*/
@Configurable("swarm.https.only")
@AttributeDocumentation("Only enable the HTTPS Listener")
private Defaultable<Boolean> onlyHTTPS = bool(false);
/**
* Whether or not enabling AJP
*/
@Configurable("swarm.ajp.enable")
@AttributeDocumentation("Determine if AJP should be enabled")
private Defaultable<Boolean> enableAJP = ifAnyExplicitlySet(this.ajpPort);
}