/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsdl.ui.internal.contentgenerator;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.eclipse.wst.wsdl.Binding;
import org.eclipse.wst.wsdl.BindingOperation;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.Fault;
import org.eclipse.wst.wsdl.Input;
import org.eclipse.wst.wsdl.Operation;
import org.eclipse.wst.wsdl.Output;
import org.eclipse.wst.wsdl.PortType;
import org.eclipse.wst.wsdl.Service;
import org.eclipse.wst.wsdl.ui.internal.WSDLEditorPlugin;
import org.eclipse.wst.wsdl.ui.internal.actions.AddElementAction;
import org.eclipse.wst.wsdl.ui.internal.util.ComponentReferenceUtil;
import org.eclipse.wst.wsdl.ui.internal.util.WSDLEditorUtil;
import org.eclipse.wst.wsdl.util.WSDLConstants;
import org.w3c.dom.Element;
import org.w3c.dom.Node;


public class BindingGenerator extends AbstractGenerator
{
  protected Definition definition;
  protected String portTypeName;
  protected boolean generateBindingBody = true; 

  public BindingGenerator(Definition definition)
  {
    this.definition = definition;
  }
  
  public void setGenerateBindingBody(boolean generateBindingBody)
  {
    this.generateBindingBody = generateBindingBody;
  }
  
  public int getType()
  {
  	return BINDING_GENERATOR;
  }

  public Definition getDefinition()
  {
    return this.definition;
  }

  protected String getUndoDescription()
  {
    return WSDLEditorPlugin.getWSDLString("_UI_MENUBAR_GENERATE_BINDING");
  }

  public void setRefName(String refName)
  {
    setPortTypeName(refName);
  }
  
  public String getRefName()
  {
  	return portTypeName;
  }
 
  public void setPortTypeName(String portTypeName)
  {
    this.portTypeName = portTypeName;
  }

  public String getPortTypeName()
  {
    return portTypeName;
  }

  class BindingOperationTable
  {
    HashMap map = new HashMap();

    public void addBinding(Binding binding)
    {
      for (Iterator i = binding.getEBindingOperations().iterator(); i.hasNext();)
      {
        putBindingOperation((BindingOperation) i.next());
      }
    }

    public void putBindingOperation(BindingOperation bindingOperation)
    {
      String key = bindingOperation.getName();
      List list = (List) map.get(key);
      if (list == null)
      {
        list = new ArrayList();
        map.put(key, list);
      }
      if (!list.contains(bindingOperation))
      {
        list.add(bindingOperation);
      }
    }

    public BindingOperation lookupBindingOperation(Operation operation)
    {
      BindingOperation bindingOperation = null;

      List list = (List) map.get(operation.getName());
      if (list != null && list.size() > 0)
      {
        bindingOperation = (BindingOperation) list.get(0);
      }

      return bindingOperation;
    }
  }

  public void generateContent()
  {
    Element definitionElement = WSDLEditorUtil.getInstance().getElementForObject(definition);

    Binding binding = getOrCreateBinding(name, definitionElement);
	newComponent = binding;
    if (binding != null)
    {
      ComponentReferenceUtil.setPortTypeReference(binding, portTypeName != null ? portTypeName : "");
    }

    Element bindingElement = binding != null ? WSDLEditorUtil.getInstance().getElementForObject(binding) : null;

    if (bindingElement != null)
    {
      if (overwrite)
      {
        List nodes = new ArrayList();
        for (Node node = bindingElement.getFirstChild(); node != null; node = node.getNextSibling())
        {
          nodes.add(node);
        }
        for (Iterator i = nodes.iterator(); i.hasNext();)
        {
          Node node = (Node) i.next();
          bindingElement.removeChild(node);
        }
      }

	  generatePortContent(binding);
      PortType portType = binding.getEPortType();
           
      if (binding.getEExtensibilityElements().size() == 0)
      {
         bindingContentGenerator.generateBindingContent(bindingElement, portType);
      }

	  if (portType != null && generateBindingBody)
	  {	  
			BindingOperationTable table = new BindingOperationTable();
			table.addBinding(binding);
				  	
        for (Iterator i = portType.getEOperations().iterator(); i.hasNext();)
        {
          Operation operation = (Operation) i.next();
          BindingOperation bindingOperation = table.lookupBindingOperation(operation);
          if (bindingOperation == null)
          {
            generateBindingOperation(binding, bindingElement, operation);
          }
        }
      }

    }
  }

