View Javadoc
1   /*
2    * junixsocket
3    *
4    * Copyright 2009-2024 Christian Kohlschütter
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  package org.newsclub.net.unix;
19  
20  import java.io.Closeable;
21  import java.io.IOException;
22  import java.net.SocketException;
23  import java.nio.channels.ClosedByInterruptException;
24  
25  import org.eclipse.jdt.annotation.NonNull;
26  
27  /**
28   * A {@link SocketException} indicating that a socket was closed by interrupt.
29   *
30   * @author Christian Kohlschütter
31   */
32  final class SocketClosedByInterruptException extends SocketClosedException {
33    private static final long serialVersionUID = 1L;
34  
35    /**
36     * Constructs a new {@link SocketClosedByInterruptException}.
37     */
38    private SocketClosedByInterruptException() {
39      super("Closed by interrupt");
40    }
41  
42    static SocketClosedByInterruptException newInstanceAndClose(Closeable closeable) {
43      Throwable suppressed = null;
44      try {
45        if (closeable != null) {
46          closeable.close();
47        }
48      } catch (RuntimeException | IOException e) {
49        suppressed = e;
50      }
51      SocketClosedByInterruptException exc = new SocketClosedByInterruptException();
52      if (suppressed != null) {
53        exc.addSuppressed(suppressed);
54      }
55      return exc;
56    }
57  
58    public @NonNull ClosedByInterruptException asClosedByInterruptException() {
59      ClosedByInterruptException exc = new ClosedByInterruptException();
60      exc.initCause(this);
61      return exc;
62    }
63  }