/** * 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.descriptors; import java.io.IOException; import io.undertow.servlet.ServletExtension; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.Node; import org.jboss.shrinkwrap.api.asset.Asset; import org.jboss.shrinkwrap.api.asset.ByteArrayAsset; import org.jboss.shrinkwrap.api.asset.NamedAsset; import org.jboss.shrinkwrap.api.container.ServiceProviderContainer; import org.wildfly.swarm.spi.api.JBossDeploymentStructureContainer; import org.wildfly.swarm.undertow.internal.FaviconServletExtension; /** * Archive mix-in supporting manipulation of {@code web.xml}. * * @author Ken Finnigan */ public interface WebXmlContainer<T extends Archive<T>> extends Archive<T>, ServiceProviderContainer<T>, JBossDeploymentStructureContainer<T> { /** * Add a context parameter. * * @param name The name of the context parameter. * @param values The values for the context parameter. * @return This archive. */ @SuppressWarnings("unchecked") default T addContextParam(String name, String... values) { findWebXmlAsset().setContextParam(name, values); return (T) this; } /** * Retrieve the context parameter value. * * @param name The name of the context parameter. * @return Thie value of the context parameter. */ default String getContextParamValue(String name) { return findWebXmlAsset().getContextParam(name); } /** * Add the default WildFly Swarm {@code favicon.ico} handler. * * @return This archive. */ @SuppressWarnings("unchecked") default T addFaviconExceptionHandler() throws IOException { // Add FaviconServletExtension String path = "WEB-INF/classes/" + FaviconServletExtension.EXTENSION_NAME.replace('.', '/') + ".class"; byte[] generatedExtension; generatedExtension = FaviconFactory.createFaviconServletExtension(FaviconServletExtension.EXTENSION_NAME); add(new ByteArrayAsset(generatedExtension), path); // Add FaviconErrorHandler path = "WEB-INF/classes/" + FaviconServletExtension.HANDLER_NAME.replace('.', '/') + ".class"; byte[] generatedHandler; generatedHandler = FaviconFactory.createFaviconErrorHandler(FaviconServletExtension.HANDLER_NAME); add(new ByteArrayAsset(generatedHandler), path); // Add services entry for FaviconServletExtension this.addAsServiceProvider(ServletExtension.class.getName(), FaviconServletExtension.EXTENSION_NAME); return (T) this; } /** * Add a servlet. * * @param servletName The name of the servlet. * @param servletClass The class of the servlet. * @return This archive. */ default Servlet addServlet(String servletName, String servletClass) { return findWebXmlAsset().addServlet(servletName, servletClass); } /** * Retrieve a servlet by class. * * @param servletClass The servlet class. * @return The servlet descriptor. */ default Servlet servlet(String servletClass) { return findWebXmlAsset().getServlet(servletClass); } /** * Locate or create a {@code web.xml} asset. * * @return The existing or new {@code web.xml}. */ default WebXmlAsset findWebXmlAsset() { final Node webXml = this.get(WebXmlAsset.NAME); NamedAsset asset; if (webXml == null) { asset = new WebXmlAsset(); this.add(asset); } else { Asset tempAsset = webXml.getAsset(); if (!(tempAsset instanceof WebXmlAsset)) { asset = new WebXmlAsset(tempAsset.openStream()); this.add(asset); } else { asset = (NamedAsset) tempAsset; } } return (WebXmlAsset) asset; } }