You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by jv...@apache.org on 2007/06/27 14:42:41 UTC

svn commit: r551146 - in /mina/sandbox/jvermillard/apr: ./ lib/ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/mina/ src/main/java/org/apache/mina/transport/ src/main/java/org/apache/mina/transport/apr/

Author: jvermillard
Date: Wed Jun 27 05:42:39 2007
New Revision: 551146

URL: http://svn.apache.org/viewvc?view=rev&rev=551146
Log:
APR (Apache Portable Runtime) based transport (WIP)

Added:
    mina/sandbox/jvermillard/apr/
    mina/sandbox/jvermillard/apr/lib/
    mina/sandbox/jvermillard/apr/lib/libapr-1.so   (with props)
    mina/sandbox/jvermillard/apr/lib/libapr-1.so.0   (with props)
    mina/sandbox/jvermillard/apr/lib/libapr-1.so.0.2.9   (with props)
    mina/sandbox/jvermillard/apr/lib/libtcnative-1.a   (with props)
    mina/sandbox/jvermillard/apr/lib/libtcnative-1.lai
    mina/sandbox/jvermillard/apr/lib/libtcnative-1.so   (with props)
    mina/sandbox/jvermillard/apr/lib/libtcnative-1.so.0   (with props)
    mina/sandbox/jvermillard/apr/lib/libtcnative-1.so.0.1.8   (with props)
    mina/sandbox/jvermillard/apr/lib/tomcat-native-1.0.0.jar   (with props)
    mina/sandbox/jvermillard/apr/src/
    mina/sandbox/jvermillard/apr/src/main/
    mina/sandbox/jvermillard/apr/src/main/java/
    mina/sandbox/jvermillard/apr/src/main/java/org/
    mina/sandbox/jvermillard/apr/src/main/java/org/apache/
    mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/
    mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/
    mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/
    mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRConnector.java
    mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRIoProcessor.java
    mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSession.java
    mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSessionConfig.java
    mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSessionImpl.java

Added: mina/sandbox/jvermillard/apr/lib/libapr-1.so
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/lib/libapr-1.so?view=auto&rev=551146
==============================================================================
Binary file - no diff available.

Propchange: mina/sandbox/jvermillard/apr/lib/libapr-1.so
------------------------------------------------------------------------------
    svn:executable = *

Propchange: mina/sandbox/jvermillard/apr/lib/libapr-1.so
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: mina/sandbox/jvermillard/apr/lib/libapr-1.so.0
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/lib/libapr-1.so.0?view=auto&rev=551146
==============================================================================
Binary file - no diff available.

Propchange: mina/sandbox/jvermillard/apr/lib/libapr-1.so.0
------------------------------------------------------------------------------
    svn:executable = *

Propchange: mina/sandbox/jvermillard/apr/lib/libapr-1.so.0
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: mina/sandbox/jvermillard/apr/lib/libapr-1.so.0.2.9
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/lib/libapr-1.so.0.2.9?view=auto&rev=551146
==============================================================================
Binary file - no diff available.

Propchange: mina/sandbox/jvermillard/apr/lib/libapr-1.so.0.2.9
------------------------------------------------------------------------------
    svn:executable = *

Propchange: mina/sandbox/jvermillard/apr/lib/libapr-1.so.0.2.9
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: mina/sandbox/jvermillard/apr/lib/libtcnative-1.a
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/lib/libtcnative-1.a?view=auto&rev=551146
==============================================================================
Binary file - no diff available.

Propchange: mina/sandbox/jvermillard/apr/lib/libtcnative-1.a
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: mina/sandbox/jvermillard/apr/lib/libtcnative-1.lai
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/lib/libtcnative-1.lai?view=auto&rev=551146
==============================================================================
--- mina/sandbox/jvermillard/apr/lib/libtcnative-1.lai (added)
+++ mina/sandbox/jvermillard/apr/lib/libtcnative-1.lai Wed Jun 27 05:42:39 2007
@@ -0,0 +1,35 @@
+# libtcnative-1.la - a libtool library file
+# Generated by ltmain.sh - GNU libtool 1.5.20 (1.1220.2.287 2005/08/31 18:54:15)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='libtcnative-1.so.0'
+
+# Names of this library.
+library_names='libtcnative-1.so.0.1.8 libtcnative-1.so.0 libtcnative-1.so'
+
+# The name of the static archive.
+old_library='libtcnative-1.a'
+
+# Libraries that this one depends upon.
+dependency_libs=' /usr/local/apr/lib/libapr-1.la -luuid -lrt -lcrypt -lpthread -ldl -lssl -lcrypto'
+
+# Version information for libtcnative-1.
+current=1
+age=1
+revision=8
+
+# Is this an already installed library?
+installed=yes
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=no
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir='/usr/local/apr/lib'

