Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   *
   * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
   *
   * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
   * Other names may be trademarks of their respective owners.
   *
   * The contents of this file are subject to the terms of either the GNU
  * General Public License Version 2 only ("GPL") or the Common
  * Development and Distribution License("CDDL") (collectively, the
  * "License"). You may not use this file except in compliance with the
  * License. You can obtain a copy of the License at
  * http://www.netbeans.org/cddl-gplv2.html
  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
  * specific language governing permissions and limitations under the
  * License.  When distributing the software, include this License Header
  * Notice in each file and include the License file at
  * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
  * particular file as subject to the "Classpath" exception as provided
  * by Oracle in the GPL Version 2 section of the License file that
  * accompanied this code. If applicable, add the following below the
  * License Header, with the fields enclosed by brackets [] replaced by
  * your own identifying information:
  * "Portions Copyrighted [year] [name of copyright owner]"
  *
  * Contributor(s):
  * The Original Software is NetBeans. The Initial Developer of the Original
  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
  * Microsystems, Inc. All Rights Reserved.
  *
  * If you wish your version of this file to be governed by only the CDDL
  * or only the GPL Version 2, indicate your decision by adding
  * "[Contributor] elects to include this software in this distribution
  * under the [CDDL or GPL Version 2] license." If you do not indicate a
  * single choice of license, a recipient has the option to distribute
  * your version of this file under either the CDDL, the GPL Version 2 or
  * to extend the choice of license to its licensees as provided above.
  * However, if you add GPL Version 2 code and therefore, elected the GPL
  * Version 2 license, then the option applies only if the new code is
  * made subject to such option by the copyright holder.
  */
 package org.netbeans.modules.netserver;
 

Author(s):
ads
 
 public abstract class SocketFramework implements Runnable {
     
     protected static final Logger LOG = Logger.getLogger
             SocketServer.class.getCanonicalName());
     
     public SocketFramework() throws IOException {
          = new ConcurrentLinkedQueue<SelectionKey>();
          = Selector.open();
     }
 
     /* (non-Javadoc)
      * @see java.lang.Runnable#run()
      */
     @Override
     public void run() {
         try {
             doRun();
         }
         catch (IOException e) {
             .log(.nulle);
         }
     }
     
     public void closeSelectionKey key ) throws IOException {
         chanelClosedkey );
         key.channel().close();
         key.cancel();
     }
     
     public void stop(){
          = true;
         getSelector().wakeup();
     }
     
     public void sendbyte[] data , SelectionKey key ){
         getWriteQueue(key).add(ByteBuffer.wrap(data));
         .add(key);
        getSelector().wakeup();
    }
    
    public boolean isStopped(){
        return ;
    }
    
    protected void doRun() throws IOException {
        while (!) {
            while (true) {
                SelectionKey key = .poll();
                if (key == null) {
                    break;
                }
                else {
                    if (key.isValid()) {
                        int currentOps = key.interestOps();
                        key.interestOps(currentOps|.);
                    }
                }
            }
            getSelector().select();
            if ( isStopped() ){
                return;
            }
            for (Iterator<SelectionKeyiterator = getSelector().selectedKeys()
                    .iterator(); iterator.hasNext();)
            {
                SelectionKey key = iterator.next();
                iterator.remove();
                if (!key.isValid()) {
                    continue;
                }
                
                try {
                    process(key);
                }
                catchClosedChannelException e ){
                    close(key);
                }
                catchIOException e ){
                    .log(.nulle);
                    close(key);
                }
            }
        }
        getSelector().close();
    }
    
    protected void processSelectionKey key ) throws IOException {
        if (key.isReadable()) {
            readData(key);
        }
        if (key.isValid() && key.isWritable()) {
            writeData(key);
        }        
    }
    
    protected abstract void chanelClosedSelectionKey key );
    
    protected abstract SocketAddress getAddress();
    
    protected abstract Queue<ByteBuffergetWriteQueueSelectionKey key );
    
    protected void setReadHandlerReadHandler handler ){
        this. = handler;
    }
    
    protected ReadHandler getReadHandler(){
        return ;
    }
    
    protected Selector getSelector(){
        return ;
    }
    
    protected void readDataSelectionKey key ) throws IOException {
        .read(key);
    }
    
    protected void writeDataSelectionKey key ) throws IOException  {
        Queue<ByteBufferqueue = getWriteQueue(key);
        int ops = .;
        whilequeue!= null ){
            ByteBuffer buffer = queue.peek();
            if ( buffer == null ){
                break;
            }
            else {
                int length = buffer.remaining();
                int written = ((SocketChannel)key.channel()).write(buffer);
                if (written < length) {
                    // Not all bytes written. Socket's output buffer is full probably.
                    // Keep the rest of this buffer in the write queue and wait until
                    // the channel is writable again.
                    ops |= .;
                    break;
                } else {
                    // The whole content of the buffer written => remove it from the queue
                    queue.poll();
                }
            }
        }
        key.interestOps(ops);
    }
    
    private Selector selector;
    private Queue<SelectionKeykeys;
    private ReadHandler handler;
    private volatile boolean stop;
New to GrepCode? Check out our FAQ X