package er.woadaptor.websockets;
import java.io.IOException;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.handler.codec.http.HttpRequest;
import com.webobjects.appserver.WOApplication;
import com.webobjects.appserver.WORequest;
import com.webobjects.appserver.WOSession;
import com.webobjects.foundation.NSForwardException;
import er.extensions.appserver.ERXApplication;
import er.woadaptor.ERWOAdaptorUtilities;
public abstract class AbstractWOWebSocketFactory implements WebSocketFactory {
/**
* Adds WO specific extensions to WebSocket creation. Do not override this
* create method. Instead, override the {@link #create(Channel)} method
* instead.
*/
public WebSocket create(Channel channel, HttpRequest req) {
ERXApplication._startRequest();
try {
WORequest request = null;
try {
request = ERWOAdaptorUtilities.asWORequest(req);
} catch (IOException e) {
throw NSForwardException._runtimeExceptionForThrowable(e);
}
WOSession session = ERWOAdaptorUtilities.existingSession(request);
DefaultWOWebSocket socket = create(channel);
socket.init(session);
if (session != null) {
WOApplication.application().saveSessionForContext(session.context());
}
return socket;
} finally {
ERXApplication._endRequest();
}
}
/**
* Override this abstract method to return an instance of your own
* WOWebSocket subclass.
*
* @param channel
* the channel for the WebSocket
* @return a new websocket
*/
public abstract DefaultWOWebSocket create(Channel channel);
}