test_class.file: server/src/test/java/io/spine/server/bus/FilterChainTest.java
test_class.identifier: FilterChainTest
test_case.body: @Test
      @DisplayName("not allow closing twice")
      void notAllowClosingTwice() throws Exception {
          FilterChain<EventEnvelope> chain = new FilterChain<>(ImmutableList.of());
  
          chain.close();
          assertThrows(IllegalStateException.class, chain::close);
      }
test_case.class_method_signature: FilterChainTest.notAllowClosingTwice()
test_case.full_signature: @Test @DisplayName("not allow closing twice") void notAllowClosingTwice()
test_case.identifier: notAllowClosingTwice
test_case.invocations: of close assertThrows
test_case.modifiers: @Test @DisplayName("not allow closing twice")
test_case.parameters: ()
test_case.return: void
test_case.signature: void notAllowClosingTwice()
focal_class.declarator: chain
focal_class.modifier: private final
focal_class.original_string: private final ImmutableList<BusFilter<E>> chain;
focal_class.type: ImmutableList<BusFilter<E>>
focal_class.var_name: chain
focal_class.declarator: closed
focal_class.modifier: private volatile
focal_class.original_string: private volatile boolean closed;
focal_class.type: boolean
focal_class.var_name: closed
focal_class.file: server/src/main/java/io/spine/server/bus/FilterChain.java
focal_class.identifier: FilterChain
focal_class.interfaces: implements BusFilter<E>, Closeable
focal_class.class_method_signature: FilterChain.FilterChain(Iterable<BusFilter<E>> filters)
focal_class.full_signature:   FilterChain(Iterable<BusFilter<E>> filters)
focal_class.identifier: FilterChain
focal_class.parameters: (Iterable<BusFilter<E>> filters)
focal_class.signature:  FilterChain(Iterable<BusFilter<E>> filters)
focal_class.class_method_signature: FilterChain.filter(E envelope)
focal_class.full_signature: @Override public Optional<Ack> filter(E envelope)
focal_class.identifier: filter
focal_class.modifiers: @Override public
focal_class.parameters: (E envelope)
focal_class.return: Optional<Ack>
focal_class.signature: Optional<Ack> filter(E envelope)
focal_class.class_method_signature: FilterChain.contains(BusFilter<E> filter)
focal_class.full_signature:  boolean contains(BusFilter<E> filter)
focal_class.identifier: contains
focal_class.parameters: (BusFilter<E> filter)
focal_class.return: boolean
focal_class.signature: boolean contains(BusFilter<E> filter)
focal_class.class_method_signature: FilterChain.close()
focal_class.full_signature: @Override public void close()
focal_class.identifier: close
focal_class.modifiers: @Override public
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void close()
focal_class.class_method_signature: FilterChain.isOpen()
focal_class.full_signature: @Override public boolean isOpen()
focal_class.identifier: isOpen
focal_class.modifiers: @Override public
focal_class.parameters: ()
focal_class.return: boolean
focal_class.signature: boolean isOpen()
focal_class.class_method_signature: FilterChain.toString()
focal_class.full_signature: @Override public String toString()
focal_class.identifier: toString
focal_class.modifiers: @Override public
focal_class.parameters: ()
focal_class.return: String
focal_class.signature: String toString()
focal_method.body: @Override
      public void close() throws Exception {
          checkOpen();
          closed = true;
          for (BusFilter<?> filter : chain.reverse()) {
              filter.close();
          }
      }
focal_method.class_method_signature: FilterChain.close()
focal_method.full_signature: @Override public void close()
focal_method.identifier: close
focal_method.invocations: checkOpen reverse close
focal_method.modifiers: @Override public
focal_method.parameters: ()
focal_method.return: void
focal_method.signature: void close()