/* Copyright 2006 The JA-SIG Collaborative.  All rights reserved.
*  See license distributed with this file and
*  available online at http://www.uportal.org/license.html
*/

package org.esupportail.portal.layout.dlm.processing;

import java.util.Hashtable;

import javax.servlet.http.HttpServletRequest;

import org.jasig.portal.UserPreferences;
import org.jasig.portal.layout.dlm.DistributedLayoutManager;
import org.jasig.portal.layout.dlm.processing.IParameterProcessor;
import org.jasig.portal.layout.dlm.processing.ISaxProcessor;
import org.jasig.portal.layout.node.IUserLayoutFolderDescription;
import org.jasig.portal.security.IPerson;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.XMLFilterImpl;

/**
 * IParameterProcessor that disable useless channel rendering.
 */
public class DisableUselessChannelRendering extends XMLFilterImpl
implements ISaxProcessor, IParameterProcessor
{
    /**
     * Layout manager.
     */
    private DistributedLayoutManager dlMgr;

    /**
     * Utilisateur guest ou non.
     */
    private boolean guest;
    
    /**
     * Identifiant du dossier racine.
     */
    private String rootId;
    
    /**
     * Parametre uP_root :
     * 	- null  = accueil,
     *  - root  = onglet,
     *  - autre = canal.
     */
    private String userLayoutRoot = "root";
    
    /**
     * Numero de l'onglet actif.
     */
    private int activeTab = 1;
    
    /**
     * Numero de l'onglet courrant dans le parcours SAX.
     */
    private int tab;
        
    /**
     * @see org.jasig.portal.layout.dlm.processing.IParameterProcessor#setResources(
     * org.jasig.portal.security.IPerson, org.jasig.portal.layout.dlm.DistributedLayoutManager)
     */
    public void setResources(IPerson person, DistributedLayoutManager dlm)
    {
        this.dlMgr = dlm;
        this.guest = person.isGuest();
        rootId = dlMgr.getRootFolderId();
    }

    /**
     * @see org.jasig.portal.layout.dlm.processing.IParameterProcessor#processParameters(
     * org.jasig.portal.UserPreferences, javax.servlet.http.HttpServletRequest)
     */
    @SuppressWarnings("unchecked")
	public void processParameters(UserPreferences prefs, @SuppressWarnings("unused") HttpServletRequest request)
    {
    	Hashtable<String, String> userPrefs = prefs.getStructureStylesheetUserPreferences().getParameterValues();
    	userLayoutRoot = (userPrefs.containsKey("userLayoutRoot") ? userPrefs.get("userLayoutRoot") : "root");
    	activeTab = (userPrefs.containsKey("activeTab") ? Integer.parseInt(userPrefs.get("activeTab")) : 1);
    }
    
    /**
     * @see org.jasig.portal.layout.dlm.processing.ISaxProcessor#getCacheKey()
     */
    public String getCacheKey()
    {
        return "DUCR:" + this.guest;
    }
    
    /**
     * @see org.xml.sax.helpers.XMLFilterImpl#startElement(java.lang.String, java.lang.String,
     * java.lang.String, org.xml.sax.Attributes)
     */
    @Override
	public void startElement(String uri, String localName, String qName,
            Attributes atts) throws SAXException
    {
    	// pour l'utilisateur GUEST, on ne peut rien faire...
    	if (guest) {
    		super.startElement(uri, localName, qName, atts);
    		return;
    	}
    	
    	// sinon on change "channel" en "chan" pour éviter le rendu des canaux non vus
    	String name = qName;
        String id = atts.getValue("ID");
        if (qName.equals("channel")
        	&& ((IUserLayoutFolderDescription)dlMgr.getNode(dlMgr.getParentId(id))).getFolderType() == IUserLayoutFolderDescription.REGULAR_TYPE
        	&& (!userLayoutRoot.equals("root") && !userLayoutRoot.equals(id)
        		|| userLayoutRoot.equals("root") && tab != activeTab)) {
    		// CHANNEL
        	// - dans un dossier regular (ni header, ni footer),
        	// - ET le canal n'est pas cible OU le canal n'est pas dans l'onglet actif
        	// => on ne rend pas le canal.
       		name = "chan";
        } else if (qName.equals("folder")) {
        	//FOLDER
        	if (rootId.equals(id)) {
        		// root folder
        		tab = 0;
        	} else if (rootId.equals(dlMgr.getParentId(id))
        		&& ((IUserLayoutFolderDescription)dlMgr.getNode(id)).getFolderType() == IUserLayoutFolderDescription.REGULAR_TYPE) {
        		// onglet (filtre les colonnes, le header et le footer)
        		++tab;
        	}
        }
        super.startElement(uri, name, name, atts);
    }
    
    /**
     * @see org.jasig.portal.layout.dlm.processing.ISaxProcessor#getContentHandler(org.xml.sax.ContentHandler)
     */
    public ContentHandler getContentHandler(ContentHandler handler)
    {
    	super.setContentHandler(handler);
        return this;
    }
    
}