Added: mina/sandbox/jvermillard/apr/lib/libtcnative-1.so
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/lib/libtcnative-1.so?view=auto&rev=551146
==============================================================================
Binary file - no diff available.

Propchange: mina/sandbox/jvermillard/apr/lib/libtcnative-1.so
------------------------------------------------------------------------------
    svn:executable = *

Propchange: mina/sandbox/jvermillard/apr/lib/libtcnative-1.so
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: mina/sandbox/jvermillard/apr/lib/libtcnative-1.so.0
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/lib/libtcnative-1.so.0?view=auto&rev=551146
==============================================================================
Binary file - no diff available.

Propchange: mina/sandbox/jvermillard/apr/lib/libtcnative-1.so.0
------------------------------------------------------------------------------
    svn:executable = *

Propchange: mina/sandbox/jvermillard/apr/lib/libtcnative-1.so.0
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: mina/sandbox/jvermillard/apr/lib/libtcnative-1.so.0.1.8
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/lib/libtcnative-1.so.0.1.8?view=auto&rev=551146
==============================================================================
Binary file - no diff available.

Propchange: mina/sandbox/jvermillard/apr/lib/libtcnative-1.so.0.1.8
------------------------------------------------------------------------------
    svn:executable = *

Propchange: mina/sandbox/jvermillard/apr/lib/libtcnative-1.so.0.1.8
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: mina/sandbox/jvermillard/apr/lib/tomcat-native-1.0.0.jar
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/lib/tomcat-native-1.0.0.jar?view=auto&rev=551146
==============================================================================
Binary file - no diff available.

Propchange: mina/sandbox/jvermillard/apr/lib/tomcat-native-1.0.0.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRConnector.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRConnector.java?view=auto&rev=551146
==============================================================================
--- mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRConnector.java (added)
+++ mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRConnector.java Wed Jun 27 05:42:39 2007
@@ -0,0 +1,83 @@
+package org.apache.mina.transport.apr;
+
+import java.net.SocketAddress;
+import java.util.concurrent.Executor;
+
+import org.apache.mina.common.ConnectFuture;
+import org.apache.mina.common.TransportType;
+import org.apache.mina.common.support.BaseIoConnector;
+import org.apache.mina.common.support.IoServiceListenerSupport;
+import org.apache.mina.util.NewThreadExecutor;
+import org.apache.tomcat.jni.Pool;
+
+public class APRConnector  extends BaseIoConnector {
+
+    /**
+     * @noinspection StaticNonFinalField
+     */
+    private static volatile int nextId = 0;
+
+    private final Object lock = new Object();
+    private final int id = nextId++;
+    private final String threadName = "APRConnector-" + id;    
+    private final int processorCount;
+    private final Executor executor;
+    private final APRIoProcessor[] ioProcessors;
+
+    // APR memory pool (package wide mother pool)
+    static long pool = -1;
+
+    /**
+     * Create a connector with a single processing thread using a NewThreadExecutor 
+     */
+    public APRConnector()
+    {
+        this( 1, new NewThreadExecutor() );
+    }
+
+    /**
+     * Create a connector with the desired number of processing threads
+     *
+     * @param processorCount Number of processing threads
+     * @param executor Executor to use for launching threads
+     */
+    public APRConnector( int processorCount, Executor executor )
+    {
+        super( null ); // TODO : DEFAULT CONFIG
+        if( processorCount < 1 )
+        {
+            throw new IllegalArgumentException( "Must have at least one processor" );
+        }
+
+        if(pool==-1)
+        	pool = Pool.create(0);
+
+        this.executor = executor;
+        this.processorCount = processorCount;
+        ioProcessors = new APRIoProcessor[processorCount];
+
+        for( int i = 0; i < processorCount; i++ )
+        {
+        	ioProcessors[i] = new APRIoProcessor( "APRConnectorIoProcessor-" + id + "." + i, executor );
+        }
+    }
+
+    
+    
+	@Override
+	protected ConnectFuture doConnect(SocketAddress remoteAddress, SocketAddress localAddress) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public TransportType getTransportType() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	
+    @Override
+    protected IoServiceListenerSupport getListeners()
+    {
+        return super.getListeners();
+    }
+}

