/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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 org.apache.asyncweb.server.transport.mina;


import org.apache.mina.core.session.IoSession;
import org.apache.mina.handler.multiton.SingleSessionIoHandler;
import org.apache.mina.handler.multiton.SingleSessionIoHandlerDelegate;
import org.apache.mina.handler.multiton.SingleSessionIoHandlerFactory;
import org.apache.asyncweb.server.ServiceContainer;


/**
 * The default HttpIoHandler used when one is not provided.
 *
 * @author The Apache MINA Project (dev@mina.apache.org)
 */
public class DefaultHttpIoHandler extends SingleSessionIoHandlerDelegate implements HttpIoHandler
{
    /** the default idle time in seconds - 5 minutes */
    public static final int DEFAULT_IDLE_TIME = 300;


    public DefaultHttpIoHandler()
    {
        super( new Factory() );
    }


    public ServiceContainer getContainer()
    {
        return ( ( Factory ) getFactory() ).getContainer();
    }


    public void setContainer( ServiceContainer container )
    {
        ( ( Factory ) getFactory() ).setContainer( container );
    }


    public void setReadIdle( int idleTime )
    {
        ( ( Factory ) getFactory() ).setReadIdle( idleTime );
    }


    private static class Factory implements SingleSessionIoHandlerFactory
    {
        private ServiceContainer container;
        private int readIdleTime = DEFAULT_IDLE_TIME;

        public ServiceContainer getContainer()
        {
            return container;
        }

        public void setContainer( ServiceContainer container )
        {
            this.container = container;
        }

        public void setReadIdle( int idleTime )
        {
            this.readIdleTime = idleTime;
        }


        public SingleSessionIoHandler getHandler( IoSession session )
        {
            SingleHttpSessionIoHandler handler = new SingleHttpSessionIoHandler( container, session );
            handler.setReadIdleTime( readIdleTime );
            return handler;
        }
    }
}
