package org.glassfish.grizzly.filterchain;
import java.util.EnumSet;
import org.glassfish.grizzly.Closeable;
import org.glassfish.grizzly.Connection;
import org.glassfish.grizzly.Context;
import org.glassfish.grizzly.IOEvent;
public abstract class AbstractFilterChain implements FilterChain {
protected final EnumSet<IOEvent> interestedIoEventsMask = EnumSet.allOf(IOEvent.class);
@Override
public int indexOfType(final Class<? extends Filter> filterType) {
final int size = size();
for (int i = 0; i < size; i++) {
final Filter filter = get(i);
if (filterType.isAssignableFrom(filter.getClass())) {
return i;
}
}
return -1;
}
@Override
public boolean isInterested(final IOEvent ioEvent) {
return interestedIoEventsMask.contains(ioEvent);
}
@Override
public void setInterested(final IOEvent ioEvent, final boolean isInterested) {
if (isInterested) {
interestedIoEventsMask.add(ioEvent);
} else {
interestedIoEventsMask.remove(ioEvent);
}
}
@Override
public final FilterChainContext obtainFilterChainContext(
final Connection connection) {
final FilterChainContext context = FilterChainContext.create(connection);
context.internalContext.setProcessor(this);
return context;
}
@Override
public FilterChainContext obtainFilterChainContext(
final Connection connection,
final Closeable closeable) {
final FilterChainContext context = FilterChainContext.create(
connection, closeable);
context.internalContext.setProcessor(this);
return context;
}
@Override
public FilterChainContext obtainFilterChainContext(
final Connection connection, final int startIdx, final int endIdx,
final int currentIdx) {
final FilterChainContext ctx = obtainFilterChainContext(connection);
ctx.setStartIdx(startIdx);
ctx.setEndIdx(endIdx);
ctx.setFilterIdx(currentIdx);
return ctx;
}
@Override
public FilterChainContext obtainFilterChainContext(
final Connection connection,
final Closeable closeable,
final int startIdx, final int endIdx, final int currentIdx) {
final FilterChainContext ctx =
obtainFilterChainContext(connection, closeable);
ctx.setStartIdx(startIdx);
ctx.setEndIdx(endIdx);
ctx.setFilterIdx(currentIdx);
return ctx;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder(256);
sb.append(getClass().getSimpleName())
.append('@')
.append(Integer.toHexString(hashCode()))
.append(" {");
final int size = size();
if (size > 0) {
sb.append(get(0).toString());
for (int i = 1; i < size; i++) {
sb.append(" <-> ");
sb.append(get(i).toString());
}
}
sb.append('}');
return sb.toString();
}
@Override
public final Context obtainContext(final Connection connection) {
return obtainFilterChainContext(connection).internalContext;
}
@Override
protected void finalize() throws Throwable {
clear();
super.finalize();
}
}