/* * JBoss, Home of Professional Open Source * Copyright 2013 Red Hat Inc. and/or its affiliates and other * contributors as indicated by the @author tags. All rights reserved. * 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.arquillian.protocol.modules; import java.util.Collection; import java.util.Map; import org.jboss.arquillian.container.test.spi.TestDeployment; import org.jboss.arquillian.container.test.spi.client.deployment.DeploymentPackager; import org.jboss.arquillian.container.test.spi.client.deployment.ProtocolArchiveProcessor; import org.jboss.arquillian.protocol.servlet.Processor; import org.jboss.arquillian.protocol.servlet.ServletMethodExecutor; import org.jboss.arquillian.protocol.servlet.arq514hack.descriptors.api.web.WebAppDescriptor; import org.jboss.arquillian.protocol.servlet.v_2_5.ProtocolDeploymentAppender; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.Filters; import org.jboss.shrinkwrap.api.Node; import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.jboss.shrinkwrap.descriptor.api.Descriptors; import static org.jboss.arquillian.protocol.servlet.ServletUtil.WEB_XML_PATH; /** * Adjust ServletProtocolDeploymentPackager to fit Modular. * * @author <a href="mailto:ales.justin@jboss.org">Ales Justin</a> * @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a> */ public abstract class AbstractModulesProtocolDeploymentPackager implements DeploymentPackager { public Archive<?> generateDeployment(TestDeployment testDeployment, Collection<ProtocolArchiveProcessor> processors) { Archive<?> archive = testDeployment.getApplicationArchive(); WebArchive protocol = new ProtocolDeploymentAppender().createAuxiliaryArchive(); Collection<Archive<?>> auxiliaryArchives = testDeployment.getAuxiliaryArchives(); Processor processor = new Processor(testDeployment, processors); if (archive instanceof EnterpriseArchive) { final EnterpriseArchive ear = (EnterpriseArchive) archive; Map<ArchivePath, Node> wars = ear.getContent(Filters.include(".*\\.war")); for (Map.Entry<ArchivePath, Node> warEntry : wars.entrySet()) { WebArchive war = ear.getAsType(WebArchive.class, warEntry.getKey()); handleWar(war, protocol, processor); addLibrariesToWar(war, auxiliaryArchives); } addLibrariesToEar(ear, auxiliaryArchives); } else if (archive instanceof WebArchive) { final WebArchive war = (WebArchive) archive; handleWar(war, protocol, processor); war.addAsLibraries(auxiliaryArchives); } else { throw new IllegalArgumentException("Can only handle .war or .ear: " + archive); } return archive; } protected abstract void addLibrariesToWar(WebArchive war, Collection<Archive<?>> libs); protected abstract void addLibrariesToEar(EnterpriseArchive ear, Collection<Archive<?>> libs); private Archive<?> handleWar(WebArchive war, WebArchive protocol, Processor processor) { if (war.contains(WEB_XML_PATH)) { WebAppDescriptor applicationWebXml = Descriptors.importAs(WebAppDescriptor.class).fromStream(war.get(WEB_XML_PATH).getAsset().openStream()); // SHRINKWRAP-187, to eager on not allowing overrides, delete it first war.delete(WEB_XML_PATH); war.setWebXML(new StringAsset(mergeWithDescriptor(applicationWebXml).exportAsString())); war.merge(protocol, Filters.exclude(".*web\\.xml.*")); } else { war.merge(protocol); } processor.process(war); return war; } static WebAppDescriptor mergeWithDescriptor(WebAppDescriptor descriptor) { // use String v. of desc.servlet(..) so we don't force Servlet API on classpath descriptor.servlet( ServletMethodExecutor.ARQUILLIAN_SERVLET_NAME, "org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner", new String[]{ServletMethodExecutor.ARQUILLIAN_SERVLET_MAPPING}); return descriptor; } }