// Path: src/main/java/io/openio/sds/exceptions/OioException.java
// @SuppressWarnings("deprecation")
// public class OioException extends SdsException {
// 
//     /**
//      * 
//      */
//     private static final long serialVersionUID = 3270900242235005338L;
// 
//     public OioException(String message) {
//         super(message);
//     }
// 
//     public OioException(String message, Throwable t) {
//         super(message, t);
//     }
// }
// 
// Path: src/main/java/io/openio/sds/logging/SdsLogger.java
// public interface SdsLogger {
// 
//     /**
//      * Logs a message at {@link Level#FINEST}.
//      *
//      * @param message
//      *            the message to log.
//      */
//     public void trace(String message);
// 
//     /**
//      * Logs a throwable at {@link Level#FINEST}. The message of the Throwable
//      * will be the message.
//      *
//      * @param thrown
//      *            the Throwable to log.
//      */
//     public void trace(Throwable thrown);
// 
//     /**
//      * Logs message with associated throwable information at
//      * {@link Level#FINEST}.
//      *
//      * @param message
//      *            the message to log
//      * @param thrown
//      *            the Throwable associated to the message.
//      */
//     public void trace(String message, Throwable thrown);
// 
//     /**
//      * Checks if the {@link Level#FINEST} is enabled.
//      *
//      * @return true if enabled, false otherwise.
//      */
//     public boolean isTraceEnabled();
// 
//     /**
//      * Logs a message at {@link Level#FINE}.
//      *
//      * @param message
//      *            the message to log.
//      */
//     public void debug(String message);
//     
//     /**
//      * Logs message with associated throwable information at
//      * {@link Level#FINE}.
//      *
//      * @param message
//      *            the message to log
//      * @param thrown
//      *            the Throwable associated to the message.
//      */
//     public void debug(String message, Throwable thrown);
// 
//     /**
//      * Checks if the {@link Level#FINE} is enabled.
//      *
//      * @return true if enabled, false otherwise.
//      */
//     public boolean isDebugEnabled();
// 
//     /**
//      * Logs a message at {@link Level#INFO}.
//      *
//      * @param message
//      *            the message to log.
//      */
//     public void info(String message);
// 
//     /**
//      * Logs a message at {@link Level#WARNING}.
//      *
//      * @param message
//      *            the message to log.
//      */
//     public void warn(String message);
// 
//     /**
//      * Logs a throwable at {@link Level#WARNING}. The message of the Throwable
//      * will be the message.
//      *
//      * @param thrown
//      *            the Throwable to log.
//      */
//     public void warn(Throwable thrown);
// 
//     /**
//      * Logs message with associated throwable information at
//      * {@link Level#WARNING}.
//      *
//      * @param message
//      *            the message to log
//      * @param thrown
//      *            the Throwable associated to the message.
//      */
//     public void warn(String message, Throwable thrown);
// 
//     /**
//      * Logs a message at {@link Level#SEVERE}.
//      *
//      * @param message
//      *            the message to log.
//      */
//     public void error(String message);
// 
//     /**
//      * Logs a throwable at {@link Level#SEVERE}. The message of the Throwable
//      * will be the message.
//      *
//      * @param thrown
//      *            the Throwable to log.
//      */
//     public void error(Throwable thrown);
// 
//     /**
//      * Logs message with associated throwable information at
//      * {@link Level#SEVERE}.
//      *
//      * @param message
//      *            the message to log
//      * @param thrown
//      *            the Throwable associated to the message.
//      */
//     public void error(String message, Throwable thrown);
// }
// 
// Path: src/main/java/io/openio/sds/logging/SdsLoggerFactory.java
// public class SdsLoggerFactory {
// 
//     private static int loaded = -1;
// 
//     public static SdsLogger getLogger(Class<?> c) {
//         ensureLoaded();
//         switch (loaded) {
//         case 1:
//             return new Log4jLogger(c);
//         case 0:
//         default:
//             return new BaseLogger(c);
//         }
//     }
// 
//     private static void ensureLoaded() {
//         if (-1 == loaded) {
//             try {
//                 Class.forName("org.apache.log4j.LogManager");
//                 loaded = 1;
//             } catch (ClassNotFoundException e) {
//                 loaded = 0;
//             }
//         }
//     }
// 
// }