  protected void generatePortContent(Binding binding)
  {
    for (Iterator i = definition.getEServices().iterator(); i.hasNext();)
    {
      Service service = (Service) i.next();
      /*
      for (Iterator j = service.getEPorts().iterator(); j.hasNext();)
      {
        Port port = (Port) j.next();
        if (port.getBinding() == binding)
        {
          if (port.getEExtensibilityElements().size() == 0)
          {
            Element portElement = WSDLUtil.getInstance().getElementForObject(port);
            bindingContentGenerator.generatePortContent(portElement, port);
          }
        }
      }*/
    }
  }

  protected void generateBindingOperation(Binding binding, Element bindingElement, Operation operation)
  {
    Element bindingOperationElement = createWSDLElement(bindingElement, "operation");
    bindingOperationElement.setAttribute("name", operation.getName());
    bindingContentGenerator.generateBindingOperationContent(bindingOperationElement, operation);

    Input input = operation.getEInput();
    if (input != null)
    {
      Element bindingInputElement = createWSDLElement(bindingOperationElement, "input");
      if (input.getName() != null)
      {
        bindingInputElement.setAttribute("name", input.getName());
      }
      bindingContentGenerator.generateBindingInputContent(bindingInputElement, input);
    }

    Output output = operation.getEOutput();
    if (output != null)
    {
      Element bindingOutputElement = createWSDLElement(bindingOperationElement, "output");
      if (output.getName() != null)
      {
        bindingOutputElement.setAttribute("name", output.getName());
      }
      bindingContentGenerator.generateBindingOutputContent(bindingOutputElement, output);
    }

    for (Iterator i = operation.getEFaults().iterator(); i.hasNext();)
    {
      Fault fault = (Fault) i.next();

      Element bindingFaultElement = createWSDLElement(bindingOperationElement, "fault");
      if (fault.getName() != null)
      {
        bindingFaultElement.setAttribute("name", fault.getName());
      }
      bindingContentGenerator.generateBindingFaultContent(bindingFaultElement, fault);
    }
  }

  protected Binding getOrCreateBindingHelper(String name)
  {
    Binding result = null;
    if (name != null)
    {
      for (Iterator i = getDefinition().getEBindings().iterator(); i.hasNext();)
      {
        Binding binding = (Binding) i.next();
        String bindingName = binding.getQName().getLocalPart();
        if (name.equals(bindingName))
        {
          result = binding;
          break;
        }
      }
    }
    return result;
  }

  protected Binding getOrCreateBinding(String name, Element definitionElement)
  {
    Binding result = getOrCreateBindingHelper(name);
    if (result == null)
    {
      String prefix = definition.getPrefix(WSDLConstants.WSDL_NAMESPACE_URI);
      AddBindingAction action = new AddBindingAction(definition, name, definitionElement, prefix);
      action.run();
      result = getOrCreateBindingHelper(name);
    }
    return result;
  }

  public Node getParentNode()
  {
    return WSDLEditorUtil.getInstance().getElementForObject(definition);
  }
}

class AddBindingAction extends AddElementAction
{
  protected String name;
  protected Definition definition;

  public AddBindingAction(Definition definition, String name, Node parentNode, String prefix)
  {
    super("binding", "icons/binding_obj.gif", parentNode, prefix, "binding");
    this.definition = definition;
    this.name = name;
    setComputeTopLevelRefChild(true);
  }

  protected void addAttributes(Element newElement)
  {
    newElement.setAttribute("name", name);
    newElement.setAttribute("type", "");
  }

  public String getBindingName()
  {
    return name;
  }
}