1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.nio.channels.spi;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
21ae704b984c10a63883cc366e823d53902d6ac7a9Elliott Hughesimport java.nio.SelectorProviderImpl;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.Channel;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.DatagramChannel;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.Pipe;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.ServerSocketChannel;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.SocketChannel;
2764e526d079a7218f984eeaba6ff2feeaadeeaffbElliott Hughesimport java.util.ServiceLoader;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code SelectorProvider} is an abstract base class that declares methods for
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * providing instances of {@link DatagramChannel}, {@link Pipe},
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link java.nio.channels.Selector} , {@link ServerSocketChannel}, and
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link SocketChannel}. All the methods of this class are thread-safe.
3464e526d079a7218f984eeaba6ff2feeaadeeaffbElliott Hughes *
3564e526d079a7218f984eeaba6ff2feeaadeeaffbElliott Hughes * <p>A provider instance can be retrieved through a system property or the
3664e526d079a7218f984eeaba6ff2feeaadeeaffbElliott Hughes * configuration file in a jar file; if no provider is available that way then
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the system default provider is returned.
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
3964e526d079a7218f984eeaba6ff2feeaadeeaffbElliott Hughespublic abstract class SelectorProvider {
40ae704b984c10a63883cc366e823d53902d6ac7a9Elliott Hughes
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static SelectorProvider provider = null;
42eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code SelectorProvider}.
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected SelectorProvider() {
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets a provider instance by executing the following steps when called for
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the first time:
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <ul>
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li> if the system property "java.nio.channels.spi.SelectorProvider" is
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * set, the value of this property is the class name of the provider
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returned; </li>
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li>if there is a provider-configuration file named
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * "java.nio.channels.spi.SelectorProvider" in META-INF/services of a jar
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * file valid in the system class loader, the first class name is the
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * provider's class name; </li>
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <li> otherwise, a system default provider will be returned.</li>
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </ul>
62eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the provider.
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    synchronized public static SelectorProvider provider() {
6664e526d079a7218f984eeaba6ff2feeaadeeaffbElliott Hughes        if (provider == null) {
6764e526d079a7218f984eeaba6ff2feeaadeeaffbElliott Hughes            provider = ServiceLoader.loadFromSystemProperty(SelectorProvider.class);
6864e526d079a7218f984eeaba6ff2feeaadeeaffbElliott Hughes            if (provider == null) {
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                provider = loadProviderByJar();
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
7164e526d079a7218f984eeaba6ff2feeaadeeaffbElliott Hughes            if (provider == null) {
72ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes                provider = new SelectorProviderImpl();
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return provider;
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
7864e526d079a7218f984eeaba6ff2feeaadeeaffbElliott Hughes    private static SelectorProvider loadProviderByJar() {
79fa65e4a9364363eff71335dfa3520f0c1d788b0dElliott Hughes        for (SelectorProvider provider : ServiceLoader.load(SelectorProvider.class)) {
8064e526d079a7218f984eeaba6ff2feeaadeeaffbElliott Hughes            return provider;
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new open {@code DatagramChannel}.
87f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the new channel.
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs.
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract DatagramChannel openDatagramChannel() throws IOException;
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code Pipe}.
96f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the new pipe.
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs.
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract Pipe openPipe() throws IOException;
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new selector.
105f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the new selector.
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs.
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract AbstractSelector openSelector() throws IOException;
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new open {@code ServerSocketChannel}.
114f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the new channel.
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs.
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract ServerSocketChannel openServerSocketChannel()
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException;
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Create a new open {@code SocketChannel}.
124f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the new channel.
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs.
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract SocketChannel openSocketChannel() throws IOException;
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
13299e234cc3322b6c88c9d883da45116d9ec8271dbElliott Hughes     * Returns the channel inherited from the process that created this VM.
13399e234cc3322b6c88c9d883da45116d9ec8271dbElliott Hughes     * On Android, this method always returns null because stdin and stdout are
13499e234cc3322b6c88c9d883da45116d9ec8271dbElliott Hughes     * never connected to a socket.
135f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the channel.
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs.
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Channel inheritedChannel() throws IOException {
141753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        // Android never has stdin/stdout connected to a socket.
142753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        return null;
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
145