Added: mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRIoProcessor.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRIoProcessor.java?view=auto&rev=551146
==============================================================================
--- mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRIoProcessor.java (added)
+++ mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRIoProcessor.java Wed Jun 27 05:42:39 2007
@@ -0,0 +1,325 @@
+package org.apache.mina.transport.apr;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.Executor;
+
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.ExceptionMonitor;
+import org.apache.mina.common.IdleStatus;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.WriteRequest;
+import org.apache.mina.common.support.IoServiceListenerSupport;
+import org.apache.mina.util.NamePreservingRunnable;
+import org.apache.tomcat.jni.Error;
+import org.apache.tomcat.jni.Poll;
+import org.apache.tomcat.jni.Pool;
+import org.apache.tomcat.jni.Socket;
+import org.apache.tomcat.jni.Status;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class APRIoProcessor {
+
+	private final Logger logger = LoggerFactory.getLogger(getClass());
+
+	private final Object lock = new Object();
+
+	private final String threadName;
+
+	private final Executor executor;
+
+	private long pool = 0; // memory pool
+
+	private long pollset = 0; // socket poller
+
+	private final Queue<APRSessionImpl> newSessions = new ConcurrentLinkedQueue<APRSessionImpl>();
+
+	private final Queue<APRSessionImpl> removingSessions = new ConcurrentLinkedQueue<APRSessionImpl>();
+
+	private final Queue<APRSessionImpl> flushingSessions = new ConcurrentLinkedQueue<APRSessionImpl>();
+
+	private final Queue<APRSessionImpl> trafficControllingSessions = new ConcurrentLinkedQueue<APRSessionImpl>();
+
+	private final Map<Long, APRSessionImpl> managedSessions = new HashMap<Long, APRSessionImpl>();
+
+	private long lastIdleCheckTime = System.currentTimeMillis();
+
+	private int socketCount = 0;
+
+	private Worker worker;
+
+	APRIoProcessor(String threadName, Executor executor) {
+		this.threadName = threadName;
+		this.executor = executor;
+
+		// initialize a memory pool for APR functions
+		pool = Pool.create(APRConnector.pool);
+		try {
+
+			// TODO : optimize/parametrize those values
+			pollset = Poll.create(32, pool, 0, 10000000);
+		} catch (Error e) {
+			logger.error("APR Error : " + e.getDescription(), e);
+			// TODO : send that to the good logger
+		}
+	}
+
+	void addNew(APRSessionImpl session) {
+		newSessions.offer(session);
+
+		startupWorker();
+	}
+
+	void remove(APRSessionImpl session) {
+		scheduleRemove(session);
+		startupWorker();
+	}
+
+	private void startupWorker() {
+		synchronized (lock) {
+			if (worker == null) {
+				worker = new Worker();
+				executor.execute(new NamePreservingRunnable(worker));
+			}
+		}
+	}
+
+	void flush(APRSessionImpl session) {
+		scheduleFlush(session);
+	}
+
+	private void scheduleRemove(APRSessionImpl session) {
+		removingSessions.offer(session);
+	}
+
+	// TODO : do something with traffic control 
+	private void scheduleTrafficControl(APRSessionImpl session) {
+		trafficControllingSessions.offer(session);
+	}
+
+	private void scheduleFlush(APRSessionImpl session) {
+		flushingSessions.offer(session);
+	}
+
+	private void doAddNew() {
+		for (;;) {
+			APRSessionImpl session = newSessions.poll();
+
+			if (session == null) {
+				break;
+			}
+
+			// polling the socket for write and read
+			// FIXME : perhaps we should oll write only if needed for save CPU, but actually it's too complex for me :)
+			int rv = Poll.add(pollset, session.getAPRSocket(), Poll.APR_POLLIN
+					| Poll.APR_POLLOUT);
+			if (rv == Status.APR_SUCCESS) {
+				System.out.println("Added worker to pollset");
+				managedSessions.put(session.getAPRSocket(), session);
+				socketCount++;
+				// AbstractIoFilterChain.CONNECT_FUTURE is cleared inside here
+				// in AbstractIoFilterChain.fireSessionOpened().
+				getServiceListeners(session).fireSessionCreated(session);
+			} else {
+				// FIXME: find a way to bring the real APR error from returned codes
+				session.getFilterChain().fireExceptionCaught(session,
+						new RuntimeException("APR Error"));
+			}
+		}
+	}
+
+	private void doRemove() {
+		for (;;) {
+			APRSessionImpl session = removingSessions.poll();
+
+			if (session == null) {
+				break;
+			}
+
+			// remove of the pollset
+			Poll.remove(pollset, session.getAPRSocket());
+
+			// close the socket
+			Socket.close(session.getAPRSocket());
+			clearWriteRequestQueue(session);
+			getServiceListeners(session).fireSessionDestroyed(session);
+		}
+	}
+
+	private void read(APRSessionImpl session) {
+		byte[] buf = session.getReadBuffer();
+		int bytes = Socket.recv(session.getAPRSocket(), buf, 0, -1);
+		if (bytes > 0) {
+			ByteBuffer bbuf = ByteBuffer.allocate(bytes);
+			bbuf.put(buf, 0, bytes);
+			bbuf.flip();
+			session.increaseReadBytes(bytes);
+			session.getFilterChain().fireMessageReceived(session, bbuf);
+		} else if (bytes < 0) {
+			logger.debug("Read {} bytes, scheduling for remove", bytes);
+			scheduleRemove(session);
+		}
+	}
+
+	private void write(APRSessionImpl session) {
+		if (session.getWriteRequestQueue().size() <= 0)
+			return;
+		Queue<WriteRequest> writeRequestQueue = session.getWriteRequestQueue();
+
+		for (;;) {
+
+			WriteRequest req;
+
+			synchronized (writeRequestQueue) {
+				req = writeRequestQueue.peek();
+			}
+
+			if (req == null) {
+				break;
+			}
+
+			ByteBuffer buf = (ByteBuffer) req.getMessage();
+			if (buf.remaining() == 0) {
+				synchronized (writeRequestQueue) {
+					writeRequestQueue.poll();
+				}
+				session.increaseWrittenMessages();
+				buf.reset();
+				session.getFilterChain().fireMessageSent(session, req);
+				continue;
+			}
+			// be sure APR_SO_NONBLOCK was set, or it will block
+			int toWrite = buf.remaining();
+			int writtenBytes = Socket.sendb(session.getAPRSocket(), buf.buf(),
+					0, toWrite);
+			if (writtenBytes > 0) {
+				// increase
+				session.increaseWrittenBytes(writtenBytes);
+			}
+
+			// kernel buffer full for this socket, wait next polling
+			if (buf.hasRemaining())
+				break;
+		}
+	}
+
+	private void clearWriteRequestQueue(APRSessionImpl session) {
+		Queue<WriteRequest> writeRequestQueue = session.getWriteRequestQueue();
+		WriteRequest req;
+
+		while ((req = writeRequestQueue.poll()) != null) {
+			req.getFuture().setWritten(false);
+		}
+	}
+
+	private void notifyIdleness() {
+		// process idle sessions
+		long currentTime = System.currentTimeMillis();
+		if ((currentTime - lastIdleCheckTime) >= 1000) {
+			lastIdleCheckTime = currentTime;
+			for (APRSessionImpl session : managedSessions.values()) {
+				notifyIdleness(session, currentTime);
+			}
+		}
+	}
+
+	private void notifyIdleness(APRSessionImpl session, long currentTime) {
+		notifyIdleness0(session, currentTime, session
+				.getIdleTimeInMillis(IdleStatus.BOTH_IDLE),
+				IdleStatus.BOTH_IDLE, Math.max(session.getLastIoTime(), session
+						.getLastIdleTime(IdleStatus.BOTH_IDLE)));
+		notifyIdleness0(session, currentTime, session
+				.getIdleTimeInMillis(IdleStatus.READER_IDLE),
+				IdleStatus.READER_IDLE, Math.max(session.getLastReadTime(),
+						session.getLastIdleTime(IdleStatus.READER_IDLE)));
+		notifyIdleness0(session, currentTime, session
+				.getIdleTimeInMillis(IdleStatus.WRITER_IDLE),
+				IdleStatus.WRITER_IDLE, Math.max(session.getLastWriteTime(),
+						session.getLastIdleTime(IdleStatus.WRITER_IDLE)));
+
+		notifyWriteTimeout(session, currentTime, session
+				.getWriteTimeoutInMillis(), session.getLastWriteTime());
+	}
+
+	private void notifyIdleness0(APRSessionImpl session, long currentTime,
+			long idleTime, IdleStatus status, long lastIoTime) {
+		if (idleTime > 0 && lastIoTime != 0
+				&& (currentTime - lastIoTime) >= idleTime) {
+			session.increaseIdleCount(status);
+			session.getFilterChain().fireSessionIdle(session, status);
+		}
+	}
+
+	private void notifyWriteTimeout(APRSessionImpl session, long currentTime,
+			long writeTimeout, long lastIoTime) {
+		// TODO : I understand nothing here :)
+	}
+
+	private IoServiceListenerSupport getServiceListeners(IoSession session) {
+		IoService service = session.getService();
+		if (service instanceof APRConnector) {
+			return ((APRConnector) service).getListeners();
+		} else
+			return null;
+	}
+
+	private class Worker implements Runnable {
+		public void run() {
+			Thread.currentThread().setName(APRIoProcessor.this.threadName);
+
+			for (;;) {
+
+				try {
+
+					// pop new sessions
+					doAddNew();
+
+					if (socketCount < 1) {
+						return; // no need to poll an empty pollset
+					}
+
+					// TODO : doUpdateTrafficMask();
+
+					/* is it OK ? : Two times size of the created pollset */
+					long[] desc = new long[socketCount * 2];
+
+					/* use 100 milliseconds poll timeout, TODO : parametrize for more latency/CPU usage control*/
+					int rv = Poll.poll(pollset, 100000, desc, false);
+					if (rv > 0) {
+						for (int n = 0; n < rv; n++) {
+							long clientSock = desc[n * 2 + 1];
+							logger.debug("Poll flags " + desc[n * 2]);
+
+							APRSessionImpl session = managedSessions
+									.get(clientSock);
+
+							if (!session.isConnected()) {
+								clearWriteRequestQueue(session);
+								continue;
+							}
+
+							if (desc[n * 2] == Poll.APR_POLLIN)
+								read(session);
+							if (desc[n * 2] == Poll.APR_POLLOUT)
+								write(session);
+						}
+					}
+					notifyIdleness();
+					doRemove();
+				} catch (Throwable t) {
+					ExceptionMonitor.getInstance().exceptionCaught(t);
+
+					try {
+						Thread.sleep(1000);
+					} catch (InterruptedException e1) {
+						ExceptionMonitor.getInstance().exceptionCaught(e1);
+					}
+				}
+			}
+		}
+	}
+}