import java.util.Iterator;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import io.openio.sds.exceptions.OioException;
import io.openio.sds.logging.SdsLogger;
import io.openio.sds.logging.SdsLoggerFactory;
    }

    protected boolean timedOut(T item, long now) {
        return now >= item.lastUsage() + settings.idleTimeout();
    }

    /**
     * @return the first item of the queue that has not timed out.
     */
    protected T leaseLoop() {
        long now = monotonicMillis();
        T item = q.poll();
        while (item != null && this.timedOut(item, now)) {
            destroy(item);
            item = q.poll();
        }
        return item;
    }

    public T lease() {
        T item = leaseLoop();
        if (item == null) {
            item = tryCreate();
            if (item == null) {
                try {
                    item = q.poll(settings.maxWait(), TimeUnit.MILLISECONDS);
                } catch (InterruptedException e) {
                    logger.debug("connection wait interrrupted");
                }
                if (item == null)
// Path: src/main/java/io/openio/sds/exceptions/OioException.java
// @SuppressWarnings("deprecation")
// public class OioException extends SdsException {
// 
//     /**
//      * 
//      */
//     private static final long serialVersionUID = 3270900242235005338L;
// 
//     public OioException(String message) {
//         super(message);
//     }
// 
//     public OioException(String message, Throwable t) {
//         super(message, t);
//     }
// }
// 
// Path: src/main/java/io/openio/sds/logging/SdsLogger.java
// public interface SdsLogger {
// 
//     /**
//      * Logs a message at {@link Level#FINEST}.
//      *
//      * @param message
//      *            the message to log.
//      */
//     public void trace(String message);
// 
//     /**
//      * Logs a throwable at {@link Level#FINEST}. The message of the Throwable
//      * will be the message.
//      *
//      * @param thrown
//      *            the Throwable to log.
//      */
//     public void trace(Throwable thrown);
// 
//     /**
//      * Logs message with associated throwable information at
//      * {@link Level#FINEST}.
//      *
//      * @param message
//      *            the message to log
//      * @param thrown
//      *            the Throwable associated to the message.
//      */
//     public void trace(String message, Throwable thrown);
// 
//     /**
//      * Checks if the {@link Level#FINEST} is enabled.
//      *
//      * @return true if enabled, false otherwise.
//      */
//     public boolean isTraceEnabled();
// 
//     /**
//      * Logs a message at {@link Level#FINE}.
//      *
//      * @param message
//      *            the message to log.
//      */
//     public void debug(String message);
//     
//     /**
//      * Logs message with associated throwable information at
//      * {@link Level#FINE}.
//      *
//      * @param message
//      *            the message to log
//      * @param thrown
//      *            the Throwable associated to the message.
//      */
//     public void debug(String message, Throwable thrown);
// 
//     /**
//      * Checks if the {@link Level#FINE} is enabled.
//      *
//      * @return true if enabled, false otherwise.
//      */
//     public boolean isDebugEnabled();
// 
//     /**
//      * Logs a message at {@link Level#INFO}.
//      *
//      * @param message
//      *            the message to log.
//      */
//     public void info(String message);
// 
//     /**
//      * Logs a message at {@link Level#WARNING}.
//      *
//      * @param message
//      *            the message to log.
//      */
//     public void warn(String message);
// 
//     /**
//      * Logs a throwable at {@link Level#WARNING}. The message of the Throwable
//      * will be the message.
//      *
//      * @param thrown
//      *            the Throwable to log.
//      */
//     public void warn(Throwable thrown);
// 
//     /**
//      * Logs message with associated throwable information at
//      * {@link Level#WARNING}.
//      *
//      * @param message
//      *            the message to log
//      * @param thrown
//      *            the Throwable associated to the message.
//      */
//     public void warn(String message, Throwable thrown);
// 
//     /**
//      * Logs a message at {@link Level#SEVERE}.
//      *
//      * @param message
//      *            the message to log.
//      */
//     public void error(String message);
// 
//     /**
//      * Logs a throwable at {@link Level#SEVERE}. The message of the Throwable
//      * will be the message.
//      *
//      * @param thrown
//      *            the Throwable to log.
//      */
//     public void error(Throwable thrown);
// 
//     /**
//      * Logs message with associated throwable information at
//      * {@link Level#SEVERE}.
//      *
//      * @param message
//      *            the message to log
//      * @param thrown
//      *            the Throwable associated to the message.
//      */
//     public void error(String message, Throwable thrown);
// }
// 
// Path: src/main/java/io/openio/sds/logging/SdsLoggerFactory.java
// public class SdsLoggerFactory {
// 
//     private static int loaded = -1;
// 
//     public static SdsLogger getLogger(Class<?> c) {
//         ensureLoaded();
//         switch (loaded) {
//         case 1:
//             return new Log4jLogger(c);
//         case 0:
//         default:
//             return new BaseLogger(c);
//         }
//     }
// 
//     private static void ensureLoaded() {
//         if (-1 == loaded) {
//             try {
//                 Class.forName("org.apache.log4j.LogManager");
//                 loaded = 1;
//             } catch (ClassNotFoundException e) {
//                 loaded = 0;
//             }
//         }
//     }
// 
// }


// Path: src/main/java/io/openio/sds/pool/Pool.java
import java.util.Iterator;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import io.openio.sds.exceptions.OioException;
import io.openio.sds.logging.SdsLogger;
import io.openio.sds.logging.SdsLoggerFactory;

    }

    protected boolean timedOut(T item, long now) {
        return now >= item.lastUsage() + settings.idleTimeout();
    }

    /**
     * @return the first item of the queue that has not timed out.
     */
    protected T leaseLoop() {
        long now = monotonicMillis();
        T item = q.poll();
        while (item != null && this.timedOut(item, now)) {
            destroy(item);
            item = q.poll();
        }
        return item;
    }

    public T lease() {
        T item = leaseLoop();
        if (item == null) {
            item = tryCreate();
            if (item == null) {
                try {
                    item = q.poll(settings.maxWait(), TimeUnit.MILLISECONDS);
                } catch (InterruptedException e) {
                    logger.debug("connection wait interrrupted");
                }
                if (item == null)
                    throw new OioException(String.format("Unable to get pooled element"));