package org.apache.avalon.griffin;

import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.activity.Startable;
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.parameters.Parameterizable;
import org.apache.avalon.framework.parameters.ParameterException;
import org.apache.avalon.griffin.engine.GriffinEmbeddor;

/**
 *
 * @author <a href="mailto:colus@isoft.co.kr">Eung-ju Park</a>
 */
public class Griffin
    implements ComponentManager, Parameterizable, Initializable, Disposable, Startable
{
    public static final String ROLE = "org.apache.avalon.griffin.Griffin";

    private Parameters      m_parameters;
    private GriffinEmbeddor m_embeddor;

    public void parameterize( final Parameters parameters )
    {
        //default parameter values
        m_parameters = new Parameters();
        m_parameters.setParameter( "kernel-class", "org.apache.avalon.phoenix.engine.PhoenixKernel" );
        m_parameters.setParameter( "kernel-configuration-source", null );
        m_parameters.setParameter( "manager-class", "org.apache.avalon.griffin.engine.GriffinManager" );
        m_parameters.setParameter( "manager-configuration-source", null );
        m_parameters.setParameter( "deployer-class", "org.apache.avalon.phoenix.engine.DefaultSarDeployer" );
        m_parameters.setParameter( "log-destination", "./logs/griffin.log" );
        m_parameters.setParameter( "log-priority", "INFO" );
        m_parameters.setParameter( "application-name", "griffin" );
        m_parameters.setParameter( "application-home", "./griffin" );

        m_parameters.merge( parameters );
    }

    public void initialize()
        throws Exception
    {
        m_embeddor = new GriffinEmbeddor();
        m_embeddor.parameterize( m_parameters );
        m_embeddor.initialize();
    }

    public void start()
        throws Exception
    {
        m_embeddor.start();
        m_embeddor.execute();
    }

    public void stop()
        throws Exception
    {
        m_embeddor.stop();
    }

    public void dispose()
    {
        m_embeddor.dispose();
    }

    /**
     * Lookup the service component.
     *
     * @param role of component
     * @return
     */
    public Component lookup( final String name )
        throws ComponentException
    {
        return m_embeddor.lookup( name );
    }

    public void release( final Component component )
    {
        m_embeddor.release( component );
    }
}
