import com.google.common.reflect.AbstractInvocationHandler;
import com.google.common.reflect.Reflection;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import io.netty.util.concurrent.EventExecutor;
import io.netty.util.concurrent.GlobalEventExecutor;
import io.netty.util.concurrent.ImmediateEventExecutor;
public interface AutoCloseableEventExecutor extends EventExecutor, AutoCloseable {
+ static AutoCloseableEventExecutor globalEventExecutor() {
+ return CloseableEventExecutorMixin.createCloseableProxy(GlobalEventExecutor.INSTANCE);
+ }
+
+ static AutoCloseableEventExecutor immediateEventExecutor() {
+ return CloseableEventExecutorMixin.createCloseableProxy(ImmediateEventExecutor.INSTANCE);
+ }
- public static class CloseableEventExecutorMixin implements AutoCloseable {
+ class CloseableEventExecutorMixin implements AutoCloseable {
public static final int DEFAULT_SHUTDOWN_SECONDS = 1;
private final EventExecutor eventExecutor;
- public CloseableEventExecutorMixin(EventExecutor eventExecutor) {
+ public CloseableEventExecutorMixin(final EventExecutor eventExecutor) {
this.eventExecutor = eventExecutor;
}
@Override
- public void close() throws Exception {
+ @SuppressFBWarnings(value = "UC_USELESS_VOID_METHOD", justification = "False positive")
+ public void close() {
eventExecutor.shutdownGracefully(0, DEFAULT_SHUTDOWN_SECONDS, TimeUnit.SECONDS);
}
-
- private static AutoCloseableEventExecutor createCloseableProxy(
- final CloseableEventExecutorMixin closeableEventExecutorMixin) {
+ static AutoCloseableEventExecutor createCloseableProxy(final EventExecutor eventExecutor) {
+ final CloseableEventExecutorMixin closeableEventExecutor = new CloseableEventExecutorMixin(eventExecutor);
return Reflection.newProxy(AutoCloseableEventExecutor.class, new AbstractInvocationHandler() {
@Override
- protected Object handleInvocation(Object proxy, Method method, Object[] args) throws Throwable {
+ protected Object handleInvocation(final Object proxy, final Method method, final Object[] args)
+ throws Throwable {
if (method.getName().equals("close")) {
- closeableEventExecutorMixin.close();
+ closeableEventExecutor.close();
return null;
} else {
- return method.invoke(closeableEventExecutorMixin.eventExecutor, args);
+ return method.invoke(closeableEventExecutor.eventExecutor, args);
}
}
});
}
-
- public static AutoCloseableEventExecutor globalEventExecutor() {
- return createCloseableProxy(new CloseableEventExecutorMixin(GlobalEventExecutor.INSTANCE));
- }
-
- public static AutoCloseableEventExecutor immediateEventExecutor() {
- return createCloseableProxy(new CloseableEventExecutorMixin(ImmediateEventExecutor.INSTANCE));
- }
-
- public static AutoCloseableEventExecutor forwardingEventExecutor(final EventExecutor eventExecutor,
- final AutoCloseable closeable) {
- return createCloseableProxy(new CloseableEventExecutorMixin(eventExecutor) {
- @Override
- public void close() throws Exception {
- // Intentional no-op.
- closeable.close();
- }
- });
- }
}
-}
\ No newline at end of file
+}