/*******************************************************************************
 * Copyright (c) 2002-2005 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 - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsi.internal.core.util;

import java.util.Iterator;
import java.util.List;

import javax.wsdl.Binding;
import javax.wsdl.Definition;
import javax.wsdl.Import;
import javax.wsdl.Message;
import javax.wsdl.Operation;
import javax.wsdl.Part;
import javax.wsdl.PortType;
import javax.wsdl.Service;
import javax.wsdl.extensions.soap.SOAPBody;

import org.eclipse.wst.wsi.internal.core.WSIConstants;

/**
 * The utility class to automate WSDL processing.
 * 
 * @author Kulik
 */
public final class WSDLUtil
{

  /**
   * The method extracts list of parts for the given soapbind:body,
   * binding operation, message, and style.
   * 
   * @param op an operation.
   * @param m  a message.
   * @param body a SOAP body.
   * @param style an operation style.
   * @return list of parts for the given soapbind:body,
   *         binding operation, message, and style.
   */
  static public List getParts(
    Operation op,
    Message m,
    SOAPBody body,
    String style)
  {
    //		if null, get parts from message 
    if (body.getParts() == null)
      // if rpc style is used, try to use partOrder attribute from operation
      if (WSIConstants.ATTRVAL_SOAP_BIND_STYLE_RPC.equals(style))
        return m.getOrderedParts(op.getParameterOrdering());
      else
        return m.getOrderedParts(null);
    else
      // converse parts name to parts objects
      return m.getOrderedParts(body.getParts());
  }

  /**
   * The method iterates all imports from the given definition and expands all
   * imported messages, service, portTypes, and bindings to the definition.
   * 
   * @param def a WSDL definition.
   */
  static public void expandDefinition(Definition def)
  {
    if (def != null && def.getImports() != null)
    {
      Iterator it = def.getImports().values().iterator();
      while (it.hasNext())
      {
        List v = (List) it.next();
        if (v != null)
        {
          Iterator it2 = v.iterator();
          while (it2.hasNext())
            expandDefinition(def, (Import) it2.next());
        }
      }
    }
  }

  /**
   * The internal method to expand definition.
   * @param target WSDL definition.
   * @param im internal method.
   */
  static private void expandDefinition(Definition target, Import im)
  {
    if (im != null && im.getDefinition() != null)
    {
      Definition d = im.getDefinition();
      if (d.getMessages() != null)
      {
        Iterator it = d.getMessages().values().iterator();
        while (it.hasNext())
          target.addMessage((Message) it.next());
      }
      if (d.getPortTypes() != null)
      {
        Iterator it = d.getPortTypes().values().iterator();
        while (it.hasNext())
          target.addPortType((PortType) it.next());
      }
      if (d.getBindings() != null)
      {
        Iterator it = d.getBindings().values().iterator();
        while (it.hasNext())
          target.addBinding((Binding) it.next());
      }
      if (d.getServices() != null)
      {
        Iterator it = d.getServices().values().iterator();
        while (it.hasNext())
          target.addService((Service) it.next());
      }

      Iterator it = d.getImports().values().iterator();
      while (it.hasNext())
      {
        List v = (List) it.next();
        if (v != null)
        {
          Iterator it2 = v.iterator();
          while (it2.hasNext())
            expandDefinition(target, (Import) it2.next());
        }
      }
    }
  }

  /**
   * The method extracts part from the message.
   * 
   * @param message a SOAP message.
   * @param part a part name.
   * @return part from the specified message.
   */
  static public Part getPart(Message message, String part)
  {
    Part mesPart = null;
    if (part == null)
      mesPart = (Part) message.getOrderedParts(null).get(0);
    else
      mesPart = message.getPart(part);
    return mesPart;
  }
}
