/**
 * 
 */
package org.eclipse.jst.pagedesigner.itemcreation;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jst.jsf.common.dom.TagIdentifier;
import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
import org.eclipse.jst.pagedesigner.itemcreation.command.ContainerCreationCommand;
import org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand;
import org.eclipse.jst.pagedesigner.itemcreation.command.UserCustomizedContainerCreationCommand;
import org.eclipse.jst.pagedesigner.itemcreation.command.UserCustomizedElementCustomizationCommand;
import org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData;
import org.eclipse.jst.pagedesigner.itemcreation.customizer.ParentData;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.w3c.dom.Element;

/**
 * Tag creation advisor that returns a new ElementCustomizationCommand
 * subclass that will perform customization of attributes, child tags and parent tags 
 * 
 * @author prusev
 * @author Debajit Adhikary
 */
public class UserCustomizedTagCreationAdvisor extends DefaultTagCreationAdvisor {

    /**
     * Default
     * @param creationData
     */
    public UserCustomizedTagCreationAdvisor(CreationData creationData) {
        super(creationData);
    }

    /**
     * @param model
     * @param tagElement
     * @return
     * 
     * Gives back the new command class.
     */
    protected ElementCustomizationCommand getElementCustomizationCommand(
            IDOMModel model, Element tagElement) {
        return new UserCustomizedElementCustomizationCommand(model, tagElement, _creationData);
    }

    
    /** 
     * Performs parent tag customization for the dropped tag. Chains any
     * required container creation commands to ensure that the required parents
     * are created.
     * 
     * (non-Javadoc)
     * 
     * @see org.eclipse.jst.pagedesigner.itemcreation.DefaultTagCreationAdvisor#getContainerCreationCommand (org.eclipse.jst.pagedesigner.dom.IDOMPosition)
     * 
     */
    @Override
    protected ContainerCreationCommand getContainerCreationCommand(IDOMPosition position)
    {
        final IAdaptable adaptable = _creationData.getDropCustomizationData();
        if (adaptable != null)
        {
            final ICustomizationData data = (ICustomizationData) adaptable.getAdapter(ICustomizationData.class);
            ContainerCreationCommand command = null;
            ParentData parentData = data.getParentData();
            
            boolean isFirstParent = true;
            for (final ICustomizationData parentCustomizationData : parentData.getParentCustomizationData())
            {
                TagIdentifier parentTagIdentifier = parentCustomizationData.getTagIdentifier();
                
                if (isFirstParent) 
                {
                    command = new UserCustomizedContainerCreationCommand(position, parentTagIdentifier, _creationData.getTagId(), (IAdaptable) parentCustomizationData);
                    isFirstParent = false;
                }
                else
                {
                    command.chain(new UserCustomizedContainerCreationCommand(position, parentTagIdentifier, _creationData.getTagId(), (IAdaptable) parentCustomizationData));
                }
            }
            return command;
        } 
        return null;
    }
}
