/*******************************************************************************
 * Copyright (c) 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.ws.internal.explorer.platform.wsdl.datamodel;

import org.eclipse.wst.ws.internal.datamodel.*;
import org.eclipse.wst.ws.internal.explorer.platform.constants.*;
import org.eclipse.wst.ws.internal.explorer.platform.wsdl.constants.*;

import javax.xml.namespace.QName;
import javax.wsdl.extensions.soap.*;
import javax.wsdl.extensions.http.*;
import javax.wsdl.extensions.*;
import javax.wsdl.*;

import java.util.*;

public class WSDLBindingElement extends WSDLCommonElement
{
  private int bindingType_;
  private Binding binding_;
  private ExtensibilityElement bindingExtensibilityElement_;
  private Vector endPoints_;

  private final void setBindingExtensibilityElement()
  {
    bindingExtensibilityElement_ = null;
    bindingType_ = BindingTypes.UNSUPPORTED;
    List extensibilityElements = binding_.getExtensibilityElements();
    for (Iterator i = extensibilityElements.iterator();i.hasNext();)
    {
      ExtensibilityElement e = (ExtensibilityElement)i.next();
      if (e instanceof HTTPBinding)
      {
        HTTPBinding binding = (HTTPBinding)e;
        String verb = binding.getVerb();
        if (BindingTypes.HTTP_VERB_GET.equals(verb))
          bindingType_ = BindingTypes.HTTP_GET;
        else if (BindingTypes.HTTP_VERB_POST.equals(verb))
          bindingType_ = BindingTypes.HTTP_POST;
      }
      else if (e instanceof SOAPBinding)
        bindingType_ = BindingTypes.SOAP;
      if (bindingType_ != BindingTypes.UNSUPPORTED)
      {
        bindingExtensibilityElement_ = e;
        break;
      }
    }
  }
  
  public WSDLBindingElement(String name, Model model, Binding binding)
  {
    super(name, model);
    setBinding(binding);
    endPoints_ = new Vector();
  }

  public void setBinding(Binding binding) {
    binding_ = binding;
    setDocumentation(binding.getDocumentationElement());
    setBindingExtensibilityElement();
  }

  public Binding getBinding() {
    return binding_;
  }
  
  public ExtensibilityElement getBindingExtensibilityElement()
  {
    return bindingExtensibilityElement_;
  }
  
  public int getBindingType()
  {
    return bindingType_;
  }

  private void resetEndPoints()
  {
    WSDLServiceElement serviceElement = (WSDLServiceElement)getParentElement();
    String fixedEndpointString = serviceElement.getAddressLocation(binding_);
    Endpoint fixedEndpoint = getEndpoint(fixedEndpointString);
    if (fixedEndpoint == null)
    {
      fixedEndpoint = new Endpoint();
      fixedEndpoint.setEndpoint(fixedEndpointString);
    }
    endPoints_.clear();
    endPoints_.add(fixedEndpoint);
  }

  public String[] getEndPoints()
  {
    String[] endPoints = new String[endPoints_.size()];
    for (int i = 0; i < endPoints.length; i++)
      endPoints[i] = ((Endpoint)endPoints_.get(i)).getEndpoint();
    return endPoints;
  }
  
  public Endpoint getEndpoint(String endpointString)
  {
    if (endpointString != null && endpointString.length() > 0)
    {
      for (Iterator it = endPoints_.iterator(); it.hasNext();)
      {
        Endpoint endpoint = (Endpoint)it.next();
        if (endpointString.equals(endpoint.getEndpoint()))
          return endpoint;
      }
    }
    return null;
  }

  public void setEndPoints(String[] endpoints)
  {
    Vector endpointVector = new Vector();
    for (int i = 0; i < endpoints.length; i++)
    {
      Endpoint endpoint = getEndpoint(endpoints[i]);
      if (endpoint == null)
      {
        endpoint = new Endpoint();
        endpoint.setEndpoint(endpoints[i]);
      }
      endpointVector.add(endpoint);
    }
    resetEndPoints();
    endPoints_.addAll(endpointVector);
  }

  public void addEndPoint(String endpointString)
  {
    if (endpointString != null && endpointString.length() > 0)
    {
      Endpoint endpoint = new Endpoint();
      endpoint.setEndpoint(endpointString);
      endPoints_.add(endpoint);
    }
  }

  public void removeEndPoint(String endpointString)
  {
    if (endpointString != null && endpointString.length() > 0)
    {
      WSDLServiceElement serviceElement = (WSDLServiceElement)getParentElement();
      String fixedEndpointString = serviceElement.getAddressLocation(binding_);
      if (fixedEndpointString == null || !fixedEndpointString.equals(endpointString))
      {
        for (int i = 0; i < endPoints_.size(); i++)
        {
          if (endpointString.equals(((Endpoint)endPoints_.get(i)).getEndpoint()))
          {
            endPoints_.remove(i);
            break;
          }
        }
      }
    }
  }

  public void buildModel() {
    resetEndPoints();
    if (binding_ != null) {
      PortType pt = binding_.getPortType();
      if (pt != null) {
        List operations = pt.getOperations();
        HashMap operationsMap = new HashMap();
        for (Iterator it = operations.iterator();it.hasNext();) {
          Operation operation = (Operation)it.next();
          operationsMap.put(createOperationUniqueName(operation), operation);
        }
        WSDLOperationElement[] wsdlOperationElements = new WSDLOperationElement[getNumberOfElements(WSDLModelConstants.REL_WSDL_OPERATION)];
        Enumeration e = getElements(WSDLModelConstants.REL_WSDL_OPERATION);
        for (int i = 0; i < wsdlOperationElements.length; i++) {
          wsdlOperationElements[i] = (WSDLOperationElement)e.nextElement();
        }
        for (int j = 0; j < wsdlOperationElements.length; j++) {
          String operationName = createOperationUniqueName(wsdlOperationElements[j].getOperation());
          Operation operation = (Operation)operationsMap.get(operationName);
          if (operation != null) {
            operationsMap.remove(operationName);
            wsdlOperationElements[j].setOperation(this, operation);
          }
          else
            disconnect(wsdlOperationElements[j], WSDLModelConstants.REL_WSDL_OPERATION);
        }
        for (Iterator it = operationsMap.values().iterator();it.hasNext();) {
          Operation oper = (Operation)it.next();
          WSDLOperationElement wsdlOperationElement = new WSDLOperationElement(oper.getName(), this, oper);
          connect(wsdlOperationElement,WSDLModelConstants.REL_WSDL_OPERATION,ModelConstants.REL_OWNER);
        }
      }
    }
  }

  private String createOperationUniqueName(Operation operation)
  {
    StringBuffer name = new StringBuffer();
    name.append(operation.getName());
    Input inputMsg = operation.getInput();
    if (inputMsg != null)
    {
      QName qname = inputMsg.getMessage().getQName();
      name.append(qname.getNamespaceURI());
      name.append(":");
      name.append(qname.getLocalPart());
    }
    Output outputMsg = operation.getOutput();
    if (outputMsg != null)
    {
      QName qname = outputMsg.getMessage().getQName();
      name.append(qname.getNamespaceURI());
      name.append(":");
      name.append(qname.getLocalPart());
    }
    return name.toString();
  }
}
