package org.webpieces.httpcommon.impl; import static org.webpieces.httpcommon.api.Protocol.HTTP11; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import org.webpieces.httpcommon.api.HttpSocket; import org.webpieces.httpcommon.api.Protocol; import org.webpieces.httpcommon.api.ServerListener; import org.webpieces.httpcommon.api.SwitchableDataListener; import org.webpieces.nio.api.channels.Channel; import org.webpieces.nio.api.handlers.DataListener; import org.webpieces.util.logging.Logger; import org.webpieces.util.logging.LoggerFactory; public class SwitchableDataListenerImpl implements SwitchableDataListener { private static final Logger log = LoggerFactory.getLogger(SwitchableDataListenerImpl.class); private Protocol protocol = HTTP11; private Map<Protocol, DataListener> dataListenerMap = new HashMap<>(); private HttpSocket socket; private ServerListener closeListener; public SwitchableDataListenerImpl(HttpSocket socket, ServerListener closeListener) { this.socket = socket; this.closeListener = closeListener; } public SwitchableDataListenerImpl(HttpSocket socket) { this.socket = socket; } @Override public void setProtocol(Protocol protocol) { this.protocol = protocol; } @Override public void put(Protocol protocol, DataListener listener) { dataListenerMap.put(protocol, listener); } @Override public DataListener getDataListener(Protocol protocol) { return dataListenerMap.get(protocol); } @Override public void incomingData(Channel channel, ByteBuffer b) { dataListenerMap.get(protocol).incomingData(channel, b); } @Override public void farEndClosed(Channel channel) { log.info("far end closed"); socket.closeSocket(); if(closeListener != null) closeListener.farEndClosed(socket); // call farEndClosed on every protocol for(Map.Entry<Protocol, DataListener> entry: dataListenerMap.entrySet()) { entry.getValue().farEndClosed(channel); } } @Override public void failure(Channel channel, ByteBuffer data, Exception e) { log.error("Failure on channel="+channel, e); // Call failure on every protocol for(Map.Entry<Protocol, DataListener> entry: dataListenerMap.entrySet()) { entry.getValue().failure(channel, data, e); } } @Override public void applyBackPressure(Channel channel) { dataListenerMap.get(protocol).applyBackPressure(channel); } @Override public void releaseBackPressure(Channel channel) { dataListenerMap.get(protocol).releaseBackPressure(channel); } }