You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2006/08/27 12:29:10 UTC

svn commit: r437358 - in /jakarta/httpcomponents/httpcore/trunk/module-nio/src: examples/ examples/org/ examples/org/apache/ examples/org/apache/http/ examples/org/apache/http/nio/ examples/org/apache/http/nio/examples/ main/java/org/apache/http/nio/ m...

Author: olegk
Date: Sun Aug 27 03:29:08 2006
New Revision: 437358

URL: http://svn.apache.org/viewvc?rev=437358&view=rev
Log:
HttpCore NIO: First take at the I/O multiplexing mechanism based on the I/O Reactor pattern

Added:
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/nio/
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/nio/examples/
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/nio/examples/ElementalEchoServer.java   (with props)
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/EventMask.java   (with props)
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOEventDispatch.java   (with props)
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOReactor.java   (with props)
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java   (with props)
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOReactor.java   (with props)
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java   (with props)
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/SessionHandle.java   (with props)
Removed:
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/NIOSocketHttpDataReceiver.java
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/NIOSocketHttpDataTransmitter.java

Added: jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/nio/examples/ElementalEchoServer.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/nio/examples/ElementalEchoServer.java?rev=437358&view=auto
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/nio/examples/ElementalEchoServer.java (added)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/nio/examples/ElementalEchoServer.java Sun Aug 27 03:29:08 2006
@@ -0,0 +1,97 @@
+package org.apache.http.nio.examples;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+
+import org.apache.http.nio.EventMask;
+import org.apache.http.nio.IOEventDispatch;
+import org.apache.http.nio.IOSession;
+import org.apache.http.nio.IOReactor;
+import org.apache.http.nio.impl.DefaultIOReactor;
+
+public class ElementalEchoServer {
+
+    public static void main(String[] args) throws Exception {
+        if (args.length < 1) {
+            System.err.println("Please specify document root directory");
+            System.exit(1);
+        }
+        Thread t = new IOReactorThread(8080, new DefaultIoEventDispatch());
+        t.setDaemon(false);
+        t.start();
+    }
+    
+    static class IOReactorThread extends Thread {
+
+        private final IOReactor ioReactor;
+        private final IOEventDispatch ioEventDispatch;
+        
+        public IOReactorThread(int port, final IOEventDispatch ioEventDispatch) 
+                throws IOException {
+            this.ioReactor = new DefaultIOReactor(new InetSocketAddress(port));
+            this.ioEventDispatch = ioEventDispatch;
+        }
+        
+        public void run() {
+            try {
+                this.ioReactor.execute(this.ioEventDispatch);
+            } catch (InterruptedIOException ex) {
+            } catch (IOException e) {
+                System.err.println("I/O error: " + e.getMessage());
+            }
+        }
+        
+    }
+    
+    static class DefaultIoEventDispatch implements IOEventDispatch {
+
+        private final ByteBuffer buffer = ByteBuffer.allocate(1024);
+        
+        public void connected(IOSession session) {
+            System.out.println("connected");
+            session.setEventMask(EventMask.READ);
+            session.setSocketTimeout(20000);
+        }
+
+        public void inputReady(final IOSession session) {
+            System.out.println("readable");
+            try {
+                this.buffer.compact();
+                int bytesRead = session.channel().read(this.buffer);
+                if (this.buffer.position() > 0) {
+                    session.setEventMask(EventMask.READ_WRITE);
+                }
+                System.out.println("Bytes read: " + bytesRead);
+            } catch (IOException ex) {
+                System.out.println("I/O error: " + ex.getMessage());
+            }
+        }
+
+        public void outputReady(final IOSession session) {
+            System.out.println("writeable");
+            try {
+                this.buffer.flip();
+                int bytesWritten = session.channel().write(this.buffer);
+                if (!this.buffer.hasRemaining()) {
+                    session.setEventMask(EventMask.READ);
+                }
+                System.out.println("Bytes written: " + bytesWritten);
+            } catch (IOException ex) {
+                System.out.println("I/O error: " + ex.getMessage());
+            }
+        }
+
+        public void timeout(final IOSession session) {
+            System.out.println("timeout");
+            session.close();
+        }
+        
+        public void disconnected(final IOSession session) {
+            System.out.println("disconnected");
+            session.close();
+        }
+    }
+    
+}

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/nio/examples/ElementalEchoServer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/nio/examples/ElementalEchoServer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/EventMask.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/EventMask.java?rev=437358&view=auto
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/EventMask.java (added)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/EventMask.java Sun Aug 27 03:29:08 2006
@@ -0,0 +1,40 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ *  Copyright 1999-2006 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.nio;
+
+import java.nio.channels.SelectionKey;
+
+public class EventMask {
+
+    public static final int READ = SelectionKey.OP_READ;
+    public static final int WRITE = SelectionKey.OP_WRITE;
+    public static final int READ_WRITE = READ | WRITE;
+    
+}

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/EventMask.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/EventMask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOEventDispatch.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOEventDispatch.java?rev=437358&view=auto
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOEventDispatch.java (added)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOEventDispatch.java Sun Aug 27 03:29:08 2006
@@ -0,0 +1,44 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ *  Copyright 1999-2006 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.nio;
+
+public interface IOEventDispatch {
+    
+    void connected(IOSession session);
+    
+    void inputReady(IOSession session);
+    
+    void outputReady(IOSession session);
+    
+    void timeout(IOSession session);
+    
+    void disconnected(IOSession session);
+    
+}

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOEventDispatch.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOEventDispatch.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOReactor.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOReactor.java?rev=437358&view=auto
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOReactor.java (added)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOReactor.java Sun Aug 27 03:29:08 2006
@@ -0,0 +1,42 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ *  Copyright 1999-2006 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.nio;
+
+import java.io.IOException;
+
+public interface IOReactor {
+
+    void execute(IOEventDispatch eventDispatch) 
+        throws IOException;
+
+    void shutdown() 
+        throws IOException;
+    
+}

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOReactor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOReactor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java?rev=437358&view=auto
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java (added)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java Sun Aug 27 03:29:08 2006
@@ -0,0 +1,56 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ *  Copyright 1999-2006 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.nio;
+
+import java.nio.channels.ByteChannel;
+
+public interface IOSession {
+
+    ByteChannel channel();
+    
+    int getEventMask();
+    
+    void setEventMask(int ops);
+
+    void close();
+    
+    boolean isClosed();
+
+    int getSocketTimeout();
+    
+    void setSocketTimeout(int timeout);
+    
+    void setAttribute(String name, Object obj);
+    
+    Object getAttribute(String name);
+    
+    Object removeAttribute(String name);
+
+}

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOReactor.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOReactor.java?rev=437358&view=auto
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOReactor.java (added)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOReactor.java Sun Aug 27 03:29:08 2006
@@ -0,0 +1,190 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ *  Copyright 1999-2006 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.nio.impl;
+
+import java.io.IOException;
+import java.net.SocketAddress;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.http.nio.IOSession;
+import org.apache.http.nio.IOEventDispatch;
+import org.apache.http.nio.IOReactor;
+
+public class DefaultIOReactor implements IOReactor {
+
+    public static int TIMEOUT_CHECK_INTERVAL = 1000;
+    
+    private volatile boolean closed = false;
+    private final ServerSocketChannel serverChannel;
+    private final Selector selector;
+    private final Set sessions;
+    private long lastTimeoutCheck;
+    
+    public DefaultIOReactor(final SocketAddress address) throws IOException {
+        super();
+        this.serverChannel = ServerSocketChannel.open();
+        this.serverChannel.configureBlocking(false);
+        this.serverChannel.socket().bind(address);
+        this.selector = Selector.open();
+        this.sessions = new HashSet();
+        this.lastTimeoutCheck = System.currentTimeMillis();
+    }
+    
+    public synchronized void execute(final IOEventDispatch eventDispatch) throws IOException {
+        this.serverChannel.register(this.selector, SelectionKey.OP_ACCEPT);
+        try {
+            for (;;) {
+                int readyCount = this.selector.select(TIMEOUT_CHECK_INTERVAL);
+                if (this.closed) {
+                    break;
+                }
+                if (readyCount > 0) {
+                    processEvents(this.selector.selectedKeys(), eventDispatch);
+                }
+                
+                long currentTime = System.currentTimeMillis();
+                if( (currentTime - this.lastTimeoutCheck) >= TIMEOUT_CHECK_INTERVAL) {
+                    this.lastTimeoutCheck = currentTime;
+                    Set keys = this.selector.keys();
+                    if (keys != null) {
+                        processSessionTimeouts(keys, eventDispatch);
+                    }
+                    processClosedSessions(eventDispatch);
+                }
+            }
+        } finally {
+            closeSessions(eventDispatch);
+        }
+    }
+    
+    private void processEvents(final Set selectedKeys, final IOEventDispatch eventDispatch)
+            throws IOException {
+        for (Iterator it = selectedKeys.iterator(); it.hasNext(); ) {
+            SelectionKey key = (SelectionKey) it.next();
+            it.remove();
+            if (key.isAcceptable()) {
+                
+                SocketChannel socketChannel = this.serverChannel.accept();
+                if (socketChannel != null) {
+                    
+                    // Register new channel with the selector
+                    socketChannel.configureBlocking(false);
+                    SelectionKey newkey = socketChannel.register(this.selector, 0);
+                    
+                    // Set up new session
+                    IOSession session = new DefaultIOSession(newkey);
+                    this.sessions.add(session);
+                    
+                    // Attach session handle to the selection key
+                    SessionHandle handle = new SessionHandle(session); 
+                    newkey.attach(handle);
+                    
+                    // Dispatch the event
+                    eventDispatch.connected(session);
+                }
+            }
+            if (key.isReadable()) {
+                SessionHandle handle = (SessionHandle) key.attachment();
+                IOSession session = handle.getSession();
+                handle.resetLastRead();
+
+                // Dispatch the event
+                eventDispatch.inputReady(session);
+            }
+            if (key.isWritable()) {
+                SessionHandle handle = (SessionHandle) key.attachment();
+                IOSession session = handle.getSession();
+                handle.resetLastWrite();
+                
+                // Dispatch the event
+                eventDispatch.outputReady(session);
+            }
+        }
+    }
+
+    private void processSessionTimeouts(final Set keys, final IOEventDispatch eventDispatch) {
+        long now = System.currentTimeMillis();
+        for (Iterator it = keys.iterator(); it.hasNext();) {
+            SelectionKey key = (SelectionKey) it.next();
+            SessionHandle handle = (SessionHandle) key.attachment();
+            if (handle != null) {
+                IOSession session = handle.getSession();
+                int timeout = session.getSocketTimeout();
+                if (timeout > 0) {
+                    if (handle.getLastRead() + timeout < now) {
+                        // Dispatch the event
+                        eventDispatch.timeout(session);
+                    }
+                }
+            }
+        }
+    }
+
+    private void processClosedSessions(final IOEventDispatch eventDispatch) {
+        for (Iterator it = this.sessions.iterator(); it.hasNext(); ) {
+            IOSession session = (IOSession) it.next();
+            if (session.isClosed()) {
+                it.remove();
+                // Dispatch the event
+                eventDispatch.disconnected(session);
+            }
+        }
+    }
+    
+    private void closeSessions(final IOEventDispatch eventDispatch) {
+        for (Iterator it = this.sessions.iterator(); it.hasNext(); ) {
+            IOSession session = (IOSession) it.next();
+            if (!session.isClosed()) {
+                session.close();
+                // Dispatch the event
+                eventDispatch.disconnected(session);
+            }
+        }
+        this.sessions.clear();
+    }
+    
+    public void shutdown() throws IOException {
+        if (this.closed) {
+            return;
+        }
+        this.closed = true;
+        // Do not accept new connections
+        this.serverChannel.close();
+        // Stop dispatching I/O events
+        this.selector.close();
+    }
+    
+}

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOReactor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOReactor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java?rev=437358&view=auto
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java (added)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java Sun Aug 27 03:29:08 2006
@@ -0,0 +1,111 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ *  Copyright 1999-2006 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.nio.impl;
+
+import java.io.IOException;
+import java.nio.channels.ByteChannel;
+import java.nio.channels.SelectionKey;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.http.nio.IOSession;
+
+public class DefaultIOSession implements IOSession {
+    
+    private volatile boolean closed = false;
+    
+    private final SelectionKey key;
+    private final Map attributes;
+    
+    private int socketTimeout;
+    
+    public DefaultIOSession(final SelectionKey key) {
+        super();
+        if (key == null) {
+            throw new IllegalArgumentException("Selection key may not be null");
+        }
+        this.key = key;
+        this.attributes = Collections.synchronizedMap(new HashMap());
+        this.socketTimeout = 0;
+    }
+    
+    public ByteChannel channel() {
+        return (ByteChannel) this.key.channel();
+    }
+    
+    public int getEventMask() {
+        return this.key.interestOps();
+    }
+    
+    public void setEventMask(int ops) {
+        this.key.interestOps(ops);
+        this.key.selector().wakeup();
+    }
+    
+    public int getSocketTimeout() {
+        return this.socketTimeout;
+    }
+    
+    public void setSocketTimeout(int timeout) {
+        this.socketTimeout = timeout;
+    }
+    
+    public void close() {
+        if (this.closed) {
+            return;
+        }
+        this.closed = true;
+        this.key.cancel();
+        try {
+            this.key.channel().close();
+        } catch (IOException ex) {
+            // Munching exceptions is not nice
+            // but in this case it is justified
+        }
+    }
+    
+    public boolean isClosed() {
+        return this.closed || !this.key.isValid();
+    }
+    
+    public Object getAttribute(final String name) {
+        return this.attributes.get(name);
+    }
+
+    public Object removeAttribute(final String name) {
+        return this.attributes.remove(name);
+    }
+
+    public void setAttribute(final String name, final Object obj) {
+        this.attributes.put(name, obj);
+    }
+    
+}

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/SessionHandle.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/SessionHandle.java?rev=437358&view=auto
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/SessionHandle.java (added)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/SessionHandle.java Sun Aug 27 03:29:08 2006
@@ -0,0 +1,78 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ *  Copyright 1999-2006 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.nio.impl;
+
+import org.apache.http.nio.IOSession;
+
+public class SessionHandle {
+
+    private final IOSession session;
+    private final long started;
+
+    private long lastRead;
+    private long lastWrite;
+    
+    public SessionHandle(final IOSession session) {
+        super();
+        if (session == null) {
+            throw new IllegalArgumentException("Session may not be null");
+        }
+        this.session = session;
+        long now = System.currentTimeMillis();
+        this.started = now;
+        this.lastRead = now;
+        this.lastWrite = now;
+    }
+
+    public IOSession getSession() {
+        return this.session;
+    }
+
+    public long getStarted() {
+        return this.started;
+    }
+
+    public long getLastRead() {
+        return this.lastRead;
+    }
+
+    public long getLastWrite() {
+        return this.lastWrite;
+    }
+    
+    public void resetLastRead() {
+        this.lastRead = System.currentTimeMillis();
+    }
+    
+    public void resetLastWrite() {
+        this.lastWrite = System.currentTimeMillis();
+    }
+    
+}

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/SessionHandle.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/SessionHandle.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



Re: svn commit: r437358

Posted by Oleg Kalnichevski <ol...@apache.org>.
On Sun, 2006-08-27 at 13:14 +0200, Roland Weber wrote:
> Hi Oleg,
> 
> just a few minor observations:
> 
> EventMask: unless you're going to add more, this should either
> be an interface or have the default constructor disabled.
> 

Good point.

> IOSession: the get/set/removeAttribute methods look exactly
> like those in HttpContext. Derive the session from the context?
> 

Good point.

> No JavaDoc warnings ;-)
> 

No javadocs - no javadocs warnings ;-)

Oleg

> cheers,
>   Roland
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: httpclient-dev-help@jakarta.apache.org
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: httpclient-dev-help@jakarta.apache.org


Re: svn commit: r437358

Posted by Roland Weber <ht...@dubioso.net>.
Hi Oleg,

just a few minor observations:

EventMask: unless you're going to add more, this should either
be an interface or have the default constructor disabled.

IOSession: the get/set/removeAttribute methods look exactly
like those in HttpContext. Derive the session from the context?

No JavaDoc warnings ;-)

cheers,
  Roland

---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: httpclient-dev-help@jakarta.apache.org