/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of 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.jboss.arquillian.portal.warp.portlet.client.deployment;
import org.jboss.arquillian.container.test.spi.RemoteLoadableExtension;
import org.jboss.arquillian.container.test.spi.TestDeployment;
import org.jboss.arquillian.container.test.spi.client.deployment.ProtocolArchiveProcessor;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.portal.warp.AfterPortletPhase;
import org.jboss.arquillian.portal.warp.BeforePortletPhase;
import org.jboss.arquillian.portal.warp.Phase;
import org.jboss.arquillian.portal.warp.portlet.PortalWarpRemoteExtension;
import org.jboss.arquillian.portal.warp.portlet.PortalWarpCommons;
import org.jboss.arquillian.portal.warp.portlet.server.execution.PortalWarpFilter;
import org.jboss.arquillian.test.spi.TestClass;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.descriptor.api.Descriptors;
import org.jboss.shrinkwrap.descriptor.api.portletapp20.PortletDescriptor;
/**
* @author <a href="http://community.jboss.org/people/kenfinni">Ken Finnigan</a>
*/
public class PortletDeploymentEnricher implements ProtocolArchiveProcessor {
static String[] REQUIRED_PORTAL_WARP_PACKAGES = new String[] {
// Implementation
"org.jboss.arquillian.portal.warp.portlet.server.event",
"org.jboss.arquillian.portal.warp.portlet.server.execution",
"org.jboss.arquillian.portal.warp.portlet.provider"
};
@Inject
private Instance<TestClass> testClass;
@Override
public void process(TestDeployment testDeployment, Archive<?> protocolArchive) {
final TestClass testClass = this.testClass.get();
final Archive<?> applicationArchive = testDeployment.getApplicationArchive();
if (PortalWarpCommons.isPortalTest(testClass.getJavaClass())) {
addPortalWarpPackageToProtocol(protocolArchive.as(WebArchive.class));
addPortalWarpFilterToDeployment(applicationArchive);
}
}
private void addPortalWarpFilterToDeployment(Archive<?> applicationArchive) {
if (applicationArchive instanceof WebArchive) {
WebArchive webArchive = (WebArchive) applicationArchive;
PortletDescriptor portletXml;
try {
portletXml = Descriptors.importAs(PortletDescriptor.class).fromStream(
applicationArchive.get("WEB-INF/portlet.xml").getAsset().openStream());
if (null != portletXml) {
webArchive.addClass(PortalWarpFilter.class);
portletXml.createFilter()
.filterName("PortalWarpFilter")
.filterClass(PortalWarpFilter.class.getName())
.lifecycle("ACTION_PHASE", "EVENT_PHASE", "RENDER_PHASE", "RESOURCE_PHASE")
.up()
.createFilterMapping()
.filterName("PortalWarpFilter")
.portletName("*")
.up();
webArchive.addAsWebInfResource(new StringAsset(portletXml.exportAsString()), "portlet.xml");
}
} catch (Exception e) {
throw new IllegalArgumentException("Unable to retrieve portlet.xml from Deployment", e);
}
}
}
private void addPortalWarpPackageToProtocol(WebArchive archive) {
archive.addAsLibrary(createPortalWarpArchive());
}
private JavaArchive createPortalWarpArchive() {
JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "arquillian-portal-warp.jar");
// API
archive.addClass(Phase.class);
archive.addClasses(BeforePortletPhase.class, AfterPortletPhase.class);
for (String packageName : REQUIRED_PORTAL_WARP_PACKAGES) {
archive.addPackage(packageName);
}
// register remote extension
archive.addClass(PortalWarpRemoteExtension.class);
archive.addAsServiceProvider(RemoteLoadableExtension.class.getName(), PortalWarpRemoteExtension.class.getName(),"!org.jboss.arquillian.protocol.servlet.runner.ServletRemoteExtension");
return archive;
}
}