package org.jboss.as.undertow.deployment;
import java.util.ArrayList;
import io.undertow.servlet.websockets.WebSocketServlet;
import io.undertow.websockets.api.WebSocketSessionHandler;
import io.undertow.websockets.core.handler.WebSocketConnectionCallback;
import org.jboss.as.server.deployment.Attachments;
import org.jboss.as.server.deployment.DeploymentPhaseContext;
import org.jboss.as.server.deployment.DeploymentUnit;
import org.jboss.as.server.deployment.DeploymentUnitProcessingException;
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
import org.jboss.as.server.deployment.reflect.DeploymentClassIndex;
import org.jboss.as.web.common.WarMetaData;
import org.jboss.metadata.javaee.spec.ParamValueMetaData;
import org.jboss.metadata.web.jboss.JBossServletMetaData;
import org.jboss.metadata.web.jboss.JBossWebMetaData;
/**
* Deployment processor for native (not JSR) web sockets.
* <p/>
* If a {@link WebSocketSessionHandler} or {@link WebSocketSessionHandler}is mapped as a servlet then it is replaced by the
* handshake servlet
*
* @author Stuart Douglas
*/
public class UndertowWebSocketDeploymentProcessor implements DeploymentUnitProcessor {
@Override
public void deploy(final DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
final DeploymentClassIndex classIndex = deploymentUnit.getAttachment(Attachments.CLASS_INDEX);
WarMetaData metaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
if (metaData == null) {
return;
}
JBossWebMetaData mergedMetaData = metaData.getMergedJBossWebMetaData();
if (mergedMetaData.getServlets() != null) {
for (final JBossServletMetaData servlet : mergedMetaData.getServlets()) {
if (servlet.getServletClass() != null) {
try {
Class<?> clazz = classIndex.classIndex(servlet.getServletClass()).getModuleClass();
if (WebSocketSessionHandler.class.isAssignableFrom(clazz) ||
WebSocketConnectionCallback.class.isAssignableFrom(clazz)) {
servlet.setServletClass(WebSocketServlet.class.getName());
if (servlet.getInitParam() == null) {
servlet.setInitParam(new ArrayList<ParamValueMetaData>());
}
final ParamValueMetaData param = new ParamValueMetaData();
param.setParamName(WebSocketServlet.SESSION_HANDLER);
param.setParamValue(clazz.getName());
servlet.getInitParam().add(param);
}
} catch (ClassNotFoundException e) {
throw new DeploymentUnitProcessingException(e);
}
}
}
}
}
@Override
public void undeploy(final DeploymentUnit context) {
}
}