/*
* 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.
*/
package com.ok2c.lightnio.impl.pool;
import java.net.SocketAddress;
import java.util.concurrent.Future;
import com.ok2c.lightnio.ConnectingIOReactor;
import com.ok2c.lightnio.IOSession;
import com.ok2c.lightnio.concurrent.BasicFuture;
import com.ok2c.lightnio.concurrent.FutureCallback;
import com.ok2c.lightnio.pool.IOSessionManager;
import com.ok2c.lightnio.pool.ManagedIOSession;
public class BasicIOSessionManager implements IOSessionManager<SocketAddress> {
private final SessionPool<SocketAddress> pool;
public BasicIOSessionManager(final ConnectingIOReactor ioreactor) {
super();
this.pool = new SessionPool<SocketAddress>(
ioreactor, new InternalRouteResolver(), 20, 50);
}
public synchronized Future<ManagedIOSession> leaseSession(
final SocketAddress route,
final Object state,
final FutureCallback<ManagedIOSession> callback) {
BasicFuture<ManagedIOSession> future = new BasicFuture<ManagedIOSession>(callback);
this.pool.lease(route, state, new InternalPoolEntryCallback(this.pool, future));
return future;
}
public synchronized void releaseSession(final ManagedIOSession session) {
session.releaseSession();
}
public synchronized void removeExpired(final IOSession iosession) {
@SuppressWarnings("unchecked")
PoolEntry<SocketAddress> entry = (PoolEntry<SocketAddress>) iosession.getAttribute(
PoolEntry.ATTRIB);
if (entry != null) {
this.pool.remove(entry);
}
}
public synchronized void shutdown() {
this.pool.shutdown();
}
static class InternalRouteResolver implements RouteResolver<SocketAddress> {
public SocketAddress resolveLocalAddress(final SocketAddress route) {
return null;
}
public SocketAddress resolveRemoteAddress(final SocketAddress route) {
return route;
}
}
static class InternalPoolEntryCallback implements PoolEntryCallback<SocketAddress> {
private final SessionPool<SocketAddress> pool;
private final BasicFuture<ManagedIOSession> future;
public InternalPoolEntryCallback(
final SessionPool<SocketAddress> pool,
final BasicFuture<ManagedIOSession> future) {
super();
this.pool = pool;
this.future = future;
}
public void completed(final PoolEntry<SocketAddress> entry) {
ManagedIOSession result = new BasicManagedIOSession(this.pool, entry);
this.future.completed(result);
}
public void failed(final Exception ex) {
this.future.failed(ex);
}
public void cancelled() {
this.future.cancel(true);
}
}
}