/*
 * MenuPlugin.java
 *
 * Created on March 6, 2002, 10:04 PM
 */
package es.ejie.frmk.presentacion.iu.taglib.html.menu.base;

import java.util.Iterator;

import javax.servlet.ServletException;

import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;

import es.ejie.frmk.control.excepciones.Q70FrameworkException;
import es.ejie.frmk.control.excepciones.Q70GestorDeExcepciones;
import es.ejie.frmk.presentacion.iu.taglib.base.Q70Constants;
import es.ejie.frmk.presentacion.iu.taglib.html.menu.util.Q70LoadableResourceException;
/**
 * Struts plug-in adapter for the menuing module.
 *
 * @author  ssayles
 */
public class Q70MenuPlugIn implements PlugIn {
    //~ Instance fields ========================================================

    /**
     * The <code>Q70Log</code> instance for this class.
     */
    private Q70MenuRepository repository;
    private String menuConfig;
    private ActionServlet servlet;

    private String modulePrefix;

    //~ Methods ================================================================

    public String getMenuConfig() {
        return menuConfig;
    }

    public void setMenuConfig(String menuConfig) {
        this.menuConfig = menuConfig;
    }


    public void init(ActionServlet servlet, ModuleConfig config)
    	throws ServletException 
    {
		//Poner en el contexto de servlets el repositorio de menus y tipos de menu definidos a nivel de Geremua.
		//La primera op que se lance dejara en el contexto de servlet el repositorio framewrok; recuperarlo.
		Q70MenuRepository frmkRepository = (Q70MenuRepository) servlet.getServletContext().getAttribute(Q70Constants.FRAMEWORK_MENU_REPOSITORY); 
		if (null==frmkRepository) 
		{
			frmkRepository = new Q70MenuRepository();
			frmkRepository.setLoadParam(Q70Constants.FRAMEWORK_MENU_CONFIG_PATH);
			frmkRepository.setServlet(servlet);
			try {       	
				//frmkRepository.load();
				frmkRepository.frmkLoad();            
				servlet.getServletContext().setAttribute(Q70Constants.FRAMEWORK_MENU_REPOSITORY, frmkRepository);
				
			} catch (Q70LoadableResourceException lre) {
				Q70GestorDeExcepciones.getSingleton().recogerThrowable(new Q70FrameworkException(Q70Constants.COMPONENTE_CUSTOM_TAG,this.getClass().toString(),"init","No se ha podido cargar la configuracion de menus de Geremua",lre));
			} catch (Exception e) {
				Q70GestorDeExcepciones.getSingleton().recogerThrowable(new Q70FrameworkException(Q70Constants.COMPONENTE_CUSTOM_TAG,this.getClass().toString(),"init","No se ha podido inicializar la configuracion de menus de Geremua",e));
			}
		}

		//Cargar el repositorio de menus y tipos de menu definidos a nivel de operacion de presentacion
		modulePrefix = config.getPrefix(); //Nombre de la op actual
	    this.servlet = servlet;
        repository = new Q70MenuRepository();
        repository.setLoadParam(menuConfig);
        repository.setServlet(servlet);

        try {       	
            repository.load();            
            //servlet.getServletContext().setAttribute(Q70MenuRepository.MENU_REPOSITORY_KEY + modulePrefix, repository);
			
        } catch (Q70LoadableResourceException lre) {
            throw new ServletException("No se ha podido cargar la configuracion de menus de la operacion de presentacion '"+modulePrefix+"': " + lre.getMessage());
        } catch (Exception e) {
			throw new ServletException("No se ha podido inicializar la configuracion de menus de la operacion de presentacion '"+modulePrefix+"': " + e.getMessage());        	
        }
        
        //Aņadir al repositorio de op los menus y tipos de menu de Geremua bajo las siguientes condiciones:
        //Si un tipo de menu existe con el mismo nombre a nivel de Geremua y de op, prevalece el de Geremua. 
		//Si un menu existe con el mismo nombre a nivel de Geremua y de op, prevalece el de la op.

		//Aņadir los tipos de menu
		String name;
		Iterator it = frmkRepository.displayers.keySet().iterator();
		while (it.hasNext())
		{
			name = (String) it.next();
			if (!repository.displayers.containsKey(name))
			{
				repository.addMenuDisplayerMapping(frmkRepository.getMenuDisplayerMapping(name));
			}							
		}		 
		       
		//Aņadir los menus
		it = frmkRepository.menus.keySet().iterator();
		while (it.hasNext())
		{
			name = (String) it.next();
			if (!repository.menus.containsKey(name))
			{
				repository.addMenu(frmkRepository.getMenu(name));
			}							
		}		 

		//Poner en el contexto de servlet el repositorio de menus de op resultante
		servlet.getServletContext().setAttribute(Q70MenuRepository.MENU_REPOSITORY_KEY + modulePrefix, repository);
        
    }



    public void destroy() {
        repository = null;
        servlet.getServletContext().removeAttribute(Q70MenuRepository.MENU_REPOSITORY_KEY + modulePrefix);
        menuConfig = null;
        servlet = null;
    }
}