Added: mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSession.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSession.java?view=auto&rev=551146
==============================================================================
--- mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSession.java (added)
+++ mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSession.java Wed Jun 27 05:42:39 2007
@@ -0,0 +1,22 @@
+package org.apache.mina.transport.apr;
+
+import java.net.InetSocketAddress;
+import java.util.Queue;
+
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.WriteRequest;
+
+public interface APRSession extends IoSession {
+	
+	
+    APRSessionConfig getConfig();
+    InetSocketAddress getRemoteAddress();
+    InetSocketAddress getLocalAddress();
+    InetSocketAddress getServiceAddress();
+    
+    // TODO : move to package only visible implementation
+    long getAPRSocket();
+    byte[] getReadBuffer();
+    void increaseReadBytes( int increment );
+    Queue<WriteRequest> getWriteRequestQueue();
+}

Added: mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSessionConfig.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSessionConfig.java?view=auto&rev=551146
==============================================================================
--- mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSessionConfig.java (added)
+++ mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSessionConfig.java Wed Jun 27 05:42:39 2007
@@ -0,0 +1,7 @@
+package org.apache.mina.transport.apr;
+
+import org.apache.mina.common.IoSessionConfig;
+
+public interface APRSessionConfig extends IoSessionConfig {
+
+}

Added: mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSessionImpl.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSessionImpl.java?view=auto&rev=551146
==============================================================================
--- mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSessionImpl.java (added)
+++ mina/sandbox/jvermillard/apr/src/main/java/org/apache/mina/transport/apr/APRSessionImpl.java Wed Jun 27 05:42:39 2007
@@ -0,0 +1,86 @@
+package org.apache.mina.transport.apr;
+
+import java.net.InetSocketAddress;
+import java.util.Queue;
+
+import org.apache.mina.common.IoFilterChain;
+import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.TransportType;
+import org.apache.mina.common.WriteRequest;
+import org.apache.mina.common.support.BaseIoSession;
+
+public class APRSessionImpl extends BaseIoSession implements APRSession {
+
+	@Override
+	protected void updateTrafficMask() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public long getAPRSocket() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	public APRSessionConfig getConfig() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public InetSocketAddress getLocalAddress() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public byte[] getReadBuffer() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public InetSocketAddress getRemoteAddress() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public Queue<WriteRequest> getWriteRequestQueue() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public IoFilterChain getFilterChain() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public IoHandler getHandler() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public int getScheduledWriteBytes() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	public int getScheduledWriteMessages() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	public IoService getService() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public TransportType getTransportType() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+    @Override
+    public InetSocketAddress getServiceAddress() {
+        return (InetSocketAddress) super.getServiceAddress();
+    }
+
+}