Source for java.nio.channels.spi.SelectorProvider

   1: /* SelectorProvider.java
   2:    Copyright (C) 2002, 2003, 2004  Free Software Foundation, Inc.
   3: 
   4: This file is part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2, or (at your option)
   9: any later version.
  10: 
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; see the file COPYING.  If not, write to the
  18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19: 02110-1301 USA.
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version. */
  37: 
  38: package java.nio.channels.spi;
  39: 
  40: import gnu.java.nio.SelectorProviderImpl;
  41: 
  42: import java.io.IOException;
  43: import java.nio.channels.Channel;
  44: import java.nio.channels.DatagramChannel;
  45: import java.nio.channels.Pipe;
  46: import java.nio.channels.ServerSocketChannel;
  47: import java.nio.channels.SocketChannel;
  48: 
  49: import java.security.AccessController;
  50: import java.security.PrivilegedAction;
  51: 
  52: /**
  53:  * @author Michael Koch
  54:  * @since 1.4
  55:  */
  56: public abstract class SelectorProvider
  57: {
  58:   private static SelectorProvider systemDefaultProvider;
  59: 
  60:   /**
  61:    * Initializes the selector provider.
  62:    *
  63:    * @exception SecurityException If a security manager has been installed and
  64:    * it denies @see RuntimePermission ("selectorProvider").
  65:    */
  66:   protected SelectorProvider()
  67:   {
  68:     SecurityManager sm = System.getSecurityManager();
  69:     if (sm != null)
  70:       sm.checkPermission(new RuntimePermission("selectorProvider"));
  71:   }
  72: 
  73:   /**
  74:    * Opens a datagram channel.
  75:    *
  76:    * @return a new datagram channel object
  77:    *
  78:    * @exception IOException if an error occurs
  79:    */
  80:   public abstract DatagramChannel openDatagramChannel()
  81:     throws IOException;
  82: 
  83:   /**
  84:    * Opens a pipe.
  85:    *
  86:    * @return a new pipe object
  87:    *
  88:    * @exception IOException if an error occurs
  89:    */
  90:   public abstract Pipe openPipe() throws IOException;
  91: 
  92:   /**
  93:    * Opens a selector.
  94:    *
  95:    * @return a new selector object
  96:    *
  97:    * @exception IOException if an error occurs
  98:    */
  99:   public abstract AbstractSelector openSelector() throws IOException;
 100: 
 101:   /**
 102:    * Opens a server socket channel.
 103:    *
 104:    * @return a new server socket channel object
 105:    *
 106:    * @exception IOException if an error occurs
 107:    */
 108:   public abstract ServerSocketChannel openServerSocketChannel()
 109:     throws IOException;
 110: 
 111:   /**
 112:    * Opens a socket channel.
 113:    *
 114:    * @return a new socket channel object
 115:    *
 116:    * @exception IOException if an error occurs
 117:    */
 118:   public abstract SocketChannel openSocketChannel() throws IOException;
 119: 
 120:   /**
 121:    * Returns the inherited channel of the VM.
 122:    *
 123:    * @return the inherited channel of the VM
 124:    *
 125:    * @throws IOException If an I/O error occurs
 126:    * @throws SecurityException If an installed security manager denies access
 127:    *         to RuntimePermission("inheritedChannel")
 128:    *
 129:    * @since 1.5
 130:    */
 131:   public Channel inheritedChannel()
 132:     throws IOException
 133:   {
 134:     SecurityManager sm = System.getSecurityManager();
 135:     if (sm != null)
 136:       {
 137:         sm.checkPermission(new RuntimePermission("inheritedChannel"));
 138:       }
 139:     // Implementation note: The default implementation can't do much more
 140:     // than return null. If a VM can provide something more useful it should
 141:     // install its own SelectorProvider (maybe a subclass of this one) to
 142:     // return something more useful.
 143:     return null;
 144:   }
 145: 
 146:   /**
 147:    * Returns the system-wide default selector provider for this invocation
 148:    * of the Java virtual machine.
 149:    *
 150:    * @return the default selector provider
 151:    */
 152:   public static synchronized SelectorProvider provider()
 153:   {
 154:     if (systemDefaultProvider == null)
 155:       {
 156:         String propertyValue = AccessController.doPrivileged(new PrivilegedAction<String> () {
 157:             public String run()
 158:             {
 159:               return System.getProperty("java.nio.channels.spi.SelectorProvider");
 160:             }
 161:           });
 162: 
 163:         if (propertyValue == null || propertyValue.equals(""))
 164:           systemDefaultProvider = new SelectorProviderImpl();
 165:         else
 166:           {
 167:             try
 168:               {
 169:                 systemDefaultProvider =
 170:                   (SelectorProvider) Class.forName(propertyValue)
 171:                                           .newInstance();
 172:               }
 173:             catch (Exception e)
 174:               {
 175:                 System.err.println("Could not instantiate class: "
 176:                                    + propertyValue);
 177:                 systemDefaultProvider = new SelectorProviderImpl();
 178:               }
 179:           }
 180:       }
 181: 
 182:     return systemDefaultProvider;
 183:   }
 184: }