package org.arquillian.cube.impl.client.container; import org.arquillian.cube.impl.util.ContainerUtil; import org.arquillian.cube.spi.Cube; import org.arquillian.cube.spi.CubeRegistry; import org.arquillian.cube.spi.metadata.HasPortBindings; import org.arquillian.cube.spi.metadata.HasPortBindings.PortAddress; import org.jboss.arquillian.container.spi.Container; import org.jboss.arquillian.container.spi.client.protocol.metadata.HTTPContext; import org.jboss.arquillian.container.spi.client.protocol.metadata.ProtocolMetaData; import org.jboss.arquillian.container.spi.client.protocol.metadata.Servlet; import org.jboss.arquillian.container.spi.context.annotation.DeploymentScoped; import org.jboss.arquillian.core.api.InstanceProducer; import org.jboss.arquillian.core.api.annotation.Inject; import org.jboss.arquillian.core.api.annotation.Observes; import org.jboss.arquillian.core.spi.EventContext; public class ProtocolMetadataUpdater { @Inject @DeploymentScoped private InstanceProducer<ProtocolMetaData> protocolMetaDataProducer; public void update(@Observes EventContext<ProtocolMetaData> eventContext, Container container, CubeRegistry registry) { ProtocolMetaData originalMetaData = eventContext.getEvent(); ProtocolMetaData updatedMetaData = new ProtocolMetaData(); boolean updated = false; try { Cube<?> cube = registry.getCube(ContainerUtil.getCubeIDForContainer(container)); if (cube == null) { return; } HasPortBindings portBindings = cube.getMetadata(HasPortBindings.class); if (portBindings == null) { return; } for (Object contextObj : originalMetaData.getContexts()) { if (contextObj instanceof HTTPContext) { HTTPContext context = (HTTPContext) contextObj; String ip = context.getHost(); int port = context.getPort(); final PortAddress mappedPort = portBindings.getMappedAddress(port); final String bindingIp; final Integer bindingPort; if (mappedPort != null) { bindingIp = mappedPort.getIP(); bindingPort = mappedPort.getPort(); } else { continue; } if (bindingPort != null && port != bindingPort) { updated = true; port = bindingPort; } if (bindingIp != null && !bindingIp.equals(ip)) { updated = true; ip = bindingIp; } if (updated) { HTTPContext newContext = new HTTPContext(ip, port); for (Servlet servlet : context.getServlets()) { newContext.add(servlet); } updatedMetaData.addContext(newContext); } } else { updatedMetaData.addContext(contextObj); } } } finally { if (updated) { protocolMetaDataProducer.set(updatedMetaData); } else { eventContext.proceed(); } } } }